On Tue, Jun 28, 2016 at 8:18 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: > On Tue, Jun 14, 2016 at 1:57 PM, Richard Biener > <richard.guent...@gmail.com> wrote: >> On Mon, Jun 13, 2016 at 12:01 PM, Bin Cheng <bin.ch...@arm.com> wrote: >>> Hi, >>> GCC vectorizer generates many unnecessary runtime alias checks known at >>> compilation time. For some data-reference pairs, alias relation can be >>> resolved at compilation time, in this case, we can simply skip the alias >>> check. For some other data-reference pairs, alias relation can be realized >>> at compilation time, in this case, we should return false and simply skip >>> vectorizing the loop. For the second case, the corresponding loop is >>> vectorized for nothing because the guard alias condition is bound to false >>> anyway. Vectorizing it not only wastes compilation time, but also slows >>> down generated code because GCC fails to resolve these "false" alias check >>> after vectorization. Even in cases it can be resolved (by VRP), GCC fails >>> to cleanup all the mess generated in loop versioning. >>> This looks like a common issue in spec2k6. For example, in >>> 434.zeusmp/ggen.f, there are three loops vectorized but never executed; in >>> 464.h264ref, there are loops in which all runtime alias checks are resolved >>> at compilation time thus loop versioning is proven unnecessary. Statistic >>> data also shows that about >100 loops are falsely vectorized currently in >>> my build of spec2k6. >>> >>> This patch is based on >>> https://gcc.gnu.org/ml/gcc-patches/2016-06/msg00399.html, bootstrap and >>> test on x86_64 and AArch64 (ongoing), is it OK? >> >> This is PR71060 and PR65206? >> >> Rather than patching up vect_prune_runtime_alias_test_list to handle >> runtime known _not_ aliasing (does that happen? for one of the >> testcases?) I'd patch vect_analyze_data_ref_dependence for that case. >> Yes, we can have cases where the runtime check generated >> is imprecise enough that it is proved to always alias, thus handling >> these cases seems fine (in which case handling the other is >> trivial). >> >> So I'm generally fine with the patch but please check the above PRs >> and eventually add testcases from them. > Hi, > The two PRs you mentioned is the case which is proved to always alias. > Before this patch, the loop is vectorized, alias check is generated > and then simplified into false, at last, the versioned loop gets > deleted. With this patch, it proves always alias earlier and we won't > do the useless versioning any more. And I checked spec, there are > quite a lot compile time no-alias cases. > > Here is the updated patch wrto your comments. Is it OK?
Ok. Thanks, Richard. > Thanks, > bin > >> >> +/* Function vect_no_alias_p. >> + >> + Given data references A and B whose alias relation is known at >> >> A and B with equal base and offset >> >> + compilation time, return TRUE if they do not alias to each other; >> + return FALSE if they do. SEGMENT_LENGTH_A and SEGMENT_LENGTH_B >> + are the memory lengths accessed by A and B respectively. */ >> + >> +static bool >> +vect_no_alias_p (struct data_reference *a, struct data_reference *b, >> + tree segment_length_a, tree segment_length_b) >> >> please don't mix tree and wide_int so much. Either use wide_int exclusively >> throughout the function or use tree_int_cst_eq for equality and >> tree_int_cst_le for the <= compares. >> >> + comp_res = compare_tree (DR_BASE_ADDRESS (dr_a), DR_BASE_ADDRESS >> (dr_b)); >> + if (comp_res == 0) >> + comp_res = compare_tree (DR_OFFSET (dr_a), DR_OFFSET (dr_b)); >> + >> + /* Alias is known at compilation time. */ >> + if (comp_res == 0 >> + && TREE_CODE (length_factor) == INTEGER_CST >> + && TREE_CODE (DR_STEP (dr_a)) == INTEGER_CST >> + && TREE_CODE (DR_STEP (dr_b)) == INTEGER_CST) >> + { >> + if (vect_no_alias_p (dr_a, dr_b, segment_length_a, >> segment_length_b)) >> + continue; >> >> I wonder if you'd rather want to check segment_length_a/b for INTEGER_CST >> (not length_factor). >> >> Thanks, >> Richard. >> >>> Thanks, >>> bin >>> >>> 2016-06-07 Bin Cheng <bin.ch...@arm.com> >>> >>> * tree-vect-data-refs.c (vect_no_alias_p): New function. >>> (vect_prune_runtime_alias_test_list): Call vect_no_alias_p to >>> resolve alias checks which are known at compilation time. >>> Truncate vector LOOP_VINFO_MAY_ALIAS_DDRS(loop_vinfo) if all >>> alias checks are resolved at compilation time.