From: Georg Bauhaus <rm.dash-bauhaus@futureapps.de>
Subject: Re: GNAT (GCC) Profile Guided Compilation
Date: Wed, 18 Jul 2012 12:01:11 +0200
Date: 2012-07-18T12:01:11+02:00 [thread overview]
Message-ID: <50068967$0$9507$9b4e6d93@newsspool1.arcor-online.net> (raw)
In-Reply-To: <505460ad-495d-41b4-a88f-e95eb99a6be3@googlegroups.com>
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;
next prev parent reply other threads:[~2012-07-24 3:15 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 [this message]
2012-07-18 17:36 ` Keean Schupke
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