This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR66705
- From: Richard Biener <rguenther at suse dot de>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 2 Sep 2015 15:45:35 +0200 (CEST)
- Subject: Re: [PATCH] Fix PR66705
- Authentication-results: sourceware.org; auth=none
- References: <alpine dot LSU dot 2 dot 11 dot 1509021456160 dot 5523 at zhemvz dot fhfr dot qr> <20150902130338 dot GA96189 at kam dot mff dot cuni dot cz> <alpine dot LSU dot 2 dot 11 dot 1509021526310 dot 5523 at zhemvz dot fhfr dot qr>
On Wed, 2 Sep 2015, Richard Biener wrote:
> On Wed, 2 Sep 2015, Jan Hubicka wrote:
>
> > >
> > > I was naiively using ->get_constructor in IPA PTA without proper
> > > checking on wheter that succeeds. Now I tried to use ctor_for_folding
> > > but that isn't good as we want to analyze non-const globals in IPA
> > > PTA and we need to analyze their initialiers as well.
> > >
> > > Thus I'm trying below with ctor_for_analysis, but I really "just"
> > > need the initializer or a "not available" for conservative handling.
> > >
> > > Bootstrapped and tested on x86_64-unknown-linux-gnu.
> > >
> > > Honza - I suppose you should doble-check this and suggest sth
> > > different (or implement sth more generic in the IPA infrastructure).
> >
> > Yep, you are correct that we don't currently have way to look into ctor
> > without actually loading. But do you need something more than just walking
> > references that you already have in ipa-ref lists?
>
> Hmm, no, ipa-ref list should be enough (unless we start field-sensitive
> analysis or need NULL inits for correctness). Still have to figure out
> how to walk the list and how the reference would look like (what
> is ref->use? IPA_REF_ADDR? can those be speculative?)
Sth like the following seems to work.
Richard.
2015-09-02 Richard Biener <rguenther@suse.de>
PR ipa/66705
* tree-ssa-structalias.c (ctor_for_analysis): New function.
(create_variable_info_for_1): Use ctor_for_analysis instead
of get_constructor.
(create_variable_info_for): Likewise.
* g++.dg/lto/pr66705_0.C: New testcase.
Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c (revision 227207)
+++ gcc/tree-ssa-structalias.c (working copy)
@@ -5650,7 +5650,6 @@ create_variable_info_for_1 (tree decl, c
auto_vec<fieldoff_s> fieldstack;
fieldoff_s *fo;
unsigned int i;
- varpool_node *vnode;
if (!declsize
|| !tree_fits_uhwi_p (declsize))
@@ -5668,12 +5667,10 @@ create_variable_info_for_1 (tree decl, c
/* Collect field information. */
if (use_field_sensitive
&& var_can_have_subvars (decl)
- /* ??? Force us to not use subfields for global initializers
- in IPA mode. Else we'd have to parse arbitrary initializers. */
+ /* ??? Force us to not use subfields for globals in IPA mode.
+ Else we'd have to parse arbitrary initializers. */
&& !(in_ipa_mode
- && is_global_var (decl)
- && (vnode = varpool_node::get (decl))
- && vnode->get_constructor ()))
+ && is_global_var (decl)))
{
fieldoff_s *fo = NULL;
bool notokay = false;
@@ -5805,13 +5802,13 @@ create_variable_info_for (tree decl, con
/* If this is a global variable with an initializer and we are in
IPA mode generate constraints for it. */
- if (vnode->get_constructor ()
- && vnode->definition)
+ ipa_ref *ref;
+ for (unsigned idx = 0; vnode->iterate_reference (idx, ref); ++idx)
{
auto_vec<ce_s> rhsc;
struct constraint_expr lhs, *rhsp;
unsigned i;
- get_constraint_for_rhs (vnode->get_constructor (), &rhsc);
+ get_constraint_for_address_of (ref->referred->decl, &rhsc);
lhs.var = vi->id;
lhs.offset = 0;
lhs.type = SCALAR;
Index: gcc/testsuite/g++.dg/lto/pr66705_0.C
===================================================================
--- gcc/testsuite/g++.dg/lto/pr66705_0.C (revision 0)
+++ gcc/testsuite/g++.dg/lto/pr66705_0.C (working copy)
@@ -0,0 +1,15 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -O2 -flto -flto-partition=max -fipa-pta } } }
+// { dg-extra-ld-options "-r -nostdlib" }
+
+class A {
+public:
+ A();
+};
+int a = 0;
+void foo() {
+ a = 0;
+ A b;
+ for (; a;)
+ ;
+}