aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-01-08 17:32:49 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2012-01-08 16:32:49 +0000
commit4c8836c61b19b88ddbfc3502c12dfcd9e87cee71 (patch)
treea713926c58706e6da15d85a29a262e6f8cb3072d
parent11f30bb0e4bf666229b6b236cd3e4ed1de13283a (diff)
downloadgcc-4c8836c61b19b88ddbfc3502c12dfcd9e87cee71.zip
gcc-4c8836c61b19b88ddbfc3502c12dfcd9e87cee71.tar.gz
gcc-4c8836c61b19b88ddbfc3502c12dfcd9e87cee71.tar.bz2
re PR tree-optimization/51694 (ICE while compiling alliance package)
PR tree-optimize/51694 * ipa-cp.c (ipa_get_indirect_edge_target): Add bounds checks. From-SVN: r182993
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-cp.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr51694.c14
4 files changed, 27 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e93424..a2648d8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-01-08 Jan Hubicka <jh@suse.cz>
+
+ PR tree-optimize/51694
+ * ipa-cp.c (ipa_get_indirect_edge_target): Add bounds checks.
+
2012-01-08 Jonathan Wakely <jwakely.gcc@gmail.com>
* doc/cpp.texi (Predefined Macros): __STRICT_ANSI__ is defined
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 2a82df1..ae38366 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -1112,7 +1112,8 @@ ipa_get_indirect_edge_target (struct cgraph_edge *ie,
if (!ie->indirect_info->polymorphic)
{
- tree t = VEC_index (tree, known_vals, param_index);
+ tree t = (VEC_length (tree, known_vals) > param_index
+ ? VEC_index (tree, known_vals, param_index) : NULL);
if (t &&
TREE_CODE (t) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL)
@@ -1126,7 +1127,7 @@ ipa_get_indirect_edge_target (struct cgraph_edge *ie,
otr_type = ie->indirect_info->otr_type;
t = VEC_index (tree, known_vals, param_index);
- if (!t && known_binfos)
+ if (!t && known_binfos && VEC_length (tree, known_binfos) > param_index)
t = VEC_index (tree, known_binfos, param_index);
if (!t)
return NULL_TREE;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3385000..b8b9b94 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2012-01-07 Jan Hubicka <jh@suse.cz>
+ PR tree-optimize/51694
+ * gcc.c-torture/compile/pr51694.c: new testcase.
+
+2012-01-07 Jan Hubicka <jh@suse.cz>
+
PR tree-optimization/51600
* g++.dg/torture/pr51600.C: New testcase.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr51694.c b/gcc/testsuite/gcc.c-torture/compile/pr51694.c
new file mode 100644
index 0000000..579a243
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr51694.c
@@ -0,0 +1,14 @@
+void
+foo (x, fn)
+ void (*fn) ();
+{
+ int a = baz ((void *) 0, x);
+ (*fn) (x, 0);
+}
+
+void
+bar (void)
+{
+ void *x = 0;
+ foo (x);
+}