diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2012-05-18 01:33:51 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2012-05-18 01:33:51 +0000 |
| commit | 22d405f57b62d0eee7a994f074859e399583f7f1 (patch) | |
| tree | 1c3e08f3a2e1b9f1ccd32df97242514b2b155ee7 | |
| parent | 46d01605ee7ae986e4d6f47aa88224e7e8b7146c (diff) | |
| download | bcm5719-llvm-22d405f57b62d0eee7a994f074859e399583f7f1.tar.gz bcm5719-llvm-22d405f57b62d0eee7a994f074859e399583f7f1.zip | |
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
| -rw-r--r-- | llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/2012-05-17-TwoAddressBug.ll | 16 |
2 files changed, 23 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index e299671b68b..8164690e40a 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 00000000000..171c3f18dc8 --- /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 +} |

