This fixes a predcom ICE where it commons a combination of two loads but with the combination being conditionally executed. It's not prepared to handle this situation, disabled with the following.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk and 4.8 branch for now. Richard. 2013-11-19 Richard Biener <rguent...@suse.de> PR tree-optimization/57517 * tree-predcom.c (combinable_refs_p): Verify the combination is always executed when the refs are. * gfortran.fortran-torture/compile/pr57517.f90: New testcase. * gcc.dg/torture/pr57517.c: Likewise. Index: gcc/tree-predcom.c =================================================================== *** gcc/tree-predcom.c (revision 204948) --- gcc/tree-predcom.c (working copy) *************** combinable_refs_p (dref r1, dref r2, *** 2068,2074 **** stmt = find_common_use_stmt (&name1, &name2); ! if (!stmt) return false; acode = gimple_assign_rhs_code (stmt); --- 2068,2078 ---- stmt = find_common_use_stmt (&name1, &name2); ! if (!stmt ! /* A simple post-dominance check - make sure the combination ! is executed under the same condition as the references. */ ! || (gimple_bb (stmt) != gimple_bb (r1->stmt) ! && gimple_bb (stmt) != gimple_bb (r2->stmt))) return false; acode = gimple_assign_rhs_code (stmt); Index: gcc/testsuite/gfortran.fortran-torture/compile/pr57517.f90 =================================================================== *** gcc/testsuite/gfortran.fortran-torture/compile/pr57517.f90 (revision 0) --- gcc/testsuite/gfortran.fortran-torture/compile/pr57517.f90 (working copy) *************** *** 0 **** --- 1,13 ---- + SUBROUTINE cal_helicity (uh, ph, phb, wavg, ims, ime, its, ite) + INTEGER, INTENT( IN ) :: ims, ime, its, ite + REAL, DIMENSION( ims:ime), INTENT( IN ) :: ph, phb, wavg + REAL, DIMENSION( ims:ime), INTENT( INOUT ) :: uh + INTEGER :: i + REAL :: zu + DO i = its, ite + zu = (ph(i ) + phb(i)) + (ph(i-1) + phb(i-1)) + IF (wavg(i) .GT. 0) THEN + uh(i) = uh(i) + zu + ENDIF + END DO + END SUBROUTINE cal_helicity Index: gcc/testsuite/gcc.dg/torture/pr57517.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr57517.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr57517.c (working copy) *************** *** 0 **** --- 1,16 ---- + /* { dg-do compile } */ + + int x[1024], y[1024], z[1024], w[1024]; + void foo (void) + { + int i; + for (i = 1; i < 1024; ++i) + { + int a = x[i]; + int b = y[i]; + int c = x[i-1]; + int d = y[i-1]; + if (w[i]) + z[i] = (a + b) + (c + d); + } + }