match.pd: Fix sve/vcond_3.c
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 8 Apr 2021 16:39:11 +0000 (17:39 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Thu, 8 Apr 2021 16:39:11 +0000 (17:39 +0100)
The sve/vcond_3.c tests had started to fail after PR97690/99305,
because we were generating:

  a = VEC_COND_EXPR <cond, { 0, ... }, { 1, ... }>;
  b = a << 15;

instead of:

  a = VEC_COND_EXPR <cond, { 0, ... }, { 1<<15, ... }>;

We already have a match.pd rule to handle this kind of thing,
but it didn't handle shifts.

gcc/
* match.pd: Extend vec_cond folds to handle shifts.

gcc/match.pd

index 036f92f..3ffd9a6 100644 (file)
@@ -3646,7 +3646,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 
 /* Sink binary operation to branches, but only if we can fold it.  */
 (for op (tcc_comparison plus minus mult bit_and bit_ior bit_xor
-        rdiv trunc_div ceil_div floor_div round_div
+        lshift rshift rdiv trunc_div ceil_div floor_div round_div
         trunc_mod ceil_mod floor_mod round_mod min max)
 /* (c ? a : b) op (c ? d : e)  -->  c ? (a op d) : (b op e) */
  (simplify