3 #include "tir/BasicBlock.h"
4 #include "tir/Constant.h"
5 #include "tir/Context.h"
6 #include "tir/Instructions.h"
12 IRBuilder(
Context& ctx) : ctx_{ctx}, insertPoint_{} {}
36 insertPoint_ = bb->begin();
39 BasicBlock* currentBlock() {
40 return insertPoint_.getBB();
52 return BasicBlock::Create(ctx_, parent);
65 return insert(BinaryInst::Create(ctx_, op, lhs, rhs));
76 return insert(CallInst::Create(ctx_, callee, args));
89 return insert(LoadInst::Create(ctx_, type, ptr));
101 return insert(StoreInst::Create(ctx_, val, ptr));
111 return insert(ReturnInst::Create(ctx_, val));
120 return insert(ReturnInst::Create(ctx_,
nullptr));
131 return createBranchInstr(
Constant::CreateBool(ctx_,
true), target, target);
144 BasicBlock* false_target) {
145 return insert(BranchInst::Create(ctx_, cond, true_target, false_target));
158 return insert(CmpInst::Create(ctx_, pred, lhs, rhs));
171 return insert(ICastInst::Create(ctx_, op, val, destTy));
175 return insert(GetElementPtrInst::Create(ctx_, ptr, t, indices));
180 assert(insertPoint_.getBB() &&
"No insertion point set");
181 if(insertPoint_.isAfterLast()) {
182 insertPoint_.getBB()->appendAfterEnd(instr);
183 }
else if(insertPoint_.isBeforeFirst()) {
184 insertPoint_.getBB()->insertBeforeBegin(instr);
186 instr->insertAfter(*insertPoint_);
188 insertPoint_ = instr->iter();
194 BasicBlock::iterator insertPoint_;