mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-21 03:32:21 +00:00
InstCombine: Fix an edge case where constant icmps could sneak into ConstantFoldInstOperands and crash.
Have to refactor the ConstantFolder interface one day to define bugs like this away. Fixes PR14131. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166374 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bf8772ed2c
commit
82a1833865
@ -333,6 +333,10 @@ static Value *SimplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp,
|
|||||||
|
|
||||||
// All operands were constants, fold it.
|
// All operands were constants, fold it.
|
||||||
if (ConstOps.size() == I->getNumOperands()) {
|
if (ConstOps.size() == I->getNumOperands()) {
|
||||||
|
if (CmpInst *C = dyn_cast<CmpInst>(I))
|
||||||
|
return ConstantFoldCompareInstOperands(C->getPredicate(), ConstOps[0],
|
||||||
|
ConstOps[1], TD, TLI);
|
||||||
|
|
||||||
if (LoadInst *LI = dyn_cast<LoadInst>(I))
|
if (LoadInst *LI = dyn_cast<LoadInst>(I))
|
||||||
if (!LI->isVolatile())
|
if (!LI->isVolatile())
|
||||||
return ConstantFoldLoadFromConstPtr(ConstOps[0], TD);
|
return ConstantFoldLoadFromConstPtr(ConstOps[0], TD);
|
||||||
|
@ -829,3 +829,37 @@ define i1 @test63(i1 %A, i1 %B) {
|
|||||||
; CHECK: %C = or i1 %B, %not
|
; CHECK: %C = or i1 %B, %not
|
||||||
; CHECK: ret i1 %C
|
; CHECK: ret i1 %C
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; PR14131
|
||||||
|
define void @test64(i32 %p, i16 %b) noreturn nounwind {
|
||||||
|
entry:
|
||||||
|
%p.addr.0.insert.mask = and i32 %p, -65536
|
||||||
|
%conv2 = and i32 %p, 65535
|
||||||
|
br i1 undef, label %lor.rhs, label %lor.end
|
||||||
|
|
||||||
|
lor.rhs:
|
||||||
|
%p.addr.0.extract.trunc = trunc i32 %p.addr.0.insert.mask to i16
|
||||||
|
%phitmp = zext i16 %p.addr.0.extract.trunc to i32
|
||||||
|
br label %lor.end
|
||||||
|
|
||||||
|
lor.end:
|
||||||
|
%t.1 = phi i32 [ 0, %entry ], [ %phitmp, %lor.rhs ]
|
||||||
|
%conv6 = zext i16 %b to i32
|
||||||
|
%div = udiv i32 %conv6, %t.1
|
||||||
|
%tobool8 = icmp eq i32 %div, 0
|
||||||
|
%cmp = icmp eq i32 %t.1, 0
|
||||||
|
%cmp12 = icmp ult i32 %conv2, 2
|
||||||
|
%cmp.sink = select i1 %tobool8, i1 %cmp12, i1 %cmp
|
||||||
|
br i1 %cmp.sink, label %cond.end17, label %cond.false16
|
||||||
|
|
||||||
|
cond.false16:
|
||||||
|
br label %cond.end17
|
||||||
|
|
||||||
|
cond.end17:
|
||||||
|
br label %while.body
|
||||||
|
|
||||||
|
while.body:
|
||||||
|
br label %while.body
|
||||||
|
; CHECK: @test64
|
||||||
|
; CHECK-NOT: select
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user