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

--- Comment #23 from Robin Dapp <rdapp at gcc dot gnu.org> ---
> this is:
> 
> _429 = mask_patt_205.47_276[i] ? vect_cst__262[i] : (vect_cst__262 <<
> {0,..})[i];
> vect_iftmp.55_287 = mask_patt_209.54_286[i] ? _429 [i] : vect_cst__262[i]

But isn't it rather
_429 = mask_patt_205.47_276[i] ? (vect_cst__262[i] << vect_cst__262[i]) :
{0,..})[i]?

The else should be the last operand, shouldn't it?

On aarch64 we don't seem to emit a COND_SHL therefore this particular situation
does not occur.

However the simplification was introduced for aarch64:

(for cond_op (COND_BINARY)
 (simplify
  (vec_cond @0
   (cond_op:s @1 @2 @3 @4) @3)
  (cond_op (bit_and @1 @0) @2 @3 @4)))

It is supposed to simplify (in gcc.target/aarch64/sve/pre_cond_share_1.c)

  _256 = .COND_MUL (mask__108.48_193, vect_iftmp.45_187, vect_cst__190, { 0.0,
... });
  vect_prephitmp_151.50_197 = VEC_COND_EXPR <mask__101.46_189, _256,
vect_cst__190>;

into COND_MUL (mask108 & mask101, vect_iftmp.45_187, vect_cst__190, { 0.0, ...
});

But that doesn't look valid to me either.  No matter what _256 is, the result
for !mask101 should be vect_cst__190 and not 0.0.

Reply via email to