[ssa] [я столкнулся с проблемами]

Spiridonov Alexander spiridoncha at gmail.com
Mon Apr 16 14:29:33 MSK 2018


On Mon, Apr 16, 2018 at 12:50:01PM +0300, Vladislav Ivanishin wrote:
> Добрый день, Александр,
> 
> 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 в репозитории сравнивает внутренние представления
> программ.
> 
> Или без типов возникает ошибка парсинга?
Да, выглядит это так:
  <original>:1: undefined type :mem
Пример для воспроизведения:
  export function :mem $test() {
  @ini
    %p =l alloc4 17
    ret %p # здесь было после printfn так - retc %p, :mem
  }
> 
> Изменения для вывода (вернее, для ввода -- разве нет? -- вывод ведь
> соответствует внутреннему представлению, реально хранимому 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-форма. В предложенном Вами подходе нужно будет выводить отдельно
> исходную программу и соотносить с полученным ответом.
Ну с новым форматом я полагал делать это так:
 * копипастим и припиливаем вывод под наш формат для построения ssa из qbe
 * считаем это эталонным решением
 * генерим с помощью него тесты
Ну а само тестирование просто проверяет что вывод пришедшего решения
совпадает с тем что мы нагенерили(ну, с поправкой на возможное
несовпадение порядка)

> 
> > P.S.
> >   Все задачи которые у нас были на ejudge, были именно такие; может кроме
> >   последнего, я подзабил на него, а условие уже посмотреть не дают :(
> >   Не вывести годный IR, а вывести инфу по базовым блокам.
> >   Возможно и нам стоит так поступить.
> 
> Я на прошлой неделе открыл контест на дорешивание. Упс -- теперь я вижу,
> что забыл при этом убрать дедлайны. Починил, теперь можно посмотреть и
> посдавать.
> 
> -- 
> Влад

-- 
С уважением,
Спиридонов Александр.


More information about the ssa mailing list