Re: [ipa-vrp] Use get/set_ptr_nonnull in ipa-vrp

2016-10-13 Thread kugan

Hi Honza,

On 12/10/16 22:16, Jan Hubicka wrote:

Hi,

This patch uses the get/set_ptr_nonnull so that ipa-vrp also
propagates nonnull ranges for pinter.

Bootstrapped and regression tested this with other patched without
any new regressions on x86_64-linux-gnu.

Is this OK for trunk?

Thanks,
Kugan




gcc/ChangeLog:

2016-10-12  Kugan Vivekanandarajah  

* 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-12  Kugan Vivekanandarajah  

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

OK, thank you!
We should be able to derive a lot of (useful) non-null information from the
fact that the pointers are dereferenced either prior the function call or in a
statement that postdominate the function entry.
I will try with spec2k/2006. Do you have any specific benchmark in mind 
that I can try first?


  I guess we could also give (semi)

useful -Wmissing-attribute=nonnull hints in that case.


I will send a follow up patch for this.

Thanks,
Kugan


Honza



Re: [ipa-vrp] Use get/set_ptr_nonnull in ipa-vrp

2016-10-12 Thread Jan Hubicka
> Hi,
> 
> This patch uses the get/set_ptr_nonnull so that ipa-vrp also
> propagates nonnull ranges for pinter.
> 
> Bootstrapped and regression tested this with other patched without
> any new regressions on x86_64-linux-gnu.
> 
> Is this OK for trunk?
> 
> Thanks,
> Kugan
> 
> 
> 
> 
> gcc/ChangeLog:
> 
> 2016-10-12  Kugan Vivekanandarajah  
> 
>   * 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-12  Kugan Vivekanandarajah  
> 
>   * gcc.dg/ipa/vrp4.c: New test.
OK, thank you!
We should be able to derive a lot of (useful) non-null information from the
fact that the pointers are dereferenced either prior the function call or in a
statement that postdominate the function entry.  I guess we could also give 
(semi)
useful -Wmissing-attribute=nonnull hints in that case.

Honza

> 

> >From f773226855968cc652fa6f2b2d9c70d2a5d7acdb Mon Sep 17 00:00:00 2001
> From: Kugan Vivekanandarajah 
> Date: Wed, 12 Oct 2016 13:54:34 +1100
> Subject: [PATCH 2/3] Set-nonnull-range-for-pointer-type
> 
> ---
>  gcc/ipa-prop.c  | 57 
> +
>  gcc/testsuite/gcc.dg/ipa/vrp4.c | 27 +++
>  2 files changed, 68 insertions(+), 16 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/ipa/vrp4.c
> 
> diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
> index a1d7619..353b638 100644
> --- a/gcc/ipa-prop.c
> +++ b/gcc/ipa-prop.c
> @@ -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)));
>   }
>  }
>  }
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp4.c b/gcc/testsuite/gcc.dg/ipa/vrp4.c
> new file mode 100644
> index 000..d7e1f26
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp4.c
> @@ -0,0 +1,27 @@
> +/* 

[ipa-vrp] Use get/set_ptr_nonnull in ipa-vrp

2016-10-12 Thread kugan

Hi,

This patch uses the get/set_ptr_nonnull so that ipa-vrp also propagates 
nonnull ranges for pinter.


Bootstrapped and regression tested this with other patched without any 
new regressions on x86_64-linux-gnu.


Is this OK for trunk?

Thanks,
Kugan




gcc/ChangeLog:

2016-10-12  Kugan Vivekanandarajah  

* 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-12  Kugan Vivekanandarajah  

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

>From f773226855968cc652fa6f2b2d9c70d2a5d7acdb Mon Sep 17 00:00:00 2001
From: Kugan Vivekanandarajah 
Date: Wed, 12 Oct 2016 13:54:34 +1100
Subject: [PATCH 2/3] Set-nonnull-range-for-pointer-type

---
 gcc/ipa-prop.c  | 57 +
 gcc/testsuite/gcc.dg/ipa/vrp4.c | 27 +++
 2 files changed, 68 insertions(+), 16 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/ipa/vrp4.c

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index a1d7619..353b638 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -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)));
 	}
 }
 }
diff --git a/gcc/testsuite/gcc.dg/ipa/vrp4.c b/gcc/testsuite/gcc.dg/ipa/vrp4.c
new file mode 100644
index 000..d7e1f26
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/vrp4.c
@@ -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 (>a);
+  foo (>b);
+}
+
+/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */
-- 
2.7.4