Use get/set_ptr_nonnull in ipa-vrp
authorKugan Vivekanandarajah <kuganv@linaro.org>
Mon, 17 Oct 2016 23:37:57 +0000 (23:37 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Mon, 17 Oct 2016 23:37:57 +0000 (23:37 +0000)
Use get/set_ptr_nonnull in ipa-vrp
gcc/ChangeLog:

2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org>

* ipa-prop.c (ipa_compute_jump_functions_for_edge): Set value range
for pointer type too.
(ipcp_update_vr): set_ptr_nonnull for pointer.

gcc/testsuite/ChangeLog:

2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org>

* gcc.dg/ipa/vrp4.c: New test.

From-SVN: r241288

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

index 86f48345cbe1249d33b5b59d8c3be650fd20f595..1c6034685254d9845581fa0e61479a20e097bba0 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       * ipa-prop.c (ipa_compute_jump_functions_for_edge): Set value range
+       for pointer type too.
+       (ipcp_update_vr): set_ptr_nonnull for pointer.
+
 2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        * tree-ssa-alias.h (pt_solution_singleton_or_null_p): Renamed from
index a1d761900f162d259944dadf2eab5d608f7d83a4..353b63821a95384f0c9fcf7fa1e4fdf5f44bc669 100644 (file)
@@ -1668,7 +1668,22 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
            useful_context = true;
        }
 
-      if (!POINTER_TYPE_P (TREE_TYPE (arg)))
+      if (POINTER_TYPE_P (TREE_TYPE (arg)))
+       {
+         if (TREE_CODE (arg) == SSA_NAME
+             && param_type
+             && get_ptr_nonnull (arg))
+           {
+             jfunc->vr_known = true;
+             jfunc->m_vr.type = VR_ANTI_RANGE;
+             jfunc->m_vr.min = build_int_cst (TREE_TYPE (arg), 0);
+             jfunc->m_vr.max = build_int_cst (TREE_TYPE (arg), 0);
+             jfunc->m_vr.equiv = NULL;
+           }
+         else
+           gcc_assert (!jfunc->vr_known);
+       }
+      else
        {
          wide_int min, max;
          value_range_type type;
@@ -5602,27 +5617,37 @@ ipcp_update_vr (struct cgraph_node *node)
        continue;
 
       if (vr[i].known
-         && INTEGRAL_TYPE_P (TREE_TYPE (ddef))
-         && !POINTER_TYPE_P (TREE_TYPE (ddef))
          && (vr[i].type == VR_RANGE || vr[i].type == VR_ANTI_RANGE))
        {
          tree type = TREE_TYPE (ddef);
          unsigned prec = TYPE_PRECISION (type);
-         if (dump_file)
+         if (INTEGRAL_TYPE_P (TREE_TYPE (ddef)))
+           {
+             if (dump_file)
+               {
+                 fprintf (dump_file, "Setting value range of param %u ", i);
+                 fprintf (dump_file, "%s[",
+                          (vr[i].type == VR_ANTI_RANGE) ? "~" : "");
+                 print_decs (vr[i].min, dump_file);
+                 fprintf (dump_file, ", ");
+                 print_decs (vr[i].max, dump_file);
+                 fprintf (dump_file, "]\n");
+               }
+             set_range_info (ddef, vr[i].type,
+                             wide_int_storage::from (vr[i].min, prec,
+                                                     TYPE_SIGN (type)),
+                             wide_int_storage::from (vr[i].max, prec,
+                                                     TYPE_SIGN (type)));
+           }
+         else if (POINTER_TYPE_P (TREE_TYPE (ddef))
+                  && vr[i].type == VR_ANTI_RANGE
+                  && wi::eq_p (vr[i].min, 0)
+                  && wi::eq_p (vr[i].max, 0))
            {
-             fprintf (dump_file, "Setting value range of param %u ", i);
-             fprintf (dump_file, "%s[",
-                      (vr[i].type == VR_ANTI_RANGE) ? "~" : "");
-             print_decs (vr[i].min, dump_file);
-             fprintf (dump_file, ", ");
-             print_decs (vr[i].max, dump_file);
-             fprintf (dump_file, "]\n");
+             if (dump_file)
+               fprintf (dump_file, "Setting nonnull for %u\n", i);
+             set_ptr_nonnull (ddef);
            }
-         set_range_info (ddef, vr[i].type,
-                         wide_int_storage::from (vr[i].min, prec,
-                                                 TYPE_SIGN (type)),
-                         wide_int_storage::from (vr[i].max, prec,
-                                                 TYPE_SIGN (type)));
        }
     }
 }
index d59844272cec6e612a6e94326a958a921866f815..94048db18e5790ff89b770e533f170b2cadac9d2 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       * gcc.dg/ipa/vrp4.c: New test.
+
 2016-10-18  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        * gcc.dg/torture/pr39074-2.c: Adjust testcase.
diff --git a/gcc/testsuite/gcc.dg/ipa/vrp4.c b/gcc/testsuite/gcc.dg/ipa/vrp4.c
new file mode 100644 (file)
index 0000000..d7e1f26
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-cp-details" } */
+
+static __attribute__((noinline, noclone))
+int foo (int *p)
+{
+  if (!p)
+    return 0;
+  *p = 1;
+}
+
+struct st
+{
+  int a;
+  int b;
+};
+
+int bar (struct st *s)
+{
+
+  if (!s)
+    return 0;
+  foo (&s->a);
+  foo (&s->b);
+}
+
+/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */