https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56118
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |rguenth at gcc dot gnu.org
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
From the dup:
Confirmed. Note that with the existing way of doing this (BIT_FIELD_REF on the
LHS) it's especially hard to get this combined.
Introducing BIT_FIELD_EXPR would help here (google for old patches). We'd have
vec_1 = { 0.0, 0.0 };
vec_2 = BIT_FIELD_EXPR <vec_1, 3.1400001049041748046875e+0, 32, 0>;
vec_3 = BIT_FIELD_EXPR <vec_2, 2.71000003814697265625e+0, 32, 32>;
which we can easily constant fold. Of course this would continue the
(ab-)use of BIT_FIELD_* for vectors. Enhancing VEC_PERM to allow the
2nd input (vector) to be of different size (or scalar) would make
vec_2 = VEC_PERM <vec_1, 3.1400001049041748046875e+0, { 0, 3 }>
possible (which is also only ternary instead of quaternary). Expansion
can go the vec_insert route or fallback to splat + perm_const.
VEC_PERM would become more of the RTL pattern
(vec_select
(vec_concat ...) ...)
Modeling element extraction with VEC_PERM would be a bit awkward (you'd
have a stale operand). So if we end up with a vector extract tree code
(not using BIT_FIELD_EXPR anymore for that) then an explicit vector insert
would make sense as well.
The only reason BIT_FIELD_EXPR isn't in trunk yet is that it has four
operands (a "first" if done properly tuplish, we'd not want it as a
"single" RHS). Though the size operand is somewhat redundant if we
require (as for BIT_FIELD_REF) matching bitsize with the operand to insert.
That said, the fix is to fix the representation, not somehow make the
existing one optimized.