Что не так с этим кодом LLVM IR - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть код LLVM IR, который выглядит примерно так:

  %8 = load i64* @tid, align 8
  %arrayidx1 = getelementptr inbounds [16 x i32]* @h, 
    i32 0, i64 %8 ;<-- %8 works fine here
  ..............
  %OldFuncCounter7 = load i64* getelementptr inbounds ([16 x i64]* 
    @EdgeProfCounters, i64 0, i64 %8) ;<-- error here, %8 not allowed
  ..............

В строке, где назначено arrayidx1 , все в порядке, но для OldFuncCounter7 компилятор LLVM жалуется, говоря «недопустимое использование локального имени функции».Это из-за% 8, который я использую.Если я заменю его константой, он будет работать нормально.Поэтому мой вопрос заключается в том, почему% 8 отлично работает с arrayidx1 , а не с OldFuncCounter7 .Что здесь происходит?

Весь базовый блок, в котором происходит эта ошибка, показан ниже

  %8 = load i64* @tid, align 8
  %arrayidx1 = getelementptr inbounds [16 x i32]* @h, i32 0, i64 %8
  store volatile i32 3, i32* %arrayidx1, align 4
  %9 = load volatile i32* getelementptr inbounds ([16 x i32]* @h, i32 0, i64 0), align 4
  %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 %9)
  %10 = load i64* @tid, align 8
  store volatile i64 %10, i64* %clock, align 8
  %call3 = call i32 @getpid() nounwind
  %call4 = call i64 @pthread_self() nounwind readnone
  %11 = load volatile i64* %clock, align 8
  %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.str1, i32 0, i32 0), i32 %call3, i64 %call4, i64 %11)
  store i64 0, i64* %oi, align 8
  ; Error here due to %8
  %OldFuncCounter7 = load i64* getelementptr inbounds ([16 x i64]* @EdgeProfCounters, i64 0, i64 %8)
  ;
  %NewFuncCounter8 = add i64 %OldFuncCounter7, 13
  store volatile i64 %NewFuncCounter8, i64* getelementptr inbounds ([16 x i64]* @EdgeProfCounters, i64 0, i64 0)
  br label %for.cond6

1 Ответ

4 голосов
/ 18 октября 2012

Вы используете %8 из константного выражения , но оно не является константой.Вам нужно исправить свой код для выполнения инструкции getelementptr вне константного выражения:

%temp = getelementptr inbounds [16 x i64]* @EdgeProfCounters, i64 0, i64 %8
%OldFuncCounter7 = load i64* %temp
...