On Tue, 14 May 2013, Jakub Jelinek wrote: > On Tue, May 14, 2013 at 11:28:43AM +0200, Richard Biener wrote: > > > + /* If non-NULL, an INTEGER_CST, where the user asserted that for any > > > + I in [ 0, nb_iterations ) and for any J in > > > + [ I, min ( I + safelen, nb_iterations ) ), the Ith and Jth > > > iterations > > > + of the loop can be safely evaluated concurrently. */ > > > + tree safelen; > > > > Can you make this a double_int (or a HOST_WIDE_INT or an int) instead > > please? It should map to data-dependence analysis distance vectors > > which currently is a vector of 'int'. > > If all we care about is int, it can be int. Infinity is when > #pragma omp simd > doesn't contain any simdlen clause, or when Cilk+ > #pragma simd > doesn't contain any vectorlength or vectorlengthfor clauses. > So, shall we assign INT_MAX for infinity? At least the vectorizer > certainly doesn't care about anything beyond MAX_VECTORIZATION_FACTOR. > And I can just map any explicit safelen in the source larger than INT_MAX > as INT_MAX.
Works for me. > > Is there a magic value to tell safelen is "infinity"? As I read > > above safelen == 0 would mean all iterations are dependent. Are > > negative safelen values well-defined? The comment doesn't seem > > to disallow them. > > The FEs disallow safelen <= 0 or non-constant. > > > Also make sure to copy the field in copy_loop_info and stream > > it in output/input_cfg in lto-streamer-in/out.c. > > Ok. > > > > + if (!broken_loop) > > > + { > > > + struct loop *loop; > > > + calculate_dominance_info (CDI_DOMINATORS); > > > + fix_loop_structure (NULL); > > > > Ick. Didn't I properly add loops everywhere? > > The loop was previously containing EDGE_ABNORMAL edges (that is something > to prevent any optimizations on those until ompexp had a chance to deal with > those), so there is no loop at all, just the loop->num == 0 for the whole > function if #pragma omp simd appears outside of loops and doesn't contain > any loops inside of its body. But don't we now know the loop (it's header and possibly its latch) and so we can simply add_loop here? > > > --- gcc/tree-vectorizer.c.jj 2013-05-13 16:49:03.000000000 +0200 > > > +++ gcc/tree-vectorizer.c 2013-05-13 20:44:58.721863725 +0200 > > > @@ -101,7 +101,8 @@ vectorize_loops (void) > > > than all previously defined loops. This fact allows us to run > > > only over initial loops skipping newly generated ones. */ > > > FOR_EACH_LOOP (li, loop, 0) > > > - if (optimize_loop_nest_for_speed_p (loop)) > > > + if ((flag_tree_vectorize && optimize_loop_nest_for_speed_p (loop)) > > > + || loop->safelen) > > > > So you vectorize all loops with a safelen? I'd say this warrants an > > extra flag in struct loop, force_vect. > > Ok. > > > > @@ -225,7 +225,8 @@ tree_vectorize (void) > > > static bool > > > gate_tree_vectorize (void) > > > { > > > - return flag_tree_vectorize; > > > + return flag_tree_vectorize > > > + || (flag_openmp && !global_options_set.x_flag_tree_vectorize); > > > > And a flag in cfun here, whether any loop has force_vect set (or > > a flag in current_loops) > > Ok. > > > Rather than looking at safelen from data-dependence analysis consumers > > data-dependence analysis itself should use the information. Which > > is why I'd like the 'safelen' thing to map to the distance vector > > representation of dependence analysis. > > Will try. Might not be trivial - the dependency whould have to be of "known" type and the distance vector maybe safelen+1 (which would be not exactly correct I think, but there isn't sth like "at least" safelen+1). So eventually it needs to be an "unknown" dependency still with a new interface of a "at least" distance result. Richard.