Какие ситуации вызывают «Использование инструкции не является инструкцией» в LLVM IR? - PullRequest
0 голосов
/ 01 января 2019

Я получаю эту ошибку много раз.Затем, когда я переворачиваю вещи, это работает.Мой код слишком сложен для размещения здесь.Я не могу упростить и воспроизвести проблему.

Исходный код в LLVM, который вызывает исключение, находится здесь: http://llvm.org/doxygen/Verifier_8cpp_source.html:

   // Check that all uses of the instruction, if they are instructions
   // themselves, actually have parent basic blocks.  If the use is not an
   // instruction, it is an error!
   for (Use &U : I.uses()) {
     if (Instruction *Used = dyn_cast<Instruction>(U.getUser()))
       Assert(Used->getParent() != nullptr,
              "Instruction referencing"
              " instruction not embedded in a basic block!",
              &I, Used);
     else {
       CheckFailed("Use of instruction is not an instruction!", U);
       return;
     }
   }

Но я все еще не понимаю, что это значит

Итак, мне интересно, если у кого-нибудь есть небольшой пример , который вызывает ошибку "Использование инструкции - это не инструкция", а также объясняю, почему это происходит.

Спасибо!

1 Ответ

0 голосов
/ 01 января 2019

Возможно, вы генерируете фиктивный ИК где-то в вашем кодеУпомянутое вами утверждение может быть вызвано, например, созданием константного выражения, которое использует результат другой инструкции в качестве операнда:

%0 = <some instruction producing result>
store i8* getelementptr inbounds ([123 x i8], [123 x i8]* @some_string, i32 %0, i32 0), ...

Здесь часть getelementptr inbounds ... является константным выражением , который не может содержать ничего, кроме других констант.Следовательно, мы не можем использовать %0 в качестве индексов здесь.

Вместо этого нам нужно использовать getelementptr инструкция :

%0 = <some instruction producing result>
%1 = i8* getelementptr inbounds ([123 x i8], [123 x i8]* @some_string, i32 %0, i32 0)
store i8* %1, ...

Что касается вашего случаяВы можете просто позвонить I.dump() из своего кода или из отладчика, чтобы выяснить, какая инструкция в точности вызывает ошибочное утверждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...