On 05/12/2016 10:08 AM, Martin Jambor wrote:
Hi,

the patch below implements deducing aggregate contents from pointers
to constant variables for inlining and IPA-CP, which finally makes us
perform the optimization requested in
https://gcc.gnu.org/ml/gcc/2014-07/msg00240.html. It also lays down
the basis for doing optimization requested in PR 69708 but two
additional small patches are required for that.

This means we do not give up if we can't use AA to prove that
the memory in question has not been clobbered since invocation of the
function but only mark this fact in the indirect_call_info.  Later on
we still use this information if we know that the parameter in
question points to a constant variable.

If this is deemed a god approach, we will probably want to add a
similar bit to inlining conditions.

Bootstrapped, lto-bootstrapped and tested on x86_64-linux. OK for
trunk?

Thanks,

Martin


2016-05-11  Martin Jambor  <mjam...@suse.cz>

        PR ipa/69708
        * cgraph.h (cgraph_indirect_call_info): New field
        guaranteed_unmodified.
        * ipa-cp.c (ipa_get_indirect_edge_target_1): Also pass parameter value
        to ipa_find_agg_cst_for_param, check guaranteed_unmodified when
        appropriate.
        * ipa-inline-analysis.c (evaluate_conditions_for_known_args): Also
        pass the parameter value to ipa_find_agg_cst_for_param.
        * ipa-prop.c (ipa_load_from_parm_agg): New parameter
        guaranteed_unmodified, store AA results there instead of bailing out
        if present.
        (ipa_note_param_call): Also initialize guaranteed_unmodified flag.
        (ipa_analyze_indirect_call_uses): Also set guaranteed_unmodified flag.
        (find_constructor_constant_at_offset): New function.
        (ipa_find_agg_cst_from_init): Likewise.
        (ipa_find_agg_cst_for_param): Also seearch for aggregate values in
        static initializers of contants, report back through a new paameter
        from_global_constant if that was the case.
        (try_make_edge_direct_simple_call): Also pass parameter value to
        ipa_find_agg_cst_for_param, check guaranteed_unmodified when
        appropriate.
        (ipa_write_indirect_edge_info): Stream new flag guaranteed_unmodified.
        (ipa_read_indirect_edge_info): Likewise.
        * ipa-prop.h (ipa_find_agg_cst_for_param): Update declaration.
        (ipa_load_from_parm_agg): Likewise.

testsuite/
        * gcc.dg/ipa/iinline-cstagg-1.c: New test.
        * gcc.dg/ipa/ipcp-cstagg-1.c: Likewise.
        * gcc.dg/ipa/ipcp-cstagg-2.c: Likewise.
        * gcc.dg/ipa/ipcp-cstagg-3.c: Likewise.
        * gcc.dg/ipa/ipcp-cstagg-4.c: Likewise.
---
LGTM.
jeff


Reply via email to