summaryrefslogtreecommitdiff
path: root/0028-AutoPrefetch-Handle-the-case-that-the-basic-block-br.patch
diff options
context:
space:
mode:
Diffstat (limited to '0028-AutoPrefetch-Handle-the-case-that-the-basic-block-br.patch')
-rw-r--r--0028-AutoPrefetch-Handle-the-case-that-the-basic-block-br.patch151
1 files changed, 151 insertions, 0 deletions
diff --git a/0028-AutoPrefetch-Handle-the-case-that-the-basic-block-br.patch b/0028-AutoPrefetch-Handle-the-case-that-the-basic-block-br.patch
new file mode 100644
index 0000000..48c2e52
--- /dev/null
+++ b/0028-AutoPrefetch-Handle-the-case-that-the-basic-block-br.patch
@@ -0,0 +1,151 @@
+From 3d20b13bc2e5af8d52e221a33881423e38c3dfdd Mon Sep 17 00:00:00 2001
+From: dingguangya <dingguangya1@huawei.com>
+Date: Thu, 17 Feb 2022 21:53:31 +0800
+Subject: [PATCH 28/28] [AutoPrefetch] Handle the case that the basic block
+ branch probability is invalid
+
+ When the node branch probability value is not initialized,
+ the branch probability must be set to 0 to ensure that
+ the calculation of the basic block execution probability
+ must be less than or equal to 100%.
+---
+ .../gcc.dg/autoprefetch/autoprefetch.exp | 27 +++++++++++++++++++
+ .../autoprefetch/branch-weighted-prefetch.c | 22 +++++++++++++++
+ .../autoprefetch/get-edge-prob-non-init.c | 24 +++++++++++++++++
+ gcc/tree-ssa-loop-prefetch.c | 17 +++++++++++-
+ 4 files changed, 89 insertions(+), 1 deletion(-)
+ create mode 100644 gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp
+ create mode 100644 gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c
+ create mode 100644 gcc/testsuite/gcc.dg/autoprefetch/get-edge-prob-non-init.c
+
+diff --git a/gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp b/gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp
+new file mode 100644
+index 000000000..a7408e338
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/autoprefetch/autoprefetch.exp
+@@ -0,0 +1,27 @@
++# Copyright (C) 1997-2022 Free Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with GCC; see the file COPYING3. If not see
++# <http://www.gnu.org/licenses/>.
++
++load_lib gcc-dg.exp
++load_lib target-supports.exp
++
++# Initialize `dg'.
++dg-init
++
++gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c]] \
++ "" "-fprefetch-loop-arrays"
++
++# All done.
++dg-finish
+\ No newline at end of file
+diff --git a/gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c b/gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c
+new file mode 100644
+index 000000000..c63c5e5cb
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/autoprefetch/branch-weighted-prefetch.c
+@@ -0,0 +1,22 @@
++/* { 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" } */
++#define N 10000000
++
++long long a[N];
++
++long long func ()
++{
++ long long i;
++ long long sum = 0;
++
++ for (i = 0; i < N; i+=1) {
++ if (i < 100000)
++ sum += a[i];
++ else
++ continue;
++ }
++
++ 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
+diff --git a/gcc/testsuite/gcc.dg/autoprefetch/get-edge-prob-non-init.c b/gcc/testsuite/gcc.dg/autoprefetch/get-edge-prob-non-init.c
+new file mode 100644
+index 000000000..f55481008
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/autoprefetch/get-edge-prob-non-init.c
+@@ -0,0 +1,24 @@
++/* { dg-do compile } */
++/* { dg-options "-Ofast -fprefetch-loop-arrays=2 -fdump-tree-aprefetch-details" } */
++
++int a, c, f;
++static int *b = &a;
++int *d;
++int e[0];
++void g() {
++ int h;
++ for (;;) {
++ h = 1;
++ for (; h >= 0; h--) {
++ c = 2;
++ for (; c; c--)
++ if (e[0])
++ if (e[c])
++ *b = 0;
++ f || (*d = 0);
++ }
++ }
++}
++int main() {}
++
++/* { dg-final } */
+diff --git a/gcc/tree-ssa-loop-prefetch.c b/gcc/tree-ssa-loop-prefetch.c
+index 3a5aef0fc..673f453a4 100644
+--- a/gcc/tree-ssa-loop-prefetch.c
++++ b/gcc/tree-ssa-loop-prefetch.c
+@@ -2132,7 +2132,7 @@ get_edge_prob (edge e)
+ {
+ /* Limit the minimum probability value. */
+ const float MINNUM_PROB = 0.00001f;
+- float fvalue = 1;
++ float fvalue = 0;
+
+ profile_probability probability = e->probability;
+ if (probability.initialized_p ())
+@@ -2143,6 +2143,21 @@ get_edge_prob (edge e)
+ fvalue = MINNUM_PROB;
+ }
+ }
++ else
++ {
++ /* When the node branch probability value is not initialized, the branch
++ probability must be set to 0 to ensure that the calculation of the
++ basic block execution probability must be less than or equal to 100%.
++ i.e,
++ ...
++ <bb 3> [local count: 20000]
++ if (f_2 != 0)
++ goto <bb 6>; [INV]
++ else
++ goto <bb 7>; [100.00%]
++ ... */
++ fvalue = 0;
++ }
+ return fvalue;
+ }
+
+--
+2.27.0.windows.1
+