diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp @@ -3427,6 +3427,9 @@ for (MachineOperand &Use : MI.implicit_operands()) { if (Use.isUse() && (Use.getReg() == AMDGPU::VCC || Use.getReg() == AMDGPU::VCC_LO)) { + assert(Orig.getReg() == AMDGPU::VCC || Orig.getReg() == AMDGPU::VCC_LO); + + Use.setReg(Orig.getReg()); Use.setIsUndef(Orig.isUndef()); Use.setIsKill(Orig.isKill()); return; diff --git a/llvm/test/CodeGen/AMDGPU/shrink-instructions-implicit-vcclo.mir b/llvm/test/CodeGen/AMDGPU/shrink-instructions-implicit-vcclo.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/shrink-instructions-implicit-vcclo.mir @@ -0,0 +1,22 @@ +# RUN: llc -march=amdgcn -mcpu=gfx1010 -run-pass=si-shrink-instructions --verify-machineinstrs %s -o - | FileCheck %s + +# Make sure the implicit vcc_lo of V_CNDMASK is preserved and not promoted to vcc. +--- + +name: shrink_cndmask_implicit_vcc_lo +tracksRegLiveness: true +body: | + bb.0: + liveins: $vgpr0, $vgpr1 + ; CHECK-LABEL: name: shrink_cndmask_implicit_vcc_lo + ; CHECK: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr0 + ; CHECK: V_CMP_LT_I32_e32 0, [[COPY]], implicit-def $vcc_lo, implicit $exec + ; CHECK: V_CNDMASK_B32_e32 0, [[COPY1]], implicit $vcc_lo, implicit $exec + %0:vgpr_32 = COPY $vgpr0 + %1:vgpr_32 = COPY $vgpr0 + V_CMP_LT_I32_e32 0, %0:vgpr_32, implicit-def $vcc_lo, implicit $exec, implicit-def $vcc + %2:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, %1:vgpr_32, $vcc_lo, implicit $exec + S_NOP 0 + +...