1/* { dg-require-effective-target vect_condition } */
2
3#include <stdarg.h>
4#include "tree-vect.h"
5
6#define K 32
7
8int cond_array[2*K][K] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
9int a[K][K] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
10int out[K];
11int check_result[K] = {2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
12
13__attribute__ ((noinline)) void
14foo (int c)
15{
16  int res, i, j, k, next;
17
18  for (k = 0; k < K; k++)
19    {
20      res = 0;
21      for (j = 0; j < K; j++)
22        for (i = 0; i < K; i++)
23          {
24            next = a[i][j];
25            res = c > cond_array[i+k][j] ? next : res;
26          }
27
28      out[k] = res;
29    }
30}
31
32int main ()
33{
34  int i, j, k;
35
36  check_vect ();
37
38  for  (j = 0; j < K; j++)
39    {
40      for (i = 0; i < 2*K; i++)
41        cond_array[i][j] = i+j;
42
43      for (i = 0; i < K; i++)
44        a[i][j] = i+2;
45    }
46
47  foo(5);
48
49  for (k = 0; k < K; k++)
50    if (out[k] != check_result[k])
51      abort ();
52
53  return 0;
54}
55
56/* Double reduction with cond_expr is not supported, since even though the order
57   of computation is the same, but vector results should be reduced to scalar
58   result, which can'be done for cond_expr.  */
59/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
60/* { dg-final { cleanup-tree-dump "vect" } } */
61
62