re PR rtl-optimization/78120 (If conversion no longer performed)
authorBernd Schmidt <bernds@redhat.com>
Thu, 24 Nov 2016 12:16:47 +0000 (12:16 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 24 Nov 2016 12:16:47 +0000 (12:16 +0000)
PR rtl-optimization/78120
* config/i386/i386.c (ix86_rtx_costs): Fully handle SETs.

From-SVN: r242832

gcc/ChangeLog
gcc/config/i386/i386.c

index 7a22234..8d9de43 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-24  Bernd Schmidt  <bschmidt@redhat.com>
+
+       PR rtl-optimization/78120
+       * config/i386/i386.c (ix86_rtx_costs): Fully handle SETs.
+
 2016-11-24  Bin Cheng  <bin.cheng@arm.com>
 
        * match.pd: Refine type conversion in result expr for below pattern:
index 3ccee08..0e8dda9 100644 (file)
@@ -40293,6 +40293,7 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno,
   enum rtx_code code = GET_CODE (x);
   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
+  int src_cost;
 
   switch (code)
     {
@@ -40303,7 +40304,23 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno,
          *total = ix86_set_reg_reg_cost (GET_MODE (SET_DEST (x)));
          return true;
        }
-      return false;
+
+      if (register_operand (SET_SRC (x), VOIDmode))
+       /* Avoid potentially incorrect high cost from rtx_costs
+          for non-tieable SUBREGs.  */
+       src_cost = 0;
+      else
+       {
+         src_cost = rtx_cost (SET_SRC (x), mode, SET, 1, speed);
+
+         if (CONSTANT_P (SET_SRC (x)))
+           /* Constant costs assume a base value of COSTS_N_INSNS (1) and add
+              a small value, possibly zero for cheap constants.  */
+           src_cost += COSTS_N_INSNS (1);
+       }
+
+      *total = src_cost + rtx_cost (SET_DEST (x), mode, SET, 0, speed);
+      return true;
 
     case CONST_INT:
     case CONST: