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

Reply via email to