aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>2017-07-12 14:59:36 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2017-07-12 14:59:36 +0000
commite5309d958112d799eae39f67b8660a11698e1328 (patch)
treedc41b51f16c3a562c08b6beeaebce01fc2961326
parent8b718de8a7c45667773cd684b4e8267cfa8a27a7 (diff)
downloadgcc-e5309d958112d799eae39f67b8660a11698e1328.zip
gcc-e5309d958112d799eae39f67b8660a11698e1328.tar.gz
gcc-e5309d958112d799eae39f67b8660a11698e1328.tar.bz2
S/390: Calculate costs for load/store on condition
This adds code to the backend rtx_costs function in order to model the costs of a load/store on condition. gcc/ChangeLog: 2017-07-12 Andreas Krebbel <krebbel@linux.vnet.ibm.com> * config/s390/s390.c (s390_rtx_costs): Return proper costs for load/store on condition. From-SVN: r250152
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/s390/s390.c42
2 files changed, 47 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 46ca90b..1960a7e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-07-12 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ * config/s390/s390.c (s390_rtx_costs): Return proper costs for
+ load/store on condition.
+
2017-07-12 Georg-Johann Lay <avr@gjlay.de>
PR target/81407
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 958ee3b..31ced21 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -3414,6 +3414,48 @@ s390_rtx_costs (rtx x, machine_mode mode, int outer_code,
*total = 0;
return true;
+ case SET:
+ {
+ /* Without this a conditional move instruction would be
+ accounted as 3 * COSTS_N_INSNS (set, if_then_else,
+ comparison operator). That's a bit pessimistic. */
+
+ if (!TARGET_Z196 || GET_CODE (SET_SRC (x)) != IF_THEN_ELSE)
+ return false;
+
+ rtx cond = XEXP (SET_SRC (x), 0);
+
+ if (!CC_REG_P (XEXP (cond, 0)) || !CONST_INT_P (XEXP (cond, 1)))
+ return false;
+
+ /* It is going to be a load/store on condition. Make it
+ slightly more expensive than a normal load. */
+ *total = COSTS_N_INSNS (1) + 1;
+
+ rtx dst = SET_DEST (x);
+ rtx then = XEXP (SET_SRC (x), 1);
+ rtx els = XEXP (SET_SRC (x), 2);
+
+ /* It is a real IF-THEN-ELSE. An additional move will be
+ needed to implement that. */
+ if (reload_completed
+ && !rtx_equal_p (dst, then)
+ && !rtx_equal_p (dst, els))
+ *total += COSTS_N_INSNS (1) / 2;
+
+ /* A minor penalty for constants we cannot directly handle. */
+ if ((CONST_INT_P (then) || CONST_INT_P (els))
+ && (!TARGET_Z13 || MEM_P (dst)
+ || (CONST_INT_P (then) && !satisfies_constraint_K (then))
+ || (CONST_INT_P (els) && !satisfies_constraint_K (els))))
+ *total += COSTS_N_INSNS (1) / 2;
+
+ /* A store on condition can only handle register src operands. */
+ if (MEM_P (dst) && (!REG_P (then) || !REG_P (els)))
+ *total += COSTS_N_INSNS (1) / 2;
+
+ return true;
+ }
case IOR:
/* risbg */
if (GET_CODE (XEXP (x, 0)) == AND