public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/29648]  New: Inline
@ 2006-10-30 11:42 P dot Schaffnit at access dot rwth-aachen dot de
  2006-10-31  5:34 ` [Bug fortran/29648] Inlining only done for contained procedures pault at gcc dot gnu dot org
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: P dot Schaffnit at access dot rwth-aachen dot de @ 2006-10-30 11:42 UTC (permalink / raw)
  To: gcc-bugs

As can be found at http://gcc.gnu.org/ml/fortran/2005-07/msg00286.html

GFortran doesn't do inlining: unfortunately I cannot do it, and I don't know
how hard this would be, but this would certainly help a lot with several codes
I know...


-- 
           Summary: Inline
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: P dot Schaffnit at access dot rwth-aachen dot de


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
@ 2006-10-31  5:34 ` pault at gcc dot gnu dot org
  2006-10-31  9:13 ` P dot Schaffnit at access dot rwth-aachen dot de
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pault at gcc dot gnu dot org @ 2006-10-31  5:34 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from pault at gcc dot gnu dot org  2006-10-31 05:34 -------
As the link says, inlining is implemented for contained procedures.  I have
changed the summary to reflect this.


-- 

pault at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2006-10-31 05:34:33
               date|                            |
            Summary|Inline                      |Inlining only done for
                   |                            |contained procedures


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
  2006-10-31  5:34 ` [Bug fortran/29648] Inlining only done for contained procedures pault at gcc dot gnu dot org
@ 2006-10-31  9:13 ` P dot Schaffnit at access dot rwth-aachen dot de
  2006-11-06 20:29 ` pinskia at gcc dot gnu dot org
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: P dot Schaffnit at access dot rwth-aachen dot de @ 2006-10-31  9:13 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #2 from P dot Schaffnit at access dot rwth-aachen dot de  2006-10-31 09:13 -------

Right!

Thanks!


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
  2006-10-31  5:34 ` [Bug fortran/29648] Inlining only done for contained procedures pault at gcc dot gnu dot org
  2006-10-31  9:13 ` P dot Schaffnit at access dot rwth-aachen dot de
@ 2006-11-06 20:29 ` pinskia at gcc dot gnu dot org
  2006-11-07  9:34 ` P dot Schaffnit at access dot rwth-aachen dot de
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2006-11-06 20:29 UTC (permalink / raw)
  To: gcc-bugs



-- 

pinskia at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pinskia at gcc dot gnu dot
                   |                            |org
           Severity|normal                      |minor
           Keywords|                            |missed-optimization


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
                   ` (2 preceding siblings ...)
  2006-11-06 20:29 ` pinskia at gcc dot gnu dot org
@ 2006-11-07  9:34 ` P dot Schaffnit at access dot rwth-aachen dot de
  2007-12-01  2:24 ` bdavis at gcc dot gnu dot org
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: P dot Schaffnit at access dot rwth-aachen dot de @ 2006-11-07  9:34 UTC (permalink / raw)
  To: gcc-bugs



-- 

P dot Schaffnit at access dot rwth-aachen dot de changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|minor                       |enhancement


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
                   ` (3 preceding siblings ...)
  2006-11-07  9:34 ` P dot Schaffnit at access dot rwth-aachen dot de
@ 2007-12-01  2:24 ` bdavis at gcc dot gnu dot org
  2007-12-03  7:45 ` dominiq at lps dot ens dot fr
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: bdavis at gcc dot gnu dot org @ 2007-12-01  2:24 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #3 from bdavis at gcc dot gnu dot org  2007-12-01 02:24 -------
in case someone does not know what a contained procedure is (i sure didn't
without getting out the Metcalf and Reid book), below is an example:

       program fred
       integer j
       j = 0
       call a(j)
       print*,j
       contains
       subroutine a(i)
       integer i
       i = i +2
       end subroutine a
       end program fred

compile it with no optimization and look at the assembler code, then compile it
with -O2, the subroutine is inlined by gfortran.

not really relevant to this PR, but something I learned and verified, which
might be of use.

