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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-11-25
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |rsandifo at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
The issue here is that we see

t.ii:10:76: note:   ==> examining statement: _2 = x.val[j_22];
t.ii:10:76: note:   precomputed vectype: vector(4) long unsigned int
t.ii:10:76: note:   nunits = 4
t.ii:10:76: note:   ==> examining statement: _10 = (unsigned int) _1;
t.ii:10:76: note:   get vectype for scalar type: unsigned int
t.ii:10:76: note:   vectype: vector(8) unsigned int
t.ii:10:76: note:   nunits = 8
t.ii:10:76: note:   ==> examining statement: _14 = _2 << _10;
t.ii:10:76: note:   skip.
t.ii:10:76: note:   ==> examining pattern def stmt: patt_38 = _1 & 4294967295;
t.ii:10:76: note:   precomputed vectype: vector(4) long unsigned int
t.ii:10:76: note:   nunits = 4
t.ii:10:76: note:   ==> examining pattern statement: patt_37 = _2 << patt_38;
t.ii:10:76: note:   precomputed vectype: vector(4) long unsigned int
...
t.ii:10:76: note:   ==> examining statement: _16 = 61 - _10;
t.ii:10:76: note:   get vectype for scalar type: unsigned int
t.ii:10:76: note:   vectype: vector(8) unsigned int
t.ii:10:76: note:   nunits = 8
t.ii:10:76: note:   ==> examining statement: _17 = _2 >> _16;
t.ii:10:76: note:   skip.
t.ii:10:76: note:   ==> examining pattern def stmt: patt_36 = (long unsigned
int) _16;
t.ii:10:76: note:   precomputed vectype: vector(4) long unsigned int
t.ii:10:76: note:   get vectype for smallest scalar type: unsigned int
t.ii:10:76: note:   nunits vectype: vector(8) unsigned int
t.ii:10:76: note:   nunits = 8
t.ii:10:76: note:   ==> examining pattern statement: patt_35 = _2 >> patt_36;
t.ii:10:76: note:   precomputed vectype: vector(4) long unsigned int
t.ii:10:76: note:   nunits = 4

because

  <bb 3> [local count: 858993460]:
  # j_22 = PHI <0(2), j_12(5)>
  # ivtmp_40 = PHI <4(2), ivtmp_39(5)>
  _1 = SPECIALMUL.val[j_22];
  _2 = x.val[j_22];
  _10 = (unsigned int) _1;
  _14 = _2 << _10;
  _15 = _14 & 2305843009213693951;
  _16 = 61 - _10;
  _17 = _2 >> _16;
  _18 = _15 + _17;
  <retval>.val[j_22] = _18;
  j_12 = j_22 + 1;
  ivtmp_39 = ivtmp_40 - 1;
  if (ivtmp_39 == 0)
    goto <bb 4>; [25.00%]
  else
    goto <bb 5>; [75.00%]

so _10 is used twice and the 2nd shift argument isn't promoted to unsigned long
by any pattern (instead it was demoted earlier). Even if fixing that
in source there's vect_recog_over_widening_pattern undoing that:

t.ii:10:76: note:   vect_recog_over_widening_pattern: detected: xyz_10 = 61 -
_1;
t.ii:10:76: note:   demoting long unsigned int to unsigned int
t.ii:10:76: note:   created pattern stmt: patt_40 = 61 - patt_41;

:/

so it looks like those work against each other here.

Reply via email to