mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
fix PR4837, some bugs folding vector compares. These
return a vector of i1, not i1 itself. llvm-svn: 80761
This commit is contained in:
parent
140720ab83
commit
8bb351e2c2
@ -5779,9 +5779,9 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
||||
|
||||
// Fold trivial predicates.
|
||||
if (I.getPredicate() == FCmpInst::FCMP_FALSE)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(*Context));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::get(I.getType(), 0));
|
||||
if (I.getPredicate() == FCmpInst::FCMP_TRUE)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(*Context));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::get(I.getType(), 1));
|
||||
|
||||
// Simplify 'fcmp pred X, X'
|
||||
if (Op0 == Op1) {
|
||||
@ -5790,11 +5790,11 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
||||
case FCmpInst::FCMP_UEQ: // True if unordered or equal
|
||||
case FCmpInst::FCMP_UGE: // True if unordered, greater than, or equal
|
||||
case FCmpInst::FCMP_ULE: // True if unordered, less than, or equal
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(*Context));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::get(I.getType(), 1));
|
||||
case FCmpInst::FCMP_OGT: // True if ordered and greater than
|
||||
case FCmpInst::FCMP_OLT: // True if ordered and less than
|
||||
case FCmpInst::FCMP_ONE: // True if ordered and operands are unequal
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(*Context));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::get(I.getType(), 0));
|
||||
|
||||
case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
|
||||
case FCmpInst::FCMP_ULT: // True if unordered or less than
|
||||
@ -5817,7 +5817,7 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
||||
}
|
||||
|
||||
if (isa<UndefValue>(Op1)) // fcmp pred X, undef -> undef
|
||||
return ReplaceInstUsesWith(I, UndefValue::get(Type::getInt1Ty(*Context)));
|
||||
return ReplaceInstUsesWith(I, UndefValue::get(I.getType()));
|
||||
|
||||
// Handle fcmp with constant RHS
|
||||
if (Constant *RHSC = dyn_cast<Constant>(Op1)) {
|
||||
@ -5885,11 +5885,11 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
|
||||
// icmp X, X
|
||||
if (Op0 == Op1)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::get(Type::getInt1Ty(*Context),
|
||||
return ReplaceInstUsesWith(I, ConstantInt::get(I.getType(),
|
||||
I.isTrueWhenEqual()));
|
||||
|
||||
if (isa<UndefValue>(Op1)) // X icmp undef -> undef
|
||||
return ReplaceInstUsesWith(I, UndefValue::get(Type::getInt1Ty(*Context)));
|
||||
return ReplaceInstUsesWith(I, UndefValue::get(I.getType()));
|
||||
|
||||
// icmp <global/alloca*/null>, <global/alloca*/null> - Global/Stack value
|
||||
// addresses never equal each other! We already know that Op0 != Op1.
|
||||
|
@ -28,3 +28,9 @@ entry:
|
||||
ret i32 %1
|
||||
}
|
||||
|
||||
; PR4837
|
||||
define <2 x i1> @test5(<2 x i64> %x) {
|
||||
entry:
|
||||
%V = icmp eq <2 x i64> %x, undef
|
||||
ret <2 x i1> %V
|
||||
}
|
Loading…
Reference in New Issue
Block a user