[LLVMdev] if/then/else implement in LLVM
Jiaye Wu
wujysh at gmail.com
Mon Jun 23 01:17:40 PDT 2014
I want to use LLVM APIs to translate own language to IR code. I implement
it like below. But I got nothing in if_then tag, and if_else is missing too.
>> Value* NIfStatement::codeGen(CodeGenContext& context)
>
> {
>
> std::cout << "Creating if statement " << std::endl;
>
>
>> Value *condValue = condition.codeGen(context);
>
> if (condValue == nullptr) return nullptr;
>
>
>> std::cout << condValue->getType()->getTypeID() << std::endl;
>
> condValue = new FCmpInst(*context.currentBlock(), CmpInst::FCMP_ONE,
>
> condValue,
>> ConstantFP::get(getGlobalContext(), APFloat(0.0)));
>
> Function *function = context.currentBlock()->getParent();
>
>
>> BasicBlock *thenBlock = BasicBlock::Create(getGlobalContext(),
>> "if.then", function);
>
> BasicBlock *elseBlock = BasicBlock::Create(getGlobalContext(),
>> "if.else");
>
> BasicBlock *mergeBlock = BasicBlock::Create(getGlobalContext(),
>> "if.cont");
>
>
>> BranchInst::Create(thenBlock, elseBlock, condValue,
>> context.currentBlock());
>
>
>>
>> // create then block
>
> context.pushBlock(thenBlock);
>
>
>> Value *thenValue = conditionCodeGen(context, thenblock);
>
> if (thenValue == nullptr) return nullptr;
>
> BranchInst::Create(mergeBlock, context.currentBlock());
>
>
>> context.popBlock();
>
>
>> // create else block
>
> function->getBasicBlockList().push_back(elseBlock);
>
> context.pushBlock(elseBlock);
>
>
>> Value *elseValue = conditionCodeGen(context, elseblock);
>
> if (elseValue == nullptr) return nullptr;
>
> BranchInst::Create(mergeBlock, context.currentBlock());
>
>
>> context.popBlock();
>
>
>> // create PHI node
>
> function->getBasicBlockList().push_back(mergeBlock);
>
> context.pushBlock(mergeBlock);
>
>
>> PHINode *PN = PHINode::Create(Type::getVoidTy(getGlobalContext()), 2,
>> "if.tmp", mergeBlock);
>
> PN->addIncoming(thenValue, thenBlock);
>
> PN->addIncoming(elseValue, elseBlock);
>
>
>> context.popBlock();
>
>
>> return PN;
>
> }
>
>
>> Value* NIfStatement::conditionCodeGen(CodeGenContext& context,
>> StatementList& block)
>
> {
>
> std::cout << "Generate conditional block" << std::endl;
>
> StatementList::const_iterator it;
>
> Value *last = nullptr;
>
> for (it = block.begin(); it != block.end(); it++) {
>
> std::cout << "Generating code for " << typeid(**it).name() << ' '
>> << std::endl;
>
> last = (**it).codeGen(context);
>
> }
>
> return last;
>
> }
>
>
AST:
> class NIfStatement : public NStatement {
>
> public:
>
> NBinaryOperator& condition;
>
> StatementList thenblock;
>
> StatementList elseblock;
>
> NIfStatement(NBinaryOperator& condition, StatementList& thenblock) :
>
> condition(condition), thenblock(thenblock) {}
>
> NIfStatement(NBinaryOperator& condition, StatementList& thenblock,
>> StatementList& elseblock) :
>
> condition(condition), thenblock(thenblock), elseblock(elseblock) {}
>
> virtual llvm::Value* codeGen(CodeGenContext& context);
>
> virtual llvm::Value* conditionCodeGen(CodeGenContext& context,
>> StatementList& block);
>
> };
>
>
Running result:
> define internal i64 @main() {
>
> entry:
>
> %x = alloca i64
>
> %y = alloca i64
>
> %z = alloca i64
>
> %str = alloca double
>
> store i64 5, i64* %z
>
> %0 = load i64* %x
>
> %cmptmp = icmp uge i64 %0, 0
>
> %1 = fcmp one double %booltmp, 0.000000e+00
>
> br i1 %1, label %if.then, label %if.else
>
> ret void
>
>
>> if.then: ; preds = %entry
>
> }
>
>
>
Can anyone help me? What's wrong? Thank you!
--
*Jiaye Wu*
Donghua University
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140623/0627f234/attachment.html>
More information about the llvm-dev
mailing list