Index: llvm/lib/Transforms/IPO/FunctionSpecialization.cpp =================================================================== --- llvm/lib/Transforms/IPO/FunctionSpecialization.cpp +++ llvm/lib/Transforms/IPO/FunctionSpecialization.cpp @@ -674,7 +674,7 @@ auto *V = CS.getArgOperand(A->getArgNo()); // TrackValueOfGlobalVariable only tracks scalar global variables. if (auto *GV = dyn_cast(V)) - if (!GV->getValueType()->isSingleValueType()) + if (!GV->isConstant() || !GV->getValueType()->isSingleValueType()) return false; if (isa(V) && (Solver.getLatticeValueFor(V).isConstant() || Index: llvm/test/Transforms/FunctionSpecialization/function-specialization-nonconst-glob.ll =================================================================== --- llvm/test/Transforms/FunctionSpecialization/function-specialization-nonconst-glob.ll +++ llvm/test/Transforms/FunctionSpecialization/function-specialization-nonconst-glob.ll @@ -17,7 +17,7 @@ ; CHECK-NEXT: [[CALL:%.*]] = call i32 @foo.1(i32 [[X]], i32* @A) ; CHECK-NEXT: br label [[RETURN:%.*]] ; CHECK: if.else: -; CHECK-NEXT: [[CALL1:%.*]] = call i32 @foo.2(i32 [[Y:%.*]], i32* @B) +; CHECK-NEXT: [[CALL1:%.*]] = call i32 @foo(i32 [[Y:%.*]], i32* @B) ; CHECK-NEXT: br label [[RETURN]] ; CHECK: return: ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL]], [[IF_THEN]] ], [ [[CALL1]], [[IF_ELSE]] ] @@ -60,9 +60,4 @@ ; CHECK-NEXT: ret i32 %add ; CHECK-NEXT: } -; CHECK-LABEL: define internal i32 @foo.2(i32 %x, i32* %b) { -; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = load i32, i32* @B, align 4 -; CHECK-NEXT: %add = add nsw i32 %x, %0 -; CHECK-NEXT: ret i32 %add -; CHECK-NEXT: } +; CHECK-NOT: define internal i32 @foo.2(