[ssa] [я столкнулся с проблемами]
Vladislav Ivanishin
vlad at ispras.ru
Mon Apr 16 12:50:01 MSK 2018
Добрый день, Александр,
Spiridonov Alexander <spiridoncha at gmail.com> writes:
> Короче мне дико не нравится идея править qbe,
> она предназначена чтоб создавать из IR исполняемые файлы,
> а не работать на уровне source2source, мне кажется что мы просто
> зароемся если захотим дополнить таким функционалом qbe.
>
> Если конкретнее(это только на первый взгляд):
> * Нужно выводить не только функцию, но и типы используемые в ней
> https://c9x.me/compile/doc/il.html#Aggregate-Types (я не
> нашёл ничего готового в qbe для этого)
> * Нужно выводить не только функцию, но и определяемые данные
> https://c9x.me/compile/doc/il.html#Data (я не
> нашёл ничего готового в qbe для этого)
> * Нужно переписать часть отвечающую за вывод call
> https://c9x.me/compile/doc/il.html#Call
> * Ну и по-мелочи ещё всякие retw и т.п.
Для задачи в ejudge вполне достаточно выводить только функцию. Задача
ведь состоит в том, чтобы перевести её представление в SSA форму. Это
преобразование никак не затрагивает типы, определённые в программе.
Конечно, программа без типов и данных становится непригодной для
генирации по ней машинного кода, но это не должно понадобиться. В
частности, ssa.cpp в репозитории сравнивает внутренние представления
программ.
Или без типов возникает ошибка парсинга?
Изменения для вывода (вернее, для ввода -- разве нет? -- вывод ведь
соответствует внутреннему представлению, реально хранимому qbe, нужно
только научить его поглащать такую форму) call и retw выглядят простыми
и полезными.
> В общем тут вся боль от того чтоб адаптировать инструмент для целей, для
> которых он не предназначен.
>
> Предлагаю упростить задачу и
> не работать в предположении что тот кто пишет задачу должен в качестве
> вывода предоставить нам годный к парсингу IR.
>
> Предлагаю в качестве output задачи выдавать информацию в примерно таком
> формате:
> @block_name_gl:
> phi:
> * имя переменной в блоке block_name_gl, которая до построения ssa
> была на месте, где после построения будет использование
> переменной определяемой phi(ёпрст, как это называется правильно??)
> * список вида: @block_name0, at block_name1
> блоков, откуда приходят определения переменной из первого пункта
> до построения ssa
>
> Например:
> input file:
> data $fmt = { b "%d", b 0 }
> export function w $main() {
> @start
> %p =l alloc4 4
> %t =w call $scanf(l $fmt, l %p)
> %x =w loadw %p
> @loop
> %x =w sub %x, 1
> jnz %x, @loop, @end
> @end
> ret %x
> }
>
> output file:
> @loop:
> phi:
> %x
> @start, at loop
>
> В таком виде при решении задачи нужно будет по сути только определить
> куда нужно вставлять фи-функции для преобразования в усечённую
> ssa.
>
> Хотелось бы услышать кто что думает по этому поводу.
У меня нет больших возражений, но вывод полной программы для меня
предпочтителен.
В принципе, такой содержит всю необходимую информацию -- в совокупностью
со входными данными. В этом и состоит неудобство: для тестирования можно
было бы выводить целую программу в виде графа (генерировать
представление graphviz и запускать dot) и взглядом определять, корректра
ли ssa-форма. В предложенном Вами подходе нужно будет выводить отдельно
исходную программу и соотносить с полученным ответом.
> P.S.
> Все задачи которые у нас были на ejudge, были именно такие; может кроме
> последнего, я подзабил на него, а условие уже посмотреть не дают :(
> Не вывести годный IR, а вывести инфу по базовым блокам.
> Возможно и нам стоит так поступить.
Я на прошлой неделе открыл контест на дорешивание. Упс -- теперь я вижу,
что забыл при этом убрать дедлайны. Починил, теперь можно посмотреть и
посдавать.
--
Влад
More information about the ssa
mailing list