[PATCH] D28406: [InstCombine] icmp sgt (shl nsw X, C1), C0 --> icmp sgt X, C0 >> C1

bryant via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 17 23:28:19 PST 2017

bryant 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));
`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



More information about the llvm-commits mailing list