On Mon, Mar 17, 2014 at 12:01:54PM +0100, Marek Polacek wrote:
> This patch ensures that we properly expand gomp SIMD builtins even with
> -fno-tree-loop-optimize. The problem was that we didn't run the
> loop vectorization at all. -fno-tree-loop-vectorize already contains
> similar hack.
>
> Regtested/bootstrapped on x86_64-linux, ok for trunk (or for 5.0?)?
>
> 2014-03-17 Marek Polacek <[email protected]>
>
> PR middle-end/60534
> * omp-low.c (omp_max_vf): Treat -fno-tree-loop-optimize the same
> as -fno-tree-loop-vectorize.
> (expand_omp_simd): Likewise.
> testsuite/
> * gcc.dg/gomp/pr60534.c: New test.
>
> diff --git gcc/omp-low.c gcc/omp-low.c
> index 91c8656..fdf3367 100644
> --- gcc/omp-low.c
> +++ gcc/omp-low.c
> @@ -2931,7 +2931,8 @@ omp_max_vf (void)
> || optimize_debug
> || (!flag_tree_loop_vectorize
> && (global_options_set.x_flag_tree_loop_vectorize
> - || global_options_set.x_flag_tree_vectorize)))
> + || global_options_set.x_flag_tree_vectorize
> + || global_options_set.x_flag_tree_loop_optimize)))
No. IMHO this needs to be:
|| optimize_debug
+ || !flag_no_tree_loop_optimize
|| (!flag_tree_loop_vectorize
&& (global_options_set.x_flag_tree_loop_vectorize
> @@ -6834,11 +6835,12 @@ expand_omp_simd (struct omp_region *region, struct
> omp_for_data *fd)
> loop->simduid = OMP_CLAUSE__SIMDUID__DECL (simduid);
> cfun->has_simduid_loops = true;
> }
> - /* If not -fno-tree-loop-vectorize, hint that we want to vectorize
> - the loop. */
> + /* If not -fno-tree-loop-vectorize of -fno-tree-loop-optimize,
> + hint that we want to vectorize the loop. */
> if ((flag_tree_loop_vectorize
> || (!global_options_set.x_flag_tree_loop_vectorize
> - && !global_options_set.x_flag_tree_vectorize))
> + && !global_options_set.x_flag_tree_vectorize
> + && !global_options_set.x_flag_tree_loop_optimize))
Similarly, here it should be added as
+ && flag_tree_loop_optimize
> && loop->safelen > 1)
The thing is, if -fno-tree-loop-optimize (whether explicitly added by user
or implicitly through other options, then the loop will be never vectorized.
It doesn't matter if -ftree-vectorize was on or not in that case.
The magic with global_options_set is there to make the loop vectorized
if either -ftree-loop-vectorize is on (implicitly or explicitly), or
at least optimizing and not disabled explicitly (-fno-tree-vectorize),
we then force the vectorization on for the specific loops.
But -fno-tree-loop-optimize means the whole loop optimization pipeline is
not performed, at that point forcing it on and disabling all other loop
optimizations might be too problematic/error prone.
E.g. you could try -fopenmp -O -fno-tree-loop-optimize -ftree-vectorize
or -fopenmp -O3 -fno-tree-loop-optimize etc.
Jakub