diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-07-12 16:28:43 +0000 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-03-13 14:10:40 +0100 |
commit | 8595e197372df80484bb0c1632e1fe3d91895126 (patch) | |
tree | b94b5edd562ddace920f07546a7452a5c7bf922e | |
parent | cc20278a5624717abec3fad0098845a3e9f321bb (diff) |
2019-07-12 Jiangning Liu <jiangning.liu@amperecomputing.com>gcc-9_3_0-amp
PR tree-optimization/89430
* tree-ssa-phiopt.c (cond_store_replacement): Support conditional
store elimination for local variable without address escape.
PR tree-optimization/89430
* gcc.dg/tree-ssa/pr89430-1.c: New test.
* gcc.dg/tree-ssa/pr89430-2.c: New test.
* gcc.dg/tree-ssa/pr89430-3.c: New test.
* gcc.dg/tree-ssa/pr89430-4.c: New test.
* gcc.dg/tree-ssa/pr89430-5.c: New test.
* gcc.dg/tree-ssa/pr89430-6.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@273449 138bc75d-0d04-0410-961f-82ee72b054a4
Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com>
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr89430-3.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr89430-4.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c | 19 | ||||
-rw-r--r-- | gcc/tree-ssa-phiopt.c | 24 |
9 files changed, 123 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c25fefd94378..348f1058c2f4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2804,6 +2804,12 @@ * explow.c (promote_ssa_mode): Always use TYPE_MODE, don't bypass it for VECTOR_TYPE_P. +2019-07-12 Jiangning Liu <jiangning.liu@amperecomputing.com> + + PR tree-optimization/89430 + * tree-ssa-phiopt.c (cond_store_replacement): Support conditional + store elimination for local variable without address escape. + 2019-07-12 Richard Biener <rguenther@suse.de> Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 985a8e17132d..1543621ff8dc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -2495,6 +2495,16 @@ * gcc.target/i386/pr81563.c (dg-final): Check that no registers are restored from %esp. +2019-07-08 Jiangning Liu <jiangning.liu@amperecomputing.com> + + PR tree-optimization/89430 + * gcc.dg/tree-ssa/pr89430-1.c: New test. + * gcc.dg/tree-ssa/pr89430-2.c: New test. + * gcc.dg/tree-ssa/pr89430-3.c: New test. + * gcc.dg/tree-ssa/pr89430-4.c: New test. + * gcc.dg/tree-ssa/pr89430-5.c: New test. + * gcc.dg/tree-ssa/pr89430-6.c: New test. + 2019-07-08 Richard Biener <rguenther@suse.de> PR tree-optimization/91108 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c new file mode 100644 index 000000000000..8ee1850ac632 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-cselim-details" } */ + +unsigned test(unsigned k, unsigned b) { + unsigned a[2]; + if (b < a[k]) { + a[k] = b; + } + return a[0]+a[1]; +} + +/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c new file mode 100644 index 000000000000..9b96875ac7ab --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-cselim-details" } */ + +int c; +unsigned test(unsigned k, unsigned b) { + unsigned a[2]; + a[k] = c; + if (b < a[k]) { + a[k] = b; + } + return a[0]+a[1]; +} + +/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-3.c new file mode 100644 index 000000000000..0fac9f9b9c7e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-3.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-cselim-details" } */ + +unsigned a[2]; +unsigned test(unsigned k, unsigned b) { + if (b < a[k]) { + a[k] = b; + } + return a[0]+a[1]; +} + +/* { dg-final { scan-tree-dump-not "Conditional store replacement" "cselim" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-4.c b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-4.c new file mode 100644 index 000000000000..54b8c11a407b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-4.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-cselim-details" } */ + +int *p; +unsigned test(unsigned k, unsigned b) { + unsigned a[2]; + p = a; + if (b < a[k]) { + a[k] = b; + } + return a[0]+a[1]; +} + +/* { dg-final { scan-tree-dump-not "Conditional store replacement" "cselim" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c new file mode 100644 index 000000000000..b2d041193813 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-cselim-details" } */ + +int test(int b, int k) { + struct { + int data[2]; + } a; + + if (b < a.data[k]) { + a.data[k] = b; + } + + return a.data[0] + a.data[1]; +} + +/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c new file mode 100644 index 000000000000..8d3c4f7cc6a3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-cselim-details" } */ + +int test(int b, int k) { + typedef struct { + int x; + } SS; + struct { + SS data[2]; + } a; + + if (b < a.data[k].x) { + a.data[k].x = b; + } + + return a.data[0].x + a.data[1].x; +} + +/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } */ diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 19b37b43b8eb..94c3fc0521da 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -2182,7 +2182,8 @@ get_non_trapping (void) We check that MIDDLE_BB contains only one store, that that store doesn't trap (not via NOTRAP, but via checking if an access to the same - memory location dominates us) and that the store has a "simple" RHS. */ + memory location dominates us, or the store is to a local addressable + object) and that the store has a "simple" RHS. */ static bool cond_store_replacement (basic_block middle_bb, basic_block join_bb, @@ -2209,8 +2210,9 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb, locus = gimple_location (assign); lhs = gimple_assign_lhs (assign); rhs = gimple_assign_rhs1 (assign); - if (TREE_CODE (lhs) != MEM_REF - || TREE_CODE (TREE_OPERAND (lhs, 0)) != SSA_NAME + if ((TREE_CODE (lhs) != MEM_REF + && TREE_CODE (lhs) != ARRAY_REF + && TREE_CODE (lhs) != COMPONENT_REF) || !is_gimple_reg_type (TREE_TYPE (lhs))) return false; @@ -2218,7 +2220,13 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb, TREE_THIS_NOTRAP here, but in that case we also could move stores, whose value is not available readily, which we want to avoid. */ if (!nontrap->contains (lhs)) - return false; + { + /* If LHS is a local variable without address-taken, we could + always safely move down the store. */ + tree base = get_base_address (lhs); + if (!auto_var_p (base) || TREE_ADDRESSABLE (base)) + return false; + } /* Now we've checked the constraints, so do the transformation: 1) Remove the single store. */ @@ -2271,6 +2279,14 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb, else gsi_insert_before (&gsi, new_stmt, GSI_NEW_STMT); + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "\nConditional store replacement happened!"); + fprintf (dump_file, "\nReplaced the store with a load."); + fprintf (dump_file, "\nInserted a new PHI statement in joint block:\n"); + print_gimple_stmt (dump_file, new_stmt, 0, TDF_VOPS|TDF_MEMSYMS); + } + return true; } |