re PR tree-optimization/33299 (miscompilation with gfortran -O2 -ffast-math -ftree-vectorize)

PR tree-optimization/33299
        * tree-vect-transform.c (vect_create_epilog_for_reduction): Update uses
        for all relevant loop-exit phis, not just the first.

From-SVN: r128242
This commit is contained in:
Dorit Nuzman 2007-09-07 15:00:11 +00:00 committed by Dorit Nuzman
parent ccf64c833f
commit 71f4a02318
5 changed files with 61 additions and 30 deletions

View file

@ -1,3 +1,9 @@
2007-09-07 Dorit Nuzman <dorit@il.ibm.com>
PR tree-optimization/33299
* tree-vect-transform.c (vect_create_epilog_for_reduction): Update uses
for all relevant loop-exit phis, not just the first.
2007-09-07 Richard Guenther <rguenther@suse.de>
PR middle-end/33330

View file

@ -1,3 +1,9 @@
2007-09-07 Dorit Nuzman <dorit@il.ibm.com>
PR tree-optimization/33299
* gfortran.dg/vect/vect.exp: Compile some tests with -ffast-math.
* gfortran.dg/vect/fast-math-pr33299.f90: New test.
2007-09-07 Richard Guenther <rguenther@suse.de>
Revert

View file

@ -0,0 +1,17 @@
! { dg-require-effective-target vect_double }
PROGRAM test
REAL(8) :: f,dist(2)
dist = [1.0_8, 0.5_8]
if( f(1.0_8, dist) /= MINVAL(dist)) then
call abort ()
endif
END PROGRAM test
FUNCTION f( x, dist ) RESULT(s)
REAL(8) :: dist(2), x, s
s = MINVAL(dist)
IF( x < 0 ) s = -s
END FUNCTION f
! { dg-final { cleanup-tree-dump "vect" } }

View file

@ -91,12 +91,18 @@ dg-init
# Main loop.
gfortran-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/vect-*.\[fF\]{,90,95,03} ]] $DEFAULT_VECTCFLAGS
gfortran-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/pr-*.\[fF\]{,90,95,03} ]] $DEFAULT_VECTCFLAGS
gfortran-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/pr*.\[fF\]{,90,95,03} ]] $DEFAULT_VECTCFLAGS
#### Tests with special options
global SAVED_DEFAULT_VECTCFLAGS
set SAVED_DEFAULT_VECTCFLAGS $DEFAULT_VECTCFLAGS
# -ffast-math tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-ffast-math"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/fast-math-*.\[fF\]{,90,95,03} ]] \
"" $DEFAULT_VECTCFLAGS
# --param vect-max-version-for-alias-checks=0 tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "--param" "vect-max-version-for-alias-checks=0"

View file

@ -1964,6 +1964,8 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt,
tree operation = GIMPLE_STMT_OPERAND (stmt, 1);
bool nested_in_vect_loop = false;
int op_type;
VEC(tree,heap) *phis = NULL;
int i;
if (nested_in_vect_loop_p (loop, stmt))
{
@ -2260,11 +2262,7 @@ vect_finalize_reduction:
epilog_stmt = build_gimple_modify_stmt (new_dest, expr);
new_temp = make_ssa_name (new_dest, epilog_stmt);
GIMPLE_STMT_OPERAND (epilog_stmt, 0) = new_temp;
#if 0
bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
#else
bsi_insert_before (&exit_bsi, epilog_stmt, BSI_SAME_STMT);
#endif
}
@ -2274,45 +2272,43 @@ vect_finalize_reduction:
Find the loop-closed-use at the loop exit of the original scalar result.
(The reduction result is expected to have two immediate uses - one at the
latch block, and one at the loop exit). */
exit_phi = NULL;
phis = VEC_alloc (tree, heap, 10);
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, scalar_dest)
{
if (!flow_bb_inside_loop_p (loop, bb_for_stmt (USE_STMT (use_p))))
{
exit_phi = USE_STMT (use_p);
break;
VEC_quick_push (tree, phis, exit_phi);
}
}
/* We expect to have found an exit_phi because of loop-closed-ssa form. */
gcc_assert (exit_phi);
gcc_assert (!VEC_empty (tree, phis));
if (nested_in_vect_loop)
for (i = 0; VEC_iterate (tree, phis, i, exit_phi); i++)
{
stmt_vec_info stmt_vinfo = vinfo_for_stmt (exit_phi);
if (nested_in_vect_loop)
{
stmt_vec_info stmt_vinfo = vinfo_for_stmt (exit_phi);
/* FORNOW. Currently not supporting the case that an inner-loop reduction
is not used in the outer-loop (but only outside the outer-loop). */
gcc_assert (STMT_VINFO_RELEVANT_P (stmt_vinfo)
&& !STMT_VINFO_LIVE_P (stmt_vinfo));
/* FORNOW. Currently not supporting the case that an inner-loop reduction
is not used in the outer-loop (but only outside the outer-loop). */
gcc_assert (STMT_VINFO_RELEVANT_P (stmt_vinfo)
&& !STMT_VINFO_LIVE_P (stmt_vinfo));
epilog_stmt = adjustment_def ? epilog_stmt : new_phi;
STMT_VINFO_VEC_STMT (stmt_vinfo) = epilog_stmt;
set_stmt_info (get_stmt_ann (epilog_stmt),
new_stmt_vec_info (epilog_stmt, loop_vinfo));
epilog_stmt = adjustment_def ? epilog_stmt : new_phi;
STMT_VINFO_VEC_STMT (stmt_vinfo) = epilog_stmt;
set_stmt_info (get_stmt_ann (epilog_stmt),
new_stmt_vec_info (epilog_stmt, loop_vinfo));
continue;
}
if (vect_print_dump_info (REPORT_DETAILS))
{
fprintf (vect_dump, "vector of partial results after inner-loop:");
print_generic_expr (vect_dump, epilog_stmt, TDF_SLIM);
}
return;
/* Replace the uses: */
orig_name = PHI_RESULT (exit_phi);
FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, orig_name)
FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
SET_USE (use_p, new_temp);
}
/* Replace the uses: */
orig_name = PHI_RESULT (exit_phi);
FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, orig_name)
FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
SET_USE (use_p, new_temp);
VEC_free (tree, heap, phis);
}