mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-01 18:33:56 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157038 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6f55e3d57d
commit
ad75364815
@ -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) {
|
||||
|
16
test/CodeGen/X86/2012-05-17-TwoAddressBug.ll
Normal file
16
test/CodeGen/X86/2012-05-17-TwoAddressBug.ll
Normal file
@ -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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user