aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-12-09 11:06:34 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-12-09 11:06:34 +0000
commitb3b30b2401e192a42d4a75728dd198223573dd81 (patch)
tree177e1eca8dc59d171ca5d3c5e070b02640e36abb /gcc
parent30da611174c5fe050203f6ff0faa237c522f96ff (diff)
downloadgcc-b3b30b2401e192a42d4a75728dd198223573dd81.zip
gcc-b3b30b2401e192a42d4a75728dd198223573dd81.tar.gz
gcc-b3b30b2401e192a42d4a75728dd198223573dd81.tar.bz2
re PR tree-optimization/38445 (ICE in tree-ssa-struct-alias when compiling grub-0.97)
2008-12-09 Richard Guenther <rguenther@suse.de> PR tree-optimization/38445 * tree-ssa-structalias.c (emit_pointer_definition): Only visit names once. (emit_alias_warning): Adjust. From-SVN: r142590
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-ssa-structalias.c15
2 files changed, 18 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6f4c937..ae10870 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-09 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/38445
+ * tree-ssa-structalias.c (emit_pointer_definition): Only visit
+ names once.
+ (emit_alias_warning): Adjust.
+
2008-12-09 Andrew Haley <aph@redhat.com>
* fixed-value.c (do_fixed_add): Add comment.
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 46781b8..3d64c1c 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -4704,8 +4704,9 @@ static bool have_alias_info = false;
/* Emit a note for the pointer initialization point DEF. */
static void
-emit_pointer_definition (gimple def)
+emit_pointer_definition (tree ptr, bitmap visited)
{
+ gimple def = SSA_NAME_DEF_STMT (ptr);
if (gimple_code (def) == GIMPLE_PHI)
{
use_operand_p argp;
@@ -4715,7 +4716,10 @@ emit_pointer_definition (gimple def)
{
tree arg = USE_FROM_PTR (argp);
if (TREE_CODE (arg) == SSA_NAME)
- emit_pointer_definition (SSA_NAME_DEF_STMT (arg));
+ {
+ if (bitmap_set_bit (visited, SSA_NAME_VERSION (arg)))
+ emit_pointer_definition (arg, visited);
+ }
else
inform (0, "initialized from %qE", arg);
}
@@ -4729,7 +4733,6 @@ emit_pointer_definition (gimple def)
static void
emit_alias_warning (tree ptr)
{
- gimple def = SSA_NAME_DEF_STMT (ptr);
gimple use;
imm_use_iterator ui;
unsigned warned = 0;
@@ -4777,7 +4780,11 @@ emit_alias_warning (tree ptr)
}
}
if (warned > 0)
- emit_pointer_definition (def);
+ {
+ bitmap visited = BITMAP_ALLOC (NULL);
+ emit_pointer_definition (ptr, visited);
+ BITMAP_FREE (visited);
+ }
}
/* Given a pointer variable P, fill in its points-to set, or return