aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2005-07-13 02:33:10 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2005-07-12 19:33:10 -0700
commitfe83f5439acb1ce8d12d46e991e88aecf5d7c6dc (patch)
tree78b04c4676a17e65c12a5837d99d6bfd0a8fa7cd /gcc
parent13c2c08bad28dbf30454a90f56ad6da9ee171ae1 (diff)
downloadgcc-fe83f5439acb1ce8d12d46e991e88aecf5d7c6dc.zip
gcc-fe83f5439acb1ce8d12d46e991e88aecf5d7c6dc.tar.gz
gcc-fe83f5439acb1ce8d12d46e991e88aecf5d7c6dc.tar.bz2
re PR middle-end/21840 (ICE while building Linux kernel (seg fault), missing cast)
2005-07-12 Andrew Pinski <pinskia@physics.uc.edu> PR tree-opt/21840 * tree-ssa-pre.c (eliminate): Convert the sprime to the correct type if *rhs_p is not a SSA_NAME. 2005-07-12 Andrew Pinski <pinskia@physics.uc.edu> PR tree-opt/21840 * gcc.c-torture/compile/pr21840.c: New test. From-SVN: r101960
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr21840.c11
-rw-r--r--gcc/tree-ssa-pre.c9
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bb00a8f..3f3d0fe 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-07-12 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/21840
+ * tree-ssa-pre.c (eliminate): Convert the sprime to the correct type
+ if *rhs_p is not a SSA_NAME.
+
2005-07-12 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/22422
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index db5906c..15b1c4d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-07-12 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/21840
+ * gcc.c-torture/compile/pr21840.c: New test.
+
2005-07-12 Jan Hubicka <jh@suse.cz>
* gcc.c-torture/compile/pr22379.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21840.c b/gcc/testsuite/gcc.c-torture/compile/pr21840.c
new file mode 100644
index 0000000..bec3d6b
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr21840.c
@@ -0,0 +1,11 @@
+void fn_show_state(void);
+typedef void (*fn_handler_fn)(void);
+static fn_handler_fn fn_handler[1];
+
+void k_spec(unsigned char value)
+{
+ void *func = fn_handler[value];
+ if (func == fn_show_state )
+ return;
+ fn_handler[value]();
+}
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index eab18d3..fbfda11 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -2334,8 +2334,17 @@ eliminate (void)
fprintf (dump_file, " in ");
print_generic_stmt (dump_file, stmt, 0);
}
+
if (TREE_CODE (sprime) == SSA_NAME)
NECESSARY (SSA_NAME_DEF_STMT (sprime)) = 1;
+ /* We need to make sure the new and old types actually match,
+ which may require adding a simple cast, which fold_convert
+ will do for us. */
+ if (TREE_CODE (*rhs_p) != SSA_NAME
+ && !tree_ssa_useless_type_conversion_1 (TREE_TYPE (*rhs_p),
+ TREE_TYPE (sprime)))
+ sprime = fold_convert (TREE_TYPE (*rhs_p), sprime);
+
pre_stats.eliminations++;
propagate_tree_value (rhs_p, sprime);
update_stmt (stmt);