Есть ли способ обеспечить соответствие виртуального регистра на уровне IR физическому регистру? - PullRequest
1 голос
/ 06 марта 2020

В настоящее время я пишу встроенную сборку (подлинная инструкция ' bndr rd, rs1, rs2 ') для LLVM IR. Регистр назначения (rd) содержит адрес указателя для следующей инструкции загрузки / сохранения. Инструментированный код IR после прохода выглядит следующим образом:

call void asm sideeffect "bndr $0, $1, $2", "r, r, r"(%struct.SHA_INFO** %sha_info.addr, i8* %base, i8* %bound)
%2 = load %struct.SHA_INFO*, %struct.SHA_INFO** %sha_info.addr, align 8

, а сборка, сгенерированная из моего бэкэнда, выглядит следующим образом:

        addi    a1, s0, -136
        addi    a2, a1, 8
        mv      a3, a1
        mv      a4, a2
        #APP
        bndr    a1, a3, a4
        #NO_APP
        ld      a3, -144(s0)

Хотя оба встроенных asm bndr и инструкция load на уровне IR используют один и тот же виртуальный регистр "% struct.SHA_INFO % sha_info.addr ». Но на уровне сборки bndr использует регистр a1 для виртуального регистра% sha_info.addr, а ld использует -144 (s0) для того же виртуального регистра.

Мой вопрос заключается в том, можно ли принудительно bndr или ld использовать тот же физический регистр для адреса?

Спасибо

...