Message ID | c5836162-ee36-7054-c4f4-64223794e949@redhat.com |
---|---|
State | New |
Headers | show |
Series | [COMMITTED] Fold all statements in Ranger VRP. | expand |
On 10/25/2021 6:03 PM, Andrew MacLeod via Gcc-patches wrote: > This patch changes the ranger VRP pass to simplify all statements, not > just the ones with ranges. I believe Jeff had mentioned we were no > longer doing this a while back. Now we need it when running as the > VRP2 pass to satisfy the testcase: gcc.dg/wrapped-binop-simplify.c I did :-) The lack of folding in [E]VRP caused a critical function in perl to be ever-so-slightly larger and not be inlined leading to a measurable performance regression in spec when compiled with gcc-11. I never bothered upstreaming our internal version of this as other (non-VRP) changes on the trunk addressed the problem. Jeff
On 10/28/21 9:38 AM, Jeff Law wrote: > > > On 10/25/2021 6:03 PM, Andrew MacLeod via Gcc-patches wrote: >> This patch changes the ranger VRP pass to simplify all statements, >> not just the ones with ranges. I believe Jeff had mentioned we were >> no longer doing this a while back. Now we need it when running as >> the VRP2 pass to satisfy the testcase: gcc.dg/wrapped-binop-simplify.c > I did :-) The lack of folding in [E]VRP caused a critical function > in perl to be ever-so-slightly larger and not be inlined leading to a > measurable performance regression in spec when compiled with gcc-11. > I never bothered upstreaming our internal version of this as other > (non-VRP) changes on the trunk addressed the problem. > > Jeff > so does this resolve the situation then? It should, in theory. Andrew
On 10/28/2021 7:47 AM, Andrew MacLeod wrote: > On 10/28/21 9:38 AM, Jeff Law wrote: >> >> >> On 10/25/2021 6:03 PM, Andrew MacLeod via Gcc-patches wrote: >>> This patch changes the ranger VRP pass to simplify all statements, >>> not just the ones with ranges. I believe Jeff had mentioned we were >>> no longer doing this a while back. Now we need it when running as >>> the VRP2 pass to satisfy the testcase: gcc.dg/wrapped-binop-simplify.c >> I did :-) The lack of folding in [E]VRP caused a critical function >> in perl to be ever-so-slightly larger and not be inlined leading to a >> measurable performance regression in spec when compiled with gcc-11. >> I never bothered upstreaming our internal version of this as other >> (non-VRP) changes on the trunk addressed the problem. >> >> Jeff >> > so does this resolve the situation then? It should, in theory. I would expect so. It's quite similar to what we're doing internally with our gcc-11 tree. jeff
From cb153222404e2e149aa65a4b3139b09477551203 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod <amacleod@redhat.com> Date: Wed, 20 Oct 2021 13:37:29 -0400 Subject: [PATCH 1/2] Fold all statements in Ranger VRP. Until now, ranger VRP has only simplified statements with ranges. This patch enables us to fold all statements. gcc/ * tree-vrp.c (rvrp_folder::fold_stmt): If simplification fails, try to fold anyway. gcc/testsuite/ * gcc.dg/tree-ssa/vrp98.c: Disable evrp for vrp1 test. * gcc.dg/tree-ssa/vrp98-1.c: New. Test for folding in evrp. --- gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c | 41 +++++++++++++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/vrp98.c | 2 +- gcc/tree-vrp.c | 5 ++- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c new file mode 100644 index 00000000000..daa3f073b92 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target int128 } */ +/* { dg-options "-Os -fdump-tree-evrp-details" } */ + +#include <stdint.h> +#include <limits.h> + +typedef unsigned int word __attribute__((mode(word))); +typedef unsigned __int128 bigger_than_word; + +int +foo (bigger_than_word a, word b, uint8_t c) +{ + /* Must fold use of t1 into use of b, as b is no wider than word_mode. */ + const uint8_t t1 = b % UCHAR_MAX; + + /* Must NOT fold use of t2 into use of a, as a is wider than word_mode. */ + const uint8_t t2 = a % UCHAR_MAX; + + /* Must fold use of t3 into use of c, as c is narrower than t3. */ + const uint32_t t3 = (const uint32_t)(c >> 1); + + uint16_t ret = 0; + + if (t1 == 1) + ret = 20; + else if (t2 == 2) + ret = 30; + else if (t3 == 3) + ret = 40; + /* Th extra condition below is necessary to prevent a prior pass from + folding away the cast. Ignored in scan-tree-dump. */ + else if (t3 == 4) + ret = 50; + + return ret; +} + +/* { dg-final { scan-tree-dump "Folded into: if \\(_\[0-9\]+ == 1\\)" "evrp" } } */ +/* { dg-final { scan-tree-dump-not "Folded into: if \\(_\[0-9\]+ == 2\\)" "evrp" } } */ +/* { dg-final { scan-tree-dump "Folded into: if \\(_\[0-9\]+ == 3\\)" "evrp" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c index 982f091080c..78d3bbaf499 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target int128 } */ -/* { dg-options "-Os -fdump-tree-vrp1-details" } */ +/* { dg-options "-Os -fdisable-tree-evrp -fdump-tree-vrp1-details" } */ #include <stdint.h> #include <limits.h> diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index ba7a4efc7c6..a948c524098 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -50,6 +50,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple-range.h" #include "gimple-range-path.h" #include "value-pointer-equiv.h" +#include "gimple-fold.h" /* Set of SSA names found live during the RPO traversal of the function for still active basic-blocks. */ @@ -4381,7 +4382,9 @@ public: bool fold_stmt (gimple_stmt_iterator *gsi) OVERRIDE { - return m_simplifier.simplify (gsi); + if (m_simplifier.simplify (gsi)) + return true; + return ::fold_stmt (gsi, follow_single_use_edges); } private: -- 2.17.2