From 22d405f57b62d0eee7a994f074859e399583f7f1 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 18 May 2012 01:33:51 +0000 Subject: [PATCH] Teach two-address pass to update the "source" map so it doesn't perform a non-profitable commute using outdated info. The test case would still fail because of poor pre-RA schedule. That will be fixed by MI scheduler. rdar://11472010 llvm-svn: 157038 --- llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 8 +++++++- llvm/test/CodeGen/X86/2012-05-17-TwoAddressBug.ll | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/X86/2012-05-17-TwoAddressBug.ll diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index e299671..8164690 100644 --- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -1521,6 +1521,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) { #endif // Emit a copy or rematerialize the definition. + bool isCopy = false; const TargetRegisterClass *rc = MRI->getRegClass(regB); MachineInstr *DefMI = MRI->getVRegDef(regB); // If it's safe and profitable, remat the definition instead of @@ -1537,10 +1538,11 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) { } else { BuildMI(*mbbi, mi, mi->getDebugLoc(), TII->get(TargetOpcode::COPY), regA).addReg(regB); + isCopy = true; } - MachineBasicBlock::iterator prevMI = prior(mi); // Update DistanceMap. + MachineBasicBlock::iterator prevMI = prior(mi); DistanceMap.insert(std::make_pair(prevMI, Dist)); DistanceMap[mi] = ++Dist; @@ -1554,6 +1556,10 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) { RemovedKillFlag = true; } MO.setReg(regA); + + if (isCopy) + // Propagate SrcRegMap. + SrcRegMap[regA] = regB; } if (AllUsesCopied) { diff --git a/llvm/test/CodeGen/X86/2012-05-17-TwoAddressBug.ll b/llvm/test/CodeGen/X86/2012-05-17-TwoAddressBug.ll new file mode 100644 index 0000000..171c3f1 --- /dev/null +++ b/llvm/test/CodeGen/X86/2012-05-17-TwoAddressBug.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx -pre-RA-sched=source | FileCheck %s + +; Teach two-address pass to update the "source" map so it doesn't perform a +; non-profitable commute using outdated info. The test case would still fail +; because of poor pre-RA schedule. That will be fixed by MI scheduler. +; rdar://11472010 +define i32 @t(i32 %mask) nounwind readnone ssp { +entry: +; CHECK: t: +; CHECK-NOT: mov + %sub = add i32 %mask, -65535 + %shr = lshr i32 %sub, 23 + %and = and i32 %mask, 1 + %add = add i32 %shr, %and + ret i32 %add +} -- 2.7.4