forked from OSchip/llvm-project
Reset kill markers after live interval is reconstructed.
llvm-svn: 83608
This commit is contained in:
parent
f5970a019e
commit
be27d61cbc
|
@ -778,6 +778,24 @@ void PreAllocSplitting::ReconstructLiveInterval(LiveInterval* LI) {
|
|||
LI->addRange(LiveRange(DefIdx, LIs->getNextSlot(DefIdx), DeadVN));
|
||||
DeadVN->addKill(DefIdx);
|
||||
}
|
||||
|
||||
// Update kill markers.
|
||||
for (LiveInterval::vni_iterator VI = LI->vni_begin(), VE = LI->vni_end();
|
||||
VI != VE; ++VI) {
|
||||
VNInfo* VNI = *VI;
|
||||
for (unsigned i = 0, e = VNI->kills.size(); i != e; ++i) {
|
||||
LiveIndex KillIdx = VNI->kills[i];
|
||||
if (KillIdx.isPHIIndex())
|
||||
continue;
|
||||
MachineInstr *KillMI = LIs->getInstructionFromIndex(KillIdx);
|
||||
if (KillMI) {
|
||||
MachineOperand *KillMO = KillMI->findRegisterUseOperand(CurrLI->reg);
|
||||
if (KillMO)
|
||||
// It could be a dead def.
|
||||
KillMO->setIsKill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// RenumberValno - Split the given valno out into a new vreg, allowing it to
|
||||
|
@ -1102,7 +1120,7 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|||
return false; // Def is dead. Do nothing.
|
||||
|
||||
if ((SpillMI = FoldSpill(LI->reg, RC, DefMI, Barrier,
|
||||
BarrierMBB, SS, RefsInMBB))) {
|
||||
BarrierMBB, SS, RefsInMBB))) {
|
||||
SpillIndex = LIs->getInstructionIndex(SpillMI);
|
||||
} else {
|
||||
// Check if it's possible to insert a spill after the def MI.
|
||||
|
@ -1118,11 +1136,9 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|||
if (SpillPt == DefMBB->end())
|
||||
return false; // No gap to insert spill.
|
||||
}
|
||||
// Add spill. The store instruction kills the register if def is before
|
||||
// the barrier in the barrier block.
|
||||
// Add spill.
|
||||
SS = CreateSpillStackSlot(CurrLI->reg, RC);
|
||||
TII->storeRegToStackSlot(*DefMBB, SpillPt, CurrLI->reg,
|
||||
DefMBB == BarrierMBB, SS, RC);
|
||||
TII->storeRegToStackSlot(*DefMBB, SpillPt, CurrLI->reg, false, SS, RC);
|
||||
SpillMI = prior(SpillPt);
|
||||
LIs->InsertMachineInstrInMaps(SpillMI, SpillIndex);
|
||||
}
|
||||
|
@ -1150,7 +1166,7 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|||
LIs->getDefIndex(RestoreIndex));
|
||||
|
||||
ReconstructLiveInterval(CurrLI);
|
||||
|
||||
|
||||
if (!FoldedRestore) {
|
||||
LiveIndex RestoreIdx = LIs->getInstructionIndex(prior(RestorePt));
|
||||
RestoreIdx = LIs->getDefIndex(RestoreIdx);
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse2 -pre-alloc-split | FileCheck %s
|
||||
|
||||
@.str = private constant [28 x i8] c"\0A\0ADOUBLE D = %f\0A\00", align 1 ; <[28 x i8]*> [#uses=1]
|
||||
@.str1 = private constant [37 x i8] c"double to long l1 = %ld\09\09(0x%lx)\0A\00", align 8 ; <[37 x i8]*> [#uses=1]
|
||||
@.str2 = private constant [35 x i8] c"double to uint ui1 = %u\09\09(0x%x)\0A\00", align 8 ; <[35 x i8]*> [#uses=1]
|
||||
@.str3 = private constant [37 x i8] c"double to ulong ul1 = %lu\09\09(0x%lx)\0A\00", align 8 ; <[37 x i8]*> [#uses=1]
|
||||
|
||||
define i32 @main(i32 %argc, i8** nocapture %argv) nounwind ssp {
|
||||
; CHECK: movsd %xmm0, (%rsp)
|
||||
entry:
|
||||
%0 = icmp sgt i32 %argc, 4 ; <i1> [#uses=1]
|
||||
br i1 %0, label %bb, label %bb2
|
||||
|
||||
bb: ; preds = %entry
|
||||
%1 = getelementptr inbounds i8** %argv, i64 4 ; <i8**> [#uses=1]
|
||||
%2 = load i8** %1, align 8 ; <i8*> [#uses=1]
|
||||
%3 = tail call double @atof(i8* %2) nounwind ; <double> [#uses=1]
|
||||
br label %bb2
|
||||
|
||||
bb2: ; preds = %bb, %entry
|
||||
%storemerge = phi double [ %3, %bb ], [ 2.000000e+00, %entry ] ; <double> [#uses=4]
|
||||
%4 = fptoui double %storemerge to i32 ; <i32> [#uses=2]
|
||||
%5 = fptoui double %storemerge to i64 ; <i64> [#uses=2]
|
||||
%6 = fptosi double %storemerge to i64 ; <i64> [#uses=2]
|
||||
%7 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([28 x i8]* @.str, i64 0, i64 0), double %storemerge) nounwind ; <i32> [#uses=0]
|
||||
%8 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([37 x i8]* @.str1, i64 0, i64 0), i64 %6, i64 %6) nounwind ; <i32> [#uses=0]
|
||||
%9 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([35 x i8]* @.str2, i64 0, i64 0), i32 %4, i32 %4) nounwind ; <i32> [#uses=0]
|
||||
%10 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([37 x i8]* @.str3, i64 0, i64 0), i64 %5, i64 %5) nounwind ; <i32> [#uses=0]
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare double @atof(i8* nocapture) nounwind readonly
|
||||
|
||||
declare i32 @printf(i8* nocapture, ...) nounwind
|
Loading…
Reference in New Issue