Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: src/IceTargetLoweringX8632.cpp

Issue 652633002: Subzero: Improve performance of liveness analysis and live range construction. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix non-debug build Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/IceTargetLoweringX8632.cpp
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
index 6829eeec8ddb4778b2f84853d8cefaf0fd62db76..f90f380d2f9c9784fdb903c73eabfcd1bd9ce7f5 100644
--- a/src/IceTargetLoweringX8632.cpp
+++ b/src/IceTargetLoweringX8632.cpp
@@ -453,8 +453,10 @@ Variable *TargetX8632::getPhysicalRegister(SizeT RegNum) {
PhysicalRegisters[RegNum] = Reg;
// Specially mark esp as an "argument" so that it is considered
// live upon function entry.
- if (RegNum == RegX8632::Reg_esp)
+ if (RegNum == RegX8632::Reg_esp) {
Func->addImplicitArg(Reg);
+ Reg->setIgnoreLiveness();
+ }
}
return Reg;
}
@@ -1259,9 +1261,8 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
// Because of the intra-block control flow, we need to fake a use
// of T_3 to prevent its earlier definition from being dead-code
// eliminated in the presence of its later definition.
jvoung (off chromium) 2014/10/13 20:50:50 Now that the fakeuse is removed, can the comment b
Jim Stichnoth 2014/10/13 23:15:22 Done.
- Context.insert(InstFakeUse::create(Func, T_3));
- _mov(T_3, T_2);
- _mov(T_2, Zero);
+ _mov_nonkillable(T_3, T_2);
+ _mov_nonkillable(T_2, Zero);
Context.insert(Label);
_mov(DestLo, T_2);
_mov(DestHi, T_3);
@@ -1295,9 +1296,8 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
// Because of the intra-block control flow, we need to fake a use
// of T_3 to prevent its earlier definition from being dead-code
// eliminated in the presence of its later definition.
- Context.insert(InstFakeUse::create(Func, T_2));
- _mov(T_2, T_3);
- _mov(T_3, Zero);
+ _mov_nonkillable(T_2, T_3);
+ _mov_nonkillable(T_3, Zero);
Context.insert(Label);
_mov(DestLo, T_2);
_mov(DestHi, T_3);
@@ -1331,8 +1331,7 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
// Because of the intra-block control flow, we need to fake a use
// of T_3 to prevent its earlier definition from being dead-code
// eliminated in the presence of its later definition.
- Context.insert(InstFakeUse::create(Func, T_2));
- _mov(T_2, T_3);
+ _mov_nonkillable(T_2, T_3);
_sar(T_3, SignExtend);
Context.insert(Label);
_mov(DestLo, T_2);
@@ -2515,10 +2514,9 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
if (HasC2) {
_br(TableFcmp[Index].C2, Label);
}
- Context.insert(InstFakeUse::create(Func, Dest));
Constant *NonDefault =
Ctx->getConstantInt32(IceType_i32, !TableFcmp[Index].Default);
- _mov(Dest, NonDefault);
+ _mov_nonkillable(Dest, NonDefault);
Context.insert(Label);
}
}
@@ -2674,8 +2672,7 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
_br(CondX86::Br_ne, Label);
_cmp(Src0HiRM, Src1HiRI);
_br(CondX86::Br_ne, Label);
- Context.insert(InstFakeUse::create(Func, Dest));
- _mov(Dest, (Condition == InstIcmp::Eq ? One : Zero));
+ _mov_nonkillable(Dest, (Condition == InstIcmp::Eq ? One : Zero));
Context.insert(Label);
} else {
InstX8632Label *LabelFalse = InstX8632Label::create(Func, this);
@@ -2687,8 +2684,7 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
_cmp(Src0LoRM, Src1LoRI);
_br(TableIcmp64[Index].C3, LabelTrue);
Context.insert(LabelFalse);
- Context.insert(InstFakeUse::create(Func, Dest));
- _mov(Dest, Zero);
+ _mov_nonkillable(Dest, Zero);
Context.insert(LabelTrue);
}
return;
@@ -2701,8 +2697,7 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
_cmp(Src0RM, Src1);
_mov(Dest, One);
_br(getIcmp32Mapping(Inst->getCondition()), Label);
- Context.insert(InstFakeUse::create(Func, Dest));
- _mov(Dest, Zero);
+ _mov_nonkillable(Dest, Zero);
Context.insert(Label);
}
@@ -3133,7 +3128,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
}
case Intrinsics::Stackrestore: {
Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
- _mov(esp, Instr->getArg(0));
+ _mov_nonkillable(esp, Instr->getArg(0));
return;
}
case Intrinsics::Trap:
@@ -3942,22 +3937,19 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
_mov(DestLo, SrcLoRI);
_mov(DestHi, SrcHiRI);
_br(CondX86::Br_ne, Label);
- Context.insert(InstFakeUse::create(Func, DestLo));
- Context.insert(InstFakeUse::create(Func, DestHi));
Operand *SrcFLo = loOperand(SrcF);
Operand *SrcFHi = hiOperand(SrcF);
SrcLoRI = legalize(SrcFLo, Legal_Reg | Legal_Imm);
SrcHiRI = legalize(SrcFHi, Legal_Reg | Legal_Imm);
- _mov(DestLo, SrcLoRI);
- _mov(DestHi, SrcHiRI);
+ _mov_nonkillable(DestLo, SrcLoRI);
+ _mov_nonkillable(DestHi, SrcHiRI);
} else {
_cmp(ConditionRM, Zero);
SrcT = legalize(SrcT, Legal_Reg | Legal_Imm);
_mov(Dest, SrcT);
_br(CondX86::Br_ne, Label);
- Context.insert(InstFakeUse::create(Func, Dest));
SrcF = legalize(SrcF, Legal_Reg | Legal_Imm);
- _mov(Dest, SrcF);
+ _mov_nonkillable(Dest, SrcF);
}
Context.insert(Label);
@@ -4298,9 +4290,22 @@ Variable *TargetX8632::makeReg(Type Type, int32_t RegNum) {
}
void TargetX8632::postLower() {
- if (Ctx->getOptLevel() != Opt_m1)
+ if (Ctx->getOptLevel() != Opt_m1) {
+ // Find non-SSA instructions where Dest==Src0, and set the
jvoung (off chromium) 2014/10/13 20:50:50 Add a note to clarify that this is for two-address
Jim Stichnoth 2014/10/13 23:15:22 Done.
+ // DestNonKillable flag to keep liveness analysis consistent.
+ for (Inst *Inst : Context) {
+ if (Inst->isDeleted())
+ continue;
+ if (Variable *Dest = Inst->getDest()) {
+ // TODO(stichnot): We may need to consider all source
+ // operands, not just the first one, if using 3-address
+ // instructions.
+ if (Inst->getSrcSize() > 0 && Inst->getSrc(0) == Dest)
+ Inst->setDestNonKillable();
+ }
+ }
return;
- TimerMarker T(TimerStack::TT_postLower, Func);
jvoung (off chromium) 2014/10/13 20:50:50 Is this removal intentional? Otherwise, you could
Jim Stichnoth 2014/10/13 23:15:22 Removed the enum value. I removed the TimerMarker
+ }
// TODO: Avoid recomputing WhiteList every instruction.
RegSetMask RegInclude = RegSet_All;
RegSetMask RegExclude = RegSet_StackPointer;

Powered by Google App Engine
This is Rietveld 408576698