--bud


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
                   ` (4 preceding siblings ...)
  2007-12-01  2:24 ` bdavis at gcc dot gnu dot org
@ 2007-12-03  7:45 ` dominiq at lps dot ens dot fr
  2007-12-03 10:13 ` steven at gcc dot gnu dot org
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: dominiq at lps dot ens dot fr @ 2007-12-03  7:45 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #4 from dominiq at lps dot ens dot fr  2007-12-03 07:45 -------
The code in comment #3 is indeed inlined, but some cases are not. For instance
if you compile the polyhedron test 'channel' with -O3 -ffast-math
-funroll-loops and grep for _ddx, you get:

_ddx.837:
        call    _ddx.837
        call    _ddx.837

If you apply the following patch to channel.f90, i.e., do the inlining
yourself,

--- channel.f90 2005-10-11 22:53:32.000000000 +0200
+++ chan.v2.f90 2007-11-29 21:30:25.000000000 +0100
@@ -145,10 +145,22 @@

     ! ------ interior calculations ------ !

-    dudx = ddx(u(:,:,mid))
-    dvdy = ddy(v(:,:,mid))
-    dhdx = ddx(h(:,:,mid))
-    dhdy = ddy(h(:,:,mid))
+    dudx(2:M-1,:) = u(3:M,: ,mid)-u(1:M-2,: ,mid)    ! interior points
+    dudx(1,:) = 2*(u(2,: ,mid)-u(  1,: ,mid))
+    dudx(M,:) = 2*(u(M,: ,mid)-u(M-1,: ,mid))
+    
+    dvdy(:,2:N-1) = v(:,3:N ,mid)-v(:,1:N-2 ,mid)    ! interior points
+    dvdy(:,1) = 2*(v(:,2 ,mid)-v(:,  1 ,mid))
+    dvdy(:,N) = 2*(v(:,N ,mid)-v(:,N-1 ,mid))
+
+    dhdx(2:M-1,:) = h(3:M,: ,mid)-h(1:M-2,: ,mid)    ! interior points
+    dhdx(1,:) = 2*(h(2,: ,mid)-h(  1,: ,mid))
+    dhdx(M,:) = 2*(h(M,: ,mid)-h(M-1,: ,mid))
+
+    dhdy(:,2:N-1) = h(:,3:N ,mid)-h(:,1:N-2 ,mid)    ! interior points
+    dhdy(:,1) = 2*(h(:,2 ,mid)-h(:,  1 ,mid))
+    dhdy(:,N) = 2*(h(:,N ,mid)-h(:,N-1 ,mid))
+

     u(2:M-1,1:N,new) = u(2:M-1,1:N,old) &               ! interior u points
         +2.d0*dt*f(2:M-1,1:N)*v(2:M-1,1:N,mid) &
@@ -234,38 +246,6 @@
                 0.5*(v(i,j,mid)+v(i,j-1,mid))

 !------------------------------------------------------------
-contains
-!------------------------------------------------------------
-    function ddx(array)
-    implicit double precision (a-h,o-z)
-    double precision::          array(:,:)
-    double precision::          ddx(size(array,dim=1),size(array,dim=2))
-
-    I = size(array,dim=1)
-    J = size(array,dim=2)
-
-    ddx(2:I-1,1:J) = array(3:I,1:J)-array(1:I-2,1:J)    ! interior points
-
-    ddx(1,1:J) = 2*(array(2,1:J)-array(  1,1:J))
-    ddx(I,1:J) = 2*(array(I,1:J)-array(I-1,1:J))
-
-    end function ddx
-
-    function ddy(array)
-    implicit double precision (a-h,o-z)
-    double precision::          array(:,:)
-    double precision::          ddy(size(array,dim=1),size(array,dim=2))
-
-    I = size(array,dim=1)
-    J = size(array,dim=2)
-
-    ddy(1:I,2:J-1) = array(1:I,3:J)-array(1:I,1:J-2)    ! interior points
-
-    ddy(1:I,1) = 2*(array(1:I,2)-array(1:I,  1))
-    ddy(1:I,J) = 2*(array(1:I,J)-array(1:I,J-1))
-
-    end function ddy
-!------------------------------------------------------------
 end program sw

 !------------------------------------------------------------

