Bootstrap & regtest in progress on x86_64-unknown-linux-gnu.
Richard. 2019-03-11 Richard Biener <rguent...@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. Index: gcc/tree-ssa-math-opts.c =================================================================== --- gcc/tree-ssa-math-opts.c (revision 269212) +++ gcc/tree-ssa-math-opts.c (working copy) @@ -799,7 +799,7 @@ execute_cse_reciprocals_1 (gimple_stmt_i /* 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_i } } +out: for (occ = occ_head; occ; ) occ = free_bb (occ); Index: gcc/testsuite/gfortran.dg/pr89664.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr89664.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/pr89664.f90 (working copy) @@ -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