aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Dapp <rdapp@linux.vnet.ibm.com>2017-10-18 09:14:16 +0000
committerRobin Dapp <rdapp@gcc.gnu.org>2017-10-18 09:14:16 +0000
commitac2bb5222b47c6d79372ecbc16da3b282792ea07 (patch)
tree55973952685e706bdf6b5ba07f1b1d7f3db26311
parent67ba339309e7949cba2f27d3237156440d73d604 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/s390/s390.c41
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