the timing on an Intel Core2Duo 2.16Ghz goes from 4s to 2.2s.

So my question is: what are the rules applied by GCC for the inlining? I
understand that with -Os, one rule is that inlining must not increase the code
size, but what happened in the case of channel.f90 with -O3?


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
                   ` (5 preceding siblings ...)
  2007-12-03  7:45 ` dominiq at lps dot ens dot fr
@ 2007-12-03 10:13 ` steven at gcc dot gnu dot org
  2007-12-03 12:41 ` dominiq at lps dot ens dot fr
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: steven at gcc dot gnu dot org @ 2007-12-03 10:13 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #5 from steven at gcc dot gnu dot org  2007-12-03 10:13 -------
Inlining is driven by heuristics.  See ipa-inline.c.  Heuristics cannot be
perfect for all applications, of course.  The current tuning of the heuristics
is based on SPEC2k scores on Opteron, i.e. mostly for programs written in C and
C++.  Maybe for Fortran the current heuristics do not lead to the best possible
results.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
                   ` (6 preceding siblings ...)
  2007-12-03 10:13 ` steven at gcc dot gnu dot org
@ 2007-12-03 12:41 ` dominiq at lps dot ens dot fr
  2009-05-02 14:31 ` fxcoudert at gcc dot gnu dot org
  2009-05-02 18:06 ` rguenth at gcc dot gnu dot org
  9 siblings, 0 replies; 11+ messages in thread
From: dominiq at lps dot ens dot fr @ 2007-12-03 12:41 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #6 from dominiq at lps dot ens dot fr  2007-12-03 12:41 -------
Form the gcc manual:

-finline-limit=n
... . The default value of n is 600.  ...

This does not seem accurate: ddx and ddy are inlined for n=318, but not for
n=317 (corresponding respectively to 2.7s and 1.6s for the compile time and
2.5s and 4.1s for the execution time).
Note that with the default settings the compile and execution time are 1.6s and
4.1s. For the patched source they are respectively 1.7s and 2.2s.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
                   ` (7 preceding siblings ...)
  2007-12-03 12:41 ` dominiq at lps dot ens dot fr
@ 2009-05-02 14:31 ` fxcoudert at gcc dot gnu dot org
  2009-05-02 18:06 ` rguenth at gcc dot gnu dot org
  9 siblings, 0 replies; 11+ messages in thread
From: fxcoudert at gcc dot gnu dot org @ 2009-05-02 14:31 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #7 from fxcoudert at gcc dot gnu dot org  2009-05-02 14:31 -------
It's now working with -fwhole-file.


-- 

fxcoudert at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug fortran/29648] Inlining only done for contained procedures
  2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
                   ` (8 preceding siblings ...)
  2009-05-02 14:31 ` fxcoudert at gcc dot gnu dot org
@ 2009-05-02 18:06 ` rguenth at gcc dot gnu dot org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2009-05-02 18:06 UTC (permalink / raw)
  To: gcc-bugs



-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |4.5.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29648


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2009-05-02 18:06 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-10-30 11:42 [Bug fortran/29648] New: Inline P dot Schaffnit at access dot rwth-aachen dot de
2006-10-31  5:34 ` [Bug fortran/29648] Inlining only done for contained procedures pault at gcc dot gnu dot org
2006-10-31  9:13 ` P dot Schaffnit at access dot rwth-aachen dot de
2006-11-06 20:29 ` pinskia at gcc dot gnu dot org
2006-11-07  9:34 ` P dot Schaffnit at access dot rwth-aachen dot de
2007-12-01  2:24 ` bdavis at gcc dot gnu dot org
2007-12-03  7:45 ` dominiq at lps dot ens dot fr
2007-12-03 10:13 ` steven at gcc dot gnu dot org
2007-12-03 12:41 ` dominiq at lps dot ens dot fr
2009-05-02 14:31 ` fxcoudert at gcc dot gnu dot org
2009-05-02 18:06 ` rguenth at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).