Fix ice in set_value_range
authorKugan Vivekanandarajah <kuganv@linaro.org>
Wed, 9 Nov 2016 01:41:26 +0000 (01:41 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Wed, 9 Nov 2016 01:41:26 +0000 (01:41 +0000)
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

gcc/ChangeLog
gcc/ipa-cp.c
gcc/ipa-prop.c
gcc/ipa-prop.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr78121.c [new file with mode: 0644]

index e175a60..0ae292f 100644 (file)
@@ -1,3 +1,12 @@
+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.
+
 2016-11-09  Maxim Ostapenko  <m.ostapenko@samsung.com>
 
        * asan.h (asan_intercepted_p): Handle BUILT_IN_STRCSPN,
index 527ff27..79e621a 100644 (file)
@@ -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 ();
        }
index 1629870..74fe199 100644 (file)
@@ -1595,7 +1595,10 @@ determine_locally_known_aggregate_parts (gcall *call, tree arg,
     }
 }
 
-static tree
+/* Return the Ith param type of callee associated with call graph
+   edge E.  */
+
+tree
 ipa_get_callee_param_type (struct cgraph_edge *e, int i)
 {
   int n;
index 4eeae88..0e75cf4 100644 (file)
@@ -818,6 +818,7 @@ ipa_parm_adjustment *ipa_get_adjustment_candidate (tree **, bool *,
                                                   ipa_parm_adjustment_vec,
                                                   bool);
 void ipa_release_body_info (struct ipa_func_body_info *);
+tree ipa_get_callee_param_type (struct cgraph_edge *e, int i);
 
 /* From tree-sra.c:  */
 tree build_ref_for_offset (location_t, tree, HOST_WIDE_INT, bool, tree,
index d262186..4f8042e 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-09  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR ipa/78121
+       * gcc.dg/ipa/pr78121.c: New test.
+
 2016-11-09  Maxim Ostapenko  <m.ostapenko@samsung.com>
 
        * c-c++-common/asan/default_options.h: New file.
diff --git a/gcc/testsuite/gcc.dg/ipa/pr78121.c b/gcc/testsuite/gcc.dg/ipa/pr78121.c
new file mode 100644 (file)
index 0000000..4a0ae18
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR ipa/78121 */
+/* { dg-do compile } */
+/* { dg-options "-ansi -O2 -fdump-ipa-cp-details" } */
+
+void fn2 (unsigned char c);
+int a;
+static void fn1(c) unsigned char c;
+{
+    if (a)
+          fn2 (c);
+      fn1('#');
+}
+
+void fn3() { fn1 (267); }
+
+/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\\[11, 35\\\]" 1 "cp" } } */