diff --git a/llvm/lib/CodeGen/ExpandPostRAPseudos.cpp b/llvm/lib/CodeGen/ExpandPostRAPseudos.cpp index 3ad1fc7e9267..ab2382e2db6d 100644 --- a/llvm/lib/CodeGen/ExpandPostRAPseudos.cpp +++ b/llvm/lib/CodeGen/ExpandPostRAPseudos.cpp @@ -51,7 +51,7 @@ private: bool LowerSubregToReg(MachineInstr *MI); bool LowerCopy(MachineInstr *MI); - void TransferImplicitDefs(MachineInstr *MI); + void TransferImplicitOperands(MachineInstr *MI); }; } // end anonymous namespace @@ -61,20 +61,16 @@ char &llvm::ExpandPostRAPseudosID = ExpandPostRA::ID; INITIALIZE_PASS(ExpandPostRA, "postrapseudos", "Post-RA pseudo instruction expansion pass", false, false) -/// TransferImplicitDefs - MI is a pseudo-instruction, and the lowered -/// replacement instructions immediately precede it. Copy any implicit-def +/// TransferImplicitOperands - MI is a pseudo-instruction, and the lowered +/// replacement instructions immediately precede it. Copy any implicit /// operands from MI to the replacement instruction. -void -ExpandPostRA::TransferImplicitDefs(MachineInstr *MI) { +void ExpandPostRA::TransferImplicitOperands(MachineInstr *MI) { MachineBasicBlock::iterator CopyMI = MI; --CopyMI; - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - MachineOperand &MO = MI->getOperand(i); - if (!MO.isReg() || !MO.isImplicit() || MO.isUse()) - continue; - CopyMI->addOperand(MachineOperand::CreateReg(MO.getReg(), true, true)); - } + for (const MachineOperand &MO : MI->implicit_operands()) + if (MO.isReg()) + CopyMI->addOperand(MO); } bool ExpandPostRA::LowerSubregToReg(MachineInstr *MI) { @@ -167,7 +163,7 @@ bool ExpandPostRA::LowerCopy(MachineInstr *MI) { DstMO.getReg(), SrcMO.getReg(), SrcMO.isKill()); if (MI->getNumOperands() > 2) - TransferImplicitDefs(MI); + TransferImplicitOperands(MI); DEBUG({ MachineBasicBlock::iterator dMI = MI; dbgs() << "replaced by: " << *(--dMI); diff --git a/llvm/test/CodeGen/ARM/twoaddrinstr.ll b/llvm/test/CodeGen/ARM/twoaddrinstr.ll index 97a49334b742..f0a95c833c6b 100644 --- a/llvm/test/CodeGen/ARM/twoaddrinstr.ll +++ b/llvm/test/CodeGen/ARM/twoaddrinstr.ll @@ -5,6 +5,7 @@ define void @PR13378() nounwind { ; This was orriginally a crasher trying to schedule the instructions. ; CHECK-LABEL: PR13378: ; CHECK: vld1.32 +; CHECK-NEXT: vmov.i32 ; CHECK-NEXT: vst1.32 ; CHECK-NEXT: vst1.32 ; CHECK-NEXT: vmov.f32 diff --git a/llvm/test/CodeGen/X86/pr28560.ll b/llvm/test/CodeGen/X86/pr28560.ll new file mode 100644 index 000000000000..d0061f670cf1 --- /dev/null +++ b/llvm/test/CodeGen/X86/pr28560.ll @@ -0,0 +1,13 @@ +; RUN: llc -mtriple=i686-pc-linux -print-after=postrapseudos < %s 2>&1 | FileCheck %s + +; CHECK: MOV8rr %{{[A-D]}}L, %E[[R:[A-D]]]X, %E[[R]]X +define i32 @foo(i32 %i, i32 %k, i8* %p) { + %f = icmp ne i32 %i, %k + %s = zext i1 %f to i8 + %ret = zext i1 %f to i32 + br label %next +next: + %d = add i8 %s, 5 + store i8 %d, i8* %p + ret i32 %ret +}