re PR middle-end/70920 (if ((intptr_t)ptr == 0) doesn't get simplified to if (ptr...
authorRichard Biener <rguenther@suse.de>
Tue, 26 Jul 2016 13:10:33 +0000 (13:10 +0000)
committerPrathamesh Kulkarni <prathamesh3492@gcc.gnu.org>
Tue, 26 Jul 2016 13:10:33 +0000 (13:10 +0000)
2016-07-26  Richard Biener  <rguenther@suse.de>
    Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>

PR middle-end/70920
* match.pd ((intptr)x eq/ne CST to x eq/ne (typeof x) CST): New
pattern.

testsuite/
* gcc.dg/pr70920-1.c: New test-case.
* gcc.dg/pr70902-2.c: Likewise.
* gcc.dg/pr70920-3.c: Likewise.
* gcc.dg/pr70920-4.c: Likewise
* gcc.dg/tree-ssa/ssa-dom-branch-1.c: Change scan-tree-dump-times to
2 instead of 3.

Co-Authored-By: Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
From-SVN: r238754

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr70920-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr70920-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr70920-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr70920-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-branch-1.c

index beed54d295d405a68e57f45062fad26cfc2347c5..bbc7e298d4a32c729ac54dc17399ae5053382ff5 100644 (file)
@@ -1,3 +1,10 @@
+2016-07-26  Richard Biener  <rguenther@suse.de>
+           Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
+
+       PR middle-end/70920
+       * match.pd ((intptr)x eq/ne CST to x eq/ne (typeof x) CST): New
+       pattern.
+
 2016-07-26  Trevor Saunders  <tbsaunde+gcc@tbsaunde.org>
 
        * tree-ssa-structalias.c (struct scc_info): Change types of
index 21bf6177cddf1bf7e659460eea25adee2d8bcfc4..6c2ec82340a4679a069417a548e9cf723858e55a 100644 (file)
@@ -2513,6 +2513,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && ptrs_compare_unequal (@0, @1))
    { neeq == EQ_EXPR ? boolean_false_node : boolean_true_node; })))
 
+/* PR70920: Transform (intptr_t)x eq/ne CST to x eq/ne (typeof x) CST.
+   and (typeof ptr_cst) x eq/ne ptr_cst to x eq/ne (typeof x) CST */
+(for cmp (ne eq)
+ (simplify
+  (cmp (convert @0) INTEGER_CST@1)
+  (if ((POINTER_TYPE_P (TREE_TYPE (@0)) && INTEGRAL_TYPE_P (TREE_TYPE (@1)))
+        || (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && POINTER_TYPE_P (TREE_TYPE (@1))))
+   (cmp @0 (convert @1)))))
+
 /* Non-equality compare simplifications from fold_binary  */
 (for cmp (lt gt le ge)
  /* Comparisons with the highest or lowest possible integer of
index 19ea0eda9973eb2da321951b887c266a9c6bc612..b63a79c088c40eb8d7c1128665a4046a13542a65 100644 (file)
@@ -1,3 +1,14 @@
+2016-07-26  Richard Biener  <rguenther@suse.de>
+           Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
+
+       PR middle-end/70920
+       * gcc.dg/pr70920-1.c: New test-case.
+       * gcc.dg/pr70902-2.c: Likewise.
+       * gcc.dg/pr70920-3.c: Likewise.
+       * gcc.dg/pr70920-4.c: Likewise
+       * gcc.dg/tree-ssa/ssa-dom-branch-1.c: Change scan-tree-dump-times to
+       2 instead of 3.
+
 2016-07-25  Alexander Monakov  <amonakov@ispras.ru>
 
        * gcc.c-torture/execute/pr71494.c: Require label_values.
diff --git a/gcc/testsuite/gcc.dg/pr70920-1.c b/gcc/testsuite/gcc.dg/pr70920-1.c
new file mode 100644 (file)
index 0000000..9b7e2d0
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+#include <stdint.h>
+
+void f1();
+void f2();
+
+void
+foo (int *a)
+{
+  if ((intptr_t) a == 0)
+    {
+      f1 ();
+      if (a)
+       f2 (); 
+    }
+}
+
+/* { dg-final { scan-tree-dump "if \\(a == 0B\\)" "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/pr70920-2.c b/gcc/testsuite/gcc.dg/pr70920-2.c
new file mode 100644 (file)
index 0000000..2db9897
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-forwprop-details" } */
+
+#include <stdint.h>
+
+void f1();
+void f2();
+
+void
+foo (int *a)
+{
+  int cst = 0;
+  if ((intptr_t) a == cst)
+    {
+      f1 ();
+      if (a) 
+       f2 (); 
+    }
+}
+
+/* { dg-final { scan-tree-dump "gimple_simplified to if \\(a_\[0-9\]*\\(D\\) == 0B\\)" "forwprop1" } } */
diff --git a/gcc/testsuite/gcc.dg/pr70920-3.c b/gcc/testsuite/gcc.dg/pr70920-3.c
new file mode 100644 (file)
index 0000000..8b24cbc
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple -Wno-int-to-pointer-cast" } */
+
+#include <stdint.h>
+
+void f1();
+void f2();
+
+void
+foo (int a)
+{
+  if ((int *) a == 0)
+    {
+      f1 ();
+      if (a)
+       f2 (); 
+    }
+}
+
+/* { dg-final { scan-tree-dump "if \\(a == 0\\)" "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/pr70920-4.c b/gcc/testsuite/gcc.dg/pr70920-4.c
new file mode 100644 (file)
index 0000000..dedb895
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ccp-details -Wno-int-to-pointer-cast" } */
+
+#include <stdint.h>
+
+void f1();
+void f2();
+
+void
+foo (int a)
+{
+  void *cst = 0; 
+  if ((int *) a == cst)
+    {
+      f1 ();
+      if (a) 
+       f2 (); 
+    }
+}
+
+/* { dg-final { scan-tree-dump "gimple_simplified to if \\(_\[0-9\]* == 0\\)" "ccp1" } } */
index 18f9041827d8dd0a62755e8b4ab64e12bdb795aa..3c15296dfeb21e42135637ad043546205a35077b 100644 (file)
@@ -19,9 +19,9 @@ try_combine (rtx i1, rtx newpat)
   else if (i1 && foo ());
 }
 
-/* There should be three tests against i1.  Two from the hash table
+/* There should be two tests against i1.  One from the hash table
    dumps, one in the code itself.  */
-/* { dg-final { scan-tree-dump-times "if .i1_" 3 "dom2"} } */
+/* { dg-final { scan-tree-dump-times "if .i1_" 2 "dom2"} } */
 
 /* There should be no actual jump threads realized by DOM.  The
    legitimize jump threads are handled in VRP and those discovered