LLVM Pass аварийно завершает работу, когда я пытаюсь добавить zext и вызывать инструкции - PullRequest
1 голос
/ 29 мая 2020

У меня следующий LLVM IR хочет использовать printf для отображения значения% arrayidx.

%arrayidx = getelementptr inbounds float, float* %A, i64 %0
%1 = load float, float* %arrayidx, align 4

То есть результат должен быть:

%arrayidx = getelementptr inbounds float, float* %A, i64 %0
%2 = zext i64 %0 to i32
%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i64 0, i64 0), i32 %2)
%1 = load float, float* %arrayidx, align 4

Итак, я написали следующий проход LLVM:

Builder.SetInsertPoint(&BB);
Value *str = Builder.CreateGlobalStringPtr(StringRef("The index is %d\n"));

std::vector<Value*> args;
Value* idx = I->getOperand(1);
Value* idx32 = Builder.CreateIntCast(idx, Builder.getInt32Ty(), true);
args.push_back(str);
args.push_back(idx32);

Value* call_inst = Builder.CreateCall(ptf, args, "tmp");

Но я получил следующую ошибку:

opt: /llvm-6.0/include/llvm/Support/Casting.h:255: typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X = llvm::Function; Y = llvm::Constant; typename llvm::cast_retty<X, Y*>::ret_type = llvm::Function*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.

Кто-нибудь может помочь с этим? Спасибо.

...