Fix a typo in two_value_replacement function
authorLi Jia He <helijia@linux.ibm.com>
Mon, 6 May 2019 06:00:03 +0000 (06:00 +0000)
committerLi Jia He <helijia@gcc.gnu.org>
Mon, 6 May 2019 06:00:03 +0000 (06:00 +0000)
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  <helijia@linux.ibm.com>

* 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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr37508.c
gcc/testsuite/gcc.dg/tree-ssa/pr88676-2.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.c

index 7ab0457c150a4ba4de396021e14d00e207b6d454..1a4bcebb6ad4b01d17adcbfcdd4a19b840129beb 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-06  Li Jia He  <helijia@linux.ibm.com>
+
+       * tree-ssa-phiopt.c (two_value_replacement): Fix a typo in parameter
+       detection.
+
 2019-05-03  Richard Earnshaw  <rearnsha@arm.com>
 
        PR target/89400
index 19d593edef38248c547bf35521c7ac0dfa318b14..bf4a602d73d06c17a691c3032cc58aa372527658 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-06  Li Jia He  <helijia@linux.ibm.com>
+
+       * 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 <tkoenig@gcc.gnu.org>
 
        PR fortran/90344
index 2ba09afe4819e622e34798dcbe935a184fe39e77..a6def045de40b725b5e44f2c0c6c6ed97e9c61c2 100644 (file)
@@ -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 (file)
index 0000000..a549a1e
--- /dev/null
@@ -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;
+}
+
index 219791ea4ba57c234e96ead69dec3ea00d025ad5..90674a2f3c49a852b208daf032b2934c343c45be 100644 (file)
@@ -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))