diff options
| author | gingerBill <bill@gingerbill.org> | 2018-09-09 14:46:28 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-09-09 14:46:28 +0100 |
| commit | 4f3837f0e6dfcdb743f0d1399a4795088d15f664 (patch) | |
| tree | 9bd9c2093b8fe9ebecb9e612eca8443bcb057291 /src/ir.cpp | |
| parent | 76848e8807543cf1e3a6675dc404bbb0de392471 (diff) | |
Procedure inlining on call site
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index a46c375ae..ebeab9869 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -250,6 +250,7 @@ gbAllocator ir_allocator(void) { irValue * return_ptr; \ Array<irValue *> args; \ irValue * context_ptr; \ + ProcInlining inlining; \ }) \ IR_INSTR_KIND(StartupRuntime, i32) \ IR_INSTR_KIND(DebugDeclare, struct { \ @@ -1075,13 +1076,14 @@ irValue *ir_instr_select(irProcedure *p, irValue *cond, irValue *t, irValue *f) return v; } -irValue *ir_instr_call(irProcedure *p, irValue *value, irValue *return_ptr, Array<irValue *> args, Type *result_type, irValue *context_ptr) { +irValue *ir_instr_call(irProcedure *p, irValue *value, irValue *return_ptr, Array<irValue *> args, Type *result_type, irValue *context_ptr, ProcInlining inlining) { irValue *v = ir_alloc_instr(p, irInstr_Call); v->Instr.Call.value = value; v->Instr.Call.return_ptr = return_ptr; v->Instr.Call.args = args; v->Instr.Call.type = result_type; v->Instr.Call.context_ptr = context_ptr; + v->Instr.Call.inlining = inlining; return v; } @@ -1684,7 +1686,7 @@ irValue *ir_find_or_generate_context_ptr(irProcedure *proc) { } -irValue *ir_emit_call(irProcedure *p, irValue *value, Array<irValue *> args) { +irValue *ir_emit_call(irProcedure *p, irValue *value, Array<irValue *> args, ProcInlining inlining = ProcInlining_none) { Type *pt = base_type(ir_type(value)); GB_ASSERT(pt->kind == Type_Proc); Type *results = pt->Proc.results; @@ -1726,16 +1728,20 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array<irValue *> args) { } } + if (inlining == ProcInlining_none) { + inlining = p->inlining; + } + Type *abi_rt = pt->Proc.abi_compat_result_type; Type *rt = reduce_tuple_to_single_type(results); if (pt->Proc.return_by_pointer) { irValue *return_ptr = ir_add_local_generated(p, rt); GB_ASSERT(is_type_pointer(ir_type(return_ptr))); - ir_emit(p, ir_instr_call(p, value, return_ptr, args, nullptr, context_ptr)); + ir_emit(p, ir_instr_call(p, value, return_ptr, args, nullptr, context_ptr, inlining)); return ir_emit_load(p, return_ptr); } - irValue *result = ir_emit(p, ir_instr_call(p, value, nullptr, args, abi_rt, context_ptr)); + irValue *result = ir_emit(p, ir_instr_call(p, value, nullptr, args, abi_rt, context_ptr, inlining)); if (abi_rt != results) { result = ir_emit_transmute(p, result, rt); } @@ -5150,7 +5156,7 @@ irValue *ir_build_expr_internal(irProcedure *proc, Ast *expr) { } } } - return ir_emit_call(proc, value, args); + return ir_emit_call(proc, value, args, ce->inlining); } isize arg_index = 0; @@ -5344,7 +5350,7 @@ irValue *ir_build_expr_internal(irProcedure *proc, Ast *expr) { } auto call_args = array_slice(args, 0, final_count); - return ir_emit_call(proc, value, call_args); + return ir_emit_call(proc, value, call_args, ce->inlining); case_end; case_ast_node(se, SliceExpr, expr); |