re PR tree-optimization/29964 (function with volatile operators still found to be...
authorAndrew Pinski <andrew_pinski@playstation.sony.com>
Fri, 24 Nov 2006 18:32:14 +0000 (18:32 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Fri, 24 Nov 2006 18:32:14 +0000 (10:32 -0800)
2006-11-24  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/29964
        * ipa-pure-const.c (check_tree): If the original tree
        is volatile return early and say the function is not pure
        nor const.  Remove the volatile check for writes.
        (analyze_function): Print out the result of the local
        analysis pass.

2006-11-24  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR tree-opt/29964
        * gcc.dg/pure-1.c: New test.

From-SVN: r119162

gcc/ChangeLog
gcc/ipa-pure-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pure-1.c [new file with mode: 0644]

index 85c0349..12c14de 100644 (file)
@@ -1,3 +1,12 @@
+2006-11-24  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR tree-opt/29964
+       * ipa-pure-const.c (check_tree): If the original tree
+       is volatile return early and say the function is not pure
+       nor const.  Remove the volatile check for writes.  
+       (analyze_function): Print out the result of the local
+       analysis pass.
+
 2006-11-24  Joseph Myers  <joseph@codesourcery.com>
 
        * config/rs6000/eabispe.h (TARGET_DEFAULT): Include
index 041cf29..fdaff50 100644 (file)
@@ -166,6 +166,14 @@ check_tree (funct_state local, tree t, bool checking_write)
   if ((TREE_CODE (t) == EXC_PTR_EXPR) || (TREE_CODE (t) == FILTER_EXPR))
     return;
 
+  /* Any tree which is volatile disqualifies thie function from being
+     const or pure. */
+  if (TREE_THIS_VOLATILE (t))
+    {
+      local->pure_const_state = IPA_NEITHER;
+      return;
+    }
+
   while (TREE_CODE (t) == REALPART_EXPR 
         || TREE_CODE (t) == IMAGPART_EXPR
         || handled_component_p (t))
@@ -183,12 +191,13 @@ check_tree (funct_state local, tree t, bool checking_write)
       
       /* Any indirect reference that occurs on the lhs
         disqualifies the function from being pure or const. Any
-        indirect reference to a volatile disqualifies the
-        function from being pure or const.  Any indirect
-        reference that occurs on the rhs disqualifies the
+        indirect reference that occurs on the rhs disqualifies the
         function from being const.  */
-      if (checking_write || TREE_THIS_VOLATILE (t)) 
-       local->pure_const_state = IPA_NEITHER;
+      if (checking_write) 
+       {
+         local->pure_const_state = IPA_NEITHER;
+         return;
+       }
       else if (local->pure_const_state == IPA_CONST)
        local->pure_const_state = IPA_PURE;
     }
@@ -541,7 +550,7 @@ analyze_function (struct cgraph_node *fn)
              walk_tree (bsi_stmt_ptr (bsi), scan_function, 
                         fn, visited_nodes);
              if (l->pure_const_state == IPA_NEITHER) 
-               return;
+               goto end;
            }
        }
 
@@ -568,6 +577,14 @@ analyze_function (struct cgraph_node *fn)
          pop_cfun ();
        }
     }
+
+end:
+  if (dump_file)
+    {
+      fprintf (dump_file, "after local analysis of %s with initial value = %d\n ", 
+              cgraph_node_name (fn),
+              l->pure_const_state);
+    }
 }
 
 \f
index 05fb4f6..49a333b 100644 (file)
@@ -1,3 +1,8 @@
+2006-11-24  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR tree-opt/29964
+       * gcc.dg/pure-1.c: New test.
+
 2006-11-24  Joseph Myers  <joseph@codesourcery.com>
 
        * g++.dg/eh/simd-2.C: Use -O -w in general for PowerPC.
diff --git a/gcc/testsuite/gcc.dg/pure-1.c b/gcc/testsuite/gcc.dg/pure-1.c
new file mode 100644 (file)
index 0000000..f365c8d
--- /dev/null
@@ -0,0 +1,16 @@
+/* Regression test for PR middle-end/23584 */
+/* Verify that dereferencing a volatile element in a struct causes
+   the function not be pure.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-ipa-pure-const" } */
+
+struct test_a { volatile int a; };
+
+int func_a(struct test_a *a)
+{
+        return a->a;
+}
+
+/* { dg-final { scan-ipa-dump-not "found to be pure: func_a" "pure-const" } } */
+/* { dg-final { cleanup-ipa-dump "pure-const" } } */