X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fopt_inline.c;h=9f8845575afd1c0f8745f5b46f75b2517debcbbe;hb=6779c87f32214b62ed54f3e054c83aa0683fb29e;hp=009545ca5542a8c52ea38c026443f3745d94307b;hpb=6b0ac7428c65605773adc075d22d2dcfb2d31b0e;p=libfirm diff --git a/ir/opt/opt_inline.c b/ir/opt/opt_inline.c index 009545ca5..9f8845575 100644 --- a/ir/opt/opt_inline.c +++ b/ir/opt/opt_inline.c @@ -753,6 +753,22 @@ static void find_addr(ir_node *node, void *env) { is_Start(get_Proj_pred(node)) && get_Proj_proj(node) == pn_Start_P_value_arg_base) { *allow_inline = 0; + } else if (is_Alloc(node) && get_Alloc_where(node) == stack_alloc) { + /* From GCC: + * Refuse to inline alloca call unless user explicitly forced so as this + * may change program's memory overhead drastically when the function + * using alloca is called in loop. In GCC present in SPEC2000 inlining + * into schedule_block cause it to require 2GB of ram instead of 256MB. + * + * Sorryly this is true with our implementation also. + * Moreover, we cannot differentiate between alloca() and VLA yet, so this + * disables inlining of functions using VLA (with are completely save). + * + * 2 Solutions: + * - add a flag to the Alloc node for "real" alloca() calls + * - add a new Stack-Restore node at the end of a function using alloca() + */ + *allow_inline = 0; } }