Инструкции по отливке LLVM

я имею ConstantInt а также ConstantFP значения, которые я хочу добавить, используя fadd, Тем не менее, я испытываю затруднения ConstantInt в число с плавающей запятой, которое fadd приму.

Вот выдержка из кода:

Value* left = ConstantInt::get(Type::getInt64Ty(getGlobalContext()), 12, true);
Value* right = ConstantFP::get(Type::getFloatTy(getGlobalContext()), 11.6);

Instruction* cast = CastInst::Create(Instruction::SIToFP, left, left->getType(), "", currentBlock());
left = cast->getOperand(0);

BinaryOperator::Create(Instruction::FAdd, left, right, "", currentBlock());

где currentBlock() возвращает BasicBlock, После попытки создать код операции для этого, LLVM жалуется, что не может добавить два значения, потому что они не совпадают.

Я довольно новичок в LLVM, поэтому приму любой совет, если этот код не имеет смысла.

8

Решение

Мой обычный подход к этим вещам — посмотреть, что генерирует Clang — как LLVM IR, так и вызовы API C ++ (бэкэнд C ++). Вы можете использовать онлайн экземпляр для простоты. Итак, компиляция этого кода C:

float foo(int a, float b) {
return a + b;
}

Дает мне этот LLVM IR:

define float @foo(i32 %a, float %b) #0 {
entry:
%conv = sitofp i32 %a to float
%add = fadd float %conv, %b
ret float %add
}

И это вызовы API C ++, необходимые для воссоздания этого:

 // Function: foo (func_foo)
{
Function::arg_iterator args = func_foo->arg_begin();
Value* int32_a = args++;
int32_a->setName("a");
Value* float_b = args++;
float_b->setName("b");

BasicBlock* label_entry = BasicBlock::Create(mod->getContext(), "entry",func_foo,0);

// Block entry (label_entry)
CastInst* float_conv = new SIToFPInst(int32_a, Type::getFloatTy(mod->getContext()), "conv", label_entry);
BinaryOperator* float_add = BinaryOperator::Create(Instruction::FAdd, float_conv, float_b, "add", label_entry);
ReturnInst::Create(mod->getContext(), float_add, label_entry);
}

Вы можете настроить входной C-код (т.е. заменить переменные на константы и т. Д.) И посмотреть, что излучает Clang / LLVM. Это лучший / самый быстрый способ разобраться с IR и API, когда вы не слишком знакомы с ним.

11

Другие решения

Проблема здесь:

Instruction* cast = CastInst::Create(Instruction::SIToFP, left, left->getType(), "", currentBlock());

Вы кастовали left в left->getType()то есть ты ничего не сделал. Приведение к right->getType() вместо:

Instruction* cast = CastInst::Create(Instruction::SIToFP, left, right->getType(), "", currentBlock());
0

По вопросам рекламы [email protected]