summaryrefslogtreecommitdiff
path: root/0032-Autoprefetch-Prune-invaild-loops-containing-edges-wh.patch
diff options
context:
space:
mode:
Diffstat (limited to '0032-Autoprefetch-Prune-invaild-loops-containing-edges-wh.patch')
-rw-r--r--0032-Autoprefetch-Prune-invaild-loops-containing-edges-wh.patch82
1 files changed, 82 insertions, 0 deletions
diff --git a/0032-Autoprefetch-Prune-invaild-loops-containing-edges-wh.patch b/0032-Autoprefetch-Prune-invaild-loops-containing-edges-wh.patch
new file mode 100644
index 0000000..aa15df4
--- /dev/null
+++ b/0032-Autoprefetch-Prune-invaild-loops-containing-edges-wh.patch
@@ -0,0 +1,82 @@
+From 071d19832d788422034a3b052ff7ce91e1010344 Mon Sep 17 00:00:00 2001
+From: dingguangya <dingguangya1@huawei.com>
+Date: Mon, 28 Feb 2022 16:52:58 +0800
+Subject: [PATCH 32/32] [Autoprefetch] Prune invaild loops containing edges whose
+ probability exceeds 1
+
+Skip auto prefetch analysis if the loop contains the bb in which the sum
+of its outgoing edge probabilities is greater than 1.
+---
+ gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp | 2 +-
+ .../gcc.dg/autoprefetch/branch-weighted-prefetch.c | 8 ++++----
+ gcc/tree-ssa-loop-prefetch.c | 12 ++++++++++++
+ 3 files changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp b/gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp
+index a7408e338..7cae630a2 100644
+--- a/gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp
++++ b/gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp
+@@ -20,7 +20,7 @@ load_lib target-supports.exp
+ # Initialize `dg'.
+ dg-init
+
+-gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c]] \
++dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c]] \
+ "" "-fprefetch-loop-arrays"
+
+ # All done.
+diff --git a/gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c b/gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c
+index c63c5e5cb..ab537cb29 100644
+--- a/gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c
++++ b/gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c
+@@ -1,5 +1,5 @@
+-/* { dg-do compile } */
+-/* { dg-options "-O2 -fprefetch-loop-arrays=2 --param min-insn-to-prefetch-ratio=5 --param simultaneous-prefetches=100 -fdump-tree-aprefetch-details -fdump-tree-optimized" } */
++/* { dg-do compile { target { aarch64*-*-linux* } } } */
++/* { dg-options "-O2 -fprefetch-loop-arrays=2 --param min-insn-to-prefetch-ratio=5 --param simultaneous-prefetches=100 --param l1-cache-size=64 --param l1-cache-line-size=32 -fdump-tree-aprefetch-details -fdump-tree-optimized" } */
+ #define N 10000000
+
+ long long a[N];
+@@ -18,5 +18,5 @@ long long func ()
+
+ return sum;
+ }
+-/* { dg-final { scan-tree-dump-times "Ahead 40" 1 "aprefetch" } } */
+-/* { dg-final { scan-tree-dump-times "builtin_prefetch" 1 "optimized" } } */
+\ No newline at end of file
++/* { dg-final { scan-tree-dump "Calculating prefetch distance using bb branch weighting method" "aprefetch" } } */
++/* { dg-final { scan-tree-dump "builtin_prefetch" "optimized" } } */
+\ No newline at end of file
+diff --git a/gcc/tree-ssa-loop-prefetch.c b/gcc/tree-ssa-loop-prefetch.c
+index 673f453a4..0d992d8f6 100644
+--- a/gcc/tree-ssa-loop-prefetch.c
++++ b/gcc/tree-ssa-loop-prefetch.c
+@@ -2267,6 +2267,15 @@ traverse_prune_bb_branch (hash_map <basic_block, bb_bp> &bb_branch_prob,
+ && bb_bp_node->false_edge_bb == NULL))
+ return false;
+
++ /* Do not process the loop with a bb branch probability of an abnormal
++ value. */
++ if (bb_bp_node->true_edge_prob + bb_bp_node->false_edge_prob > 1)
++ {
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ fprintf (dump_file, "bb branch probability is abnormal\n");
++ return false;
++ }
++
+ if (current_bb == latch_bb)
+ {
+ max_path--;
+@@ -2409,6 +2418,9 @@ estimate_num_loop_insns (struct loop *loop, eni_weights *weights)
+ dump_loop_bb (loop);
+ return 0;
+ }
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ fprintf (dump_file, "Calculating prefetch distance using bb branch "
++ "weighting method\n");
+ }
+
+ for (unsigned i = 0; i < loop->num_nodes; i++)
+--
+2.27.0
+