[Bug fortran/32817] New: inline (pure) accessor functions
dfranke at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Thu Jul 19 08:38:00 GMT 2007
I don't know whether this is possible to achieve, but simple PURE functions
should sometimes be inlined. Please consider:
$> cat inline.f90
MODULE foomod
TYPE foo
PRIVATE ! change to PUBLIC to run the "inlined" loop
INTEGER :: value
END TYPE
INTERFACE OPERATOR(==)
MODULE PROCEDURE foo_equal
END INTERFACE
CONTAINS
PURE FUNCTION foo_new(value) RESULT (this)
INTEGER, INTENT(in) :: value
TYPE(foo) :: this
this = foo(value)
END FUNCTION
PURE FUNCTION foo_equal(this, other)
TYPE(foo), INTENT(in) :: this, other
LOGICAL :: foo_equal
foo_equal = (this%value == other%value)
END FUNCTION
END MODULE
USE foomod
INTEGER :: i, j
TYPE(foo) :: x(50000)
DO i = 1, SIZE(x)
x(i) = foo_new(i)
END DO
DO i = 1, SIZE(x)
DO j = i + 1, SIZE(x)
IF (x(i) == x(j)) EXIT ! call foo_equal
END DO
END DO
!DO i = 1, SIZE(x)
! DO j = i + 1, SIZE(x)
! IF (x(i)%value == x(j)%value) EXIT ! inlined
! END DO
!END DO
END
Using comparison function foo_equal
$> gfortran-svn -O3 inline.f90 && time ./a.out
real 0m6.818s
user 0m6.772s
sys 0m0.036s
Inlined access:
$> gfortran-svn -O3 inline.f90 && time ./a.out
real 0m1.242s
user 0m1.236s
sys 0m0.008s
The example above was taken from a real-world application that (currently)
spends about 10% of its 3 hour runtime in accessor/comparison functions like
the one shown. In general, I'd prefer the OO'ish approach over PUBLIC access to
the components.
--
Summary: inline (pure) accessor functions
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: dfranke at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32817
More information about the Gcc-bugs
mailing list