summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-21 12:35:55 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-21 12:35:55 +0000
commit8b151587bb45dfb8930ea5dc03beadffacf1a7e5 (patch)
tree073f9964a4c1cad83a1b9ebcba599d787632e79d
parent50f0ca0a0d7f9b6a4e94b4c42f59f4cee2c1a7f1 (diff)
downloadppe42-gcc-8b151587bb45dfb8930ea5dc03beadffacf1a7e5.tar.gz
ppe42-gcc-8b151587bb45dfb8930ea5dc03beadffacf1a7e5.zip
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]. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100043 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-stdarg.c24
2 files changed, 24 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f503efb986f..e7e90f051f2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c
index 5c3b81b724a..c0d16b1b31e 100644
--- a/gcc/tree-stdarg.c
+++ b/gcc/tree-stdarg.c
@@ -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;
OpenPOWER on IntegriCloud