diff options
author | Richard Biener <rguenther@suse.de> | 2013-11-19 09:21:07 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-11-19 09:21:07 +0000 |
commit | 7906dbe42433518f7adef2ca388d7edc0a7fd246 (patch) | |
tree | 701e6a088cef351b4a7274c7c7aa0195f16be89a /gcc | |
parent | 64856e1e0befcc1d2d1245efbe34b3e1b016a8f0 (diff) | |
download | gcc-7906dbe42433518f7adef2ca388d7edc0a7fd246.zip gcc-7906dbe42433518f7adef2ca388d7edc0a7fd246.tar.gz gcc-7906dbe42433518f7adef2ca388d7edc0a7fd246.tar.bz2 |
re PR tree-optimization/57517 (internal compiler error: in eliminate_temp_copies, at tree-predcom.c:1913)
2013-11-19 Richard Biener <rguenther@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.
From-SVN: r205010
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr57517.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.fortran-torture/compile/pr57517.f90 | 13 | ||||
-rw-r--r-- | gcc/tree-predcom.c | 6 |
5 files changed, 46 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d759d4c..65601e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-19 Richard Biener <rguenther@suse.de> + + PR tree-optimization/57517 + * tree-predcom.c (combinable_refs_p): Verify the combination + is always executed when the refs are. + 2013-11-19 Jeff Law <law@redhat.com> * tree-ssa-threadupdate.c: Include ssa-iterators.h diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e28844..06e0bf5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-11-19 Richard Biener <rguenther@suse.de> + + PR tree-optimization/57517 + * gfortran.fortran-torture/compile/pr57517.f90: New testcase. + * gcc.dg/torture/pr57517.c: Likewise. + 2013-11-19 Jan Hubicka <jh@suse.cz> * gcc.target/i386/memcpy-3.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr57517.c b/gcc/testsuite/gcc.dg/torture/pr57517.c new file mode 100644 index 0000000..2422d8e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57517.c @@ -0,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); + } +} diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr57517.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr57517.f90 new file mode 100644 index 0000000..f32698a --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr57517.f90 @@ -0,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 diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c index 77a15ab..a43d19b 100644 --- a/gcc/tree-predcom.c +++ b/gcc/tree-predcom.c @@ -2035,7 +2035,11 @@ combinable_refs_p (dref r1, dref r2, stmt = find_common_use_stmt (&name1, &name2); - if (!stmt) + 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); |