0

I have modified Kaleidoscope's if-then-else codegen, to support if-then (no else clause), for a non-functional language. I'm unable to get the merge block (after the 'then') to be created in the IR.

I have removed the Phi node creation, because (0) the phi node needs to merge 2 branches of execution and I only really have one branch (1) it's not really required in a non-functional language context? (2) the phi requires two legs of the same type and the statement above the 'if' statement might return a different type.

The if-then codegen is:

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;
}

The resulting IR is:

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

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

Notice that there is no 'ifcont' label generated in the IR.

How do I tell the builder to insert the ifcont label after the 'then' clause?

myk
  • 708
  • 2
  • 8
  • 20

1 Answers1

0

I solved this by adding the following 2 lines just before 'return CondV;'

TheFunction->getBasicBlockList().push_back(MergeBB);

Builder.SetInsertPoint(MergeBB);
myk
  • 708
  • 2
  • 8
  • 20