https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112859
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot
gnu.org
See Also| |https://gcc.gnu.org/bugzill
| |a/show_bug.cgi?id=112281
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2023-12-05
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
t.c:9:12: optimized: Loop nest 1 distributed: split to 2 loops and 0 library
calls.
-fno-tree-loop-distribution fixes this
GCC 11 distributes the inner loop, but only splits out the assignment to 'j'
there while with 12+ we distribute away the store to e[h].c. Looks somewhat
familiar to the other "aggregate copy" case where we have no evolution in
the inner loop.
The critical dependence is
(Data Dep:
#(Data Ref:
# bb: 5
# stmt: *i.1_1 = e[h.7_24];
# ref: e[h.7_24];
# base_object: e;
# Access function 0: {h.7_20, +, 1}_1
#)
#(Data Ref:
# bb: 5
# stmt: e[h.7_24].c = 1;
# ref: e[h.7_24].c;
# base_object: e;
# Access function 0: 32
# Access function 1: {h.7_20, +, 1}_1
#)
access_fn_A: {h.7_20, +, 1}_1
access_fn_B: {h.7_20, +, 1}_1
(subscript
iterations_that_access_an_element_twice_in_A: [0]
last_conflict: scev_not_known
iterations_that_access_an_element_twice_in_B: [0]
last_conflict: scev_not_known
(Subscript distance: 0 ))
loop nest: (1 2 )
distance_vector: 0 0
direction_vector: = =
)
which is then running into
/* If the overlap is exact preserve stmt order. */
else if (lambda_vector_zerop (DDR_DIST_VECT (ddr, 0),
DDR_NB_LOOPS (ddr)))
;
so maybe that special-casing is indeed incorrect, and the special-casing
I added
/* When then dependence distance of the innermost common
loop of the DRs is zero we have a conflict. */
auto l1 = gimple_bb (DR_STMT (dr1))->loop_father;
auto l2 = gimple_bb (DR_STMT (dr2))->loop_father;
int idx = index_in_loop_nest (find_common_loop (l1, l2)->num,
DDR_LOOP_NEST (ddr));
if (DDR_DIST_VECT (ddr, 0)[idx] == 0)
this_dir = 2;
should instead be handled to somehow handle more generally the situation that
two refs conflict in a loop where the refs do not evolve.
Thanks for these testcases btw.