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 | |
parent | d772e360ba9fa1f683bac47fcb66988462d2a583 (diff) | |
download | gcc-2b89b748a3922a95edca154e7eb6550a6f258e8f.zip gcc-2b89b748a3922a95edca154e7eb6550a6f258e8f.tar.gz gcc-2b89b748a3922a95edca154e7eb6550a6f258e8f.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 56 |
2 files changed, 47 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b41e696..1bc627a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2019-11-13 Jan Hubicka <hubicka@ucw.cz> + * ipa-cp.c (propagate_vr_across_jump_function): Propagate also across + binary operations. + +2019-11-13 Jan Hubicka <hubicka@ucw.cz> + * ipa-profile.c (check_argument_count): Check properly that e_info is non-NULL; do not check descriptors. diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 6acfb2b..36cac5f 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) |