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=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,99a6311c4195e21b X-Google-Attributes: gid103376,public From: Gautier Subject: Re: Matrix Multiplication Date: 1999/12/15 Message-ID: <385811F7.F3FFEB06@maths.unine.ch>#1/1 X-Deja-AN: 561139446 Content-Transfer-Encoding: 7bit References: <385699B5.59C14D03@lmco.com> <3856C9A1.F89EFD8@maths.unine.ch> <5l1f5s4kck891a2s6o8bhvkirm4q79hm6c@4ax.com> <3857B51F.4B1E0F1E@maths.unine.ch> <3857D640.C1991F0C@quadruscorp.com> X-Accept-Language: en Content-Type: text/plain; charset=us-ascii MIME-Version: 1.0 Newsgroups: comp.lang.ada Date: 1999-12-15T00:00:00+00:00 List-Id: > It would seem that if the compiler were smart, it would compute I and J > once and find the position once, then reuse it throughout the loop. GNAT does reuse adresses. A bright proof in c.l.a (by Samuel Tardieu): << [a(b(c,d+e(f,g)).h(i,j)) := a(b(c,d+e(f,g)).h(i,j)) + 1;] Where did you get the impression that the optimizer would miss this? For example, using GNAT, the following expression generates: (ix86 code) t__pXb: movl t__jXb,%edx | decl %edx | movl t__iXb,%eax | decl %eax | leal (%eax,%eax,4),%eax | sall $3,%eax | leal (%eax,%edx,4),%edx | movl t__gXb,%ecx | decl %ecx | Address computation movl t__fXb,%eax | decl %eax | leal (%eax,%eax,4),%eax | sall $3,%eax | movl t__eXb(%eax,%ecx,4),%eax | addl t__dXb,%eax | imull $400,%eax,%eax | leal -400(%edx,%eax),%eax | imull $4000,t__cXb,%edx | movl t__bXb-4000(%eax,%edx),%eax | decl %eax | incl t__aXb(,%eax,4) <--- Increment done here! ret The code used to generate this was: (-O3 -fomit-frame-pointer -gnatp) package T is pragma Elaborate_Body; end T; package body T is pragma Warnings (Off); -- Uninitialized variables type Two_Ints is array (Integer range <>, Integer range <>) of Integer; type Rec is record H : Two_Ints (1 .. 10, 1 .. 10); end record; type Two_Recs is array (Integer range <>, Integer range <>) of Rec; A : array (1 .. 10) of Integer; B : Two_Recs (1 .. 10, 1 .. 10); C : Integer; D : Integer; E : Two_Ints (1 .. 10, 1 .. 10); F : Integer; G : Integer; I : Integer; J : Integer; procedure P is begin a(b(c,d+e(f,g)).h(i,j)) := a(b(c,d+e(f,g)).h(i,j)) + 1; end P; end T; >> But there are *rare* cases where such "invariants" are not provable as such, and a renames helps, even with GNAT. On the other side, some Ada 83 compilers do not seem to optimize these things (Compaq Ada, Alsys). -- Gautier _____\\________________\_______\_________ http://members.xoom.com/gdemont/gsoft.htm