diff options
author | Kugan Vivekanandarajah <kuganv@linaro.org> | 2016-11-09 01:41:26 +0000 |
---|---|---|
committer | Kugan Vivekanandarajah <kugan@gcc.gnu.org> | 2016-11-09 01:41:26 +0000 |
commit | 5d5f1e95b1f4defc34597417167b1b2bc716b592 (patch) | |
tree | 993a3d81302508074a9b5c91e514840c243f83dc /gcc/ipa-cp.c | |
parent | 8f33501e32c020eada7df9d834622f2e2168f400 (diff) | |
download | gcc-5d5f1e95b1f4defc34597417167b1b2bc716b592.zip gcc-5d5f1e95b1f4defc34597417167b1b2bc716b592.tar.gz gcc-5d5f1e95b1f4defc34597417167b1b2bc716b592.tar.bz2 |
Fix ice in set_value_range
Fix ice in set_value_range
gcc/ChangeLog:
2016-11-09 Kugan Vivekanandarajah <kuganv@linaro.org>
PR ipa/78121
* ipa-cp.c (propagate_vr_accross_jump_function): Pass param type.
Also fold constant passed as argument while computing value range.
(propagate_constants_accross_call): Pass param type.
* ipa-prop.c: export ipa_get_callee_param_type.
* ipa-prop.h: export ipa_get_callee_param_type.
gcc/testsuite/ChangeLog:
2016-11-09 Kugan Vivekanandarajah <kuganv@linaro.org>
PR ipa/78121
* gcc.dg/ipa/pr78121.c: New test.
From-SVN: r241989
Diffstat (limited to 'gcc/ipa-cp.c')
-rw-r--r-- | gcc/ipa-cp.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 527ff27..79e621a 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1834,12 +1834,14 @@ propagate_bits_accross_jump_function (cgraph_edge *cs, int idx, ipa_jump_func *j } /* Propagate value range across jump function JFUNC that is associated with - edge CS and update DEST_PLATS accordingly. */ + edge CS with param of callee of PARAM_TYPE and update DEST_PLATS + accordingly. */ static bool propagate_vr_accross_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, - struct ipcp_param_lattices *dest_plats) + struct ipcp_param_lattices *dest_plats, + tree param_type) { struct ipcp_param_lattices *src_lats; ipcp_vr_lattice *dest_lat = &dest_plats->m_value_range; @@ -1847,6 +1849,11 @@ propagate_vr_accross_jump_function (cgraph_edge *cs, if (dest_lat->bottom_p ()) return false; + if (!param_type + || (!INTEGRAL_TYPE_P (param_type) + && !POINTER_TYPE_P (param_type))) + return dest_lat->set_to_bottom (); + if (jfunc->type == IPA_JF_PASS_THROUGH) { struct ipa_node_params *caller_info = IPA_NODE_REF (cs->caller); @@ -1865,6 +1872,7 @@ propagate_vr_accross_jump_function (cgraph_edge *cs, { if (TREE_OVERFLOW_P (val)) val = drop_tree_overflow (val); + val = fold_convert (param_type, val); jfunc->vr_known = true; jfunc->m_vr.type = VR_RANGE; jfunc->m_vr.min = val; @@ -2214,6 +2222,7 @@ propagate_constants_accross_call (struct cgraph_edge *cs) { struct ipa_jump_func *jump_func = ipa_get_ith_jump_func (args, i); struct ipcp_param_lattices *dest_plats; + tree param_type = ipa_get_callee_param_type (cs, i); dest_plats = ipa_get_parm_lattices (callee_info, i); if (availability == AVAIL_INTERPOSABLE) @@ -2230,7 +2239,8 @@ propagate_constants_accross_call (struct cgraph_edge *cs) dest_plats); if (opt_for_fn (callee->decl, flag_ipa_vrp)) ret |= propagate_vr_accross_jump_function (cs, - jump_func, dest_plats); + jump_func, dest_plats, + param_type); else ret |= dest_plats->m_value_range.set_to_bottom (); } |