Message ID | 54EC1ECB.5030609@mentor.com |
---|---|
State | New |
Headers | show |
[stage1 ping] [was: Postpone expanding va_arg until pass_stdarg] On 24-02-15 07:48, Tom de Vries wrote: > On 23-02-15 11:09, Tom de Vries wrote: >> On 23-02-15 09:26, Michael Matz wrote: >>> Hi, >>> >>> On Sun, 22 Feb 2015, Tom de Vries wrote: >>> >>>> Btw, I'm wondering if as run-time optimization we can tentatively set >>>> PROP_gimple_lva at the start of the gimple pass, and unset it in >>>> gimplify_va_arg_expr. That way we would avoid the loop in >>>> expand_ifn_va_arg_1 (over all bbs and gimples) in functions without >>>> va_arg. >>> >>> That makes sense. >>> >> >> I'll put this follow-up patch through testing. > > Bootstrapped and reg-tested as before together with the rest of the patch series. > > OK for stage1? > Ping. Thanks, - Tom > 0006-Set-PROP_gimple_lva-for-functions-without-IFN_VA_ARG.patch > > > 2015-02-23 Tom de Vries<tom@codesourcery.com> > > * gimplify.c (gimplify_function_tree): Tentatively set PROP_gimple_lva > in cfun->curr_properties. > (gimplify_va_arg_expr): Clear PROP_gimple_lva in cfun->curr_properties > if we generate an IFN_VA_ARG. > * tree-inline.c (expand_call_inline): Reset PROP_gimple_lva in dest > function if PROP_gimple_lva is not set in src function. > --- > gcc/gimplify.c | 10 +++++++++- > gcc/tree-inline.c | 8 ++++++++ > 2 files changed, 17 insertions(+), 1 deletion(-) > > diff --git a/gcc/gimplify.c b/gcc/gimplify.c > index 8ac6a35..497e2fa 100644 > --- a/gcc/gimplify.c > +++ b/gcc/gimplify.c > @@ -9218,6 +9218,10 @@ gimplify_function_tree (tree fndecl) > else > push_struct_function (fndecl); > > + /* Tentatively set PROP_gimple_lva here, and reset it in gimplify_va_arg_expr > + if necessary. */ > + cfun->curr_properties |= PROP_gimple_lva; > + > for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = DECL_CHAIN (parm)) > { > /* Preliminarily mark non-addressed complex variables as eligible > @@ -9312,7 +9316,7 @@ gimplify_function_tree (tree fndecl) > } > > DECL_SAVED_TREE (fndecl) = NULL_TREE; > - cfun->curr_properties = PROP_gimple_any; > + cfun->curr_properties |= PROP_gimple_any; > > pop_cfun (); > } > @@ -9431,6 +9435,10 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, > tag = build_int_cst (build_pointer_type (type), 0); > *expr_p = build_call_expr_internal_loc (loc, IFN_VA_ARG, type, 2, ap, tag); > > + /* Clear the tentatively set PROP_gimple_lva, to indicate that IFN_VA_ARG > + needs to be expanded. */ > + cfun->curr_properties &= ~PROP_gimple_lva; > + > return GS_OK; > } > > diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c > index d8abe03..7dfef4f 100644 > --- a/gcc/tree-inline.c > +++ b/gcc/tree-inline.c > @@ -4524,6 +4524,14 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) > id->src_cfun = DECL_STRUCT_FUNCTION (fn); > id->call_stmt = stmt; > > + /* If the the src function contains an IFN_VA_ARG, then so will the dst > + function after inlining. */ > + if ((id->src_cfun->curr_properties & PROP_gimple_lva) == 0) > + { > + struct function *dst_cfun = DECL_STRUCT_FUNCTION (id->dst_fn); > + dst_cfun->curr_properties &= ~PROP_gimple_lva; > + } > + > gcc_assert (!id->src_cfun->after_inlining); > > id->entry_bb = bb; > -- 1.9.1 >
[stage1 ping^2] On 10-03-15 16:31, Tom de Vries wrote: > [stage1 ping] > [was: Postpone expanding va_arg until pass_stdarg] > On 24-02-15 07:48, Tom de Vries wrote: >> On 23-02-15 11:09, Tom de Vries wrote: >>> On 23-02-15 09:26, Michael Matz wrote: >>>> Hi, >>>> >>>> On Sun, 22 Feb 2015, Tom de Vries wrote: >>>> >>>>> Btw, I'm wondering if as run-time optimization we can tentatively set >>>>> PROP_gimple_lva at the start of the gimple pass, and unset it in >>>>> gimplify_va_arg_expr. That way we would avoid the loop in >>>>> expand_ifn_va_arg_1 (over all bbs and gimples) in functions without >>>>> va_arg. >>>> >>>> That makes sense. >>>> >>> >>> I'll put this follow-up patch through testing. >> >> Bootstrapped and reg-tested as before together with the rest of the patch series. >> >> OK for stage1? >> > > Ping. > Ping again. Patch originally posted at: https://gcc.gnu.org/ml/gcc-patches/2015-02/msg01402.html . Thanks, - Tom
On Thu, 16 Apr 2015, Tom de Vries wrote: > [stage1 ping^2] > On 10-03-15 16:31, Tom de Vries wrote: > > [stage1 ping] > > [was: Postpone expanding va_arg until pass_stdarg] > > On 24-02-15 07:48, Tom de Vries wrote: > > > On 23-02-15 11:09, Tom de Vries wrote: > > > > On 23-02-15 09:26, Michael Matz wrote: > > > > > Hi, > > > > > > > > > > On Sun, 22 Feb 2015, Tom de Vries wrote: > > > > > > > > > > > Btw, I'm wondering if as run-time optimization we can tentatively > > > > > > set > > > > > > PROP_gimple_lva at the start of the gimple pass, and unset it in > > > > > > gimplify_va_arg_expr. That way we would avoid the loop in > > > > > > expand_ifn_va_arg_1 (over all bbs and gimples) in functions without > > > > > > va_arg. > > > > > > > > > > That makes sense. > > > > > > > > > > > > > I'll put this follow-up patch through testing. > > > > > > Bootstrapped and reg-tested as before together with the rest of the patch > > > series. > > > > > > OK for stage1? > > > > > > > Ping. > > > > Ping again. > > Patch originally posted at: > https://gcc.gnu.org/ml/gcc-patches/2015-02/msg01402.html . Ok. Thanks, Richard. > Thanks, > - Tom > > >
2015-02-23 Tom de Vries <tom@codesourcery.com> * gimplify.c (gimplify_function_tree): Tentatively set PROP_gimple_lva in cfun->curr_properties. (gimplify_va_arg_expr): Clear PROP_gimple_lva in cfun->curr_properties if we generate an IFN_VA_ARG. * tree-inline.c (expand_call_inline): Reset PROP_gimple_lva in dest function if PROP_gimple_lva is not set in src function. --- gcc/gimplify.c | 10 +++++++++- gcc/tree-inline.c | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 8ac6a35..497e2fa 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -9218,6 +9218,10 @@ gimplify_function_tree (tree fndecl) else push_struct_function (fndecl); + /* Tentatively set PROP_gimple_lva here, and reset it in gimplify_va_arg_expr + if necessary. */ + cfun->curr_properties |= PROP_gimple_lva; + for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = DECL_CHAIN (parm)) { /* Preliminarily mark non-addressed complex variables as eligible @@ -9312,7 +9316,7 @@ gimplify_function_tree (tree fndecl) } DECL_SAVED_TREE (fndecl) = NULL_TREE; - cfun->curr_properties = PROP_gimple_any; + cfun->curr_properties |= PROP_gimple_any; pop_cfun (); } @@ -9431,6 +9435,10 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, tag = build_int_cst (build_pointer_type (type), 0); *expr_p = build_call_expr_internal_loc (loc, IFN_VA_ARG, type, 2, ap, tag); + /* Clear the tentatively set PROP_gimple_lva, to indicate that IFN_VA_ARG + needs to be expanded. */ + cfun->curr_properties &= ~PROP_gimple_lva; + return GS_OK; } diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index d8abe03..7dfef4f 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -4524,6 +4524,14 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) id->src_cfun = DECL_STRUCT_FUNCTION (fn); id->call_stmt = stmt; + /* If the the src function contains an IFN_VA_ARG, then so will the dst + function after inlining. */ + if ((id->src_cfun->curr_properties & PROP_gimple_lva) == 0) + { + struct function *dst_cfun = DECL_STRUCT_FUNCTION (id->dst_fn); + dst_cfun->curr_properties &= ~PROP_gimple_lva; + } + gcc_assert (!id->src_cfun->after_inlining); id->entry_bb = bb; -- 1.9.1