LINUX.ORG.RU

LLVM, CMP, бранчи

 , ,


0

4

Сначала прохладная история чисто поржать и излить нервы, т.к. все равно чую придется в мейл-листе спрашивать

сижу пишу бэк к LLVM. у железки CMP отсутствует, флаги выставляются через SUB. соответственно бранч выглядит как sub + br_cc. Начинаю замечать что бранчи периодически оттупают. смотрю дебаг. в момент когда происходит сравнение с числом, в частности с нулем, LLVM увидев строку sub r0, r0, 0 с умным видом подмечает «норкоман чтоле?» и нафиг удаляет эту инструкцию. бьюсь с этой падлой уже часа четыре, хоть бы хрен.

ну и собственно вопрос, можт кто знает. как правильно реализовать в LLVM бранч (BR_CC) используя sub и отдельный статус-регистр (imp-def). пока сделал так:

  • есть кастомный lowering, который сначала берет ISD::SUB или ISD::FSUB в зависимости от типа регистра/переменной.
  • результат скармливается в кастомный MyISD::BCC в качестве третьего аргумента помимо адреса и условия.
  • собственно в InstrInfo.td есть 4 строки с бранчем для 4 типов регистров.

косяк в том что во время оптимизации бранчей в insertBranch требуется добавить аргумент-регистр, что в отдельных случаях нафиг все ломает. да и вообще это довольно странно выглядит. ну и вылазят вот такие занятные «оптимизации» типа описанной выше.

пытался подсунуть в паттерн imp-def статус-регистр, который выставляется вычитанием, но поскольку этот регистр идет вторым аргументом LLVM начинает пытаться заюзать COPY на него, что чревато (делается через жопу в 3 шага минимум) и вообще делать смысла не имеет в данном случае.

пытался поставить glue на вычитание, но стандартный SUB этого дела не имеет, как и chain. смотрел другие варианты - народ юзает glue, но лепит хренову кучу кастомных ISD.

не, можно конечно расписать кастомные ISD и паттерны на каждый тип данных, но это сейчас их 5 штук, а если залезть в вектор - там все 15 будут. хотелось бы оставить просто ISD::SUB, поскольку он в любом случае расписан для всех типов.

p.s. код если что лежит тут, ветка bugfixes.

★★★★★

Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от anonymous

не я. но вижу что не один такой. и решения там походу тож нема

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Написано же по ссылке выше в последнем письме: смотреть как зделоно в AVR

ого. занятно. правда это к сожалению не совсем подходит. копировать регистр все-таки можно. просто не нужно в 99% случаев

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от upcFrost

Лан, я вообще-то не разбираюсь в этом во всём, просто нагуглил какую-то херню.

anonymous
()
Ответ на: комментарий от upcFrost

У AVR в InstInfo написано «implicit SREG» у инструкций, которые неявно трогают статусный регистр. Это не то, что тебе нужно?

anonymous
()
Ответ на: комментарий от anonymous

Близко. Та же шняга делается через defs/uses, который у меня есть. Надо с ней еще правда попрыгать.

Пока сделал несколько кастомных ISD и запретил копировать статус-регистр. Хз нормально ли

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от upcFrost

Та же шняга делается через defs/uses, который у меня есть.

У AVR и defs/uses [SREG], и imlicit SREG одновременно

anonymous
()
Ответ на: комментарий от anonymous

У AVR и defs/uses [SREG], и imlicit SREG одновременно

нашел разницу. не, нужно именно в defs писать. там мутная байда типа implicit работает только когда инструкция выбрана через паттерн, и никак иначе. соответственно вызов из кода такой инструкции ничего не даст. а defs работает в любом случае.

блин, документация короче. только сиди и ройся в мейл-листе.

ладно, вроде как придумал как красиво обернуть кастомные ISD чтоб выглядело логично

upcFrost ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.