LLVM безоперационная инструкция? - PullRequest
3 голосов
/ 18 ноября 2011

Я пишу компилятор для назначения для языка с пустыми операторами.Для таких структур, как if-then-else, было бы удобно, если бы я мог использовать оператор no-op в llvm, но я не нашел никакого «официального» nop.У меня есть некоторые идеи, но в идеале я бы хотел, чтобы llvm оптимизировал эту часть кода и удалил инструкцию;любой совет?

Ответы [ 3 ]

6 голосов
/ 02 апреля 2015

Посмотрите на эту встроенную функцию:

declare void @llvm.donothing() nounwind readnone

из Справочного руководства по языку LLVM:

Встроенная функция llvm.donothing не выполняет никаких операций.Это одна из двух встроенных функций (кроме llvm.experimental.patchpoint), которые можно вызвать с помощью инструкции invoke.

6 голосов
/ 20 ноября 2011

В ИК нет операционного кода.Но вы можете смело использовать любую мертвую инструкцию, не связанную с побочными эффектами, в качестве замены (то есть, если вам действительно нужно выдать запрет на операции), потому что оптимизаторы удалят их достаточно легко.Например, %nop = add i1 0, 0 или %nop = alloca i1, i1 0 может работать.

0 голосов
/ 08 сентября 2015

Вместо noop или оператора, который оптимизируется под noop, создайте метку и ветвь для вашего условия if.

  1. Это упрощает генерацию кода, без особых случаев, когда есть или нет.
  2. Оптимизатор преобразует их в инструкции фи.
  3. Это делает намерение кода явным для разработчика. В будущем вам или другим людям не нужно будет выяснять, почему эта дополнительная инструкция была вставлена.

Например:

    %2 = icmp sgt i32 %0, %1
    br i1 %2, label %3, label %7
; <label>:3
;   ;; [instructions in block redacted for simplicity]
    br label %8
; <label>:7
    br label %8
; <label>:8
    %9 = load i32* %x, align 4 ;; continue on our merry way
...