【问题标题】:Inserting a zero extension instruction into a basicblock将零扩展指令插入基本块
【发布时间】:2012-03-14 00:10:45
【问题描述】:

我想在基本块中插入零扩展指令和乘法指令。输入是,

define void @DriverInit() {
    EntryBlock:
      %abc = call i32 @cuInit(i32 0)
      ret void
    }

我想把它改成,

define void @DriverInit() {
        EntryBlock:
          %abc = call i32 @cuInit(i32 0)
          %2 = zext i32 1 to i64
     %3 = mul i64 %2, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64)
          ret void
        }

如何使用 LLVM C++ API 来做到这一点?我使用下面的代码来创建零扩展指令,但我无法做到。

IRBuilder<> builder(BB);
Value *One = builder.getInt32(1);

Value *zer=builder.CreateZExt(One, IntegerType::getInt64Ty(M.getContext()),"1");

CreateZExt 的第二个参数是我想要零扩展的目标类型,如果我错了,请纠正我。

我是 LLVM 的初学者,我很难获得有关在 pass 中使用哪些函数的信息。除了源代码的 doxygen 文档之外,还有哪些资源可用?

【问题讨论】:

  • 我不明白你的问题 - 你能澄清一下吗?你有什么输入 IR,你想创建什么输出? mul 的第二个参数中的指针咒语是做什么的?
  • 如果输入函数中已经有了EntryBlock,为什么还要创建一个基本块?
  • 此外,如果你在展示你正在做的(错误的)方式之前真正解释了你想要完成的事情,这可能会有所帮助。

标签: compiler-construction llvm


【解决方案1】:

一旦您对 LLVM 有一定的经验,您就会知道在哪里查看代码。 直到您获得该经验,您可以使用 C++ 后端为您生成与给定 IR 等效的 API 调用。

一种方法是使用 C++ 后端使用 llc 编译 IR。例如,我采用这个简化的 IR:

define void @DriverInit() {
EntryBlock:
  %0 = zext i32 1 to i64
  %1 = mul i64 %0, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64)
  ret void
}

将其保存到名为z.ll 的文件中并运行:

llc -march=cpp -O0 -cppgen=program z.ll

您需要在某处安装或构建 LLVM 才能访问llc。它产生z.cpp,它有C++ API调用来创建整个模块。 EntryBlock 基本块的相关部分是:

 // Function: DriverInit (func_DriverInit)
 {

  BasicBlock* label_EntryBlock = BasicBlock::Create(mod->getContext(), "EntryBlock",func_DriverInit,0);

  // Block EntryBlock (label_EntryBlock)
  CastInst* int64_6 = new ZExtInst(const_int32_1, IntegerType::get(mod->getContext(), 64), "", label_EntryBlock);
  BinaryOperator* int64_7 = BinaryOperator::Create(Instruction::Mul, int64_6, const_int64_2, "", label_EntryBlock);
  ReturnInst::Create(mod->getContext(), label_EntryBlock);
 }

您将在其中看到如何正确使用 zExtInstr 构造函数和之后的 BinaryOperator::Create 调用来生成该 IR。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多