Index: llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp =================================================================== --- llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp +++ llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp @@ -220,6 +220,9 @@ // TODO: Consider accumulating the offset to the base. AAPtr = AAPtr->stripPointerCastsSameRepresentation(); AlignSCEV = SE->getSCEV(AlignOB.Inputs[1].get()); + // We only handle a simple constant (constant expressions not allowed). + if (!isa(AlignSCEV)) + return false; AlignSCEV = SE->getTruncateOrZeroExtend(AlignSCEV, Int64Ty); if (AlignOB.Inputs.size() == 3) OffSCEV = SE->getSCEV(AlignOB.Inputs[2].get()); Index: llvm/test/Transforms/AlignmentFromAssumptions/simple.ll =================================================================== --- llvm/test/Transforms/AlignmentFromAssumptions/simple.ll +++ llvm/test/Transforms/AlignmentFromAssumptions/simple.ll @@ -252,6 +252,21 @@ ; CHECK: ret i32 undef } +; Don't crash on constant expression. + +@g = global i32 0 + +define void @PR50978(i32* %arg) { +; CHECK-LABEL: @PR50978( +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[ARG:%.*]], i64 zext (i32 ptrtoint (i32* @g to i32) to i64)) ] +; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[ARG]], align 4 +; CHECK-NEXT: ret void +; + call void @llvm.assume(i1 true) [ "align"(i32* %arg, i64 zext (i32 ptrtoint (i32* @g to i32) to i64)) ] + load i32, i32* %arg + ret void +} + declare void @llvm.assume(i1) nounwind declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind