diff options
author | Robin Dapp <rdapp@linux.vnet.ibm.com> | 2017-10-18 09:14:16 +0000 |
---|---|---|
committer | Robin Dapp <rdapp@gcc.gnu.org> | 2017-10-18 09:14:16 +0000 |
commit | ac2bb5222b47c6d79372ecbc16da3b282792ea07 (patch) | |
tree | 55973952685e706bdf6b5ba07f1b1d7f3db26311 | |
parent | 67ba339309e7949cba2f27d3237156440d73d604 (diff) | |
download | gcc-ac2bb5222b47c6d79372ecbc16da3b282792ea07.zip gcc-ac2bb5222b47c6d79372ecbc16da3b282792ea07.tar.gz gcc-ac2bb5222b47c6d79372ecbc16da3b282792ea07.tar.bz2 |
S/390: Do not end groups after fallthru edge.
gcc/ChangeLog:
2017-10-17 Robin Dapp <rdapp@linux.vnet.ibm.com>
* config/s390/s390.c (s390_bb_fallthru_entry_likely): New function.
(s390_sched_init): Do not reset s390_sched_state if we entered the
current basic block via a fallthru edge and all others are unlikely.
From-SVN: r253850
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 41 |
2 files changed, 45 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5850f00..e4563c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2017-10-18 Robin Dapp <rdapp@linux.vnet.ibm.com> + * config/s390/s390.c (s390_bb_fallthru_entry_likely): New function. + (s390_sched_init): Do not reset s390_sched_state if we entered the + current basic block via a fallthru edge and all others are unlikely. + +2017-10-18 Robin Dapp <rdapp@linux.vnet.ibm.com> + * config/s390/s390.c (NUM_SIDES): New variable. (LONGRUNNING_THRESHOLD): New variable. (LATENCY_FACTOR): New variable. diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 021993f..4e08955 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -83,6 +83,7 @@ along with GCC; see the file COPYING3. If not see #include "symbol-summary.h" #include "ipa-prop.h" #include "ipa-fnsummary.h" +#include "sched-int.h" /* This file should be included last. */ #include "target-def.h" @@ -14618,6 +14619,28 @@ s390_z10_prevent_earlyload_conflicts (rtx_insn **ready, int *nready_p) ready[0] = tmp; } +/* Returns TRUE if BB is entered via a fallthru edge and all other + incoming edges are less than unlikely. */ +static bool +s390_bb_fallthru_entry_likely (basic_block bb) +{ + edge e, fallthru_edge; + edge_iterator ei; + + if (!bb) + return false; + + fallthru_edge = find_fallthru_edge (bb->preds); + if (!fallthru_edge) + return false; + + FOR_EACH_EDGE (e, ei, bb->preds) + if (e != fallthru_edge + && e->probability >= profile_probability::unlikely ()) + return false; + + return true; +} /* The s390_sched_state variable tracks the state of the current or the last instruction group. @@ -14626,7 +14649,7 @@ s390_z10_prevent_earlyload_conflicts (rtx_insn **ready, int *nready_p) 3 the last group is complete - normal insns 4 the last group was a cracked/expanded insn */ -static int s390_sched_state; +static int s390_sched_state = 0; #define S390_SCHED_STATE_NORMAL 3 #define S390_SCHED_STATE_CRACKED 4 @@ -15036,7 +15059,21 @@ s390_sched_init (FILE *file ATTRIBUTE_UNUSED, { last_scheduled_insn = NULL; memset (last_scheduled_unit_distance, 0, MAX_SCHED_UNITS * sizeof (int)); - s390_sched_state = 0; + + /* If the next basic block is most likely entered via a fallthru edge + we keep the last sched state. Otherwise we start a new group. + The scheduler traverses basic blocks in "instruction stream" ordering + so if we see a fallthru edge here, s390_sched_state will be of its + source block. + + current_sched_info->prev_head is the insn before the first insn of the + block of insns to be scheduled. + */ + rtx_insn *insn = current_sched_info->prev_head + ? NEXT_INSN (current_sched_info->prev_head) : NULL; + basic_block bb = insn ? BLOCK_FOR_INSN (insn) : NULL; + if (s390_tune < PROCESSOR_2964_Z13 || !s390_bb_fallthru_entry_likely (bb)) + s390_sched_state = 0; } /* This target hook implementation for TARGET_LOOP_UNROLL_ADJUST calculates |