/* Detect simplification for vector condition folding where
- c = mask1 ? (masked_op mask2 a b) : b
+ c = mask1 ? (masked_op mask2 a b els) : els
into
- c = masked_op (mask1 & mask2) a b
+ c = masked_op (mask1 & mask2) a b els
where the operation can be partially applied to one operand. */
(for cond_op (COND_BINARY)
(simplify
(vec_cond @0
- (cond_op:s @1 @2 @3 @4) @3)
+ (cond_op:s @1 @2 @3 @4) @4)
(cond_op (bit_and @1 @0) @2 @3 @4)))
/* And same for ternary expressions. */
(for cond_op (COND_TERNARY)
(simplify
(vec_cond @0
- (cond_op:s @1 @2 @3 @4 @5) @4)
+ (cond_op:s @1 @2 @3 @4 @5) @5)
(cond_op (bit_and @1 @0) @2 @3 @4 @5)))
/* For pointers @0 and @2 and nonnegative constant offset @1, look for
}
/* { dg-final { scan-tree-dump-times {\.COND_MUL} 1 "optimized" } } */
-/* { dg-final { scan-tree-dump-times {\.VCOND} 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-times {\.VCOND} 1 "optimized" { xfail *-*-* } } } */
--- /dev/null
+/* { dg-do run { target { riscv_v && rv64 } } } */
+/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d -fdump-tree-optimized" } */
+
+#include "pr113607.c"
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d -fdump-tree-optimized" } */
+
+struct {
+ signed b;
+} c, d = {6};
+
+short e, f;
+int g[1000];
+signed char h;
+int i, j;
+long k, l;
+
+long m(long n, long o) {
+ if (n < 1 && o == 0)
+ return 0;
+ return n;
+}
+
+static int p() {
+ long q = 0;
+ int a = 0;
+ for (; e < 2; e += 1)
+ g[e * 7 + 1] = -1;
+ for (; h < 1; h += 1) {
+ k = g[8] || f;
+ l = m(g[f * 7 + 1], k);
+ a = l;
+ j = a < 0 || g[f * 7 + 1] < 0 || g[f * 7 + 1] >= 32 ? a : a << g[f * 7 + 1];
+ if (j)
+ ++q;
+ }
+ if (q)
+ c = d;
+ return i;
+}
+
+int main() {
+ p();
+ if (c.b != 6)
+ __builtin_abort ();
+}
+
+/* We must not fold VEC_COND_EXPR into COND_SHL.
+ Therefore, make sure that we still have 2/4 VCOND_MASKs with real else
+ value. */
+
+/* { dg-final { scan-tree-dump-times { = \.VCOND_MASK.\([a-z0-9\._]+, [a-z0-9\._\{\}, ]+, [0-9\.\{\},]+\);} 0 "optimized" } } */
+/* { dg-final { scan-tree-dump-times { = \.VCOND_MASK.\([a-z0-9\._]+, [a-z0-9\._\{\}, ]+, [a-z0-9\._]+\);} 4 "optimized" } } */