[InstCombine] Optimize icmp slt signum(x), 1 --> icmp slt x, 1
authorSanjoy Das <sanjoy@playingwithpointers.com>
Wed, 16 Sep 2015 20:41:29 +0000 (20:41 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Wed, 16 Sep 2015 20:41:29 +0000 (20:41 +0000)
commit907ab6ac2a02de3febf3bdd6160302f19322a9cb
treeeaceaa014b21f63dad543cfceff69b26f2bfc48a
parent66ef931b4346fdd73f82f6d6c24391f2ef923943
[InstCombine] Optimize icmp slt signum(x), 1 --> icmp slt x, 1

Summary:
`signum(x)` is sometimes implemented as `(x >> 63) | (-x >>> 63)` (for
an `i64` `x`).  This change adds a matcher for that pattern, and an
instcombine rule to optimize `signum(x) s< 1`.

Later, we can also consider optimizing:

  icmp slt signum(x), 0 --> icmp slt x, 0
  icmp sle signum(x), 1 --> true

etc.

Reviewers: majnemer

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D12703

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247846 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/IR/PatternMatch.h
lib/Transforms/InstCombine/InstCombineCompares.cpp
test/Transforms/InstCombine/compare-signs.ll