From patchwork Tue Nov 9 17:23:40 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Jambor X-Patchwork-Id: 70564 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]) by ozlabs.org (Postfix) with SMTP id 40445B6F07 for ; Wed, 10 Nov 2010 04:23:58 +1100 (EST) Received: (qmail 32426 invoked by alias); 9 Nov 2010 17:23:50 -0000 Received: (qmail 32414 invoked by uid 22791); 9 Nov 2010 17:23:48 -0000 X-SWARE-Spam-Status: No, hits=-3.7 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 09 Nov 2010 17:23:43 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id D251279727 for ; Tue, 9 Nov 2010 18:23:40 +0100 (CET) Date: Tue, 9 Nov 2010 18:23:40 +0100 From: Martin Jambor To: GCC Patches Subject: [PATCH, PR 46351] Do not SRA types with aggregate bit-fields Message-ID: <20101109172340.GA16780@virgil.arch.suse.de> Mail-Followup-To: GCC Patches MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) X-IsSubscribed: yes 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 Hi, our current way of dealing with bit fields cannot possibly handle aggregate ones, so this patch removes variables which contain them from the SRA candidates. Bootstrapped and tested on x86-64-linux. The c94008d acats test failed with it so I am going to re-test to figure out whether it is one of those spurious acats failures or not. OK if it passes? Thanks, Martin 2010-11-09 Martin Jambor PR tree-optimization/46351 PR tree-optimization/46377 * tree-sra.c (type_internals_preclude_sra_p): Disqualify types with aggregate bit-fields. * testsuite/gnat.dg/opt10.adb: New file. * testsuite/gnat.dg/opt10_pkg.ads: Likewise. * testsuite/gnat.dg/opt11.adb: Likewise. * testsuite/gnat.dg/opt11.ads: Likewise. Index: mine/gcc/tree-sra.c =================================================================== --- mine.orig/gcc/tree-sra.c +++ mine/gcc/tree-sra.c @@ -653,7 +653,8 @@ type_internals_preclude_sra_p (tree type if (TREE_THIS_VOLATILE (fld) || !DECL_FIELD_OFFSET (fld) || !DECL_SIZE (fld) || !host_integerp (DECL_FIELD_OFFSET (fld), 1) - || !host_integerp (DECL_SIZE (fld), 1)) + || !host_integerp (DECL_SIZE (fld), 1) + || (DECL_BIT_FIELD (fld) && AGGREGATE_TYPE_P (ft))) return true; if (AGGREGATE_TYPE_P (ft) Index: mine/gcc/testsuite/gnat.dg/opt10.adb =================================================================== --- /dev/null +++ mine/gcc/testsuite/gnat.dg/opt10.adb @@ -0,0 +1,26 @@ +-- { dg-do compile } +-- { dg-options "-O2 } + +with Opt10_Pkg; use Opt10_Pkg; + +procedure Opt10 is + + procedure Compare_Rep_Data (MA, MB : Rep_Message) is + begin + if MA.Data /= MB.Data then + raise Program_Error; + end if; + end; + + procedure Check_Rep_For (Bit : Boolean) is + MA, MB : Rep_Message; + begin + Safe_Assign (MA, Bit); + Safe_Assign (MB, Bit); + Compare_Rep_Data (MA, MB); + end; + +begin + Check_Rep_For (Bit => False); +end; + Index: mine/gcc/testsuite/gnat.dg/opt10_pkg.ads =================================================================== --- /dev/null +++ mine/gcc/testsuite/gnat.dg/opt10_pkg.ads @@ -0,0 +1,14 @@ +package Opt10_Pkg is + + type Rep_Message is record + Bit : Boolean; + Data : String (1 .. 4); + end record; + for Rep_Message use record + Bit at 0 range 0 .. 0; + Data at 0 range 1 .. 32; + end record; + + procedure Safe_Assign (M : in out Rep_Message; Bit : Boolean); + +end; Index: mine/gcc/testsuite/gnat.dg/opt11.adb =================================================================== --- /dev/null +++ mine/gcc/testsuite/gnat.dg/opt11.adb @@ -0,0 +1,12 @@ +-- { dg-compile } +-- { dg-options "-O" } + +package body Opt11 is + + procedure Proc is + R : Rec; + begin + R := (others => <>); + end; + +end Opt11; Index: mine/gcc/testsuite/gnat.dg/opt11.ads =================================================================== --- /dev/null +++ mine/gcc/testsuite/gnat.dg/opt11.ads @@ -0,0 +1,17 @@ +package Opt11 is + + type String_Ptr is access constant String; + + type Form_Type is (Qualified, Unqualified); + + type Rec is record + N1, N2, N3 : Natural; + Fixed : String_Ptr; + Form : Form_Type; + Is_Local : Boolean := True; + end record; + pragma Pack (Rec); + + procedure Proc; + +end Opt11;