diff options
author | Andrew Pinski <pinskia@physics.uc.edu> | 2005-07-13 02:33:10 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2005-07-12 19:33:10 -0700 |
commit | fe83f5439acb1ce8d12d46e991e88aecf5d7c6dc (patch) | |
tree | 78b04c4676a17e65c12a5837d99d6bfd0a8fa7cd /gcc | |
parent | 13c2c08bad28dbf30454a90f56ad6da9ee171ae1 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr21840.c | 11 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 9 |
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); |