diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp --- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp +++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp @@ -1539,11 +1539,8 @@ return (void)markOverdefined(&I); } - Constant *Ptr = Operands[0]; - auto Indices = ArrayRef(Operands.begin() + 1, Operands.end()); - Constant *C = - ConstantExpr::getGetElementPtr(I.getSourceElementType(), Ptr, Indices); - markConstant(&I, C); + if (Constant *C = ConstantFoldInstOperands(&I, Operands, DL)) + markConstant(&I, C); } void SCCPInstVisitor::visitStoreInst(StoreInst &SI) { diff --git a/llvm/test/Transforms/SCCP/vscale-gep.ll b/llvm/test/Transforms/SCCP/vscale-gep.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/SCCP/vscale-gep.ll @@ -0,0 +1,11 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -passes=sccp -S | FileCheck %s + +define ptr @scalable_vector_getelementptr(i64 %x) { +; CHECK-LABEL: @scalable_vector_getelementptr( +; CHECK-NEXT: [[PTR:%.*]] = getelementptr , ptr null, i64 1 +; CHECK-NEXT: ret ptr [[PTR]] +; + %ptr = getelementptr , ptr null, i64 1 + ret ptr %ptr +}