diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 2b24fe49c970b..e911ce8a75828 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -2376,20 +2376,24 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { // If we have only one valid type, this is likely a copy between a virtual // and physical register. - TypeSize SrcSize = TRI->getRegSizeInBits(SrcReg, *MRI); - TypeSize DstSize = TRI->getRegSizeInBits(DstReg, *MRI); + TypeSize SrcSize = TypeSize::getZero(); + TypeSize DstSize = TypeSize::getZero(); if (SrcReg.isPhysical() && DstTy.isValid()) { const TargetRegisterClass *SrcRC = TRI->getMinimalPhysRegClassLLT(SrcReg, DstTy); - if (SrcRC) - SrcSize = TRI->getRegSizeInBits(*SrcRC); + if (!SrcRC) + SrcSize = TRI->getRegSizeInBits(SrcReg, *MRI); + } else { + SrcSize = TRI->getRegSizeInBits(SrcReg, *MRI); } if (DstReg.isPhysical() && SrcTy.isValid()) { const TargetRegisterClass *DstRC = TRI->getMinimalPhysRegClassLLT(DstReg, SrcTy); - if (DstRC) - DstSize = TRI->getRegSizeInBits(*DstRC); + if (!DstRC) + DstSize = TRI->getRegSizeInBits(DstReg, *MRI); + } else { + DstSize = TRI->getRegSizeInBits(DstReg, *MRI); } // The next two checks allow COPY between physical and virtual registers, diff --git a/llvm/test/MachineVerifier/AMDGPU/test_copy_physregs_llt_virtreg.mir b/llvm/test/MachineVerifier/AMDGPU/test_copy_physregs_llt_virtreg.mir new file mode 100644 index 0000000000000..0fd50391a7e3a --- /dev/null +++ b/llvm/test/MachineVerifier/AMDGPU/test_copy_physregs_llt_virtreg.mir @@ -0,0 +1,58 @@ +# RUN: not --crash llc -mtriple=amdgcn -run-pass=none -filetype=null %s 2>&1 | FileCheck -implicit-check-not="Bad machine code" %s + +--- +name: test_valid_copies +tracksRegLiveness: true +body: | + bb.0: + liveins: $vgpr0, $vcc + %0:_(s32) = COPY $vgpr0 + %1:_(s16) = COPY $vgpr0 + %2:_(s64) = COPY $vcc + %3:_(s1) = COPY $vcc + $vgpr0 = COPY %0 + $vgpr0 = COPY %0 + $vcc = COPY %2 + $vcc = COPY %3 +... + +--- +name: test_invalid_copies +tracksRegLiveness: true +body: | + bb.0: + liveins: $vgpr0_vgpr1, $vgpr2, $vcc + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: %0:_(s32) = COPY $vgpr0_vgpr1 + %0:_(s32) = COPY $vgpr0_vgpr1 + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: %1:_(s64) = COPY $vgpr2 + %1:_(s64) = COPY $vgpr2 + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: %2:_(s32) = COPY $vcc + %2:_(s32) = COPY $vcc + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: %3:_(s8) = COPY $vgpr2 + %3:_(s8) = COPY $vgpr2 + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: $vgpr0_vgpr1 = COPY %0:_(s32) + $vgpr0_vgpr1 = COPY %0 + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: $vgpr2 = COPY %1:_(s64) + $vgpr2 = COPY %1 + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: $vcc = COPY %2:_(s32) + $vcc = COPY %2 + + ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** + ; CHECK: - instruction: $vgpr2 = COPY %3:_(s8) + $vgpr2 = COPY %3 + +... diff --git a/llvm/test/MachineVerifier/test_copy_physregs_x86.mir b/llvm/test/MachineVerifier/test_copy_physregs_x86.mir index a239379a34e62..f3323c4353142 100644 --- a/llvm/test/MachineVerifier/test_copy_physregs_x86.mir +++ b/llvm/test/MachineVerifier/test_copy_physregs_x86.mir @@ -29,34 +29,26 @@ body: | liveins: $xmm0, $xmm1, $xmm2, $xmm3 ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: %0:_(s16) = COPY $xmm0 - %0:_(s16) = COPY $xmm0 + ; CHECK: - instruction: %0:_(<4 x s16>) = COPY $xmm1 + %0:_(<4 x s16>) = COPY $xmm1 ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: %1:_(<4 x s16>) = COPY $xmm1 - %1:_(<4 x s16>) = COPY $xmm1 + ; CHECK: - instruction: %1:_(s256) = COPY $xmm2 + %1:_(s256) = COPY $xmm2 ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: %2:_(s256) = COPY $xmm2 - %2:_(s256) = COPY $xmm2 + ; CHECK: - instruction: %2:_(<8 x s32>) = COPY $xmm3 + %2:_(<8 x s32>) = COPY $xmm3 ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: %3:_(<8 x s32>) = COPY $xmm3 - %3:_(<8 x s32>) = COPY $xmm3 + ; CHECK: - instruction: $xmm1 = COPY %0:_(<4 x s16>) + $xmm1 = COPY %0 ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: $xmm0 = COPY %0:_(s16) - $xmm0 = COPY %0 - - ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: $xmm1 = COPY %1:_(<4 x s16>) - $xmm1 = COPY %1 + ; CHECK: - instruction: $xmm2 = COPY %1:_(s256) + $xmm2 = COPY %1 ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: $xmm2 = COPY %2:_(s256) - $xmm2 = COPY %2 - - ; CHECK: *** Bad machine code: Copy Instruction is illegal with mismatching sizes *** - ; CHECK: - instruction: $xmm3 = COPY %3:_(<8 x s32>) - $xmm3 = COPY %3 + ; CHECK: - instruction: $xmm3 = COPY %2:_(<8 x s32>) + $xmm3 = COPY %2 ...