From patchwork Thu Aug 28 20:29:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Teresa Johnson X-Patchwork-Id: 384014 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id CBD38140120 for ; Fri, 29 Aug 2014 06:29:37 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; q= dns; s=default; b=CKVK6CKIU2eq7Fxh1vsVLRGSbveRaE/c+bppd7kthYNDSk 18PmIEcRDPEcPjIjkrjO5TdtvcIwh8WTHmTwxCXjw+jNt1iIfj4Yff4DJn+PjqPR /uPqME+T7gTUAu61Klk49okKzFuCtYZ1V5M+XM16eHd8qhE6FtIWeAiEjX95s= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; s= default; bh=O1SpIVx/T/VvIUvRG1tm1l5w4nQ=; b=NS20WK975+K1/fIXSkzG GF1/b+ZwVCq3aeFgJIOi7x8iXCxYuW7nJ16eYOmen50p7C4Lmq4jLMxfQFTIncSG mx27KJUVlWPxQrsrC00ppGCV00Q/ZOTJYTNgp4Za7PFfxJjZPqaIJOY3K3UXm0P0 MJfTPbY867s/pvoNk4f3b+4= Received: (qmail 26480 invoked by alias); 28 Aug 2014 20:29:31 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 26471 invoked by uid 89); 28 Aug 2014 20:29:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qg0-f41.google.com Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com) (209.85.192.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 28 Aug 2014 20:29:29 +0000 Received: by mail-qg0-f41.google.com with SMTP id i50so1347843qgf.14 for ; Thu, 28 Aug 2014 13:29:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=et7wIEd9p3QNhDvvayrw1Uhw7aw613cuadIUM41NvjE=; b=lYhDAEc07DVOeYFU6PgthOgMghlZhdPaBmxQ/aIFuCT2/DOT9pVuq5/8rZ4ZecuquI TD0aYg0v3QEF+xJsGJftf1YYAMFGhaCbCLkrU+8RELA5PC4KGpGpf1slhpoFdXYY43nY 7+UqRgNGFqITe6yfg/b6OgH84JALpB+gN8yjAz/cgZPyEFvZQlS123pMob8MZX965ZHT sFqffd60IQOYEPpfJ6pkCmTwd5ifZLbgWOsfklnb+t1mVXOhQJN5vff8p4GTKUcnpklX 65VChrwutKZW/PSm0vt8VXFZSUQLC27pnKmOS+ebmC/pDDd2Eed0HPL//JmH7GXModh4 veIA== X-Gm-Message-State: ALoCoQl78HdC0+Um1gT21aG7XLYa4VkiaWIr29dML9WhV+39bJe5VC/dM1FY4JTXj1fPHgakLTE1 MIME-Version: 1.0 X-Received: by 10.140.107.198 with SMTP id h64mr9830290qgf.42.1409257764614; Thu, 28 Aug 2014 13:29:24 -0700 (PDT) Received: by 10.229.126.201 with HTTP; Thu, 28 Aug 2014 13:29:24 -0700 (PDT) Date: Thu, 28 Aug 2014 13:29:24 -0700 Message-ID: Subject: [GOOGLE] Fixup varpool references after LIPO linking From: Teresa Johnson To: "gcc-patches@gcc.gnu.org" , David Li X-IsSubscribed: yes This patch fixes up varpool nodes after LIPO linking as we were doing for cgraph node references. While, here I made some fixes to the cgraph fixup as well (mark address taken as appropriate) and removed old references. The latter exposed an issue with resolved cgraph nodes getting eliminated when they were only referenced from vtables and the LIPO linking selected an external copy as the resolved node. Addressed this by forcing the LIPO linking to prefer the non-external copy. Passes regression testing, internal benchmark testing in progress. Ok for google/4_9 if that succeeds? Teresa 2014-08-28 Teresa Johnson Google ref b/17038802. * l-ipo.c (resolve_cgraph_node): Pick non-external node. (fixup_reference_list): Fixup varpool references, remove old references, mark cgraph nodes as address taken as needed. Index: l-ipo.c =================================================================== --- l-ipo.c (revision 213975) +++ l-ipo.c (working copy) @@ -1564,6 +1564,15 @@ resolve_cgraph_node (struct cgraph_sym **slot, str (*slot)->rep_decl = decl2; return; } + /* Similarly, pick the non-external symbol, since external + symbols may be eliminated by symtab_remove_unreachable_nodes + after ipa inlining (see process_references). */ + if (DECL_EXTERNAL (decl1) && !DECL_EXTERNAL (decl2)) + { + (*slot)->rep_node = node; + (*slot)->rep_decl = decl2; + return; + } has_prof1 = has_profile_info (decl1); bool is_aux1 = cgraph_is_auxiliary (decl1); @@ -2304,31 +2313,44 @@ fixup_reference_list (struct varpool_node *node) int i; struct ipa_ref *ref; struct ipa_ref_list *list = &node->ref_list; - vec new_refered; + vec new_refered; vec new_refered_type; - struct cgraph_node *c; + struct symtab_node *sym_node; enum ipa_ref_use use_type = IPA_REF_LOAD; new_refered.create (10); new_refered_type.create (10); for (i = 0; ipa_ref_list_reference_iterate (list, i, ref); i++) { - if (!is_a (ref->referred)) - continue; - - struct cgraph_node *cnode = ipa_ref_node (ref); - struct cgraph_node *r_cnode - = cgraph_lipo_get_resolved_node (cnode->decl); - if (r_cnode != cnode) + if (is_a (ref->referred)) { + struct cgraph_node *cnode = ipa_ref_node (ref); + struct cgraph_node *r_cnode + = cgraph_lipo_get_resolved_node (cnode->decl); new_refered.safe_push (r_cnode); use_type = ref->use; new_refered_type.safe_push ((int) use_type); + gcc_assert (use_type != IPA_REF_ADDR + || cnode->global.inlined_to + || cnode->address_taken); + if (use_type == IPA_REF_ADDR) + cgraph_mark_address_taken_node (r_cnode); } + else if (is_a (ref->referred)) + { + struct varpool_node *var = ipa_ref_varpool_node (ref); + struct varpool_node *r_var = real_varpool_node (var->decl); + new_refered.safe_push (r_var); + use_type = ref->use; + new_refered_type.safe_push ((int) use_type); + } + else + gcc_assert (false); } - for (i = 0; new_refered.iterate (i, &c); ++i) + ipa_remove_all_references (&node->ref_list); + for (i = 0; new_refered.iterate (i, &sym_node); ++i) { - ipa_record_reference (node, c, + ipa_record_reference (node, sym_node, (enum ipa_ref_use) new_refered_type[i], NULL); } }