diff --git a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp --- a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp +++ b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp @@ -55,7 +55,6 @@ #include "llvm/Analysis/ValueLattice.h" #include "llvm/Analysis/ValueLatticeUtils.h" #include "llvm/Analysis/ValueTracking.h" -#include "llvm/IR/ConstantFold.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/Transforms/Scalar/SCCP.h" #include "llvm/Transforms/Utils/Cloning.h" @@ -260,7 +259,7 @@ } Constant *InstCostVisitor::visitGetElementPtrInst(GetElementPtrInst &I) { - SmallVector Operands; + SmallVector Operands; Operands.reserve(I.getNumOperands()); for (unsigned Idx = 0, E = I.getNumOperands(); Idx != E; ++Idx) { @@ -273,10 +272,8 @@ Operands.push_back(C); } - auto *Ptr = cast(Operands[0]); - auto Ops = ArrayRef(Operands.begin() + 1, Operands.end()); - return ConstantFoldGetElementPtr(I.getSourceElementType(), Ptr, - I.isInBounds(), std::nullopt, Ops); + auto Ops = ArrayRef(Operands.begin(), Operands.end()); + return ConstantFoldInstOperands(&I, Ops, DL); } Constant *InstCostVisitor::visitSelectInst(SelectInst &I) { diff --git a/llvm/unittests/Transforms/IPO/FunctionSpecializationTest.cpp b/llvm/unittests/Transforms/IPO/FunctionSpecializationTest.cpp --- a/llvm/unittests/Transforms/IPO/FunctionSpecializationTest.cpp +++ b/llvm/unittests/Transforms/IPO/FunctionSpecializationTest.cpp @@ -281,8 +281,8 @@ Ref = getInstCost(Gep) + getInstCost(Load) + getInstCost(Freeze) + getInstCost(Smax); Bonus = Specializer.getSpecializationBonus(F->getArg(2), GV, Visitor); - EXPECT_NE(Bonus, Ref); - EXPECT_FALSE(Bonus > 0); + EXPECT_EQ(Bonus, Ref); + EXPECT_TRUE(Bonus > 0); Bonus = Specializer.getSpecializationBonus(F->getArg(3), Undef, Visitor); EXPECT_TRUE(Bonus == 0);