diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2019-11-14 00:40:49 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2019-11-13 23:40:49 +0000 |
commit | 2b89b748a3922a95edca154e7eb6550a6f258e8f (patch) | |
tree | a2f3b73973a9a988ac9eb96a8dcec7e1e1b76577 /gcc/ipa-cp.c | |
parent | d772e360ba9fa1f683bac47fcb66988462d2a583 (diff) |
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
Diffstat (limited to 'gcc/ipa-cp.c')
-rw-r--r-- | gcc/ipa-cp.c | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 6acfb2ba58a..36cac5f012c 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) |