From: Richard Biener <rguenther@suse.de>
To: gcc-patches@gcc.gnu.org
Cc: Jan Hubicka <hubicka@ucw.cz>
Subject: [PATCH] Fix PR66705
Date: Wed, 02 Sep 2015 12:59:00 -0000 [thread overview]
Message-ID: <alpine.LSU.2.11.1509021456160.5523@zhemvz.fhfr.qr> (raw)
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).
Thanks,
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)
@@ -5637,6 +5637,26 @@ check_for_overlaps (vec<fieldoff_s> fiel
return false;
}
+/* We can't use ctor_for_folding as that only returns constant constructors. */
+
+static tree
+ctor_for_analysis (tree decl)
+{
+ varpool_node *node = varpool_node::get (decl);
+ if (!node)
+ return error_mark_node;
+ node = node->ultimate_alias_target ();
+ if (DECL_INITIAL (node->decl) != error_mark_node
+ || !in_lto_p)
+ return (DECL_INITIAL (node->decl)
+ ? DECL_INITIAL (node->decl) : error_mark_node);
+ if (in_lto_p
+ && node->lto_file_data
+ && !node->body_removed)
+ return node->get_constructor ();
+ return error_mark_node;
+}
+
/* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
This will also create any varinfo structures necessary for fields
of DECL. */
@@ -5650,7 +5670,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))
@@ -5672,8 +5691,7 @@ create_variable_info_for_1 (tree decl, c
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 ()))
+ && ctor_for_analysis (decl) != error_mark_node))
{
fieldoff_s *fo = NULL;
bool notokay = false;
@@ -5805,13 +5823,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)
+ tree ctor = ctor_for_analysis (decl);
+ if (ctor != error_mark_node)
{
auto_vec<ce_s> rhsc;
struct constraint_expr lhs, *rhsp;
unsigned i;
- get_constraint_for_rhs (vnode->get_constructor (), &rhsc);
+ get_constraint_for_rhs (ctor, &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;)
+ ;
+}
next reply other threads:[~2015-09-02 12:59 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-02 12:59 Richard Biener [this message]
2015-09-02 13:03 ` Jan Hubicka
2015-09-02 13:32 ` Richard Biener
2015-09-02 13:45 ` Richard Biener
2015-09-02 14:23 ` Jan Hubicka
2015-09-02 14:31 ` Richard Biener
2015-09-03 8:54 ` Jan Hubicka
2015-09-02 14:25 ` Jan Hubicka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LSU.2.11.1509021456160.5523@zhemvz.fhfr.qr \
--to=rguenther@suse.de \
--cc=gcc-patches@gcc.gnu.org \
--cc=hubicka@ucw.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).