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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2026-02-03
     Ever confirmed|0                           |1
          Component|tree-optimization           |target
             Status|UNCONFIRMED                 |NEW

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---

  <bb 13> [local count: 0]:
  # j_47 = PHI <j_21(18), 0(30)>
  # ivtmp_37 = PHI <ivtmp_13(18), 16(30)>
  _29 = c[j_47];
  pretmp_22 = d[j_47];
  iftmp.0_26 = (char) j_47;
  _10 = iftmp.0_26 + pretmp_22;
  _20 = pretmp_22 * 2;
  e_lsm.9_9 = _29 ? _10 : _20;

  <bb 5> [local count: 505088096]:
  # vectp_c.15_112 = PHI <vectp_c.15_113(11), &c(37)>
  # vect_vec_iv_.19_116 = PHI <_117(11), { 0, 1 }(37)>
  # vectp_d.21_119 = PHI <vectp_d.21_120(11), &d(37)>
  # ivtmp_132 = PHI <ivtmp_133(11), 0(37)>
  vect_iftmp.20_118 = (vector(2) char) vect_vec_iv_.19_116;
  vect__1.17_114 = MEM <vector(2) unsigned char> [(_Bool *)vectp_c.15_112];
  mask_patt_100.27_127 = vect__1.17_114 != { 0, 0 };
  vect_patt_101.28_129 = VEC_COND_EXPR <mask_patt_100.27_127, _128, { -1, -1
}>;
  vect_pretmp_50.23_121 = MEM <vector(2) char> [(char *)vectp_d.21_119];
  vect__28.25_123 = vect_pretmp_50.23_121 * { 2, 2 };
  vect_patt_99.26_124 = .COND_ADD (mask_patt_100.27_127, vect_iftmp.20_118,
vect_pretmp_50.23_121, vect__28.25_123);

does not look wrong to me.

  <bb 40> [local count: 63136012]:
  # vect_patt_99.26_125 = PHI <vect_patt_99.26_124(5)>
  # vect_patt_101.28_130 = PHI <vect_patt_101.28_129(5)>
  _131 = BIT_FIELD_REF <vect_patt_101.28_130, 64, 64>;
  prephitmp_108 = _131;
  _126 = BIT_FIELD_REF <vect_patt_99.26_125, 8, 8>;
  e_lsm.9_106 = _126;

that extracts the last lane from the vector(2) char.  Backend issue?

It work with the following, but the vectorization is the same:

int printf(const char *, ...);
long a;
long long b;
_Bool c[16];
char d[16];
char e;
int f = 1;
int __attribute__((noipa)) foo ()
{
  for (int j=0; j<16; j++) {
    e = (c[j] ? j : d[j]) + d[j];
    a = f * c[j] ?: ~0;
  }
  return (int)e;
}
int main() {
  for (long i=0; i<16; ++i)
    c[i] = 40;
  b = foo ();
  printf("%llu\n", b);
}

Reply via email to