summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-10-01 16:23:23 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-10-01 16:23:23 +0000
commitc8ce33fa7fec7d4d0c0e2a8b8bb535b6d5cba0e0 (patch)
tree0d6ab17c627566b006769ae664f2d3297a608ae0
parent256f88c6c0f6ffe9083a4fc3fb4eded341c772a4 (diff)
downloadgcc-c8ce33fa7fec7d4d0c0e2a8b8bb535b6d5cba0e0.tar.gz
re PR tree-optimization/37617 (ICE on valid code)
2008-10-01 Richard Guenther <rguenther@suse.de> PR tree-optimization/37617 * tree-ssa-pre.c (create_expression_by_pieces): During FRE do not add to the NEW_SETS. * gcc.c-torture/compile/pr37617.c: New testcase. From-SVN: r140816
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr37617.c19
-rw-r--r--gcc/tree-ssa-pre.c3
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d20066c4cbb..d053f30da87 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2008-10-01 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/37617
+ * tree-ssa-pre.c (create_expression_by_pieces): During FRE
+ do not add to the NEW_SETS.
+
+2008-10-01 Richard Guenther <rguenther@suse.de>
+
PR middle-end/37285
* tree-vrp.c (execute_vrp): If we optimized away the default
case make sure to promote the label that got in place of it
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 16a233a5c7f..d2f70a06b65 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2008-10-01 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/37617
+ * gcc.c-torture/compile/pr37617.c: New testcase.
+
+2008-10-01 Richard Guenther <rguenther@suse.de>
+
PR middle-end/37285
* gcc.c-torture/compile/pr37285.c: New testcase.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37617.c b/gcc/testsuite/gcc.c-torture/compile/pr37617.c
new file mode 100644
index 00000000000..901b8cabf22
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr37617.c
@@ -0,0 +1,19 @@
+typedef union
+{
+ char *string;
+ double dval;
+ float fval;
+} yystype;
+char *f(void)
+{
+ yystype tok;
+ tok.dval = 0;
+ return (tok.string);
+}
+char *f1(void)
+{
+ yystype tok;
+ tok.fval = 0;
+ return (tok.string);
+}
+
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index cd344af2d10..84c884b060c 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -2885,7 +2885,8 @@ create_expression_by_pieces (basic_block block, pre_expr expr,
VN_INFO (forcedname)->value_id = get_next_value_id ();
nameexpr = get_or_alloc_expr_for_name (forcedname);
add_to_value (VN_INFO (forcedname)->value_id, nameexpr);
- bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
+ if (!in_fre)
+ bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
bitmap_value_replace_in_set (AVAIL_OUT (block), nameexpr);
}
mark_symbols_for_renaming (stmt);