diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2022-10-06 15:13:50 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2022-10-06 15:16:29 +0200 |
commit | 3ec926d36fbf7cb3ff45759471139f3a71d1c4de (patch) | |
tree | 038eb343866568a2a1fcc078210bcd8ef7adb271 /gcc/fortran/trans-openmp.cc | |
parent | b9d04e915fe0f4cdcca40e6de65ae384ba82a429 (diff) | |
download | gcc-3ec926d36fbf7cb3ff45759471139f3a71d1c4de.zip gcc-3ec926d36fbf7cb3ff45759471139f3a71d1c4de.tar.gz gcc-3ec926d36fbf7cb3ff45759471139f3a71d1c4de.tar.bz2 |
Fix wrong code generated by unroll-and-jam pass
There is a loophole in the unroll-and-jam pass that can quickly result in
wrong code generation. The code reads:
if (!compute_data_dependences_for_loop (outer, true, &loop_nest,
&datarefs, &dependences))
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Cannot analyze data dependencies\n");
free_data_refs (datarefs);
free_dependence_relations (dependences);
continue;
}
but compute_data_dependences_for_loop may return true even if the analysis
is reported as failing by compute_affine_dependence for a dependence pair:
(compute_affine_dependence
ref_a: data[_14], stmt_a: data[_14] = i_59;
ref_b: data[_14], stmt_b: data[_14] = i_59;
Data ref a:
Data ref b:
affine dependence test not usable: access function not affine or constant.
) -> dependence analysis failed
Note that this is a self-dependence pair and the code for them reads:
/* Nothing interesting for the self dependencies. */
if (dra == drb)
continue;
This means that the pass may reorder "complex" accesses to the same memory
location in successive iterations, which is OK for reads but not for writes.
gcc/
* gimple-loop-jam.cc (tree_loop_unroll_and_jam): Bail out for a self
dependency that is a write-after-write if the access function is not
affine or constant.
gcc/testsuite/
* gcc.c-torture/execute/20221006-1.c: New test.
Diffstat (limited to 'gcc/fortran/trans-openmp.cc')
0 files changed, 0 insertions, 0 deletions