re PR tree-optimization/16443 (ICE during linux kernel compilation)
authorDiego Novillo <dnovillo@redhat.com>
Tue, 13 Jul 2004 20:51:02 +0000 (20:51 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Tue, 13 Jul 2004 20:51:02 +0000 (16:51 -0400)
PR tree-optimization/16443
* tree-ssa-alias.c: Add more description for
CALL_CLOBBERED_VARS and ADDRESSABLE_VARS.
* tree-ssa-operands.c (get_asm_expr_operands): Re-order the
clobbering of call-clobbered and addressable variables.  If
there are any before aliases have been computed, add them.

testsuite/ChangeLog

PR tree-optimization/16443
* gcc.dg/tree-ssa/20040713-1.c: New test.

From-SVN: r84641

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

index 8febe2abd4461bb941a8ba7399e3e20bfd08c64b..0e71184813c8c18d8f7d6fdedc036f8e34604af9 100644 (file)
@@ -1,3 +1,12 @@
+2004-07-13  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/16443
+       * tree-ssa-alias.c: Add more description for
+       CALL_CLOBBERED_VARS and ADDRESSABLE_VARS.
+       * tree-ssa-operands.c (get_asm_expr_operands): Re-order the
+       clobbering of call-clobbered and addressable variables.  If
+       there are any before aliases have been computed, add them.
+
 2004-07-13  Diego Novillo  <dnovillo@redhat.com>
 
        * tree-optimize.c (execute_todo): Flush DUMP_FILE before
index 1089cdf1c84746b25c2697185089833448eebc40..19083e0362bed6b1c9a65b4bd92bd768b2e28ee7 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-13  Diego Novillo  <dnovillo@redhat.com>
+
+       PR tree-optimization/16443
+       * gcc.dg/tree-ssa/20040713-1.c: New test.
+
 2004-07-15  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * g++.dg/lookup/new2.C: Use first operand of type __SIZE_TYPE__
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040713-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040713-1.c
new file mode 100644 (file)
index 0000000..78919d0
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+/* Extracted from PR 16443.  Contributed by Volker Reichelt.
+   Scanning of __asm__ operands wasn't considering call-clobbered
+   variables discovered before the aliasing pass.  This was causing a
+   crash in verify_ssa() because 'p' was not being given an SSA_NAME.  */
+
+void foo(char *p)
+{
+    __asm__ ("" ::: "memory");
+}
+
+void bar()
+{
+    static char *p;
+    foo(p);
+}
index cc0a00a559b568e66ac39e560a86bdbfd6a7e254..9da01676f43488575705c6966985ffd9a9fd6d24 100644 (file)
@@ -164,7 +164,12 @@ static struct ptr_info_def *get_ptr_info (tree t);
 bitmap call_clobbered_vars;
 
 /* Addressable variables in the function.  If bit I is set, then
-   REFERENCED_VARS (I) has had its address taken.  */
+   REFERENCED_VARS (I) has had its address taken.  Note that
+   CALL_CLOBBERED_VARS and ADDRESSABLE_VARS are not related.  An
+   addressable variable is not necessarily call-clobbered (e.g., a
+   local addressable whose address does not escape) and not all
+   call-clobbered variables are addressable (e.g., a local static
+   variable).  */
 bitmap addressable_vars;
 
 /* 'true' after aliases have been computed (see compute_may_aliases).  This
index 90b9d022b556706300737eee62e3518798589568..b9c5a6cf670a9285910c7e08c7063b1e5d294668 100644 (file)
@@ -1231,16 +1231,6 @@ get_asm_expr_operands (tree stmt, voperands_t prev_vops)
       {
        size_t i;
 
-       /* If we still have not computed aliasing information, we
-          won't know what variables are call-clobbered and/or
-          addressable.  Just mark the statement as having volatile
-          operands for now.  */
-       if (!aliases_computed_p)
-         {
-           stmt_ann (stmt)->has_volatile_ops = true;
-           break;
-         }
-
        /* Clobber all call-clobbered variables (or .GLOBAL_VAR if we
           decided to group them).  */
        if (global_var)
@@ -1259,6 +1249,13 @@ get_asm_expr_operands (tree stmt, voperands_t prev_vops)
              add_stmt_operand (&var, stmt, opf_is_def, prev_vops);
            });
 
+       /* If we don't have call-clobbered nor addressable vars and we
+          still have not computed aliasing information, just mark the
+          statement as having volatile operands.  If the alias pass
+          finds some, we will add them at that point.  */
+       if (!aliases_computed_p)
+         stmt_ann (stmt)->has_volatile_ops = true;
+
        break;
       }
 }