From: Joey Gouly Date: Tue, 13 May 2014 15:42:45 +0000 (+0000) Subject: [CGP] r205941 changed the logic, so that a cast happens *before* 'Result' is X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=fdae312e65f6bf6a419c03878e2780826c4e91a5;p=oota-llvm.git [CGP] r205941 changed the logic, so that a cast happens *before* 'Result' is compared to 'AddrMode.BaseReg'. In the case that 'AddrMode.BaseReg' is nullptr, 'Result' will also be nullptr, so the cast causes an assertion. We should use dyn_cast_or_null here to check 'Result' is not null and it is an instruction. Bug found by Mats Petersson, and I reduced his IR to get a test case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208705 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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 +}