S/390: Calculate costs for load/store on condition
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Wed, 12 Jul 2017 14:59:36 +0000 (14:59 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 12 Jul 2017 14:59:36 +0000 (14:59 +0000)
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

gcc/ChangeLog
gcc/config/s390/s390.c

index 46ca90b590573dbe7c9b45a175e5b254dd5068a4..1960a7e1a7452e697fd5afd2b2889b2fd9a85553 100644 (file)
@@ -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
index 958ee3b926cac8969541ed1d575a2cd5a624af3c..31ced21a043fb272598ade5559fe0017414479f4 100644 (file)
@@ -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