https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69368
--- Comment #61 from Dominique d'Humieres <dominiq at lps dot ens.fr> --- Another oddity of the "optimization" introduced by r232508 is the following test (borrowed from https://gcc.gnu.org/ml/gcc-patches/2016-02/msg01356.html) [Book15] f90/bug% cat pr69368_1_a.f90 SUBROUTINE FOO IMPLICIT DOUBLE PRECISION (X) INTEGER J ! COMMON /MYCOMMON / X(1031) COMMON /MYCOMMON / X(1) DO 10 J=1,1024 X(J+1)=X(J+7) 10 CONTINUE RETURN END [Book15] f90/bug% cat pr69368_1_b.f90 IMPLICIT DOUBLE PRECISION (X) COMMON /MYCOMMON/ X(1031) DO I=1,1031 X(I)=I END DO call FOO() print *, X(1025) IF (X(1025).NE.1031) CALL ABORT END The test fails if pr69368_1_a.f90 is compiled with -O2 (FOO is compiled as a simple RETURN). Now if I replace COMMON /MYCOMMON / X(1) with COMMON /MYCOMMON / X(2) I get at compile tile with -O2 pr69368_1_a_1.f90:7:0: X(J+1)=X(J+7) Warning: iteration 1 invokes undefined behavior [-Waggressive-loop-optimizations] pr69368_1_a_1.f90:6:0: DO 10 J=1,1024 note: within this loop and the test succeeds. Any reason why there is no warning for "COMMON /MYCOMMON / X(1)"? Also the following invalid code [Book15] f90/bug% cat pr69368_1_c.f90 SUBROUTINE FOO(X) IMPLICIT DOUBLE PRECISION (X) INTEGER J DIMENSION X(1) DO 10 J=1,1024 X(J+1)=X(J+7) 10 CONTINUE RETURN END [Book15] f90/bug% cat pr69368_1_d.f90 IMPLICIT DOUBLE PRECISION (X) DIMENSION X(1031) DO I=1,1031 X(I)=I END DO call FOO(X) print *, X(1025) IF (X(1025).NE.1031.0) CALL ABORT END gives the expected result.