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

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |NEW
                 CC|                            |rguenth at gcc dot gnu.org
          Component|target                      |tree-optimization
           Assignee|ubizjak at gmail dot com           |unassigned at gcc dot 
gnu.org

--- Comment #10 from Uroš Bizjak <ubizjak at gmail dot com> ---
Actually, the problem already starts with tree Early-VRP pass. Consider
following testcase:

int foo (int x)
{
  return __builtin_ctz (x) & 0x1f;
}


And these definitions in i386.h:

/* The value at zero is only defined for the BMI instructions
   LZCNT and TZCNT, not the BSR/BSF insns in the original isa.  */
#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
        ((VALUE) = GET_MODE_BITSIZE (MODE), TARGET_BMI ? 1 : 0)
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
        ((VALUE) = GET_MODE_BITSIZE (MODE), TARGET_LZCNT ? 1 : 0)

compile with gcc -O2 -mbmi, _.evrp dump shows:

Value ranges after Early VRP:

x.0_1: [0, +INF]
_2: [0, 31]
x_3(D): VARYING
_4: [0, 31]


foo (int x)
{
  unsigned int x.0_1;
  int _2;
  int _4;

  <bb 2>:
  x.0_1 = (unsigned int) x_3(D);
  _2 = __builtin_ctz (x.0_1);
  _4 = _2;
  return _4;

}

It looks that VRP pass doesn't account for CTZ_DEFINED_VALUE_AT_ZERO and
blindly assumes undefined value at zero.

Unassign and recategorize PR as tree optimization problem.

Reply via email to