re PR tree-optimization/65053 (PostgreSQL miscompilation)
authorJakub Jelinek <jakub@redhat.com>
Fri, 13 Feb 2015 23:20:31 +0000 (00:20 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 13 Feb 2015 23:20:31 +0000 (00:20 +0100)
PR tree-optimization/65053
* tree-ssa-phiopt.c (value_replacement): When moving assign before
cond, either reset VR on lhs or set it to phi result VR.

* gcc.c-torture/execute/pr65053-1.c: New test.
* gcc.c-torture/execute/pr65053-2.c: New test.

From-SVN: r220700

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr65053-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/pr65053-2.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.c

index a574c2b06a3629f206b31639654cd09c9e5f7431..0795bc6409bbb24b21e9cbdf0c6f93a4cbd4ed5f 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-13  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/65053
+       * tree-ssa-phiopt.c (value_replacement): When moving assign before
+       cond, either reset VR on lhs or set it to phi result VR.
+
 2015-02-13  Jeff Law  <law@redhat.com>
 
        PR tree-optimization/64823
index 78026a1015ed00ea2ed0dee3e5671af416fe621d..f25e959ae2558988c49fc7a73ec401d268b36be2 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-13  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/65053
+       * gcc.c-torture/execute/pr65053-1.c: New test.
+       * gcc.c-torture/execute/pr65053-2.c: New test.
+
 2015-02-13  Marek Polacek  <polacek@redhat.com>
 
        PR c/65050
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr65053-1.c b/gcc/testsuite/gcc.c-torture/execute/pr65053-1.c
new file mode 100644 (file)
index 0000000..edcf41d
--- /dev/null
@@ -0,0 +1,32 @@
+/* PR tree-optimization/65053 */
+
+int i;
+
+__attribute__ ((noinline, noclone))
+unsigned int foo (void)
+{
+  return 0;
+}
+
+int
+main ()
+{
+  unsigned int u = -1;
+  if (u == -1)
+    {
+      unsigned int n = foo ();
+      if (n > 0)
+       u = n - 1;
+    }
+
+  while (u != -1)
+    {
+      asm ("" : "+g" (u));
+      u = -1;
+      i = 1;
+    }
+
+  if (i)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr65053-2.c b/gcc/testsuite/gcc.c-torture/execute/pr65053-2.c
new file mode 100644 (file)
index 0000000..2a0f4e4
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR tree-optimization/65053 */
+
+int i;
+unsigned int x;
+
+int
+main ()
+{
+  asm volatile ("" : "+g" (x));
+  unsigned int n = x;
+  unsigned int u = 32;
+  if (n >= 32)
+    __builtin_abort ();
+  if (n != 0)
+    u = n + 32;
+
+  while (u != 32)
+    {
+      asm ("" : : "g" (u));
+      u = 32;
+      i = 1;
+    }
+
+  if (i)
+    __builtin_abort ();
+  return 0;
+}
index bad546dd4b767fac6b8242c14659248825b77fe6..c7fb0731296075fbcc3e64759ffe6b5777123f2a 100644 (file)
@@ -917,6 +917,31 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
              && absorbing_element_p (code_def, cond_rhs))))
     {
       gsi = gsi_for_stmt (cond);
+      if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
+       {
+         /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6
+            def-stmt in:
+            if (n_5 != 0)
+              goto <bb 3>;
+            else
+              goto <bb 4>;
+
+            <bb 3>:
+            # RANGE [0, 4294967294]
+            u_6 = n_5 + 4294967295;
+
+            <bb 4>:
+            # u_3 = PHI <u_6(3), 4294967295(2)>  */
+         SSA_NAME_RANGE_INFO (lhs) = NULL;
+         SSA_NAME_ANTI_RANGE_P (lhs) = 0;
+         /* If available, we can use VR of phi result at least.  */
+         tree phires = gimple_phi_result (phi);
+         struct range_info_def *phires_range_info
+           = SSA_NAME_RANGE_INFO (phires);
+         if (phires_range_info)
+           duplicate_ssa_name_range_info (lhs, SSA_NAME_RANGE_TYPE (phires),
+                                          phires_range_info);
+       }
       gimple_stmt_iterator gsi_from = gsi_for_stmt (assign);
       gsi_move_before (&gsi_from, &gsi);
       replace_phi_edge_with_variable (cond_bb, e1, phi, lhs);