Res = ConstantExpr::getSub(Res, CE->getOperand(1));
Res = ConstantExpr::getIntToPtr(Res, ResTy);
if (auto *ResCE = dyn_cast<ConstantExpr>(Res))
- Res = ConstantFoldConstantExpression(ResCE, DL, TLI);
+ if (auto *FoldedRes =
+ ConstantFoldConstantExpression(ResCE, DL, TLI))
+ Res = FoldedRes;
return Res;
}
}
return nullptr;
// Fold the PHI's operands.
if (auto *NewC = dyn_cast<ConstantExpr>(C))
- C = ConstantFoldConstantExpression(NewC, DL, TLI);
+ if (auto *FoldedC = ConstantFoldConstantExpression(NewC, DL, TLI))
+ C = FoldedC;
// If the incoming value is a different constant to
// the one we saw previously, then give up.
if (CommonValue && C != CommonValue)
for (const Use &OpU : I->operands()) {
auto *Op = cast<Constant>(&OpU);
// Fold the Instruction's operands.
- if (auto *NewCE = dyn_cast<ConstantExpr>(Op)) {
- auto *FoldedOp = ConstantFoldConstantExpression(NewCE, DL, TLI);
- if (!FoldedOp)
- return nullptr;
- Op = FoldedOp;
- }
+ if (auto *NewCE = dyn_cast<ConstantExpr>(Op))
+ if (auto *FoldedOp = ConstantFoldConstantExpression(NewCE, DL, TLI))
+ Op = FoldedOp;
Ops.push_back(Op);
}
namespace {
-Constant *
-ConstantFoldConstantExpressionImpl(const ConstantExpr *CE, const DataLayout &DL,
- const TargetLibraryInfo *TLI,
- SmallPtrSetImpl<ConstantExpr *> &FoldedOps) {
+Constant *ConstantFoldConstantExpressionImpl(
+ const ConstantExpr *CE, const DataLayout &DL, const TargetLibraryInfo *TLI,
+ SmallDenseMap<ConstantExpr *, Constant *> &FoldedOps) {
SmallVector<Constant *, 8> Ops;
for (const Use &NewU : CE->operands()) {
auto *NewC = cast<Constant>(&NewU);
// Recursively fold the ConstantExpr's operands. If we have already folded
// a ConstantExpr, we don't have to process it again.
if (auto *NewCE = dyn_cast<ConstantExpr>(NewC)) {
- if (FoldedOps.insert(NewCE).second){
- auto *FoldedC =
- ConstantFoldConstantExpressionImpl(NewCE, DL, TLI, FoldedOps);
- if (!FoldedC)
- return nullptr;
- NewC = FoldedC;
+ auto It = FoldedOps.find(NewCE);
+ if (It == FoldedOps.end()) {
+ if (auto *FoldedC =
+ ConstantFoldConstantExpressionImpl(NewCE, DL, TLI, FoldedOps)) {
+ NewC = FoldedC;
+ FoldedOps.insert({NewCE, FoldedC});
+ } else {
+ FoldedOps.insert({NewCE, NewCE});
+ }
+ } else {
+ NewC = It->second;
}
}
Ops.push_back(NewC);
Constant *llvm::ConstantFoldConstantExpression(const ConstantExpr *CE,
const DataLayout &DL,
const TargetLibraryInfo *TLI) {
- SmallPtrSet<ConstantExpr *, 4> FoldedOps;
+ SmallDenseMap<ConstantExpr *, Constant *> FoldedOps;
return ConstantFoldConstantExpressionImpl(CE, DL, TLI, FoldedOps);
}