mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[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. llvm-svn: 208705
This commit is contained in:
parent
a2d476ba2a
commit
c0f94cb136
@ -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<Instruction>(Result);
|
||||
Instruction *I = dyn_cast_or_null<Instruction>(Result);
|
||||
if (I && (Result != AddrMode.BaseReg))
|
||||
I->eraseFromParent();
|
||||
return false;
|
||||
|
14
test/CodeGen/X86/codegen-prepare-crash.ll
Normal file
14
test/CodeGen/X86/codegen-prepare-crash.ll
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user