[PATCH] D28406: [InstCombine] icmp sgt (shl nsw X, C1), C0 --> icmp sgt X, C0 >> C1
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 18 07:30:10 PST 2017
spatel added inline comments.
================
Comment at: lib/Transforms/InstCombine/InstCombineCompares.cpp:1945
APInt ShiftedC = C->lshr(*ShiftAmt);
return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
}
----------------
bryant wrote:
> `Cmp.isEquality() || Pred == ICmpInst::ICMP_UGT` looks equivalent to `Pred == ICMP_UGE`. From memory, the unsigned counterparts only work with ugt and ule. It doesn't work with uge.
>
> ```
> Name: ugt
> %a = shl nsw i8 %x, C1
> %b = icmp ugt %a, C0
> =>
> %b = icmp ugt %x, (C0 >> C1)
>
> ----------------------------------------
> Optimization: ugt
> Done: 1
> Optimization is correct!
>
> Name: eq
> %a = shl nsw i8 %x, C1
> %b = icmp eq %a, C0
> =>
> %b = icmp eq %x, (C0 >> C1)
>
> ----------------------------------------
> Optimization: eq
> ERROR: Mismatch in values of i1 %b
> ```
>
> http://rise4fun.com/Alive/D1
Except that Cmp.isEquality() has nothing to do with ICMP_UGE:
static bool isEquality(Predicate P) {
return P == ICMP_EQ || P == ICMP_NE;
}
I'll take this as a suggestion to improve readability by spelling out the relevant predicates instead of using isEquality, but there is no functional change.
https://reviews.llvm.org/D28406
More information about the llvm-commits
mailing list