This fixes PR61209, we were leaking VN_TOP into the cached expr used for folding. That's of course a no-no.
Bootstrap and regtest ongoing on x86_64-unknown-linux-gnu. Richard. 2014-05-19 Richard Biener <rguent...@suse.de> PR tree-optimization/61209 * tree-ssa-sccvn.c (visit_phi): Avoid setting expr to VN_TOP. * gfortran.dg/pr61209.f90: New testcase. Index: gcc/tree-ssa-sccvn.c =================================================================== *** gcc/tree-ssa-sccvn.c (revision 210608) --- gcc/tree-ssa-sccvn.c (working copy) *************** visit_phi (gimple phi) *** 3125,3136 **** if (is_gimple_min_invariant (sameval)) { VN_INFO (PHI_RESULT (phi))->has_constants = true; ! VN_INFO (PHI_RESULT (phi))->expr = sameval; } else { VN_INFO (PHI_RESULT (phi))->has_constants = false; ! VN_INFO (PHI_RESULT (phi))->expr = sameval; } if (TREE_CODE (sameval) == SSA_NAME) --- 3125,3138 ---- if (is_gimple_min_invariant (sameval)) { VN_INFO (PHI_RESULT (phi))->has_constants = true; ! if (sameval != VN_TOP) ! VN_INFO (PHI_RESULT (phi))->expr = sameval; } else { VN_INFO (PHI_RESULT (phi))->has_constants = false; ! if (sameval != VN_TOP) ! VN_INFO (PHI_RESULT (phi))->expr = sameval; } if (TREE_CODE (sameval) == SSA_NAME) Index: gcc/testsuite/gfortran.dg/pr61209.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pr61209.f90 (revision 0) --- gcc/testsuite/gfortran.dg/pr61209.f90 (working copy) *************** *** 0 **** --- 1,46 ---- + ! { dg-do compile } + ! { dg-options "-O -fbounds-check" } + MODULE array_types + INTERFACE array_data + MODULE PROCEDURE array_data_i1d + END INTERFACE + TYPE array_i1d_type + END TYPE array_i1d_type + TYPE array_i1d_obj + TYPE(array_i1d_type), POINTER :: low + END TYPE array_i1d_obj + TYPE dbcsr_type + TYPE(array_i1d_obj) :: local_rows + LOGICAL :: local_indexing + END TYPE dbcsr_type + TYPE dbcsr_obj + TYPE(dbcsr_type) :: m + END TYPE dbcsr_obj + CONTAINS + FUNCTION array_data_i1d(array) RESULT (DATA) + TYPE(array_i1d_obj), INTENT(IN) :: array + INTEGER, DIMENSION(:), POINTER :: DATA + IF (ASSOCIATED (array%low)) THEN + ENDIF + END FUNCTION array_data_i1d + SUBROUTINE dbcsr_make_index_list (matrix, thread_redist) + TYPE(dbcsr_obj), INTENT(INOUT) :: matrix + LOGICAL, INTENT(IN) :: thread_redist + INTEGER, ALLOCATABLE, DIMENSION(:, :) :: blki + INTEGER, DIMENSION(:), POINTER :: local_rows, td + INTEGER :: blk + nthreads = 0 + IF (nthreads .GT. 0 .AND. thread_redist) THEN + IF (matrix%m%local_indexing) THEN + local_rows => array_data (matrix%m%local_rows) + ENDIF + CALL dbcsr_build_row_index_inplace (thr_c, nthreads) + IF (matrix%m%local_indexing) THEN + DO blk = 1, nblks + IF (td(local_rows(blki(1, blk))) .EQ. ithread) THEN + ENDIF + ENDDO + ENDIF + ENDIF + END SUBROUTINE dbcsr_make_index_list + END MODULE