------- Comment #17 from jakub at gcc dot gnu dot org 2009-01-05 13:11 ------- Slightly more reduced: ! PR rtl-optimization/38722 ! { dg-do compile } ! { dg-options "-O1" } SUBROUTINE foo(x, n, ga, gc, vr) TYPE pt DOUBLE PRECISION, DIMENSION (:, :, :), POINTER :: cr END TYPE pt TYPE pu TYPE(pt), POINTER :: pw END TYPE pu LOGICAL, INTENT(in) :: x, ga, gc INTEGER :: i, n LOGICAL :: dd, ep, fe TYPE(pu) :: vr TYPE(pu), DIMENSION(:), POINTER :: v IF (.NOT. fe) THEN IF (ga) THEN CALL bar (dd, ep, gc) END IF IF (x .AND. .NOT. ga) THEN IF (gc) THEN DO i=1,n CALL baz (v(i), x, gc) v(i)%pw%cr = 1.0 END DO DO i=1,n IF (ep) THEN IF (dd) THEN IF (i==1) THEN v(i)%pw%cr=v(i)%pw%cr + vr%pw%cr ENDIF END IF END IF END DO END IF ENDIF END IF END SUBROUTINE foo
I'd say the bug is in /* If we will be able to accept this, we have made a change to the destination of I3. This requires us to do a few adjustments. */ PATTERN (i3) = newpat; adjust_for_new_dest (i3); being done before last check that might decide to undo_all (and without recording the changes into undo structures). A patch which just sets a flag and does these 2 stmts if the flag is set after the last undo_all cures this, I'll bootstrap/regtest it soon. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38722