From 94adc935af1e1e6a90c0d6127707f7b3a53b692d Mon Sep 17 00:00:00 2001 From: Li Jia He Date: Mon, 6 May 2019 06:00:03 +0000 Subject: [PATCH] Fix a typo in two_value_replacement function GCC revision 267634 implemented two_value_replacement function. However, a typo occurred during the parameter check, which caused us to miss some optimizations. The intent of the code might be to check that the input parameters are const int and their difference is one. However, when I read the code, I found that it is wrong to detect whether an input data plus one is equal to itself. This could be a typo. 2019-05-06 Li Jia He * tree-ssa-phiopt.c (two_value_replacement): Fix a typo in parameter detection. * gcc.dg/tree-ssa/pr37508.c: Add the no-ssa-phiopt option to skip phi optimization. * gcc.dg/tree-ssa/pr88676-2.c: New testcase. From-SVN: r270894 --- gcc/ChangeLog | 5 ++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gcc.dg/tree-ssa/pr37508.c | 6 ++--- gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c | 30 +++++++++++++++++++++++ gcc/tree-ssa-phiopt.c | 2 +- 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ab0457c150..1a4bcebb6ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-05-06 Li Jia He + + * tree-ssa-phiopt.c (two_value_replacement): Fix a typo in parameter + detection. + 2019-05-03 Richard Earnshaw PR target/89400 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19d593edef3..bf4a602d73d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-05-06 Li Jia He + + * gcc.dg/tree-ssa/pr37508.c: Add the no-ssa-phiopt option to skip phi + optimization. + * gcc.dg/tree-ssa/pr88676-2.c: New testcase. + 2019-05-05 Thomas Koenig PR fortran/90344 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr37508.c b/gcc/testsuite/gcc.dg/tree-ssa/pr37508.c index 2ba09afe481..a6def045de4 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr37508.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr37508.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1" } */ +/* { dg-options "-O2 -fno-ssa-phiopt -fno-tree-fre -fdump-tree-vrp1" } */ struct foo1 { int i:1; @@ -22,7 +22,7 @@ int test2 (struct foo2 *x) { if (x->i == 0) return 1; - else if (x->i == -1) /* This test is already folded to false by ccp1. */ + else if (x->i == -1) /* This test is already optimized by ccp1 or phiopt1. */ return 1; return 0; } @@ -31,7 +31,7 @@ int test3 (struct foo1 *x) { if (x->i == 0) return 1; - else if (x->i == 1) /* This test is already folded to false by fold. */ + else if (x->i == 1) /* This test is already optimized by ccp1 or phiopt1. */ return 1; return 0; } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c new file mode 100644 index 00000000000..a549a1ef13d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c @@ -0,0 +1,30 @@ +/* PR tree-optimization/88676 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-phiopt1" } */ +/* { dg-final { scan-tree-dump-not " = PHI <" "optimized" } } */ + +struct foo1 { + int i:1; +}; +struct foo2 { + unsigned i:1; +}; + +int test1 (struct foo1 *x) +{ + if (x->i == 0) + return 1; + else if (x->i == 1) + return 1; + return 0; +} + +int test2 (struct foo2 *x) +{ + if (x->i == 0) + return 1; + else if (x->i == -1) + return 1; + return 0; +} + diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 219791ea4ba..90674a2f3c4 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -602,7 +602,7 @@ two_value_replacement (basic_block cond_bb, basic_block middle_bb, || TREE_CODE (arg1) != INTEGER_CST || (tree_int_cst_lt (arg0, arg1) ? wi::to_widest (arg0) + 1 != wi::to_widest (arg1) - : wi::to_widest (arg1) + 1 != wi::to_widest (arg1))) + : wi::to_widest (arg1) + 1 != wi::to_widest (arg0))) return false; if (!empty_block_p (middle_bb)) -- 2.30.2