From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=BAYES_00,FORGED_MUA_MOZILLA autolearn=no autolearn_force=no version=3.4.4 X-Google-Thread: a07f3367d7,103803355c3db607 X-Google-Attributes: gida07f3367d7,public,usenet X-Google-NewGroupId: yes X-Google-Language: ENGLISH,ASCII-7-bit Received: by 10.180.96.42 with SMTP id dp10mr251154wib.2.1343099747271; Mon, 23 Jul 2012 20:15:47 -0700 (PDT) Path: ge7ni52754794wib.0!nntp.google.com!volia.net!news2.volia.net!feed-A.news.volia.net!npeer.de.kpn-eurorings.net!npeer-ng0.de.kpn-eurorings.net!xlned.com!feeder5.xlned.com!feed.xsnews.nl!border-3.ams.xsnews.nl!border4.nntp.ams.giganews.com!border2.nntp.ams.giganews.com!nntp.giganews.com!news.nobody.at!diablo1.news.osn.de!news.osn.de!diablo2.news.osn.de!217.188.199.168.MISMATCH!takemy.news.telefonica.de!telefonica.de!newsfeed.arcor.de!newsspool2.arcor-online.net!news.arcor.de.POSTED!not-for-mail Date: Wed, 18 Jul 2012 12:01:11 +0200 From: Georg Bauhaus User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:14.0) Gecko/20120713 Thunderbird/14.0 MIME-Version: 1.0 Newsgroups: comp.lang.ada Subject: Re: GNAT (GCC) Profile Guided Compilation References: <982d531a-3972-4971-b802-c7e7778b8649@googlegroups.com> <520bdc39-6004-4142-a227-facf14ebb0e8@googlegroups.com> <4ff08cb2$0$6575$9b4e6d93@newsspool3.arcor-online.net> <4ff1d731$0$6582$9b4e6d93@newsspool3.arcor-online.net> <4ff41d38$0$6577$9b4e6d93@newsspool3.arcor-online.net> <26b778c4-5abc-4fbf-94b0-888c2ce71831@googlegroups.com> <4ff43956$0$6576$9b4e6d93@newsspool3.arcor-online.net> <2dba1140-4f28-4fb8-ace4-2c10f3a02313@googlegroups.com> <505460ad-495d-41b4-a88f-e95eb99a6be3@googlegroups.com> In-Reply-To: <505460ad-495d-41b4-a88f-e95eb99a6be3@googlegroups.com> Message-ID: <50068967$0$9507$9b4e6d93@newsspool1.arcor-online.net> Organization: Arcor NNTP-Posting-Date: 18 Jul 2012 12:01:11 CEST NNTP-Posting-Host: e3fc723c.newsspool1.arcor-online.net X-Trace: DXC=CcC2B756GU`9kIfcjg:0fdic==]BZ:afn4Fo<]lROoRankgeX?EC@@`[A^MO;>XjJgnc\616M64>jLh>_cHTX3jm@M^DoXR9NPi X-Complaints-To: usenet-abuse@arcor.de Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Date: 2012-07-18T12:01:11+02:00 List-Id: On 15.07.12 10:27, Keean Schupke wrote: > function F(N : Node, V : Value) return Boolean is begin ( > return (N.Enum = Const) or else ((N.Enum = V) = (N.Number = 0)); > ) > > B : constant Boolean = F(N1, V) > and then F(N2, V) > and then F(N3, V) > and then F(N4, V); > FWIW, I have two observations after playing with the above function: Using different ways of supplying the variables to F and to functions like it, two things seemed to have noticeable influence: 1) making the Node record limited (good) 2) supplying the values, not the record, to F (possibly good) The results have varied a lot with everything (CPU, compiler, switches, ...), and I haven't checked the indirections for correctness; in any case, plain F (record components) did well. with System; package News_23.Choice is function F (N : Node; V : Value) return Boolean; function FA (N : Node; V : Value) return Boolean; function FP1 (p : System.Address; V : Value) return Boolean; function FP2 (p : System.Address; V : Value) return Boolean; function FP3 (p : System.Address; V : Value) return Boolean; function F_3_Args (Enum : Value; Number : Numeric; V : Value) return Boolean; private Const : constant Value := Two; end News_23.choice; with System.Address_To_Access_Conversions, System.Storage_Elements; with Ada.Unchecked_Conversion; package body News_23.Choice is use System.Storage_Elements; Enum_Offset : constant := 4 * Storage_Element'Size; Number_Offset : constant := 8 * Storage_Element'Size; function F(N : Node; V : Value) return Boolean is begin return (N.Enum = Const) or else ((N.Enum = V) = (N.Number = 0)); end; package Value_P is new System.Address_To_Access_Conversions (Object => Value); package Numeric_P is new System.Address_To_Access_Conversions (Object => Numeric); function FA(N : Node; V : Value) return Boolean is begin declare -- Enm : Value_P.Object_Pointer renames Value_P.To_Pointer (N'Address + N.Enum'Position); -- Num : Numeric_P.Object_Pointer renames Numeric_P.To_Pointer (N'Address + N.Number'Position); Enm : Value_P.Object_Pointer renames Value_P.To_Pointer (N'Address + Enum_Offset); Num : Numeric_P.Object_Pointer renames Numeric_P.To_Pointer (N'Address + Number_Offset); begin return (Enm.all = Const) or else ((Enm.all = V) = (Num.all = 0)); end; end FA; function FP1 (P : System.Address; V : Value) return Boolean is Enm : Value; pragma Import (Ada, Enm); for Enm'Address use P + Enum_Offset; Num : Numeric; pragma Import (Ada, Num); for Num'Address use P + Number_Offset; begin pragma Inspection_Point (P); return (Enm = Const) or else ((Enm = V) = (Num = 0)); end FP1; function FP2 (P : System.Address; V : Value) return Boolean is Enm : Value; pragma Import (Ada, Enm); for Enm'Address use To_Address (To_Integer (P) + Enum_Offset); Num : Numeric; pragma Import (Ada, Num); for Num'Address use To_Address (To_Integer (P) + Number_Offset); begin pragma Inspection_Point (P); return (Enm = Const) or else ((Enm = V) = (Num = 0)); end FP2; type Adr is mod 2**Standard'Address_Size; function To_N is new Ada.Unchecked_Conversion (System.Address, Adr); function To_Adr is new Ada.Unchecked_Conversion (Adr, System.Address); function FP3 (P : System.Address; V : Value) return Boolean is Enm : Value; pragma Import (Ada, Enm); for Enm'Address use To_Adr (To_N (P) + Enum_Offset); Num : Numeric; pragma Import (Ada, Num); for Num'Address use To_Adr (To_N (P) + Number_Offset); begin pragma Inspection_Point (P); return (Enm = Const) or else ((Enm = V) = (Num = 0)); end FP3; function F_3_Args(Enum : Value; Number : Numeric ; V : Value) return Boolean is begin return (Enum = Const) or else ((Enum = V) = (Number = 0)); end F_3_Args; end News_23.Choice;