mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 22:24:07 +00:00
ConstantInt has some getters which return ConstantInt's or ConstantVector's of
the value splatted into every element. Extend this to getTrue and getFalse which by providing new overloads that take Types that are either i1 or <N x i1>. Use it in InstCombine to add vector support to some code, fixing PR8469! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127116 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1915,10 +1915,10 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
// that code below can assume that Min != Max.
|
||||
if (!isa<Constant>(Op0) && Op0Min == Op0Max)
|
||||
return new ICmpInst(I.getPredicate(),
|
||||
ConstantInt::get(I.getContext(), Op0Min), Op1);
|
||||
ConstantInt::get(Op0->getType(), Op0Min), Op1);
|
||||
if (!isa<Constant>(Op1) && Op1Min == Op1Max)
|
||||
return new ICmpInst(I.getPredicate(), Op0,
|
||||
ConstantInt::get(I.getContext(), Op1Min));
|
||||
ConstantInt::get(Op1->getType(), Op1Min));
|
||||
|
||||
// Based on the range information we know about the LHS, see if we can
|
||||
// simplify this comparison. For example, (x&4) < 8 is always true.
|
||||
@ -1926,7 +1926,7 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
default: llvm_unreachable("Unknown icmp opcode!");
|
||||
case ICmpInst::ICMP_EQ: {
|
||||
if (Op0Max.ult(Op1Min) || Op0Min.ugt(Op1Max))
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
|
||||
// If all bits are known zero except for one, then we know at most one
|
||||
// bit is set. If the comparison is against zero, then this is a check
|
||||
@ -1963,7 +1963,7 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
}
|
||||
case ICmpInst::ICMP_NE: {
|
||||
if (Op0Max.ult(Op1Min) || Op0Min.ugt(Op1Max))
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
|
||||
// If all bits are known zero except for one, then we know at most one
|
||||
// bit is set. If the comparison is against zero, then this is a check
|
||||
@ -2000,9 +2000,9 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
}
|
||||
case ICmpInst::ICMP_ULT:
|
||||
if (Op0Max.ult(Op1Min)) // A <u B -> true if max(A) < min(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Min.uge(Op1Max)) // A <u B -> false if min(A) >= max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
|
||||
return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) {
|
||||
@ -2018,9 +2018,9 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
break;
|
||||
case ICmpInst::ICMP_UGT:
|
||||
if (Op0Min.ugt(Op1Max)) // A >u B -> true if min(A) > max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Max.ule(Op1Min)) // A >u B -> false if max(A) <= max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
|
||||
if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
|
||||
return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
|
||||
@ -2037,9 +2037,9 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
break;
|
||||
case ICmpInst::ICMP_SLT:
|
||||
if (Op0Max.slt(Op1Min)) // A <s B -> true if max(A) < min(C)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Min.sge(Op1Max)) // A <s B -> false if min(A) >= max(C)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
|
||||
return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) {
|
||||
@ -2050,9 +2050,9 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
break;
|
||||
case ICmpInst::ICMP_SGT:
|
||||
if (Op0Min.sgt(Op1Max)) // A >s B -> true if min(A) > max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Max.sle(Op1Min)) // A >s B -> false if max(A) <= min(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
|
||||
if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
|
||||
return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
|
||||
@ -2065,30 +2065,30 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
case ICmpInst::ICMP_SGE:
|
||||
assert(!isa<ConstantInt>(Op1) && "ICMP_SGE with ConstantInt not folded!");
|
||||
if (Op0Min.sge(Op1Max)) // A >=s B -> true if min(A) >= max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Max.slt(Op1Min)) // A >=s B -> false if max(A) < min(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
break;
|
||||
case ICmpInst::ICMP_SLE:
|
||||
assert(!isa<ConstantInt>(Op1) && "ICMP_SLE with ConstantInt not folded!");
|
||||
if (Op0Max.sle(Op1Min)) // A <=s B -> true if max(A) <= min(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Min.sgt(Op1Max)) // A <=s B -> false if min(A) > max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
break;
|
||||
case ICmpInst::ICMP_UGE:
|
||||
assert(!isa<ConstantInt>(Op1) && "ICMP_UGE with ConstantInt not folded!");
|
||||
if (Op0Min.uge(Op1Max)) // A >=u B -> true if min(A) >= max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Max.ult(Op1Min)) // A >=u B -> false if max(A) < min(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
break;
|
||||
case ICmpInst::ICMP_ULE:
|
||||
assert(!isa<ConstantInt>(Op1) && "ICMP_ULE with ConstantInt not folded!");
|
||||
if (Op0Max.ule(Op1Min)) // A <=u B -> true if max(A) <= min(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
if (Op0Min.ugt(Op1Max)) // A <=u B -> false if min(A) > max(B)
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
break;
|
||||
}
|
||||
|
||||
@ -2329,9 +2329,9 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
|
||||
default: break;
|
||||
case ICmpInst::ICMP_EQ:
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
|
||||
case ICmpInst::ICMP_NE:
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getContext()));
|
||||
return ReplaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
|
||||
case ICmpInst::ICMP_SGT:
|
||||
case ICmpInst::ICMP_SGE:
|
||||
return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
|
||||
|
Reference in New Issue
Block a user