LLVM IRBuilder If-Then Codegen

时间:2018-01-19 11:57:56

标签: c++ llvm

我修改了Kaleidoscope的if-then-else codegen,以支持if-then(no else子句),用于非功能语言。我无法在IR中创建合并块(在'then'之后)。

我已经删除了Phi节点的创建,因为(0)phi节点需要合并2个执行分支,而我只有一个分支(1)在非功能语言上下文中并不是真的需要它? (2)phi需要两个相同类型的分支,而'if'语句上面的陈述可能会返回不同的类型。

if-then codegen是:

static IRBuilder<> Builder(TheContext);
:
Value* IfThenExprAST::Codegen() {

    Value* CondV = Cond->Codegen();
    CondV = Builder.CreateICmpNE(CondV, Builder.getInt1(0), "ifcond");

    Function *TheFunction = Builder.GetInsertBlock()->getParent();
    BasicBlock* ThenBB = BasicBlock::Create(TheContext, "then", TheFunction);
    BasicBlock* MergeBB = BasicBlock::Create(TheContext, "ifcont");

    Builder.CreateCondBr(CondV, ThenBB, MergeBB);

    Builder.SetInsertPoint(ThenBB);

    llvm::Value* ThenV;
    for(std::vector<ExprAST*>::iterator it = Then.begin(); it != Then.end(); ++it)
        ThenV = (*it)->Codegen();

    Builder.CreateBr(MergeBB);

    return CondV;
}

产生的IR是:

:
br i1 true, label %then, label %ifcont

then:                                             ; preds = %entry
br label %ifcont
:     
ret double 1.000000e+01

请注意,IR中没有生成“ifcont”标签。

如何告诉构建器在'then'子句后插入ifcont标签?

1 个答案:

答案 0 :(得分:0)

我通过在'return CondV;'

之前添加以下两行来解决这个问题
TheFunction->getBasicBlockList().push_back(MergeBB);

Builder.SetInsertPoint(MergeBB);