diff options
author | Andrew Pinski <quic_apinski@quicinc.com> | 2024-07-25 17:43:07 -0700 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2024-07-28 19:06:00 +0200 |
commit | 65936041dbffdc735bed4dbf831462ff3922d28f (patch) | |
tree | 3a3051c09ac778d3c86e1e6829df82b7746193af /gcc | |
parent | f9caac3ac9c1de99092433c4480a6a59c0078790 (diff) | |
download | gcc-65936041dbffdc735bed4dbf831462ff3922d28f.zip gcc-65936041dbffdc735bed4dbf831462ff3922d28f.tar.gz gcc-65936041dbffdc735bed4dbf831462ff3922d28f.tar.bz2 |
isel: Don't duplicate comparisons for -O0 nor -fno-tree-ter [PR116101]
While doing cleanups on this code I noticed that we do the duplicate
of comparisons at -O0. For C and C++ code this makes no difference as
the gimplifier never produces COND_EXPR. But it could make a difference
for other front-ends.
Oh and for -fno-tree-ter, duplicating the comparison is just a waste
as it is never used for expand.
I also decided to add a few testcases so this is checked in the future.
Even added one for the duplication itself.
Bootstrapped and tested on x86_64-linux-gnu with no regressions.
PR tree-optimization/116101
gcc/ChangeLog:
* gimple-isel.cc (maybe_duplicate_comparison): Don't
do anything for -O0 or -fno-tree-ter.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-ssa/dup_compare_cond-1.c: New test.
* gcc.dg/tree-ssa/dup_compare_cond-2.c: New test.
* gcc.dg/tree-ssa/dup_compare_cond-3.c: New test.
Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-isel.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-1.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-2.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-3.c | 19 |
4 files changed, 62 insertions, 0 deletions
diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc index 99bfc93..2817ab6 100644 --- a/gcc/gimple-isel.cc +++ b/gcc/gimple-isel.cc @@ -407,6 +407,11 @@ maybe_duplicate_comparison (gassign *stmt, basic_block bb) tree lhs = gimple_assign_lhs (stmt); unsigned cnt = 0; + /* This is should not be used for -O0 nor it is not useful + when ter is turned off. */ + if (!optimize || !flag_tree_ter) + return; + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs) { if (is_gimple_debug (USE_STMT (use_p))) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-1.c b/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-1.c new file mode 100644 index 0000000..0321a60 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-1.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple -O0 -fdump-tree-optimized " } */ +/* PR tree-optimization/116101 */ + +int __GIMPLE() f(int a, int b, int c, int d, int e) +{ + _Bool t; + int ff; + int gg; + int res; + t = a == b; + ff = t ? a : e; + gg = t ? d : b; + res = ff+gg; + return res; +} + +/* At -O0 we should not duplicate the comparison. */ +/* { dg-final { scan-tree-dump-times " == " 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-2.c b/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-2.c new file mode 100644 index 0000000..07e2175 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-2.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple -O2 -fdump-tree-optimized " } */ +/* PR middle-end/105715 */ + +int __GIMPLE() f(int a, int b, int c, int d, int e) +{ + _Bool t; + int ff; + int gg; + int res; + t = a == b; + ff = t ? a : e; + gg = t ? d : b; + res = ff+gg; + return res; +} + +/* At -O2 we should have duplicate the comparison. */ +/* { dg-final { scan-tree-dump-times " == " 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-3.c b/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-3.c new file mode 100644 index 0000000..88bf197 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/dup_compare_cond-3.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple -O2 -fno-tree-ter -fdump-tree-optimized " } */ +/* PR tree-optimization/116101 */ + +int __GIMPLE() f(int a, int b, int c, int d, int e) +{ + _Bool t; + int ff; + int gg; + int res; + t = a == b; + ff = t ? a : e; + gg = t ? d : b; + res = ff+gg; + return res; +} + +/* With -fno-tree-ter it is not useful to duplicate the comparison. */ +/* { dg-final { scan-tree-dump-times " == " 1 "optimized" } } */ |