| Index: src/IceInst.cpp
|
| diff --git a/src/IceInst.cpp b/src/IceInst.cpp
|
| index 5a308d89eece5721e2c1ac0eef40f4f372946ec4..f6e8974fa1d1382dca082fe83b93bf50c1e0130f 100644
|
| --- a/src/IceInst.cpp
|
| +++ b/src/IceInst.cpp
|
| @@ -206,7 +206,7 @@ bool Inst::liveness(InstNumberT InstNumber, LivenessBV &Live,
|
| assert(!isDeleted());
|
|
|
| Dead = false;
|
| - if (Dest) {
|
| + if (Dest && !Dest->isRematerializable()) {
|
| SizeT VarNum = Liveness->getLiveIndex(Dest->getIndex());
|
| if (Live[VarNum]) {
|
| if (!isDestRedefined()) {
|
| @@ -227,6 +227,8 @@ bool Inst::liveness(InstNumberT InstNumber, LivenessBV &Live,
|
| bool IsPhi = llvm::isa<InstPhi>(this);
|
| resetLastUses();
|
| FOREACH_VAR_IN_INST(Var, *this) {
|
| + if (Var->isRematerializable())
|
| + continue;
|
| SizeT VarNum = Liveness->getLiveIndex(Var->getIndex());
|
| if (!Live[VarNum]) {
|
| setLastUse(IndexOfVarInInst(Var));
|
| @@ -411,10 +413,12 @@ void InstPhi::livenessPhiOperand(LivenessBV &Live, CfgNode *Target,
|
| for (SizeT I = 0; I < getSrcSize(); ++I) {
|
| if (Labels[I] == Target) {
|
| if (auto *Var = llvm::dyn_cast<Variable>(getSrc(I))) {
|
| - SizeT SrcIndex = Liveness->getLiveIndex(Var->getIndex());
|
| - if (!Live[SrcIndex]) {
|
| - setLastUse(I);
|
| - Live[SrcIndex] = true;
|
| + if (!Var->isRematerializable()) {
|
| + SizeT SrcIndex = Liveness->getLiveIndex(Var->getIndex());
|
| + if (!Live[SrcIndex]) {
|
| + setLastUse(I);
|
| + Live[SrcIndex] = true;
|
| + }
|
| }
|
| }
|
| return;
|
|
|