我修改了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标签?
答案 0 :(得分:0)
我通过在'return CondV;'
之前添加以下两行来解决这个问题TheFunction->getBasicBlockList().push_back(MergeBB);
Builder.SetInsertPoint(MergeBB);