tree-stdarg.c (execute_optimize_stdarg): Handle references to va_list of the form...
authorRichard Guenther <rguenth@gcc.gnu.org>
Sat, 21 May 2005 12:35:55 +0000 (12:35 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sat, 21 May 2005 12:35:55 +0000 (12:35 +0000)
2005-05-21  Richard Guenther  <rguenth@gcc.gnu.org>

* tree-stdarg.c (execute_optimize_stdarg): Handle references
to va_list of the form &va[0].

From-SVN: r100043

gcc/ChangeLog
gcc/tree-stdarg.c

index f503efb986f46e91675b9e9df5cd5a3d3b452a8f..e7e90f051f22120f76d25688a87484161027ba7e 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-21  Richard Guenther  <rguenth@gcc.gnu.org>
+
+       * tree-stdarg.c (execute_optimize_stdarg): Handle references
+       to va_list of the form &va[0].
+
 2005-05-20  Jan Hubicka  <jh@suse.cz>
 
        * Makefile.in (insn-emit.o): Add basic-block.h dependency.
index 5c3b81b724a6874fcbacdf4aca4acb1609d35cb5..c0d16b1b31e8231e9156399a381e29bb010fe6ed 100644 (file)
@@ -660,16 +660,30 @@ execute_optimize_stdarg (void)
 
          si.va_start_count++;
          ap = TREE_VALUE (TREE_OPERAND (call, 1));
-         if (TREE_CODE (ap) != ADDR_EXPR
-             || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (ap, 0)))
-                != TYPE_MAIN_VARIANT (va_list_type_node)
-             || TREE_CODE (TREE_OPERAND (ap, 0)) != VAR_DECL)
+
+         if (TREE_CODE (ap) != ADDR_EXPR)
            {
              va_list_escapes = true;
              break;
            }
-
          ap = TREE_OPERAND (ap, 0);
+         if (TREE_CODE (ap) == ARRAY_REF)
+           {
+             if (! integer_zerop (TREE_OPERAND (ap, 1)))
+               {
+                 va_list_escapes = true;
+                 break;
+               }
+             ap = TREE_OPERAND (ap, 0);
+           }
+         if (TYPE_MAIN_VARIANT (TREE_TYPE (ap))
+             != TYPE_MAIN_VARIANT (va_list_type_node)
+             || TREE_CODE (ap) != VAR_DECL)
+           {
+             va_list_escapes = true;
+             break;
+           }
+
          if (is_global_var (ap))
            {
              va_list_escapes = true;