- avoid-cycling-on-vertain-subreg-reloads.patch: Add patch source comment - change-gcc-BASE-VER.patch: Likewise - dont-generate-IF_THEN_ELSE.patch: Likewise - fix-ICE-in-compute_live_loop_exits.patch: Likewise - fix-ICE-in-eliminate_stmt.patch: Likewise - fix-ICE-in-vect_create_epilog_for_reduction.patch: Likewise - fix-ICE-in-vect_stmt_to_vectorize.patch: Likewise - fix-ICE-in-verify_ssa.patch: Likewise - fix-ICE-when-vectorizing-nested-cycles.patch: Likewise - fix-cost-of-plus.patch: Likewise - ipa-const-prop-self-recursion-bugfix.patch: Likewise - simplify-removing-subregs.patch: Likewise - medium-code-mode.patch: Bugfix - fix-when-peeling-for-alignment.patch: Move to ... - fix-PR-92351-When-peeling-for-alignment.patch: ... this - AArch64-Fix-constraints-for-CPY-M.patch: New file - Apply-maximum-nunits-for-BB-SLP.patch: New file - Fix-EXTRACT_LAST_REDUCTION-segfault.patch: New file - Fix-up-push_partial_def-little-endian-bitfield.patch: New file - Fix-zero-masking-for-vcvtps2ph.patch: New file - IRA-Handle-fully-tied-destinations.patch: New file - SLP-VECT-Add-check-to-fix-96837.patch: New file - aarch64-Fix-ash-lr-lshr-mode-3-expanders.patch: New file - aarch64-Fix-bf16-and-matrix-g++-gfortran.patch: New file - aarch64-Fix-mismatched-SVE-predicate-modes.patch: New file - aarch64-fix-sve-acle-error.patch: New file - adjust-vector-cost-and-move-EXTRACT_LAST_REDUCTION-costing.patch: New file - bf16-and-matrix-characteristic.patch: New file - fix-ICE-IPA-compare-VRP-types.patch: New file - fix-ICE-in-affine-combination.patch: New file - fix-ICE-in-pass-vect.patch: New file - fix-ICE-in-vect_update_misalignment_for_peel.patch: New file - fix-addlosymdi-ICE-in-pass-reload.patch: New file - fix-an-ICE-in-vect_recog_mask_conversion_pattern.patch: New file - fix-avx512vl-vcvttpd2dq-2-fail.patch: New file - fix-issue499-add-nop-convert.patch: New file - fix-issue604-ldist-dependency-fixup.patch: New file - modulo-sched-Carefully-process-loop-counter-initiali.patch: New file - re-PR-target-91124-gcc.target-i386-avx512vl-vpshldvd.patch: New file - reduction-paths-with-unhandled-live-stmt.patch: New file - redundant-loop-elimination.patch: New file - sccvn-Improve-handling-of-load-masked-with-integer.patch: New file - speed-up-DDG-analysis-and-fix-bootstrap-compare-debug.patch: New file - store-merging-Consider-also-overlapping-stores-earlier.patch: New file - tree-optimization-96920-another-ICE-when-vectorizing.patch: New file - tree-optimization-97812-fix-range-query-in-VRP-asser.patch: New file - vectorizable-comparison-Swap-operands-only-once.patch: New file - x86-Fix-bf16-and-matrix.patch: New file
109 lines
3.6 KiB
Diff
109 lines
3.6 KiB
Diff
commit f6e1a4cd83190746b6544917f7526fa480ca5f18
|
|
Author: Bin Cheng <bin.cheng@linux.alibaba.com>
|
|
Date: Wed May 13 11:37:47 2020 +0800
|
|
|
|
Add missing unit dependence vector in data dependence analysis
|
|
|
|
Current data dependence analysis misses unit distant vector if DRs in
|
|
DDR have the same invariant access functions. This adds the vector as
|
|
the constant access function case.
|
|
|
|
2020-05-13 Bin Cheng <bin.cheng@linux.alibaba.com>
|
|
PR tree-optimization/94969
|
|
|
|
gcc/
|
|
* tree-data-dependence.c (constant_access_functions): Rename to...
|
|
(invariant_access_functions): ...this. Add parameter. Check for
|
|
invariant access function, rather than constant.
|
|
(build_classic_dist_vector): Call above function.
|
|
* tree-loop-distribution.c (pg_add_dependence_edges): Add comment.
|
|
|
|
gcc/testsuite/
|
|
* gcc.dg/tree-ssa/pr94969.c: New test.
|
|
|
|
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c
|
|
new file mode 100644
|
|
index 00000000000..056b015f97c
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c
|
|
@@ -0,0 +1,28 @@
|
|
+/* PR tree-optimization/52267 */
|
|
+/* { dg-do run } */
|
|
+/* { dg-options "-O3 -fdump-tree-ldist-details" } */
|
|
+
|
|
+int a = 0, b = 0, c = 0;
|
|
+struct S {
|
|
+ signed m : 7;
|
|
+ signed e : 2;
|
|
+};
|
|
+struct S f[2] = {{0, 0}, {0, 0}};
|
|
+struct S g = {0, 0};
|
|
+
|
|
+void __attribute__((noinline))
|
|
+k()
|
|
+{
|
|
+ for (; c <= 1; c++) {
|
|
+ f[b] = g;
|
|
+ f[b].e ^= 1;
|
|
+ }
|
|
+}
|
|
+int main()
|
|
+{
|
|
+ k();
|
|
+ if (f[b].e != 1)
|
|
+ __builtin_abort ();
|
|
+}
|
|
+
|
|
+/* { dg-final { scan-tree-dump-not "ldist" "Loop 1 distributed: split to 3 loops"} } */
|
|
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
|
|
index 851225e1171..5505ba46778 100644
|
|
--- a/gcc/tree-data-ref.c
|
|
+++ b/gcc/tree-data-ref.c
|
|
@@ -4821,17 +4821,19 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
|
|
return true;
|
|
}
|
|
|
|
-/* Return true when the DDR contains only constant access functions. */
|
|
+/* Return true when the DDR contains only invariant access functions wrto. loop
|
|
+ number LNUM. */
|
|
|
|
static bool
|
|
-constant_access_functions (const struct data_dependence_relation *ddr)
|
|
+invariant_access_functions (const struct data_dependence_relation *ddr,
|
|
+ int lnum)
|
|
{
|
|
unsigned i;
|
|
subscript *sub;
|
|
|
|
FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
|
|
- if (!evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 0))
|
|
- || !evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 1)))
|
|
+ if (!evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 0), lnum)
|
|
+ || !evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 1), lnum))
|
|
return false;
|
|
|
|
return true;
|
|
@@ -5030,7 +5032,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
|
|
dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
|
|
save_dist_v (ddr, dist_v);
|
|
|
|
- if (constant_access_functions (ddr))
|
|
+ if (invariant_access_functions (ddr, loop_nest->num))
|
|
add_distance_for_zero_overlaps (ddr);
|
|
|
|
if (DDR_NB_LOOPS (ddr) > 1)
|
|
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
|
|
index 44423215332..b122c3964a0 100644
|
|
--- a/gcc/tree-loop-distribution.c
|
|
+++ b/gcc/tree-loop-distribution.c
|
|
@@ -2080,7 +2080,8 @@ loop_distribution::pg_add_dependence_edges (struct graph *rdg, int dir,
|
|
this_dir = -this_dir;
|
|
|
|
/* Known dependences can still be unordered througout the
|
|
- iteration space, see gcc.dg/tree-ssa/ldist-16.c. */
|
|
+ iteration space, see gcc.dg/tree-ssa/ldist-16.c and
|
|
+ gcc.dg/tree-ssa/pr94969.c. */
|
|
if (DDR_NUM_DIST_VECTS (ddr) != 1)
|
|
this_dir = 2;
|
|
/* If the overlap is exact preserve stmt order. */
|