* x86-tune-sched.c (ix86_adjust_cost): Fix Zen support.
authorJan Hubicka <hubicka@ucw.cz>
Thu, 12 Oct 2017 15:36:05 +0000 (17:36 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 12 Oct 2017 15:36:05 +0000 (15:36 +0000)
From-SVN: r253684

gcc/ChangeLog
gcc/config/i386/x86-tune-sched.c

index ad116af74a5722baf09b153e548eff5920ec1f30..79316bb98fdfa310a8d8ac7be168c3636b958daa 100644 (file)
@@ -1,3 +1,7 @@
+2017-10-12  Jan Hubicka  <hubicka@ucw.cz>
+
+       * x86-tune-sched.c (ix86_adjust_cost): Fix Zen support.
+
 2017-10-12  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/alpha/alpha.c (alpha_split_conditional_move):
index 51fa77c389abadb6c26753fb8148700a3060e1df..aac2bae806155daf0f98faaef9bd6bbd76d12dc3 100644 (file)
@@ -352,7 +352,6 @@ ix86_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
     case PROCESSOR_BDVER2:
     case PROCESSOR_BDVER3:
     case PROCESSOR_BDVER4:
-    case PROCESSOR_ZNVER1:
     case PROCESSOR_BTVER1:
     case PROCESSOR_BTVER2:
     case PROCESSOR_GENERIC:
@@ -392,6 +391,35 @@ ix86_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
        }
       break;
 
+    case PROCESSOR_ZNVER1:
+      /* Stack engine allows to execute push&pop instructions in parall.  */
+      if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
+         && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
+       return 0;
+
+      memory = get_attr_memory (insn);
+
+      /* Show ability of reorder buffer to hide latency of load by executing
+        in parallel with previous instruction in case
+        previous instruction is not needed to compute the address.  */
+      if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
+         && !ix86_agi_dependent (dep_insn, insn))
+       {
+         enum attr_unit unit = get_attr_unit (insn);
+         int loadcost;
+
+         if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
+           loadcost = 4;
+         else
+           loadcost = 7;
+
+         if (cost >= loadcost)
+           cost -= loadcost;
+         else
+           cost = 0;
+       }
+      break;
+
     case PROCESSOR_CORE2:
     case PROCESSOR_NEHALEM:
     case PROCESSOR_SANDYBRIDGE: