From: Keean Schupke <keean.schupke@googlemail.com>
Subject: Re: GNAT (GCC) Profile Guided Compilation
Date: Wed, 18 Jul 2012 10:36:00 -0700 (PDT)
Date: 2012-07-18T10:36:00-07:00 [thread overview]
Message-ID: <b2c3f20c-3d66-4558-9ddf-13a826f25283@googlegroups.com> (raw)
In-Reply-To: <50068967$0$9507$9b4e6d93@newsspool1.arcor-online.net>
On Wednesday, 18 July 2012 11:01:11 UTC+1, Georg Bauhaus wrote:
> 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;
I think if you use -O3 -gnatn (and pragma Inline(X)) the function will be inlined. Does it still make a difference then?
Cheers,
Keean.
next prev parent reply other threads:[~2012-07-26 0:24 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-29 9:17 GNAT (GCC) Profile Guided Compilation Keean Schupke
2012-06-29 9:34 ` Dmitry A. Kazakov
2012-06-29 10:01 ` Keean Schupke
2012-06-29 10:24 ` Keean Schupke
2012-06-29 12:26 ` stefan-lucks
2012-06-29 12:51 ` Keean Schupke
2012-06-29 12:05 ` Dmitry A. Kazakov
2012-06-29 10:48 ` Simon Wright
2012-06-29 11:14 ` Keean Schupke
2012-06-29 12:39 ` gautier_niouzes
2012-06-29 12:52 ` Keean Schupke
2012-06-29 14:14 ` gautier_niouzes
2012-06-29 15:05 ` gautier_niouzes
2012-06-29 17:03 ` Keean Schupke
2012-07-01 9:29 ` Georg Bauhaus
2012-07-01 17:45 ` Georg Bauhaus
2012-07-01 22:57 ` Keean Schupke
2012-07-02 17:15 ` Georg Bauhaus
2012-07-02 17:26 ` Keean Schupke
2012-07-02 23:48 ` Keean Schupke
2012-07-04 10:38 ` Georg Bauhaus
2012-07-04 10:57 ` Keean Schupke
2012-07-04 12:36 ` Mark Lorenzen
2012-07-04 12:38 ` Georg Bauhaus
2012-07-14 20:17 ` Keean Schupke
2012-07-14 20:33 ` Keean Schupke
2012-07-14 20:43 ` Niklas Holsti
2012-07-14 22:32 ` Keean Schupke
2012-07-14 23:40 ` Keean Schupke
2012-07-15 7:15 ` Niklas Holsti
2012-07-15 8:27 ` Keean Schupke
2012-07-18 10:01 ` Georg Bauhaus
2012-07-18 17:36 ` Keean Schupke [this message]
2012-07-19 5:42 ` Georg Bauhaus
2012-07-19 10:18 ` Keean Schupke
2012-07-15 11:02 ` Niklas Holsti
2012-07-15 12:48 ` Keean Schupke
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox