Index: llvm/lib/Transforms/IPO/FunctionSpecialization.cpp =================================================================== --- llvm/lib/Transforms/IPO/FunctionSpecialization.cpp +++ llvm/lib/Transforms/IPO/FunctionSpecialization.cpp @@ -276,6 +276,7 @@ std::function GetTLI; SmallPtrSet SpecializedFuncs; + SmallVector ReplacedWithConstant; public: FunctionSpecializer(SCCPSolver &Solver, @@ -320,6 +321,15 @@ return Changed; } + void removeDeadInstructions() { + for (auto *I : ReplacedWithConstant) { + LLVM_DEBUG(dbgs() << "FnSpecialization: Removing dead instruction " + << *I << "\n"); + I->eraseFromParent(); + } + ReplacedWithConstant.clear(); + } + bool tryToReplaceWithConstant(Value *V) { if (!V->getType()->isSingleValueType() || isa(V) || V->user_empty()) @@ -330,6 +340,10 @@ return false; auto *Const = isConstant(IV) ? Solver.getConstant(IV) : UndefValue::get(V->getType()); + + LLVM_DEBUG(dbgs() << "FnSpecialization: Replacing " << *V + << "\nFnSpecialization: with " << *Const << "\n"); + V->replaceAllUsesWith(Const); for (auto *U : Const->users()) @@ -340,7 +354,7 @@ // Remove the instruction from Block and Solver. if (auto *I = dyn_cast(V)) { if (I->isSafeToRemove()) { - I->eraseFromParent(); + ReplacedWithConstant.push_back(I); Solver.removeLatticeValueFor(I); } } @@ -886,7 +900,8 @@ Changed = true; } - // Clean up the IR by removing ssa_copy intrinsics. + // Clean up the IR by removing dead instructions and ssa_copy intrinsics. + FS.removeDeadInstructions(); removeSSACopy(M); return Changed; }