From 2b89b748a3922a95edca154e7eb6550a6f258e8f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 14 Nov 2019 00:40:49 +0100 Subject: [PATCH] ipa-cp.c (propagate_vr_across_jump_function): Propagate also across binary operations. * ipa-cp.c (propagate_vr_across_jump_function): Propagate also across binary operations. From-SVN: r278185 --- gcc/ChangeLog | 5 +++++ gcc/ipa-cp.c | 56 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b41e6969ff6a..1bc627a111dd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-11-13 Jan Hubicka + + * ipa-cp.c (propagate_vr_across_jump_function): Propagate also across + binary operations. + 2019-11-13 Jan Hubicka * ipa-profile.c (check_argument_count): Check properly that e_info diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 6acfb2ba58a1..36cac5f012ce 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1975,23 +1975,51 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, if (jfunc->type == IPA_JF_PASS_THROUGH) { enum tree_code operation = ipa_get_jf_pass_through_operation (jfunc); + class ipa_node_params *caller_info = IPA_NODE_REF (cs->caller); + int src_idx = ipa_get_jf_pass_through_formal_id (jfunc); + class ipcp_param_lattices *src_lats + = ipa_get_parm_lattices (caller_info, src_idx); + tree operand_type = ipa_get_type (caller_info, src_idx); + + if (src_lats->m_value_range.bottom_p ()) + return dest_lat->set_to_bottom (); + value_range vr; if (TREE_CODE_CLASS (operation) == tcc_unary) { - class ipa_node_params *caller_info = IPA_NODE_REF (cs->caller); - int src_idx = ipa_get_jf_pass_through_formal_id (jfunc); - tree operand_type = ipa_get_type (caller_info, src_idx); - class ipcp_param_lattices *src_lats - = ipa_get_parm_lattices (caller_info, src_idx); - - if (src_lats->m_value_range.bottom_p ()) - return dest_lat->set_to_bottom (); - value_range vr; - if (ipa_vr_operation_and_type_effects (&vr, - &src_lats->m_value_range.m_vr, - operation, param_type, - operand_type)) - return dest_lat->meet_with (&vr); + ipa_vr_operation_and_type_effects (&vr, + &src_lats->m_value_range.m_vr, + operation, param_type, + operand_type); + } + /* A crude way to prevent unbounded number of value range updates + in SCC components. We should allow limited number of updates within + SCC, too. */ + else if (!ipa_edge_within_scc (cs)) + { + tree op = ipa_get_jf_pass_through_operand (jfunc); + value_range op_vr (op, op); + value_range op_res,res; + + range_fold_binary_expr (&op_res, operation, operand_type, + &src_lats->m_value_range.m_vr, &op_vr); + ipa_vr_operation_and_type_effects (&vr, + &op_res, + NOP_EXPR, param_type, + operand_type); + } + if (!vr.undefined_p () && !vr.varying_p ()) + { + if (jfunc->m_vr) + { + value_range jvr; + if (ipa_vr_operation_and_type_effects (&jvr, jfunc->m_vr, + NOP_EXPR, + param_type, + jfunc->m_vr->type ())) + vr.intersect (*jfunc->m_vr); + } + return dest_lat->meet_with (&vr); } } else if (jfunc->type == IPA_JF_CONST) -- 2.43.5