> 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 <kugan.vivekanandara...@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-12 Kugan Vivekanandarajah <kugan.vivekanandara...@linaro.org> > > * 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 <kugan.vivekanandara...@linaro.org> > 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 0000000..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 (&s->a); > + foo (&s->b); > +} > + > +/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */ > -- > 2.7.4 >