[PATCH] D53844: [InstSimplify] fold icmp based on range of abs/nabs

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 29 15:46:11 PDT 2018


spatel created this revision.
spatel added reviewers: craig.topper, lebedev.ri, RKSimon.
Herald added a subscriber: mcrosier.

This is a fix for PR39475:
https://bugs.llvm.org/show_bug.cgi?id=39475

We managed to get some of these patterns using the computeKnownBits logic in https://reviews.llvm.org/D47041, but I don't think that can be used for nabs().
Instead, put in some range-based logic, so we can fold both abs/nabs with icmp with a constant value.

Alive proofs:
https://rise4fun.com/Alive/21r

  Name: abs_nsw_is_positive
    %cmp = icmp slt i32 %x, 0
    %negx = sub nsw i32 0, %x
    %abs = select i1 %cmp, i32 %negx, i32 %x
    %r = icmp sgt i32 %abs, -1
      =>
    %r = i1 true
   
  Name: abs_nsw_is_not_negative
    %cmp = icmp slt i32 %x, 0
    %negx = sub nsw i32 0, %x
    %abs = select i1 %cmp, i32 %negx, i32 %x
    %r = icmp slt i32 %abs, 0
      =>
    %r = i1 false
   
  Name: nabs_is_negative_or_0
    %cmp = icmp slt i32 %x, 0
    %negx = sub i32 0, %x
    %nabs = select i1 %cmp, i32 %x, i32 %negx
    %r = icmp slt i32 %nabs, 1
      =>
    %r = i1 true
  
  Name: nabs_is_not_over_0
    %cmp = icmp slt i32 %x, 0
    %negx = sub i32 0, %x
    %nabs = select i1 %cmp, i32 %x, i32 %negx
    %r = icmp sgt i32 %nabs, 0
      =>
    %r = i1 false
   


https://reviews.llvm.org/D53844

Files:
  lib/Analysis/InstructionSimplify.cpp
  test/Transforms/InstSimplify/icmp-abs-nabs.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53844.171597.patch
Type: text/x-patch
Size: 10163 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181029/e1abd22f/attachment.bin>


More information about the llvm-commits mailing list