From bd08db74e39248a4fe434ee03c5256ab5b63ee47 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 23 Apr 2005 10:14:27 -0700 Subject: [PATCH] re PR target/21099 (ICE on mmx intrinsics) PR target/21099 * config/i386/i386.c (ix86_split_to_parts): Use proper mode when simplifying CONST_VECTOR. From-SVN: r98624 --- gcc/ChangeLog | 10 ++++++++-- gcc/config/i386/i386.c | 5 ++++- gcc/tree-eh.c | 12 +++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c8758e19969..d5595bf1e4e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-04-23 Richard Henderson + + PR target/21099 + * config/i386/i386.c (ix86_split_to_parts): Use proper mode when + simplifying CONST_VECTOR. + 2005-04-23 Kazu Hirata * tree-ssa-live.c (live_worklist): Take a stack allocated on @@ -644,7 +650,7 @@ decode_addr_const): Likewise. 2005-04-21 Alan Modra - Fariborz Jahanian + Fariborz Jahanian * config/rs6000/rs6000.c (rs6000_arg_partial_bytes): Fix size of portion of argument passed in fpr. @@ -1122,7 +1128,7 @@ * fold-const (fold_binary): Fold ~X ^ ~ Y to X ^ Y. 2005-04-20 Michael Pogue - Joseph S. Myers + Joseph S. Myers * c.opt (Wint-to-pointer-cast, Wpointer-to-int-cast): New options. * c-typeck.c (build_c_cast): Check these options. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 8560fd3cc9a..b8ac322d56e 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -10621,7 +10621,10 @@ ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode) if (GET_CODE (operand) == CONST_VECTOR) { enum machine_mode imode = int_mode_for_mode (mode); - operand = simplify_subreg (imode, operand, mode, 0); + /* Caution: if we looked through a constant pool memory above, + the operand may actually have a different mode now. That's + ok, since we want to pun this all the way back to an integer. */ + operand = simplify_subreg (imode, operand, GET_MODE (operand), 0); gcc_assert (operand != NULL); mode = imode; } diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 90f90611d01..bfac6bc0dbf 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -1920,7 +1920,12 @@ tree_could_throw_p (tree t) bool tree_can_throw_internal (tree stmt) { - int region_nr = lookup_stmt_eh_region (stmt); + int region_nr; + + if (TREE_CODE (stmt) == RESX_EXPR) + region_nr = TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0)); + else + region_nr = lookup_stmt_eh_region (stmt); if (region_nr < 0) return false; return can_throw_internal_1 (region_nr); @@ -1931,8 +1936,9 @@ tree_can_throw_external (tree stmt) { int region_nr = lookup_stmt_eh_region (stmt); if (region_nr < 0) - return false; - return can_throw_external_1 (region_nr); + return tree_could_throw_p (stmt); + else + return can_throw_external_1 (region_nr); } bool -- 2.30.2