fix incorrect folding of icmp with undef, PR6481.

llvm-svn: 97659
This commit is contained in:
Chris Lattner 2010-03-03 19:46:03 +00:00
parent a529c25555
commit 3afc0721c7
3 changed files with 15 additions and 6 deletions

View File

@ -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.

View File

@ -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())

View File

@ -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
}