aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-03-06 23:51:28 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2009-03-06 23:51:28 +0100
commit65401a0ba393e9f2b971e9069e0335dc26c8a917 (patch)
treed04ea7237c3310a33db5662c63ae571acd66723f /gcc
parent9f0e7885bb87904aac629a6c9aa3df4156667c08 (diff)
downloadgcc-65401a0ba393e9f2b971e9069e0335dc26c8a917.zip
gcc-65401a0ba393e9f2b971e9069e0335dc26c8a917.tar.gz
gcc-65401a0ba393e9f2b971e9069e0335dc26c8a917.tar.bz2
re PR middle-end/39360 (ICE in referenced_var_lookup, at tree-dfa.c:563)
PR middle-end/39360 * tree-flow.h (add_referenced_var): Return bool instead of void. * tree-dfa.c (add_referenced_var): Return result of referenced_var_check_and_insert call. * tree-inline.c (expand_call_inline): Call add_referenced_var instead of referenced_var_check_and_insert. * gcc.c-torture/compile/pr39360.c: New test. From-SVN: r144683
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr39360.c16
-rw-r--r--gcc/tree-dfa.c12
-rw-r--r--gcc/tree-flow.h2
-rw-r--r--gcc/tree-inline.c4
6 files changed, 37 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f6204bf..68bd222 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2009-03-06 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/39360
+ * tree-flow.h (add_referenced_var): Return bool instead of void.
+ * tree-dfa.c (add_referenced_var): Return result of
+ referenced_var_check_and_insert call.
+ * tree-inline.c (expand_call_inline): Call add_referenced_var instead
+ of referenced_var_check_and_insert.
+
PR debug/39372
* dwarf2out.c (add_abstract_origin_attribute): Return
origin_die.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cbc8ae2..c349894 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2009-03-06 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/39360
+ * gcc.c-torture/compile/pr39360.c: New test.
+
PR debug/39372
* g++.dg/debug/dwarf2/static-local-var-in-ctor.C: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39360.c b/gcc/testsuite/gcc.c-torture/compile/pr39360.c
new file mode 100644
index 0000000..0bd6311
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr39360.c
@@ -0,0 +1,16 @@
+/* PR middle-end/39360 */
+
+static int a[] = { 1 };
+
+static inline void
+bar (int **x)
+{
+ static int *c[2] = { 0, a };
+ *x = c[1];
+}
+
+int
+foo (int **x)
+{
+ bar (x);
+}
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index df0be2d..5241e64 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -1,6 +1,6 @@
/* Data flow functions for trees.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 Free Software
- Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
+ Free Software Foundation, Inc.
Contributed by Diego Novillo <dnovillo@redhat.com>
This file is part of GCC.
@@ -639,7 +639,7 @@ set_default_def (tree var, tree def)
/* Add VAR to the list of referenced variables if it isn't already there. */
-void
+bool
add_referenced_var (tree var)
{
var_ann_t v_ann;
@@ -655,7 +655,7 @@ add_referenced_var (tree var)
/* Tag's don't have DECL_INITIAL. */
if (MTAG_P (var))
- return;
+ return true;
/* Scan DECL_INITIAL for pointer variables as they may contain
address arithmetic referencing the address of other
@@ -667,7 +667,11 @@ add_referenced_var (tree var)
optimizers. */
&& !DECL_EXTERNAL (var))
walk_tree (&DECL_INITIAL (var), find_vars_r, NULL, 0);
+
+ return true;
}
+
+ return false;
}
/* Remove VAR from the list. */
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index 01953b5..4082967 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -768,7 +768,7 @@ extern void dump_referenced_vars (FILE *);
extern void dump_variable (FILE *, tree);
extern void debug_variable (tree);
extern tree get_virtual_var (tree);
-extern void add_referenced_var (tree);
+extern bool add_referenced_var (tree);
extern void remove_referenced_var (tree);
extern void mark_symbols_for_renaming (gimple);
extern void find_new_referenced_vars (gimple);
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 63392e2..917b526 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1,5 +1,5 @@
/* Tree inlining.
- Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+ Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by Alexandre Oliva <aoliva@redhat.com>
@@ -3383,7 +3383,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
var = TREE_VALUE (t_step);
if (TREE_STATIC (var) && !TREE_ASM_WRITTEN (var))
{
- if (var_ann (var) && referenced_var_check_and_insert (var))
+ if (var_ann (var) && add_referenced_var (var))
cfun->local_decls = tree_cons (NULL_TREE, var,
cfun->local_decls);
}