Add targetm.insn_cost hook
authorSegher Boessenkool <segher@kernel.crashing.org>
Mon, 9 Oct 2017 19:47:08 +0000 (21:47 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 9 Oct 2017 19:47:08 +0000 (21:47 +0200)
This adds a new hook that the insn_cost function uses if a target has
implemented it (it uses the old pattern_cost nee insn_rtx_cost if not).

* target.def (insn_cost): New hook.
* doc/tm.texi.in (TARGET_INSN_COST): New hook.
* doc/tm.texi: Regenerate.
* rtlanal.c (insn_cost): Use the new hook.

From-SVN: r253562

gcc/ChangeLog
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/rtlanal.c
gcc/target.def

index dfb19231a981bcc9ea20c83f5967e446257b66de..871166a0bd3ae037307eb12d04200143053bdb0c 100644 (file)
@@ -1,3 +1,10 @@
+2017-10-09  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * target.def (insn_cost): New hook.
+       * doc/tm.texi.in (TARGET_INSN_COST): New hook.
+       * doc/tm.texi: Regenerate.
+       * rtlanal.c (insn_cost): Use the new hook.
+
 2017-10-09  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * combine.c (combine_validate_cost): Compute the new insn_cost,
index 8f503e1904ecb04e24d80a2c9c43f05345028d2a..03772177d0dee6a55dbe8ffc45d9ec68500f2aaa 100644 (file)
@@ -6652,6 +6652,18 @@ should probably only be given to addresses with different numbers of
 registers on machines with lots of registers.
 @end deftypefn
 
+@deftypefn {Target Hook} int TARGET_INSN_COST (rtx_insn *@var{insn}, bool @var{speed})
+This target hook describes the relative costs of RTL instructions.
+
+In implementing this hook, you can use the construct
+@code{COSTS_N_INSNS (@var{n})} to specify a cost equal to @var{n} fast
+instructions.
+
+When optimizing for code size, i.e.@: when @code{speed} is
+false, this target hook should be used to estimate the relative
+size cost of an expression, again relative to @code{COSTS_N_INSNS}.
+@end deftypefn
+
 @deftypefn {Target Hook} {unsigned int} TARGET_MAX_NOCE_IFCVT_SEQ_COST (edge @var{e})
 This hook returns a value in the same units as @code{TARGET_RTX_COSTS},
 giving the maximum acceptable cost for a sequence generated by the RTL
index 15b3f1f67715a66f8efce13e113340acb5a2329a..d2cf68fee00867effb2aaac76f8a15a29a3a98f5 100644 (file)
@@ -4600,6 +4600,8 @@ Define this macro if a non-short-circuit operation produced by
 
 @hook TARGET_ADDRESS_COST
 
+@hook TARGET_INSN_COST
+
 @hook TARGET_MAX_NOCE_IFCVT_SEQ_COST
 
 @hook TARGET_NOCE_CONVERSION_PROFITABLE_P
index f01eab5bdb4a0caee11db563aa835afd08428ed6..eadf691d077dd8115b4bcb8d68a328032f867745 100644 (file)
@@ -5329,6 +5329,9 @@ pattern_cost (rtx pat, bool speed)
 int
 insn_cost (rtx_insn *insn, bool speed)
 {
+  if (targetm.insn_cost)
+    return targetm.insn_cost (insn, speed);
+
   return pattern_cost (PATTERN (insn), speed);
 }
 
index 80ef7469a503b5b35e882c8e17e979806442016a..aac5d2711a838cd4a19f024fe2c750b96455d2a3 100644 (file)
@@ -3715,6 +3715,20 @@ registers on machines with lots of registers.",
  int, (rtx address, machine_mode mode, addr_space_t as, bool speed),
  default_address_cost)
 
+/* Compute a cost for INSN.  */
+DEFHOOK
+(insn_cost,
+ "This target hook describes the relative costs of RTL instructions.\n\
+\n\
+In implementing this hook, you can use the construct\n\
+@code{COSTS_N_INSNS (@var{n})} to specify a cost equal to @var{n} fast\n\
+instructions.\n\
+\n\
+When optimizing for code size, i.e.@: when @code{speed} is\n\
+false, this target hook should be used to estimate the relative\n\
+size cost of an expression, again relative to @code{COSTS_N_INSNS}.",
+ int, (rtx_insn *insn, bool speed), NULL)
+
 /* Give a cost, in RTX Costs units, for an edge.  Like BRANCH_COST, but with
    well defined units.  */
 DEFHOOK