Mercurial > hg > CbC > CbC_gcc
diff gcc/lower-subreg.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | a06113de4d67 |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/lower-subreg.c Sun Feb 07 18:28:00 2010 +0900 +++ b/gcc/lower-subreg.c Fri Feb 12 23:39:51 2010 +0900 @@ -531,28 +531,32 @@ return 0; } -/* We are deleting INSN. Move any EH_REGION notes to INSNS. */ +/* This is called via for_each_rtx. Look for SUBREGs which can be + decomposed and decomposed REGs that need copying. */ -static void -move_eh_region_note (rtx insn, rtx insns) +static int +adjust_decomposed_uses (rtx *px, void *data ATTRIBUTE_UNUSED) { - rtx note, p; + rtx x = *px; - note = find_reg_note (insn, REG_EH_REGION, NULL_RTX); - if (note == NULL_RTX) - return; + if (x == NULL_RTX) + return 0; - gcc_assert (CALL_P (insn) - || (flag_non_call_exceptions && may_trap_p (PATTERN (insn)))); - - for (p = insns; p != NULL_RTX; p = NEXT_INSN (p)) + if (resolve_subreg_p (x)) { - if (CALL_P (p) - || (flag_non_call_exceptions - && INSN_P (p) - && may_trap_p (PATTERN (p)))) - add_reg_note (p, REG_EH_REGION, XEXP (note, 0)); + x = simplify_subreg_concatn (GET_MODE (x), SUBREG_REG (x), + SUBREG_BYTE (x)); + + if (x) + *px = x; + else + x = copy_rtx (*px); } + + if (resolve_reg_p (x)) + *px = copy_rtx (x); + + return 0; } /* Resolve any decomposed registers which appear in register notes on @@ -819,7 +823,7 @@ insns = get_insns (); end_sequence (); - move_eh_region_note (insn, insns); + copy_reg_eh_region_note_forward (insn, insns, NULL_RTX); emit_insn_before (insns, insn); @@ -886,6 +890,18 @@ return false; } +/* A VAR_LOCATION can be simplified. */ + +static void +resolve_debug (rtx insn) +{ + for_each_rtx (&PATTERN (insn), adjust_decomposed_uses, NULL_RTX); + + df_insn_rescan (insn); + + resolve_reg_notes (insn); +} + /* Checks if INSN is a decomposable multiword-shift or zero-extend and sets the decomposable_context bitmap accordingly. A non-zero value is returned if a decomposable insn has been found. */ @@ -922,7 +938,7 @@ } else /* left or right shift */ { - if (GET_CODE (XEXP (op, 1)) != CONST_INT + if (!CONST_INT_P (XEXP (op, 1)) || INTVAL (XEXP (op, 1)) < BITS_PER_WORD || GET_MODE_BITSIZE (GET_MODE (op_operand)) != 2 * BITS_PER_WORD) return 0; @@ -1158,18 +1174,18 @@ FOR_BB_INSNS (bb, insn) { - rtx next, pat; + rtx pat; if (!INSN_P (insn)) continue; - next = NEXT_INSN (insn); - pat = PATTERN (insn); if (GET_CODE (pat) == CLOBBER) resolve_clobber (pat, insn); else if (GET_CODE (pat) == USE) resolve_use (pat, insn); + else if (DEBUG_INSN_P (insn)) + resolve_debug (insn); else { rtx set; @@ -1289,7 +1305,7 @@ BITMAP_FREE (b); } - VEC_free (bitmap, heap, reg_copy_graph); + VEC_free (bitmap, heap, reg_copy_graph); BITMAP_FREE (decomposable_context); BITMAP_FREE (non_decomposable_context);