------- 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

Reply via email to