gcc internals:计算指令成本

时间:2013-07-08 14:56:42

标签: gcc compiler-construction

我正在研究一个架构的gcc后端。该体系结构具有索引数组访问的指令;因此,ld r0, (r1, r2)相当于r0 = r1[r2],其中r1int32_t*

我在.md文件中使用以下模式表示:

(define_insn "*si_load_indexed"
  [
    (set
      (match_operand:SI 0 "register_operand" "=r")
      (mem:SI
        (plus:SI
          (mult:SI
            (match_operand:SI 1 "register_operand" "%r")
            (const_int 4))
          (match_operand:SI 2 "register_operand" "r"))))
  ]
  ""
  "ld %0, (%2, %1)"
  [(set_attr "length" "4")]
)

但是,指令实际上从未被发出。查看指令组合阶段的调试输出,我看到了:

Trying 8, 9 -> 10:
Successfully matched this instruction:
(set (reg:SI 47 [ *_5 ])
    (mem:SI (plus:SI (mult:SI (reg/v:SI 43 [ b ])
                (const_int 4 [0x4]))
            (reg:SI 0 r0 [ a ])) [2 *_5+0 S4 A32]))
rejecting combination of insns 8, 9 and 10
original costs 8 + 4 + 4 = 16
replacement cost 32

如果我已正确读取,则表示指令模式已匹配,但由于比原始指令更昂贵,指令已被拒绝。

那么,如何计算我的教学费用呢?它从哪里得到32(看起来非常高)?我如何说服gcc实际使用这条指令?

1 个答案:

答案 0 :(得分:1)

问这样的问题的适当地方是gcc@gcc.gnu.org。如果你提出聪明的问题,他们会非常有帮助。 :)

当然,您应首先阅读内部手册。相关部分位于:http://gcc.gnu.org/onlinedocs/gccint/Costs.html#Costs

我相信你需要看TARGET_RTX_COSTS,但我可能错了。我认为,默认行为是通过逐步遍历RTL并累加操作来估算成本,但是自从我查看它之后它已经复杂了一段时间(请查看rtx_costs)。

其他端口添加指令属性以帮助他们判断成本。