tree-ssa-operands.c (get_expr_operands): Do not treat malloc attributed functions...
authorSteven Bosscher <stevenb@suse.de>
Mon, 17 May 2004 21:25:32 +0000 (21:25 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Mon, 17 May 2004 21:25:32 +0000 (21:25 +0000)
* tree-ssa-operands.c (get_expr_operands): Do not treat malloc
attributed functions as pure or const.

From-SVN: r81951

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/20040517-1.c [new file with mode: 0644]
gcc/tree-ssa-operands.c

index db93d50..ea3b7f9 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-17  Steven Bosscher  <stevenb@suse.de>
+
+       * tree-ssa-operands.c (get_expr_operands): Do not treat malloc
+       attributed functions as pure or const.
+
 2004-05-17  Frank Ch. Eigler  <fche@redhat.com>
 
        * tree-mudflap.c (mx_register_decls): Tolerate decl trees resulting
index ad748bc..82a596b 100644 (file)
@@ -1,3 +1,7 @@
+2004-05-17  Steven Bosscher  <stevenb@suse.de>
+
+       * gcc.dg/tree-ssa/20040517-1.c: New test.
+
 2004-05-15  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * gcc.dg/tree-ssa/20040514-1.c: Add '}' that was forgotten.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040517-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040517-1.c
new file mode 100644 (file)
index 0000000..c38f1b3
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-ssa-vops" } */
+int a; 
+extern void __attribute__ ((malloc)) *foo ();
+void bar (void) 
+{ 
+  a = 1; 
+  foo (); 
+  if (a) 
+    abort (); 
+} 
+
+/* We used to treat malloc functions like pure and const functions, but
+   malloc functions may clobber global memory.  Only the function result
+   does not alias any other pointer.
+   Hence, we must have a VDEF for a before and after the call to foo().  */
+/* { dg-final { scan-tree-dump-times "VDEF" 2 "ssa"} } */
+
index de5b16d..f011275 100644 (file)
@@ -1023,12 +1023,11 @@ get_expr_operands (tree stmt, tree *expr_p, int flags, voperands_t prev_vops)
 
       if (bitmap_first_set_bit (call_clobbered_vars) >= 0)
        {
+         /* A 'pure' or a 'const' functions never call clobber anything. 
+            A 'noreturn' function might, but since we don't return anyway 
+            there is no point in recording that.  */ 
          if (!(call_flags
-               & (ECF_PURE
-                  | ECF_CONST
-                  | ECF_NORETURN
-                  | ECF_MALLOC
-                  | ECF_MAY_BE_ALLOCA)))
+               & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
            add_call_clobber_ops (stmt, prev_vops);
          else if (!(call_flags & (ECF_CONST | ECF_NORETURN)))
            add_call_read_ops (stmt, prev_vops);