https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83403
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Blocks| |53947
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Apart from some details in data-ref analysis we also fail to vectorize a loop
with invariant stores (reduction in memory). If we fix that we run into the
issue that dependence checking doesn't seem to handle the invariant stores
either.
t.ii:1400:24: note: versioning for alias required: can't determine dependence
between *_293 and *_293
consider run-time aliasing test between *_293 and *_293
t.ii:1400:24: note: versioning for alias required: can't determine dependence
between *_293 and *_302
consider run-time aliasing test between *_293 and *_302
...
t.ii:1400:24: note: === vect_prune_runtime_alias_test_list ===
t.ii:1400:24: note: not vectorized: compilation time alias.
that is because while I "fixed" DR_BASE_ADDRESS (via split_constant_offset)
DR_BASE_OBJECT doesn't reflect that.
I suppose instead of fixing via split_constant_offset and friends we should
eventually analyze the DR with respect to the first loop it varies in?
vectorizer hack:
Index: gcc/tree-vect-data-refs.c
===================================================================
--- gcc/tree-vect-data-refs.c (revision 255622)
+++ gcc/tree-vect-data-refs.c (working copy)
@@ -2641,9 +2641,9 @@ vect_analyze_data_ref_access (struct dat
/* Allow loads with zero step in inner-loop vectorization. */
if (loop_vinfo && integer_zerop (step))
{
- GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = NULL;
+ //GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = NULL;
if (!nested_in_vect_loop_p (loop, stmt))
- return DR_IS_READ (dr);
+ return true;//DR_IS_READ (dr);
/* Allow references with zero step for outer loops marked
with pragma omp simd only - it guarantees absence of
loop-carried dependencies between inner loop iterations. */
split-constant-offset hack (I'm not sure it's valid this way given we
specify an evolution loop that we might end up "skipping").
Index: gcc/tree-data-ref.c
===================================================================
--- gcc/tree-data-ref.c (revision 255622)
+++ gcc/tree-data-ref.c (working copy)
@@ -709,6 +709,26 @@ split_constant_offset_1 (tree type, tree
*var = fold_convert (type, var0);
return true;
}
+ if (TREE_CODE (op0) == SSA_NAME
+ && ! SSA_NAME_IS_DEFAULT_DEF (op0)
+ && INTEGRAL_TYPE_P (itype)
+ && TYPE_OVERFLOW_WRAPS (itype)
+ && TYPE_PRECISION (type) > TYPE_PRECISION (itype))
+ {
+ gimple *def = SSA_NAME_DEF_STMT (op0);
+ tree chrec = analyze_scalar_evolution (gimple_bb
(def)->loop_father,
+ op0);
+ if (! chrec_contains_undetermined (chrec)
+ && TREE_CODE (chrec) == POLYNOMIAL_CHREC
+ && ! scev_probably_wraps_p (op0, CHREC_LEFT (chrec),
+ CHREC_RIGHT (chrec), def,
+ gimple_bb (def)->loop_father,
true))
+ {
+ split_constant_offset (op0, &var0, off);
+ *var = fold_convert (type, var0);
+ return true;
+ }
+ }
return false;
}
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53947
[Bug 53947] [meta-bug] vectorizer missed-optimizations