Выражение метки в ИК-коде llvm - PullRequest
6 голосов
/ 19 марта 2012

Иногда я обнаружил, что идентификатор метки в llvm IR начинается с запятой ';', например ; <label> 6, однако, как я знаю, запятая используется для комментариев.Так как же llvm может получить информацию о ярлыке в комментариях?Я что-то упустил?
Выполняется один простой тест.
исходный файл C:

#include <stdio.h>

int main()
{
 int a;
 scanf("%d", &a);
 if ( a > 3)
  a *= 2;
 return 0;
}

ИК-код llvm, сгенерированный http://llvm.org/demo/index.cgi (аналогично clang -c -emit-llvm main.c) выглядит следующим образом:

; ModuleID = '/tmp/webcompile/_13654_0.bc'

@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1

define i32 @main() nounwind uwtable {
  %a = alloca i32, align 4
  %1 = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), i32* %a) nounwind
  %2 = load i32* %a, align 4, !tbaa !0
  %3 = icmp sgt i32 %2, 3
  br i1 %3, label %4, label %6

; <label>:4                                       ; preds = %0
  %5 = shl nsw i32 %2, 1
  store i32 %5, i32* %a, align 4, !tbaa !0
  br label %6

; <label>:6                                       ; preds = %4, %0
  ret i32 0
}

Ответы [ 3 ]

4 голосов
/ 19 марта 2012

В LLVM IR блоку не требуется явная метка. Инструкции аналогичны, что приводит к% 1,% 2,% 3. LLVM присваивает номера безымянным инструкциям и блокам в порядке возрастания. br i1 %3... завершает первый блок, и последняя использованная метка номера равна 3, поэтому следующий блок помечается как 4. Этот блок заканчивается следующей инструкцией br, а последний использованный номер равен 5, поэтому следующий и последний блок помечается с 6. Сначала может показаться странным, что блоки и инструкции совместно используют одно и то же пространство имен, но помните, что блоки также являются значениями.

2 голосов
/ 19 декабря 2013

Несмотря на формулировку, %4 в label %4 НЕ является меткой, это просто ссылка на блок.Вы правы, это очень запутанно, см. эту проблему для обсуждения.

1 голос
/ 17 июня 2014

Что-то, что вы можете попробовать, это запустить на вашем IR проход instnamer, который даст всем явное имя, так что вам не нужно беспокоиться о поиске неявных имен.

...