[Bug tree-optimization/85758] New: questionable bitwise folding (missing single use check?)

amonakov at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat May 12 10:51:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85758

            Bug ID: 85758
           Summary: questionable bitwise folding (missing single use
                    check?)
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: amonakov at gcc dot gnu.org
  Target Milestone: ---

The following should be translated as-is:

void f(int a, int b);
void g(int a, int b, int m, int s)
{
    m &= s;
    a += m;
    m ^= s;
    b += m;
    f(a, b);
}

However instead of and/add/xor/add we get mov/not/and/and/add/add:

        movl    %edx, %eax
        notl    %edx
        andl    %ecx, %eax
        andl    %edx, %ecx
        addl    %eax, %edi
        addl    %ecx, %esi
        jmp     f

This is because forwprop applies an identity to m = (m & s) ^ s:

g (int a, int b, int m, int s)
{
  <bb 2> :
  m_3 = m_1(D) & s_2(D);
  a_5 = a_4(D) + m_3;
  m_6 = m_3 ^ s_2(D);
  b_8 = b_7(D) + m_6;
  f (a_5, b_8);
  return;
}

gimple_simplified to _11 = ~m_1(D);
m_6 = s_2(D) & _11;
g (int a, int b, int m, int s)
{
  int _11;

  <bb 2> :
  m_3 = m_1(D) & s_2(D);
  a_5 = m_3 + a_4(D);
  _11 = ~m_1(D);
  m_6 = s_2(D) & _11;
  b_8 = m_6 + b_7(D);
  f (a_5, b_8);
  return;
}

However since m_3 is used, this is more costly. Shouldn't this folding check
for single use of the intermediate expr? From a quick look, this is probably
match.pd:/* Fold (X & Y) ^ Y and (X ^ Y) & Y as ~X & Y.  */


More information about the Gcc-bugs mailing list