diff --git a/llvm/lib/CodeGen/MachineSink.cpp b/llvm/lib/CodeGen/MachineSink.cpp --- a/llvm/lib/CodeGen/MachineSink.cpp +++ b/llvm/lib/CodeGen/MachineSink.cpp @@ -1324,7 +1324,8 @@ // "zombie" define of that preg. E.g., EFLAGS. () for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) { const MachineOperand &MO = MI.getOperand(I); - if (!MO.isReg()) continue; + if (!MO.isReg() || MO.isUse()) + continue; Register Reg = MO.getReg(); if (Reg == 0 || !Register::isPhysicalRegister(Reg)) continue; diff --git a/llvm/test/CodeGen/RISCV/MachineSink-implicit-x0.mir b/llvm/test/CodeGen/RISCV/MachineSink-implicit-x0.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/MachineSink-implicit-x0.mir @@ -0,0 +1,33 @@ +# RUN: llc -mtriple=riscv32 %s -run-pass=machine-sink -o - | FileCheck %s + +# Verify that sinking of '%20:gpr = LUI 1, implicit $x0' is not inhibited by +# the implicit use of '$x0'. +# Register '$x0' is a 'MRI->isConstantPhysReg()' on RISCV and such uses should +# not inhibit sinking transformation even though they are livein to the block +# they are to be sunk into (inhibit under such conditions should only happen +# for defines). + +--- +name: f +tracksRegLiveness: true +body: | + ; CHECK-LABEL: bb.1: + ; CHECK-NEXT: successors: %bb.3(0x80000000) + ; CHECK-NEXT: liveins: $x0 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[LUI:%[0-9]+]]:gpr = LUI 1, implicit $x0 + bb.0: + liveins: $x10 + %10:gpr = COPY $x10 + %20:gpr = LUI 1, implicit $x0 + BEQ %10, %10, %bb.2 + PseudoBR %bb.1 + bb.1: + liveins: $x0 + %30:gpr = ADDI %20, 5 + PseudoBR %bb.3 + bb.2: + PseudoBR %bb.3 + bb.3: + PseudoRET +...