On Fri, May 31, 2019 at 11:43:29AM +0200, Richard Biener wrote: > Hmm. Is it enough to set TREE_THIS_NOTRAP on the ARRAY_REF instead?
That works too. > At least it's documented the ARRAY_REF then isn't the issue. > As for conditional vs. unconditional I'm not so sure but automatic > vars are excepmted from that anyways? Only if they are guaranteed not to have out of bound accesses. Anyway, I'll go with this, those ARRAY_REFs indeed should never trap. 2019-05-31 Jakub Jelinek <ja...@redhat.com> * omp-low.c (lower_rec_simd_input_clauses): Set TREE_THIS_NOTRAP on ivar and lvar. * gcc.dg/vect/vect-cond-12.c: New test. --- gcc/omp-low.c.jj 2019-05-30 23:19:14.469931759 +0200 +++ gcc/omp-low.c 2019-05-31 11:52:20.491195088 +0200 @@ -3728,6 +3728,8 @@ lower_rec_simd_input_clauses (tree new_v NULL_TREE, NULL_TREE); lvar = build4 (ARRAY_REF, TREE_TYPE (new_var), avar, sctx->lane, NULL_TREE, NULL_TREE); + TREE_THIS_NOTRAP (ivar) = 1; + TREE_THIS_NOTRAP (lvar) = 1; } if (DECL_P (new_var)) { --- gcc/testsuite/gcc.dg/vect/vect-cond-12.c.jj 2019-05-31 11:25:33.203577504 +0200 +++ gcc/testsuite/gcc.dg/vect/vect-cond-12.c 2019-05-31 11:26:58.616174115 +0200 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fopenmp-simd" } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_condition } } } */ + +int x; + +void +foo (int *a) +{ + #pragma omp simd lastprivate (x) + for (int i = 0; i < 1024; ++i) + if (a[i]) + x = i; +} Jakub