diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index d2559cf53d2..a6d8a68588d 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -2759,7 +2759,7 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr, // the original IR value was tossed in favor of a constant back when // the AddrMode was created we need to bail out gracefully if widths // do not match instead of extending it. - Instruction *I = dyn_cast(Result); + Instruction *I = dyn_cast_or_null(Result); if (I && (Result != AddrMode.BaseReg)) I->eraseFromParent(); return false; diff --git a/test/CodeGen/X86/codegen-prepare-crash.ll b/test/CodeGen/X86/codegen-prepare-crash.ll new file mode 100644 index 00000000000..c3288170cc4 --- /dev/null +++ b/test/CodeGen/X86/codegen-prepare-crash.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s +target triple = "x86_64-unknown-linux-gnu" + +@g = external global [10 x i32] + +define void @f(i32 %u) { + %1 = add i32 %u, 4 + br label %P.Proc8.exit + +P.Proc8.exit: + %valueindex35.i = getelementptr [10 x i32]* @g, i32 0, i32 %1 + store i32 %u, i32* %valueindex35.i + ret void +}