Reorders two transforms that collide with each other
authorDavid Majnemer <david.majnemer@gmail.com>
Sun, 14 Apr 2013 21:15:43 +0000 (21:15 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sun, 14 Apr 2013 21:15:43 +0000 (21:15 +0000)
commit024d943bca85ee0b6bc1b9e5f13ec5276f16c13d
tree81479f985b66d217409d4160a4d0d47effb2b85c
parent687a9dfcb9a5f39e3252b2bd8d83642be02dc235
Reorders two transforms that collide with each other

One performs: (X == 13 | X == 14) -> X-13 <u 2
The other: (A == C1 || A == C2) -> (A & ~(C1 ^ C2)) == C1

The problem is that there are certain values of C1 and C2 that
trigger both transforms but the first one blocks out the second,
this generates suboptimal code.

Reordering the transforms should be better in every case and
allows us to do interesting stuff like turn:
  %shr = lshr i32 %X, 4
  %and = and i32 %shr, 15
  %add = add i32 %and, -14
  %tobool = icmp ne i32 %add, 0

into:
  %and = and i32 %X, 240
  %tobool = icmp ne i32 %and, 224

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179493 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
test/Transforms/InstCombine/icmp.ll
test/Transforms/InstCombine/load-cmp.ll
test/Transforms/InstCombine/or.ll