From 77985f1a1eee0690b7d2a564339c63e6eadd1900 Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 29 Mar 2013 12:11:10 +0000 Subject: [PATCH] * cfgbuild.c (inside_basic_block_p): Use JUMP_TABLE_DATA_P in lieu of tests for JUMP_P and a ADDR_DIFF_VEC or ADDR_VEC pattern. (control_flow_insn_p): Likewise. * cfgrtl.c (duplicate_insn_chain): Likewise. * final.c (get_attr_length_1): Likewise. (shorten_branches): Likewise. (final_scan_insn): Likewise. * function.c (instantiate_virtual_regs): Likewise. * gcse.c (insert_insn_end_basic_block): Likewise. * ira-costs.c (scan_one_insn): Likewise. * lra-eliminations.c (eliminate_regs_in_insn): Likewise. * lra.c (check_rtl): Likewise. * reload1.c (elimination_costs_in_insn): Likewise. * reorg.c (follow_jumps): Likewise. * config/arm/arm.c (is_jump_table): Use JUMP_TABLE_DATA_P in lieu of tests for JUMP_P and a ADDR_DIFF_VEC or ADDR_VEC pattern. (thumb_far_jump_used_p): Likewise. * config/bfin/bfin.c (workaround_rts_anomaly): Likewise. (workaround_speculation): Likewise. (add_sched_insns_for_speculation): Likewise. * config/c6x/c6x.c (reorg_emit_nops): Likewise. * config/frv/frv.c (frv_function_contains_far_jump): Likewise. (frv_for_each_packet): Likewise. * config/i386/i386.c (ix86_avoid_jump_mispredicts): Likewise. * config/ia64/ia64.c (emit_all_insn_group_barriers): Likewise. (final_emit_insn_group_barriers): Likewise. * config/m32r/m32r.c (m32r_is_insn): Likewise. * config/mips/mips.c (USEFUL_INSN_P): Likewise. (mips16_insn_length): Likewise. * config/pa/pa.c (pa_reorg): Likewise. (pa_combine_instructions): Likewise. * config/rs6000/rs6000.c (rs6000_invalid_within_doloop): Likewise. * config/sh/sh.c (fixup_addr_diff_vecs): Likewise. (sh_reorg): Likewise. (split_branches): Likewise. * config/spu/spu.c (get_branch_target): Likewise. * config/s390/s390.c (s390_chunkify_start): Simplify logic using JUMP_TABLE_DATA_P. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@197234 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 43 +++++++++++++++++++++++++++++++++++++++++++ gcc/cfgbuild.c | 10 +++------- gcc/cfgrtl.c | 3 +-- gcc/config/arm/arm.c | 7 ++----- gcc/config/bfin/bfin.c | 25 +++++++++++++++++-------- gcc/config/c6x/c6x.c | 4 +--- gcc/config/frv/frv.c | 7 ++----- gcc/config/i386/i386.c | 9 +++------ gcc/config/ia64/ia64.c | 6 ++---- gcc/config/m32r/m32r.c | 4 ++-- gcc/config/mips/mips.c | 9 +++++---- gcc/config/pa/pa.c | 19 ++++++------------- gcc/config/rs6000/rs6000.c | 4 +--- gcc/config/s390/s390.c | 15 ++++----------- gcc/config/sh/sh.c | 7 +++---- gcc/config/spu/spu.c | 3 +-- gcc/final.c | 11 ++++++----- gcc/function.c | 5 ++--- gcc/gcse.c | 3 +-- gcc/ira-costs.c | 6 +++--- gcc/lra-eliminations.c | 5 ++--- gcc/lra.c | 3 +-- gcc/reload1.c | 10 ++++------ gcc/reorg.c | 4 +--- 24 files changed, 116 insertions(+), 106 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b9db43..e172f41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,46 @@ +2013-03-29 Steven Bosscher + + * cfgbuild.c (inside_basic_block_p): Use JUMP_TABLE_DATA_P in lieu + of tests for JUMP_P and a ADDR_DIFF_VEC or ADDR_VEC pattern. + (control_flow_insn_p): Likewise. + * cfgrtl.c (duplicate_insn_chain): Likewise. + * final.c (get_attr_length_1): Likewise. + (shorten_branches): Likewise. + (final_scan_insn): Likewise. + * function.c (instantiate_virtual_regs): Likewise. + * gcse.c (insert_insn_end_basic_block): Likewise. + * ira-costs.c (scan_one_insn): Likewise. + * lra-eliminations.c (eliminate_regs_in_insn): Likewise. + * lra.c (check_rtl): Likewise. + * reload1.c (elimination_costs_in_insn): Likewise. + * reorg.c (follow_jumps): Likewise. + + * config/arm/arm.c (is_jump_table): Use JUMP_TABLE_DATA_P in lieu + of tests for JUMP_P and a ADDR_DIFF_VEC or ADDR_VEC pattern. + (thumb_far_jump_used_p): Likewise. + * config/bfin/bfin.c (workaround_rts_anomaly): Likewise. + (workaround_speculation): Likewise. + (add_sched_insns_for_speculation): Likewise. + * config/c6x/c6x.c (reorg_emit_nops): Likewise. + * config/frv/frv.c (frv_function_contains_far_jump): Likewise. + (frv_for_each_packet): Likewise. + * config/i386/i386.c (ix86_avoid_jump_mispredicts): Likewise. + * config/ia64/ia64.c (emit_all_insn_group_barriers): Likewise. + (final_emit_insn_group_barriers): Likewise. + * config/m32r/m32r.c (m32r_is_insn): Likewise. + * config/mips/mips.c (USEFUL_INSN_P): Likewise. + (mips16_insn_length): Likewise. + * config/pa/pa.c (pa_reorg): Likewise. + (pa_combine_instructions): Likewise. + * config/rs6000/rs6000.c (rs6000_invalid_within_doloop): Likewise. + * config/sh/sh.c (fixup_addr_diff_vecs): Likewise. + (sh_reorg): Likewise. + (split_branches): Likewise. + * config/spu/spu.c (get_branch_target): Likewise. + + * config/s390/s390.c (s390_chunkify_start): Simplify logic using + JUMP_TABLE_DATA_P. + 2013-03-29 Kirill Yukhin * gcc/config/i386/avx2intrin.h (_mm256_broadcastsi128_si256): diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c index c47aad0..34cc29c 100644 --- a/gcc/cfgbuild.c +++ b/gcc/cfgbuild.c @@ -51,13 +51,10 @@ inside_basic_block_p (const_rtx insn) case CODE_LABEL: /* Avoid creating of basic block for jumptables. */ return (NEXT_INSN (insn) == 0 - || !JUMP_P (NEXT_INSN (insn)) - || (GET_CODE (PATTERN (NEXT_INSN (insn))) != ADDR_VEC - && GET_CODE (PATTERN (NEXT_INSN (insn))) != ADDR_DIFF_VEC)); + || ! JUMP_TABLE_DATA_P (insn)); case JUMP_INSN: - return (GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC); + return (! JUMP_TABLE_DATA_P (insn)); case CALL_INSN: case INSN: @@ -88,8 +85,7 @@ control_flow_insn_p (const_rtx insn) case JUMP_INSN: /* Jump insn always causes control transfer except for tablejumps. */ - return (GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC); + return (! JUMP_TABLE_DATA_P (insn)); case CALL_INSN: /* Noreturn and sibling call instructions terminate the basic blocks diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index ec1ba9a..56ea2a8 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -3627,8 +3627,7 @@ duplicate_insn_chain (rtx from, rtx to) /* Avoid copying of dispatch tables. We never duplicate tablejumps, so this can hit only in case the table got moved far from original jump. */ - if (GET_CODE (PATTERN (insn)) == ADDR_VEC - || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (insn)) { /* Avoid copying following barrier as well if any (and debug insns in between). */ diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 5f63a2e..17a1598 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -12824,9 +12824,7 @@ is_jump_table (rtx insn) && ((table = next_real_insn (JUMP_LABEL (insn))) == next_real_insn (insn)) && table != NULL - && JUMP_P (table) - && (GET_CODE (PATTERN (table)) == ADDR_VEC - || GET_CODE (PATTERN (table)) == ADDR_DIFF_VEC)) + && JUMP_TABLE_DATA_P (table)) return table; return NULL_RTX; @@ -22658,8 +22656,7 @@ thumb_far_jump_used_p (void) { if (JUMP_P (insn) /* Ignore tablejump patterns. */ - && GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC + && ! JUMP_TABLE_DATA_P (insn) && get_attr_far_jump (insn) == FAR_JUMP_YES ) { diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c index a2d22c1..7fab975 100644 --- a/gcc/config/bfin/bfin.c +++ b/gcc/config/bfin/bfin.c @@ -4084,12 +4084,15 @@ workaround_rts_anomaly (void) if (NOTE_P (insn) || LABEL_P (insn)) continue; + if (JUMP_TABLE_DATA_P (insn)) + continue; + if (first_insn == NULL_RTX) first_insn = insn; pat = PATTERN (insn); if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER - || GET_CODE (pat) == ASM_INPUT || GET_CODE (pat) == ADDR_VEC - || GET_CODE (pat) == ADDR_DIFF_VEC || asm_noperands (pat) >= 0) + || GET_CODE (pat) == ASM_INPUT + || asm_noperands (pat) >= 0) continue; if (CALL_P (insn)) @@ -4277,6 +4280,8 @@ workaround_speculation (void) if (NOTE_P (insn) || BARRIER_P (insn)) continue; + if (JUMP_TABLE_DATA_P (insn)) + continue; if (LABEL_P (insn)) { @@ -4285,8 +4290,7 @@ workaround_speculation (void) } pat = PATTERN (insn); - if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER - || GET_CODE (pat) == ADDR_VEC || GET_CODE (pat) == ADDR_DIFF_VEC) + if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER) continue; if (GET_CODE (pat) == ASM_INPUT || asm_noperands (pat) >= 0) @@ -4434,10 +4438,13 @@ workaround_speculation (void) if (NOTE_P (target) || BARRIER_P (target) || LABEL_P (target)) continue; + if (JUMP_TABLE_DATA_P (target)) + continue; + pat = PATTERN (target); if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER - || GET_CODE (pat) == ASM_INPUT || GET_CODE (pat) == ADDR_VEC - || GET_CODE (pat) == ADDR_DIFF_VEC || asm_noperands (pat) >= 0) + || GET_CODE (pat) == ASM_INPUT + || asm_noperands (pat) >= 0) continue; if (NONDEBUG_INSN_P (target)) @@ -4510,11 +4517,13 @@ add_sched_insns_for_speculation (void) if (NOTE_P (insn) || BARRIER_P (insn) || LABEL_P (insn)) continue; + if (JUMP_TABLE_DATA_P (insn)) + continue; pat = PATTERN (insn); if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER - || GET_CODE (pat) == ASM_INPUT || GET_CODE (pat) == ADDR_VEC - || GET_CODE (pat) == ADDR_DIFF_VEC || asm_noperands (pat) >= 0) + || GET_CODE (pat) == ASM_INPUT + || asm_noperands (pat) >= 0) continue; if (JUMP_P (insn)) diff --git a/gcc/config/c6x/c6x.c b/gcc/config/c6x/c6x.c index f66ad55..a7c3683 100644 --- a/gcc/config/c6x/c6x.c +++ b/gcc/config/c6x/c6x.c @@ -5052,9 +5052,7 @@ reorg_emit_nops (rtx *call_labels) || GET_CODE (PATTERN (insn)) == USE || GET_CODE (PATTERN (insn)) == CLOBBER || shadow_or_blockage_p (insn) - || (JUMP_P (insn) - && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC - || GET_CODE (PATTERN (insn)) == ADDR_VEC))) + || JUMP_TABLE_DATA_P (insn)) goto next_insn; if (!c6x_flag_schedule_insns2) diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c index fd5349f..ab7502e 100644 --- a/gcc/config/frv/frv.c +++ b/gcc/config/frv/frv.c @@ -1410,8 +1410,7 @@ frv_function_contains_far_jump (void) while (insn != NULL && !(JUMP_P (insn) /* Ignore tablejump patterns. */ - && GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC + && ! JUMP_TABLE_DATA_P (insn) && get_attr_far_jump (insn) == FAR_JUMP_YES)) insn = NEXT_INSN (insn); return (insn != NULL); @@ -7481,13 +7480,11 @@ frv_for_each_packet (void (*handle_packet) (void)) frv_start_packet_block (); } - if (INSN_P (insn)) + if (INSN_P (insn) && ! JUMP_TABLE_DATA_P (insn)) switch (GET_CODE (PATTERN (insn))) { case USE: case CLOBBER: - case ADDR_VEC: - case ADDR_DIFF_VEC: break; default: diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 030183c..732b2a3 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -35209,8 +35209,7 @@ ix86_avoid_jump_mispredicts (void) { start = NEXT_INSN (start); if ((JUMP_P (start) - && GET_CODE (PATTERN (start)) != ADDR_VEC - && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC) + && ! JUMP_TABLE_DATA_P (start)) || CALL_P (start)) njumps--, isjump = 1; else @@ -35227,8 +35226,7 @@ ix86_avoid_jump_mispredicts (void) fprintf (dump_file, "Insn %i estimated to %i bytes\n", INSN_UID (insn), min_size); if ((JUMP_P (insn) - && GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC) + && ! JUMP_TABLE_DATA_P (insn)) || CALL_P (insn)) njumps++; else @@ -35238,8 +35236,7 @@ ix86_avoid_jump_mispredicts (void) { start = NEXT_INSN (start); if ((JUMP_P (start) - && GET_CODE (PATTERN (start)) != ADDR_VEC - && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC) + && ! JUMP_TABLE_DATA_P (start)) || CALL_P (start)) njumps--, isjump = 1; else diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 0e328ff..144cf7e 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -6987,8 +6987,7 @@ emit_all_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED) if (! last) continue; - if (JUMP_P (last) - && GET_CODE (PATTERN (last)) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (last)) last = prev_active_insn (last); if (recog_memoized (last) != CODE_FOR_insn_group_barrier) emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last); @@ -9376,8 +9375,7 @@ final_emit_insn_group_barriers (FILE *dump ATTRIBUTE_UNUSED) if (! last) continue; - if (JUMP_P (last) - && GET_CODE (PATTERN (last)) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (last)) last = prev_active_insn (last); if (recog_memoized (last) != CODE_FOR_insn_group_barrier) emit_insn_after (gen_insn_group_barrier (GEN_INT (3)), last); diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c index 8dfce68..93df52f 100644 --- a/gcc/config/m32r/m32r.c +++ b/gcc/config/m32r/m32r.c @@ -1308,9 +1308,9 @@ static int m32r_is_insn (rtx insn) { return (NONDEBUG_INSN_P (insn) + && ! JUMP_TABLE_DATA_P (insn) && GET_CODE (PATTERN (insn)) != USE - && GET_CODE (PATTERN (insn)) != CLOBBER - && GET_CODE (PATTERN (insn)) != ADDR_VEC); + && GET_CODE (PATTERN (insn)) != CLOBBER); } /* Increase the priority of long instructions so that the diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index d7a0749..7a67c45 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -95,12 +95,13 @@ along with GCC; see the file COPYING3. If not see : TARGET_64BIT ? 0x100 : 0x400) /* True if INSN is a mips.md pattern or asm statement. */ +/* ??? This test exists through the compiler, perhaps it should be + moved to rtl.h. */ #define USEFUL_INSN_P(INSN) \ (NONDEBUG_INSN_P (INSN) \ + && ! JUMP_TABLE_DATA_P (INSN) \ && GET_CODE (PATTERN (INSN)) != USE \ - && GET_CODE (PATTERN (INSN)) != CLOBBER \ - && GET_CODE (PATTERN (INSN)) != ADDR_VEC \ - && GET_CODE (PATTERN (INSN)) != ADDR_DIFF_VEC) + && GET_CODE (PATTERN (INSN)) != CLOBBER) /* If INSN is a delayed branch sequence, return the first instruction in the sequence, otherwise return INSN itself. */ @@ -14648,7 +14649,7 @@ mips16_emit_constants (struct mips16_constant *constants, rtx insn) static int mips16_insn_length (rtx insn) { - if (JUMP_P (insn)) + if (JUMP_TABLE_DATA_P (insn)) { rtx body = PATTERN (insn); if (GET_CODE (body) == ADDR_VEC) diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 1cad695..b969e10 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -8997,9 +8997,7 @@ pa_reorg (void) unsigned int length, i; /* Find an ADDR_VEC or ADDR_DIFF_VEC insn to explode. */ - if (! JUMP_P (insn) - || (GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)) + if (! JUMP_TABLE_DATA_P (insn)) continue; /* Emit marker for the beginning of the branch table. */ @@ -9056,9 +9054,7 @@ pa_reorg (void) for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) { /* Find an ADDR_VEC insn. */ - if (! JUMP_P (insn) - || (GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)) + if (! JUMP_TABLE_DATA_P (insn)) continue; /* Now generate markers for the beginning and end of the @@ -9138,10 +9134,9 @@ pa_combine_instructions (void) /* We only care about INSNs, JUMP_INSNs, and CALL_INSNs. Also ignore any special USE insns. */ if ((! NONJUMP_INSN_P (anchor) && ! JUMP_P (anchor) && ! CALL_P (anchor)) + || JUMP_TABLE_DATA_P (anchor) || GET_CODE (PATTERN (anchor)) == USE - || GET_CODE (PATTERN (anchor)) == CLOBBER - || GET_CODE (PATTERN (anchor)) == ADDR_VEC - || GET_CODE (PATTERN (anchor)) == ADDR_DIFF_VEC) + || GET_CODE (PATTERN (anchor)) == CLOBBER) continue; anchor_attr = get_attr_pa_combine_type (anchor); @@ -9165,8 +9160,7 @@ pa_combine_instructions (void) /* Anything except a regular INSN will stop our search. */ if (! NONJUMP_INSN_P (floater) - || GET_CODE (PATTERN (floater)) == ADDR_VEC - || GET_CODE (PATTERN (floater)) == ADDR_DIFF_VEC) + || JUMP_TABLE_DATA_P (floater)) { floater = NULL_RTX; break; @@ -9227,8 +9221,7 @@ pa_combine_instructions (void) /* Anything except a regular INSN will stop our search. */ if (! NONJUMP_INSN_P (floater) - || GET_CODE (PATTERN (floater)) == ADDR_VEC - || GET_CODE (PATTERN (floater)) == ADDR_DIFF_VEC) + || JUMP_TABLE_DATA_P (floater)) { floater = NULL_RTX; break; diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 0fe45d8..72cf8de 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -18788,9 +18788,7 @@ rs6000_invalid_within_doloop (const_rtx insn) if (CALL_P (insn)) return "Function call in the loop."; - if (JUMP_P (insn) - && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC - || GET_CODE (PATTERN (insn)) == ADDR_VEC)) + if (JUMP_TABLE_DATA_P (insn)) return "Computed branch in the loop."; return NULL; diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index f6aa581..ab1e1f5 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -5739,7 +5739,7 @@ addr_generation_dependency_p (rtx dep_rtx, rtx insn) rtx target, pat; if (NONJUMP_INSN_P (dep_rtx)) - dep_rtx = PATTERN (dep_rtx); + dep_rtx = PATTERN (dep_rtx); if (GET_CODE (dep_rtx) == SET) { @@ -7013,11 +7013,7 @@ s390_chunkify_start (void) && (LABEL_PRESERVE_P (insn) || LABEL_NAME (insn))) { rtx vec_insn = next_real_insn (insn); - rtx vec_pat = vec_insn && JUMP_P (vec_insn) ? - PATTERN (vec_insn) : NULL_RTX; - if (!vec_pat - || !(GET_CODE (vec_pat) == ADDR_VEC - || GET_CODE (vec_pat) == ADDR_DIFF_VEC)) + if (! vec_insn || ! JUMP_TABLE_DATA_P (vec_insn)) bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (insn)); } @@ -7048,12 +7044,9 @@ s390_chunkify_start (void) /* Find the jump table used by this casesi jump. */ rtx vec_label = XEXP (XEXP (XVECEXP (pat, 0, 1), 0), 0); rtx vec_insn = next_real_insn (vec_label); - rtx vec_pat = vec_insn && JUMP_P (vec_insn) ? - PATTERN (vec_insn) : NULL_RTX; - if (vec_pat - && (GET_CODE (vec_pat) == ADDR_VEC - || GET_CODE (vec_pat) == ADDR_DIFF_VEC)) + if (vec_insn && JUMP_TABLE_DATA_P (vec_insn)) { + rtx vec_pat = PATTERN (vec_insn); int i, diff_p = GET_CODE (vec_pat) == ADDR_DIFF_VEC; for (i = 0; i < XVECLEN (vec_pat, diff_p); i++) diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 44e1e4c..d13198b 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -5799,7 +5799,7 @@ fixup_addr_diff_vecs (rtx first) { rtx vec_lab, pat, prev, prevpat, x, braf_label; - if (!JUMP_P (insn) + if (! JUMP_TABLE_DATA_P (insn) || GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC) continue; pat = PATTERN (insn); @@ -6233,7 +6233,7 @@ sh_reorg (void) num_mova = 0; } } - else if (JUMP_P (insn) + else if (JUMP_TABLE_DATA_P (insn) && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC && num_mova /* ??? loop invariant motion can also move a mova out of a @@ -6496,8 +6496,7 @@ split_branches (rtx first) } else if (JUMP_P (insn) /* Don't mess with ADDR_DIFF_VEC */ - && (GET_CODE (PATTERN (insn)) == SET - || GET_CODE (PATTERN (insn)) == RETURN)) + && ! JUMP_TABLE_DATA_P (insn)) { enum attr_type type = get_attr_type (insn); if (type == TYPE_CBRANCH) diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 2d8ec9c..ec5a987 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -2172,8 +2172,7 @@ get_branch_target (rtx branch) return gen_rtx_REG (SImode, LINK_REGISTER_REGNUM); /* jump table */ - if (GET_CODE (PATTERN (branch)) == ADDR_VEC - || GET_CODE (PATTERN (branch)) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (branch)) return 0; /* ASM GOTOs. */ diff --git a/gcc/final.c b/gcc/final.c index d25b8e0..577d5eb 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -396,7 +396,7 @@ get_attr_length_1 (rtx insn, int (*fallback_fn) (rtx)) case JUMP_INSN: body = PATTERN (insn); - if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (insn)) { /* Alignment is machine-dependent and should be handled by ADDR_VEC_ALIGN. */ @@ -1020,7 +1020,7 @@ shorten_branches (rtx first) int min_align; addr_diff_vec_flags flags; - if (!JUMP_P (insn) + if (! JUMP_TABLE_DATA_P (insn) || GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC) continue; pat = PATTERN (insn); @@ -1094,7 +1094,7 @@ shorten_branches (rtx first) continue; body = PATTERN (insn); - if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (insn)) { /* This only takes room if read-only data goes into the text section. */ @@ -1230,7 +1230,8 @@ shorten_branches (rtx first) INSN_ADDRESSES (uid) = insn_current_address; #ifdef CASE_VECTOR_SHORTEN_MODE - if (optimize && JUMP_P (insn) + if (optimize + && JUMP_TABLE_DATA_P (insn) && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC) { rtx body = PATTERN (insn); @@ -2404,7 +2405,7 @@ final_scan_insn (rtx insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, /* Detect insns that are really jump-tables and output them as such. */ - if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (insn)) { #if !(defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)) int vlen, idx; diff --git a/gcc/function.c b/gcc/function.c index cd9cb85..d3b7ed6 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1915,10 +1915,9 @@ instantiate_virtual_regs (void) { /* These patterns in the instruction stream can never be recognized. Fortunately, they shouldn't contain virtual registers either. */ - if (GET_CODE (PATTERN (insn)) == USE + if (JUMP_TABLE_DATA_P (insn) + || GET_CODE (PATTERN (insn)) == USE || GET_CODE (PATTERN (insn)) == CLOBBER - || GET_CODE (PATTERN (insn)) == ADDR_VEC - || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC || GET_CODE (PATTERN (insn)) == ASM_INPUT) continue; else if (DEBUG_INSN_P (insn)) diff --git a/gcc/gcse.c b/gcc/gcse.c index 0c176f6..f6bf2fc 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -2155,8 +2155,7 @@ insert_insn_end_basic_block (struct expr *expr, basic_block bb) /* If this is a jump table, then we can't insert stuff here. Since we know the previous real insn must be the tablejump, we insert the new instruction just before the tablejump. */ - if (GET_CODE (PATTERN (insn)) == ADDR_VEC - || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC) + if (JUMP_TABLE_DATA_P (insn)) insn = prev_active_insn (insn); #ifdef HAVE_cc0 diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c index 1de0061..562aeb0 100644 --- a/gcc/ira-costs.c +++ b/gcc/ira-costs.c @@ -1269,12 +1269,12 @@ scan_one_insn (rtx insn) int i, k; bool counted_mem; - if (!NONDEBUG_INSN_P (insn)) + if (!NONDEBUG_INSN_P (insn) + || JUMP_TABLE_DATA_P (insn)) return insn; pat_code = GET_CODE (PATTERN (insn)); - if (pat_code == USE || pat_code == CLOBBER || pat_code == ASM_INPUT - || pat_code == ADDR_VEC || pat_code == ADDR_DIFF_VEC) + if (pat_code == USE || pat_code == CLOBBER || pat_code == ASM_INPUT) return insn; counted_mem = false; diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c index 9df0bae..1f88d6b 100644 --- a/gcc/lra-eliminations.c +++ b/gcc/lra-eliminations.c @@ -767,10 +767,9 @@ eliminate_regs_in_insn (rtx insn, bool replace_p) if (icode < 0 && asm_noperands (PATTERN (insn)) < 0 && ! DEBUG_INSN_P (insn)) { - lra_assert (GET_CODE (PATTERN (insn)) == USE + lra_assert (JUMP_TABLE_DATA_P (insn) + || GET_CODE (PATTERN (insn)) == USE || GET_CODE (PATTERN (insn)) == CLOBBER - || GET_CODE (PATTERN (insn)) == ADDR_VEC - || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC || GET_CODE (PATTERN (insn)) == ASM_INPUT); return; } diff --git a/gcc/lra.c b/gcc/lra.c index 9df24b5..5c7b0d6 100644 --- a/gcc/lra.c +++ b/gcc/lra.c @@ -1997,10 +1997,9 @@ check_rtl (bool final_p) FOR_EACH_BB (bb) FOR_BB_INSNS (bb, insn) if (NONDEBUG_INSN_P (insn) + && ! JUMP_TABLE_DATA_P (insn) && GET_CODE (PATTERN (insn)) != USE && GET_CODE (PATTERN (insn)) != CLOBBER - && GET_CODE (PATTERN (insn)) != ADDR_VEC - && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC && GET_CODE (PATTERN (insn)) != ASM_INPUT) { if (final_p) diff --git a/gcc/reload1.c b/gcc/reload1.c index cbb945d..7d6b5dd 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -3234,10 +3234,9 @@ eliminate_regs_in_insn (rtx insn, int replace) if (! insn_is_asm && icode < 0) { - gcc_assert (GET_CODE (PATTERN (insn)) == USE + gcc_assert (JUMP_TABLE_DATA_P (insn) + || GET_CODE (PATTERN (insn)) == USE || GET_CODE (PATTERN (insn)) == CLOBBER - || GET_CODE (PATTERN (insn)) == ADDR_VEC - || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC || GET_CODE (PATTERN (insn)) == ASM_INPUT || DEBUG_INSN_P (insn)); if (DEBUG_INSN_P (insn)) @@ -3645,10 +3644,9 @@ elimination_costs_in_insn (rtx insn) if (! insn_is_asm && icode < 0) { - gcc_assert (GET_CODE (PATTERN (insn)) == USE + gcc_assert (JUMP_TABLE_DATA_P (insn) + || GET_CODE (PATTERN (insn)) == USE || GET_CODE (PATTERN (insn)) == CLOBBER - || GET_CODE (PATTERN (insn)) == ADDR_VEC - || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC || GET_CODE (PATTERN (insn)) == ASM_INPUT || DEBUG_INSN_P (insn)); return; diff --git a/gcc/reorg.c b/gcc/reorg.c index c19fb4c..51a70dc 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -2339,9 +2339,7 @@ follow_jumps (rtx label, rtx jump, bool *crossing) if (ANY_RETURN_P (this_label)) return this_label; tem = next_active_insn (this_label); - if (tem - && (GET_CODE (PATTERN (tem)) == ADDR_VEC - || GET_CODE (PATTERN (tem)) == ADDR_DIFF_VEC)) + if (tem && JUMP_TABLE_DATA_P (tem)) break; if (!targetm.can_follow_jump (jump, insn)) -- 2.7.4