diff options
author | Ian Lance Taylor <iant@golang.org> | 2021-09-13 10:37:49 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2021-09-13 10:37:49 -0700 |
commit | e252b51ccde010cbd2a146485d8045103cd99533 (patch) | |
tree | e060f101cdc32bf5e520de8e5275db9d4236b74c /gcc/modulo-sched.c | |
parent | f10c7c4596dda99d2ee872c995ae4aeda65adbdf (diff) | |
parent | 104c05c5284b7822d770ee51a7d91946c7e56d50 (diff) | |
download | gcc-e252b51ccde010cbd2a146485d8045103cd99533.zip gcc-e252b51ccde010cbd2a146485d8045103cd99533.tar.gz gcc-e252b51ccde010cbd2a146485d8045103cd99533.tar.bz2 |
Merge from trunk revision 104c05c5284b7822d770ee51a7d91946c7e56d50.
Diffstat (limited to 'gcc/modulo-sched.c')
-rw-r--r-- | gcc/modulo-sched.c | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index 6ad960e..1c1b459 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-pass.h" #include "dbgcnt.h" #include "loop-unroll.h" +#include "hard-reg-set.h" #ifdef INSN_SCHEDULING @@ -1352,10 +1353,10 @@ sms_schedule (void) int maxii, max_asap; partial_schedule_ptr ps; basic_block bb = NULL; - class loop *loop; basic_block condition_bb = NULL; edge latch_edge; HOST_WIDE_INT trip_count, max_trip_count; + HARD_REG_SET prohibited_regs; loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_RECORDED_EXITS); @@ -1385,6 +1386,8 @@ sms_schedule (void) We use loop->num as index into this array. */ g_arr = XCNEWVEC (ddg_ptr, number_of_loops (cfun)); + REG_SET_TO_HARD_REG_SET (prohibited_regs, &df->regular_block_artificial_uses); + if (dump_file) { fprintf (dump_file, "\n\nSMS analysis phase\n"); @@ -1393,7 +1396,7 @@ sms_schedule (void) /* Build DDGs for all the relevant loops and hold them in G_ARR indexed by the loop index. */ - FOR_EACH_LOOP (loop, 0) + for (auto loop : loops_list (cfun, 0)) { rtx_insn *head, *tail; rtx count_reg; @@ -1469,23 +1472,31 @@ sms_schedule (void) } /* Don't handle BBs with calls or barriers - or !single_set with the exception of instructions that include - count_reg---these instructions are part of the control part - that do-loop recognizes. + or !single_set with the exception of do-loop control part insns. ??? Should handle insns defining subregs. */ - for (insn = head; insn != NEXT_INSN (tail); insn = NEXT_INSN (insn)) - { - rtx set; - - if (CALL_P (insn) - || BARRIER_P (insn) - || (NONDEBUG_INSN_P (insn) && !JUMP_P (insn) - && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE - && !reg_mentioned_p (count_reg, insn)) - || (INSN_P (insn) && (set = single_set (insn)) - && GET_CODE (SET_DEST (set)) == SUBREG)) - break; - } + for (insn = head; insn != NEXT_INSN (tail); insn = NEXT_INSN (insn)) + { + if (INSN_P (insn)) + { + HARD_REG_SET regs; + CLEAR_HARD_REG_SET (regs); + note_stores (insn, record_hard_reg_sets, ®s); + if (hard_reg_set_intersect_p (regs, prohibited_regs)) + break; + } + + if (CALL_P (insn) + || BARRIER_P (insn) + || (INSN_P (insn) && single_set (insn) + && GET_CODE (SET_DEST (single_set (insn))) == SUBREG) + /* Not a single set. */ + || (NONDEBUG_INSN_P (insn) && !JUMP_P (insn) + && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE + /* But non-single-set allowed in one special case. */ + && (insn != prev_nondebug_insn (tail) + || !reg_mentioned_p (count_reg, insn)))) + break; + } if (insn != NEXT_INSN (tail)) { @@ -1495,11 +1506,13 @@ sms_schedule (void) fprintf (dump_file, "SMS loop-with-call\n"); else if (BARRIER_P (insn)) fprintf (dump_file, "SMS loop-with-barrier\n"); - else if ((NONDEBUG_INSN_P (insn) && !JUMP_P (insn) - && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE)) - fprintf (dump_file, "SMS loop-with-not-single-set\n"); - else - fprintf (dump_file, "SMS loop with subreg in lhs\n"); + else if (INSN_P (insn) && single_set (insn) + && GET_CODE (SET_DEST (single_set (insn))) == SUBREG) + fprintf (dump_file, "SMS loop with subreg in lhs\n"); + else + fprintf (dump_file, + "SMS loop-with-not-single-set-or-prohibited-reg\n"); + print_rtl_single (dump_file, insn); } @@ -1529,7 +1542,7 @@ sms_schedule (void) } /* We don't want to perform SMS on new loops - created by versioning. */ - FOR_EACH_LOOP (loop, 0) + for (auto loop : loops_list (cfun, 0)) { rtx_insn *head, *tail; rtx count_reg; |