public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/31593]  New: Invariant DO loop variables (and I/O)
@ 2007-04-16 21:43 tkoenig at gcc dot gnu dot org
  2007-04-16 21:54 ` [Bug fortran/31593] " pinskia at gcc dot gnu dot org
                   ` (44 more replies)
  0 siblings, 45 replies; 54+ messages in thread
From: tkoenig at gcc dot gnu dot org @ 2007-04-16 21:43 UTC (permalink / raw)
  To: gcc-bugs

Compare this:

$ cat count.f90
program main
  implicit none
  integer, parameter :: value = 747
  integer :: p1, p2, p3, p4
  integer :: i

  do i=1, 10
     do p1 = 1, value-2
        do p2 = p1 + 1, value - p1
           do p3 = p2 + 1, value - p1 - p2
              p4 = value - p1 - p2 - p3
              if (p1 * p2 * p3 * p4 == value * 1000000) &
                   print '(4(I0,:" "))',p1,p2,p3,p4
           end do
        end do
     end do
  end do
end program main
$ gfortran -O3 count.f90
$ time ./a.out > /dev/null

real    0m0.634s
user    0m0.620s
sys     0m0.004s


with the equivalent

$ cat count.c
#include <stdio.h>

const int value = 747;

int main()
{
  int i, p1, p2, p3, p4;

  for (i=1; i<=10; i++)
    {
      for (p1 = 1; p1 <= value - 2 ; p1++)
        {
          for (p2 = p1 + 1; p2 <= value - p1; p2++)
            {
              for (p3 = p2 + 1; p3 <= value - p1 - p2; p3++)
                {
                  p4 = value - p1 - p2 - p3;
                  if (p1 * p2 * p3 * p4 == value * 1000000)
                    printf("%d %d %d %d\n", p1, p2, p3, p4);
                }
            }
        }
    }
}
$ gcc -O3 count.c
$ time ./a.out > /dev/null

real    0m0.396s
user    0m0.380s
sys     0m0.000s


We don't

- take advantage of the fact that p1, p2, p3 and p4 cannot
  be legally changed in the do loop

- take advantage of the fact that the I/O statemetns don't change
  the values

so we miss out on common subexpression elimination.  Here's a
part from the *.optimized file:

<L34>:;
  p2.3 = p2;
  p3.5 = p2.3 + 1;
  D.1014 = (747 - p1) - p2.3;
  p3 = p3.5;
  if (p3.5 <= D.1014) goto <L35>; else goto <L12>;

<L35>:;
  p1.58 = p1;
  p2.60 = p2;
  p3.61 = p3;
  p4.7 = ((747 - p1.58) - p2.60) - p3.61;
  p4 = p4.7;
  if (((p2.60 * p1.58) * p3.61) * p4.7 == 747000000) goto <L8>; else goto <L9>;


-- 
           Summary: Invariant DO loop variables (and I/O)
           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: tkoenig at gcc dot gnu dot org


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


^ permalink raw reply	[flat|nested] 54+ messages in thread
[parent not found: <bug-31593-4@http.gcc.gnu.org/bugzilla/>]

end of thread, other threads:[~2020-07-19 17:29 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-04-16 21:43 [Bug fortran/31593] New: Invariant DO loop variables (and I/O) tkoenig at gcc dot gnu dot org
2007-04-16 21:54 ` [Bug fortran/31593] " pinskia at gcc dot gnu dot org
2007-04-16 22:03 ` [Bug fortran/31593] Invariant DO loop variables and subroutines tkoenig at gcc dot gnu dot org
2007-04-16 22:12 ` pinskia at gcc dot gnu dot org
2007-04-17  0:15 ` tobi at gcc dot gnu dot org
2008-02-19 16:09 ` fxcoudert at gcc dot gnu dot org
2008-06-15 15:12 ` fxcoudert at gcc dot gnu dot org
2009-07-02 12:36 ` burnus at gcc dot gnu dot org
2009-08-12 17:53 ` tkoenig at gcc dot gnu dot org
2009-08-12 18:11 ` Tobias Schlüter <tobias dot schlueter at physik dot uni-muenchen dot de>
2009-08-12 20:36 ` tkoenig at gcc dot gnu dot org
2009-08-12 20:52 ` tobi at gcc dot gnu dot org
2009-08-13  9:14 ` jv244 at cam dot ac dot uk
2009-08-13 13:31 ` rguenth at gcc dot gnu dot org
2009-08-13 13:39 ` tobi at gcc dot gnu dot org
2009-08-13 18:55 ` tkoenig at gcc dot gnu dot org
2009-08-13 23:33 ` Tobias Schlüter <tobias dot schlueter at physik dot uni-muenchen dot de>
2009-08-14 18:13 ` tobi at gcc dot gnu dot org
2009-08-14 19:29 ` tobi at gcc dot gnu dot org
2009-08-14 19:55 ` tobi at gcc dot gnu dot org
2009-08-14 20:19 ` jvdelisle at gcc dot gnu dot org
2009-08-14 21:19 ` mikael at gcc dot gnu dot org
2009-08-14 21:31 ` tobi at gcc dot gnu dot org
2009-08-14 21:45 ` tobi at gcc dot gnu dot org
2009-08-14 21:46 ` tobi at gcc dot gnu dot org
2009-08-14 22:05 ` tkoenig at gcc dot gnu dot org
2009-08-14 22:38 ` tobi at gcc dot gnu dot org
2009-08-14 22:46 ` tobi at gcc dot gnu dot org
2009-08-14 22:58 ` tobi at gcc dot gnu dot org
2009-08-15  7:51 ` jv244 at cam dot ac dot uk
2009-08-15  7:53 ` jv244 at cam dot ac dot uk
2009-08-15  9:22 ` tkoenig at gcc dot gnu dot org
2009-08-15  9:25 ` tkoenig at gcc dot gnu dot org
2009-08-15  9:51 ` tobi at gcc dot gnu dot org
2009-08-15 10:06 ` jv244 at cam dot ac dot uk
2009-08-15 10:17 ` Tobias Schlüter <tobias dot schlueter at physik dot uni-muenchen dot de>
2009-08-15 10:58 ` tkoenig at gcc dot gnu dot org
2009-08-15 10:59 ` Tobias Schlüter <tobias dot schlueter at physik dot uni-muenchen dot de>
2009-08-16 15:57 ` tobi at gcc dot gnu dot org
2009-08-16 16:12 ` tkoenig at gcc dot gnu dot org
2009-08-16 16:21 ` tobi at gcc dot gnu dot org
2009-08-16 17:01 ` tobi at gcc dot gnu dot org
2009-08-17 22:08 ` tobi at gcc dot gnu dot org
2009-08-17 22:39 ` tobi at gcc dot gnu dot org
2009-10-08 11:07 ` steven at gcc dot gnu dot org
2009-10-08 11:24 ` matz at gcc dot gnu dot org
     [not found] <bug-31593-4@http.gcc.gnu.org/bugzilla/>
2010-10-16 16:07 ` tkoenig at gcc dot gnu.org
2013-08-28  8:25 ` rguenth at gcc dot gnu.org
2013-10-09 10:33 ` dominiq at lps dot ens.fr
2020-06-24  7:14 ` tobi at gcc dot gnu.org
2020-07-13 19:53 ` dominiq at lps dot ens.fr
2020-07-15 13:40 ` tobi at gcc dot gnu.org
2020-07-19 17:00 ` tkoenig at gcc dot gnu.org
2020-07-19 17:29 ` tkoenig at gcc dot gnu.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).