FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

オリジナルLLVM Backendを追加しよう (20. 制御構文の実装と最適化Passの追加)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。

jonathan2251.github.io

8.2 章 Long Branchのサポート

第8章の前半はLongBranchのサポート。これは読んでみたがあまりよく分からない。 BAL命令(Branch and Link命令?)向けのサポートだが、RISC-Vには該当する命令が存在しないのでとりあえず追加だけしておいてテストはしない。

8.3章 不要なJump命令のサポート

8.3章は、不要なJump命令の削除するPassを追加する。 これにより、Passを追加することで以下のように生成されていたコードが、

        lw      x10, 12(x2)
        lw      x11, 8(x2)
        add     x10, x10, x11
        sw      x10, 12(x2)
        lw      x10, 8(x2)
        addi    x10, x10, -1
        sw      x10, 8(x2)
        jal     $BB0_9
$BB0_9:                                 # %if.end7
        jal     $BB0_10
$BB0_10:                                # %if.end8
        lw      x10, 4(x2)
...
        lw      x10, 12(x2)
        addi    x2, x2, 16
        ret

以下のように不要なJumpが削除される。

        lw      x10, 12(x2)
        lw      x11, 8(x2)
        add     x10, x10, x11
        sw      x10, 12(x2)
        lw      x10, 8(x2)
        addi    x10, x10, -1
        sw      x10, 8(x2)
$BB0_9:                                 # %if.end7
$BB0_10:                                # %if.end8
        lw      x10, 4(x2)
...

8.4 Delayed SlotのFill

RISC-VにはDelayed Slotが存在しないので不要。