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);
}