LLVM |如何实现逻辑非运算的IR代码生成

问题描述 投票:0回答:1

假设我有这样一个函数:

// global variables
llvm::LLVMContext* context;
llvm::Module* module;
llvm::IRBuilder<>* builder;

Value* logical_not_codegen(Value* operand) {
    return builder->CreateLogicalNotOp(operand);
}

根据文档,

CreateLogicalNotOp
中没有像
IRBuilder
这样的功能,所以我的问题是:

IRBuilder
有什么可以用来为逻辑非操作生成 IR 代码吗?

编辑:顺便说一句,我认为

builder.CreateNot()
不是二进制的,我说得对吗?

c++ compiler-construction llvm llvm-ir
1个回答
0
投票

顺便说一句,这就是你的做法:

  auto size_in_bits = rhs->getType()->getPrimitiveSizeInBits();
  if (rhs->getType()->isFloatingPointTy()) {
    return _builder->CreateFCmpOEQ(rhs, ConstantFP::get(_builder->getFloatTy(), 0.0f));
  } else if (rhs->getType()->isSingleValueType()) {
    return _builder->CreateICmpEQ(rhs, ConstantInt::get(_builder->getIntNTy((unsigned)size_in_bits), 0, false));
  }

© www.soinside.com 2019 - 2024. All rights reserved.