forked from OSchip/llvm-project
fix incorrect folding of icmp with undef, PR6481.
llvm-svn: 97659
This commit is contained in:
parent
a529c25555
commit
3afc0721c7
|
@ -194,11 +194,10 @@ Value *llvm::SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
|||
const Type *ITy = GetCompareTy(LHS);
|
||||
|
||||
// icmp X, X -> true/false
|
||||
if (LHS == RHS)
|
||||
// X icmp undef -> true/false. For example, icmp ugt %X, undef -> false
|
||||
// because X could be 0.
|
||||
if (LHS == RHS || isa<UndefValue>(RHS))
|
||||
return ConstantInt::get(ITy, CmpInst::isTrueWhenEqual(Pred));
|
||||
|
||||
if (isa<UndefValue>(RHS)) // X icmp undef -> undef
|
||||
return UndefValue::get(ITy);
|
||||
|
||||
// icmp <global/alloca*/null>, <global/alloca*/null> - Global/Stack value
|
||||
// addresses never equal each other! We already know that Op0 != Op1.
|
||||
|
|
|
@ -1818,7 +1818,7 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
|
|||
|
||||
// Handle some degenerate cases first
|
||||
if (isa<UndefValue>(C1) || isa<UndefValue>(C2))
|
||||
return UndefValue::get(ResultTy);
|
||||
return ConstantInt::get(ResultTy, CmpInst::isTrueWhenEqual(pred));
|
||||
|
||||
// No compile-time operations on this type yet.
|
||||
if (C1->getType()->isPPC_FP128Ty())
|
||||
|
|
|
@ -48,7 +48,7 @@ entry:
|
|||
%V = icmp eq <2 x i64> %x, undef
|
||||
ret <2 x i1> %V
|
||||
; CHECK: @test5
|
||||
; CHECK: ret <2 x i1> undef
|
||||
; CHECK: ret <2 x i1> <i1 true, i1 true>
|
||||
}
|
||||
|
||||
define i32 @test6(i32 %a, i32 %b) {
|
||||
|
@ -121,3 +121,13 @@ define i1 @test12(i1 %A) {
|
|||
; CHECK-NEXT: %B = select i1
|
||||
; CHECK-NEXT: ret i1 %B
|
||||
}
|
||||
|
||||
; PR6481
|
||||
define i1 @test13(i8 %X) nounwind readnone {
|
||||
entry:
|
||||
%cmp = icmp slt i8 undef, %X
|
||||
ret i1 %cmp
|
||||
; CHECK: @test13
|
||||
; CHECK: ret i1 false
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue