[llvm-dev] failing to optimize boolean ops on cmps
Daniel Berlin via llvm-dev
llvm-dev at lists.llvm.org
Thu Jul 13 16:10:54 PDT 2017
On Thu, Jul 13, 2017 at 2:12 PM, Sanjay Patel <spatel at rotateright.com>
wrote:
> We have several optimizations in InstCombine for bitwise logic ops
> (and/or/xor) that fail to handle compare patterns with the equivalent
> bitwise logic. Example:
>
> define i8 @or_and_not(i8 %a, i8 %b) {
> %nota = xor i8 %a, -1
> %and = and i8 %nota, %b
> %res = or i8 %and, %a
> ret i8 %res
> }
>
> define i1 @or_and_cmp_not(i32 %a, i32 %b, i1 %c) {
> %cmp = icmp sgt i32 %a, %b
> %cmp_inv = icmp sle i32 %a, %b ; this is 'not' of %cmp
> %and = and i1 %c, %cmp_inv
> %res = or i1 %cmp, %and
> ret i1 %res
> }
>
> $ ./opt -instcombine hidden_not.ll -S
>
> define i8 @or_and_not(i8 %a, i8 %b) {
> %res = or i8 %b, %a
> ret i8 %res
> }
>
> define i1 @or_and_cmp_not(i32 %a, i32 %b, i1 %c) {
> %cmp = icmp sgt i32 %a, %b
> %cmp_inv = icmp sle i32 %a, %b
> %and = and i1 %cmp_inv, %c
> %res = or i1 %cmp, %and
> ret i1 %res
> }
>
> ---------------------------------------------------------------------
>
> Would adding to the existing InstCombine logic folds to handle this kind
> of pattern be a welcome enhancement? I don't know if it's possible to make
> the matchers handle this case without adding a new matcher. Eg:
>
>
I would rather see this added to instsimplify than instcombine.
If you do that, GVN/et all will get this already.
This probably does require a special matcher though:
We have:
if (m_c_And(m_Cmp(Pred, m_Value(), m_Value()),
m_Cmp(Pred, m_Value(), m_Value()))
and you really want:
if (m_c_And(m_Cmp(Pred, m_Value(), m_Value()),
m_Cmp(m_Opposite(Pred), m_Value(), m_Value()))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170713/c715aa5d/attachment.html>
More information about the llvm-dev
mailing list