Index: src/IceTargetLoweringX8632.cpp |
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp |
index 17bc8cc6b103df60159e72755c62d8cf548d3cd8..999556ea7cef12a2bef88c06e4813039a192ae40 100644 |
--- a/src/IceTargetLoweringX8632.cpp |
+++ b/src/IceTargetLoweringX8632.cpp |
@@ -316,6 +316,8 @@ TargetX8632::TargetX8632(Cfg *Func) |
void TargetX8632::translateO2() { |
TimerMarker T(TimerStack::TT_O2, Func); |
+ initFakeKilledScratchRegisters(); |
+ |
if (!Ctx->getFlags().PhiEdgeSplit) { |
// Lower Phi instructions. |
Func->placePhiLoads(); |
@@ -411,6 +413,9 @@ void TargetX8632::translateO2() { |
void TargetX8632::translateOm1() { |
TimerMarker T(TimerStack::TT_Om1, Func); |
+ |
+ initFakeKilledScratchRegisters(); |
+ |
Func->placePhiLoads(); |
if (Func->hasError()) |
return; |
@@ -1869,12 +1874,9 @@ void TargetX8632::lowerCall(const InstCall *Instr) { |
} |
// Insert a register-kill pseudo instruction. |
- VarList KilledRegs; |
- for (SizeT i = 0; i < ScratchRegs.size(); ++i) { |
- if (ScratchRegs[i]) |
- KilledRegs.push_back(Func->getTarget()->getPhysicalRegister(i)); |
- } |
- Context.insert(InstFakeKill::create(Func, KilledRegs, NewCall)); |
+ assert(!FakeKilledScratchRegisters.empty()); |
+ Context.insert( |
+ InstFakeKill::create(Func, FakeKilledScratchRegisters, NewCall)); |
// Generate a FakeUse to keep the call live if necessary. |
if (Instr->hasSideEffects() && ReturnReg) { |
@@ -4540,8 +4542,7 @@ void TargetX8632::postLower() { |
// allocator, for example compute live ranges only for pre-colored |
// and infinite-weight variables and run the existing linear-scan |
// allocator. |
- if (llvm::isa<InstFakeKill>(Inst)) |
- continue; |
+ assert(!llvm::isa<InstFakeKill>(Inst) || Inst->getSrcSize() == 0); |
for (SizeT SrcNum = 0; SrcNum < Inst->getSrcSize(); ++SrcNum) { |
Operand *Src = Inst->getSrc(SrcNum); |
SizeT NumVars = Src->getNumVars(); |
@@ -4563,9 +4564,6 @@ void TargetX8632::postLower() { |
FreedRegisters.reset(); |
if (Inst->isDeleted()) |
continue; |
- // Skip FakeKill instructions like above. |
- if (llvm::isa<InstFakeKill>(Inst)) |
- continue; |
// Iterate over all variables referenced in the instruction, |
// including the Dest variable (if any). If the variable is |
// marked as infinite-weight, find it a register. If this |
@@ -4579,6 +4577,8 @@ void TargetX8632::postLower() { |
SizeT NumSrcs = Inst->getSrcSize(); |
if (Dest) |
++NumSrcs; |
+ if (NumSrcs == 0) |
+ continue; |
OperandList Srcs(NumSrcs); |
for (SizeT i = 0; i < Inst->getSrcSize(); ++i) |
Srcs[i] = Inst->getSrc(i); |