From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 63073 invoked by alias); 2 Sep 2015 12:59:26 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 63058 invoked by uid 89); 2 Sep 2015 12:59:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL,BAYES_00,KAM_ASCII_DIVIDERS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Wed, 02 Sep 2015 12:59:24 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 0ADB9ACB2; Wed, 2 Sep 2015 12:59:21 +0000 (UTC) Date: Wed, 02 Sep 2015 12:59:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org cc: Jan Hubicka Subject: [PATCH] Fix PR66705 Message-ID: User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2015-09/txt/msg00146.txt.bz2 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 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 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 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 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;) + ; +}