aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-03-12 07:56:23 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-03-12 07:56:23 +0000
commitd9e1f37fad2db0cd749cd5c6f9e94972c8472610 (patch)
treef11132839af1ed186bfca4d0798668ec65801c08 /gcc
parent05073a0d54f65876f4aa827a3ae6b00b6dc74638 (diff)
downloadgcc-d9e1f37fad2db0cd749cd5c6f9e94972c8472610.zip
gcc-d9e1f37fad2db0cd749cd5c6f9e94972c8472610.tar.gz
gcc-d9e1f37fad2db0cd749cd5c6f9e94972c8472610.tar.bz2
re PR tree-optimization/89664 (ICE in free_bb, at tree-ssa-math-opts.c:522)
2019-03-12 Richard Biener <rguenther@suse.de> PR tree-optimization/89664 * tree-ssa-math-opts.c (execute_cse_reciprocals_1): Properly free the occurance tree after the early out. * gfortran.dg/pr89664.f90: New testcase. From-SVN: r269604
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr89664.f9024
-rw-r--r--gcc/tree-ssa-math-opts.c3
4 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 64bf601..85d11c9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-03-12 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/89664
+ * tree-ssa-math-opts.c (execute_cse_reciprocals_1): Properly
+ free the occurance tree after the early out.
+
2019-03-11 Jakub Jelinek <jakub@redhat.com>
PR middle-end/89655
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8c992a8..c4f79ae 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-12 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/89664
+ * gfortran.dg/pr89664.f90: New testcase.
+
2019-03-11 Jakub Jelinek <jakub@redhat.com>
PR fortran/89651
diff --git a/gcc/testsuite/gfortran.dg/pr89664.f90 b/gcc/testsuite/gfortran.dg/pr89664.f90
new file mode 100644
index 0000000..5557806
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr89664.f90
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! { dg-options "-Ofast" }
+
+subroutine s (x)
+ real :: x
+ call sub (x)
+end
+subroutine sub (x)
+ real :: x, y
+ logical :: a, b
+ real :: f1, f2, f3, f4
+ y = f1()
+ a = .false.
+ if ( f2() > f3() ) a = .true.
+ b = .false.
+ if ( f2() > f4() ) b = .true.
+ if ( a ) then
+ x = 1.0
+ else if ( b ) then
+ x = 1.0/y**2
+ else
+ x = 1.0/y - y**2
+ end if
+end
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index 5f1b369..cb8a914 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -799,7 +799,7 @@ execute_cse_reciprocals_1 (gimple_stmt_iterator *def_gsi, tree def)
/* If it is more profitable to optimize 1 / x, don't optimize 1 / (x * x). */
if (sqrt_recip_count > square_recip_count)
- return;
+ goto out;
/* Do the expensive part only if we can hope to optimize something. */
if (count + square_recip_count >= threshold && count >= 1)
@@ -842,6 +842,7 @@ execute_cse_reciprocals_1 (gimple_stmt_iterator *def_gsi, tree def)
}
}
+out:
for (occ = occ_head; occ; )
occ = free_bb (occ);