mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-20 18:48:13 +00:00
Avoid commuting a def MI in order to coalesce a copy instruction away if any use of the same val# is a copy instruction that has already been coalesced.
llvm-svn: 48833
This commit is contained in:
parent
55b8822511
commit
8d222d6221
@ -283,6 +283,17 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA,
|
|||||||
if (HasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
|
if (HasOtherReachingDefs(IntA, IntB, AValNo, BValNo))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// If some of the uses of IntA.reg is already coalesced away, return false.
|
||||||
|
// It's not possible to determine whether it's safe to perform the coalescing.
|
||||||
|
for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(IntA.reg),
|
||||||
|
UE = mri_->use_end(); UI != UE; ++UI) {
|
||||||
|
MachineInstr *UseMI = &*UI;
|
||||||
|
unsigned UseIdx = li_->getInstructionIndex(UseMI);
|
||||||
|
LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
|
||||||
|
if (ULR->valno == AValNo && JoinedCopies.count(UseMI))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// At this point we have decided that it is legal to do this
|
// At this point we have decided that it is legal to do this
|
||||||
// transformation. Start by commuting the instruction.
|
// transformation. Start by commuting the instruction.
|
||||||
MachineBasicBlock *MBB = DefMI->getParent();
|
MachineBasicBlock *MBB = DefMI->getParent();
|
||||||
@ -323,8 +334,7 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA,
|
|||||||
MachineInstr *UseMI = &*UI;
|
MachineInstr *UseMI = &*UI;
|
||||||
++UI;
|
++UI;
|
||||||
if (JoinedCopies.count(UseMI))
|
if (JoinedCopies.count(UseMI))
|
||||||
// It'll no longer be "joined" after the change.
|
continue;
|
||||||
JoinedCopies.erase(UseMI);
|
|
||||||
unsigned UseIdx = li_->getInstructionIndex(UseMI);
|
unsigned UseIdx = li_->getInstructionIndex(UseMI);
|
||||||
LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
|
LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
|
||||||
if (ULR->valno != AValNo)
|
if (ULR->valno != AValNo)
|
||||||
|
@ -1593,6 +1593,7 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(PhysReg && "VR not assigned a physical register?");
|
||||||
RegInfo->setPhysRegUsed(PhysReg);
|
RegInfo->setPhysRegUsed(PhysReg);
|
||||||
unsigned RReg = SubIdx ? TRI->getSubReg(PhysReg, SubIdx) : PhysReg;
|
unsigned RReg = SubIdx ? TRI->getSubReg(PhysReg, SubIdx) : PhysReg;
|
||||||
ReusedOperands.markClobbered(RReg);
|
ReusedOperands.markClobbered(RReg);
|
||||||
|
49
test/CodeGen/X86/2007-03-26-CoalescerBug.ll
Normal file
49
test/CodeGen/X86/2007-03-26-CoalescerBug.ll
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
; RUN: llvm-as < %s | llc -march=x86
|
||||||
|
|
||||||
|
@data = external global [339 x i64]
|
||||||
|
|
||||||
|
define void @foo(...) {
|
||||||
|
bb1:
|
||||||
|
%t43 = load i64* getelementptr ([339 x i64]* @data, i32 0, i64 212), align 4
|
||||||
|
br i1 false, label %bb80, label %bb6
|
||||||
|
bb6:
|
||||||
|
br i1 false, label %bb38, label %bb265
|
||||||
|
bb265:
|
||||||
|
ret void
|
||||||
|
bb38:
|
||||||
|
br i1 false, label %bb80, label %bb49
|
||||||
|
bb80:
|
||||||
|
br i1 false, label %bb146, label %bb268
|
||||||
|
bb49:
|
||||||
|
ret void
|
||||||
|
bb113:
|
||||||
|
ret void
|
||||||
|
bb268:
|
||||||
|
%t1062 = shl i64 %t43, 3
|
||||||
|
%t1066 = shl i64 0, 3
|
||||||
|
br label %bb85
|
||||||
|
bb85:
|
||||||
|
%t1025 = phi i64 [ 0, %bb268 ], [ %t102.0, %bb234 ]
|
||||||
|
%t1028 = phi i64 [ 0, %bb268 ], [ %t1066, %bb234 ]
|
||||||
|
%t1031 = phi i64 [ 0, %bb268 ], [ %t103.0, %bb234 ]
|
||||||
|
%t1034 = phi i64 [ 0, %bb268 ], [ %t1066, %bb234 ]
|
||||||
|
%t102.0 = add i64 %t1028, %t1025
|
||||||
|
%t103.0 = add i64 %t1034, %t1031
|
||||||
|
br label %bb86
|
||||||
|
bb86:
|
||||||
|
%t108.0 = phi i64 [ %t102.0, %bb85 ], [ %t1139, %bb248 ]
|
||||||
|
%t110.0 = phi i64 [ %t103.0, %bb85 ], [ %t1142, %bb248 ]
|
||||||
|
br label %bb193
|
||||||
|
bb193:
|
||||||
|
%t1081 = add i64 %t110.0, -8
|
||||||
|
%t1087 = add i64 %t108.0, -8
|
||||||
|
br i1 false, label %bb193, label %bb248
|
||||||
|
bb248:
|
||||||
|
%t1139 = add i64 %t108.0, %t1062
|
||||||
|
%t1142 = add i64 %t110.0, %t1062
|
||||||
|
br i1 false, label %bb86, label %bb234
|
||||||
|
bb234:
|
||||||
|
br i1 false, label %bb85, label %bb113
|
||||||
|
bb146:
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user