mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
ScalarEvolution: Do not keep temporary PHI values in ValueExprMap
Before this patch simplified SCEV expressions for PHI nodes were only returned the very first time getSCEV() was called, but later calls to getSCEV always returned the non-simplified value, which had "temporarily" been stored in the ValueExprMap, but was never removed and consequently blocked the caching of the simplified PHI expression. llvm-svn: 261485
This commit is contained in:
parent
ff9ee24191
commit
e896bbb2c0
@ -3897,6 +3897,11 @@ const SCEV *ScalarEvolution::createAddRecFromPHI(PHINode *PN) {
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the temporary PHI node SCEV that has been inserted while intending
|
||||
// to create an AddRecExpr for this PHI node. We can not keep this temporary
|
||||
// as it will prevent later (possibly simpler) SCEV expressions to be added
|
||||
// to the ValueExprMap.
|
||||
ValueExprMap.erase(PN);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -237,5 +237,31 @@ TEST_F(ScalarEvolutionsTest, SCEVMultiplyAddRecs) {
|
||||
EXPECT_EQ(Product->getOperand(8), SE.getAddExpr(Sum));
|
||||
}
|
||||
|
||||
TEST_F(ScalarEvolutionsTest, SimplifiedPHI) {
|
||||
FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context),
|
||||
std::vector<Type *>(), false);
|
||||
Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
|
||||
BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
|
||||
BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
|
||||
BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
|
||||
BranchInst::Create(LoopBB, EntryBB);
|
||||
BranchInst::Create(LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)),
|
||||
LoopBB);
|
||||
ReturnInst::Create(Context, nullptr, ExitBB);
|
||||
auto *Ty = Type::getInt32Ty(Context);
|
||||
auto *PN = PHINode::Create(Ty, 2, "", &*LoopBB->begin());
|
||||
PN->addIncoming(Constant::getNullValue(Ty), EntryBB);
|
||||
PN->addIncoming(UndefValue::get(Ty), LoopBB);
|
||||
ScalarEvolution SE = buildSE(*F);
|
||||
auto *S1 = SE.getSCEV(PN);
|
||||
auto *S2 = SE.getSCEV(PN);
|
||||
assert(isa<SCEVConstant>(S1) && "Expected a SCEV Constant");
|
||||
|
||||
// At some point, only the first call to getSCEV returned the simplified
|
||||
// SCEVConstant and later calls just returned a SCEVUnknown referencing the
|
||||
// PHI node.
|
||||
assert(S1 == S2 && "Expected identical SCEV values");
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
} // end namespace llvm
|
||||
|
Loading…
Reference in New Issue
Block a user