Commit 71f4a023 by Dorit Nuzman Committed by Dorit Nuzman

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
parent ccf64c83
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> 2007-09-07 Richard Guenther <rguenther@suse.de>
PR middle-end/33330 PR middle-end/33330
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> 2007-09-07 Richard Guenther <rguenther@suse.de>
Revert Revert
! { 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" } }
...@@ -91,12 +91,18 @@ dg-init ...@@ -91,12 +91,18 @@ dg-init
# Main loop. # 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/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 #### Tests with special options
global SAVED_DEFAULT_VECTCFLAGS global SAVED_DEFAULT_VECTCFLAGS
set SAVED_DEFAULT_VECTCFLAGS $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 # --param vect-max-version-for-alias-checks=0 tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "--param" "vect-max-version-for-alias-checks=0" lappend DEFAULT_VECTCFLAGS "--param" "vect-max-version-for-alias-checks=0"
......
...@@ -1964,6 +1964,8 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, ...@@ -1964,6 +1964,8 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt,
tree operation = GIMPLE_STMT_OPERAND (stmt, 1); tree operation = GIMPLE_STMT_OPERAND (stmt, 1);
bool nested_in_vect_loop = false; bool nested_in_vect_loop = false;
int op_type; int op_type;
VEC(tree,heap) *phis = NULL;
int i;
if (nested_in_vect_loop_p (loop, stmt)) if (nested_in_vect_loop_p (loop, stmt))
{ {
...@@ -2260,11 +2262,7 @@ vect_finalize_reduction: ...@@ -2260,11 +2262,7 @@ vect_finalize_reduction:
epilog_stmt = build_gimple_modify_stmt (new_dest, expr); epilog_stmt = build_gimple_modify_stmt (new_dest, expr);
new_temp = make_ssa_name (new_dest, epilog_stmt); new_temp = make_ssa_name (new_dest, epilog_stmt);
GIMPLE_STMT_OPERAND (epilog_stmt, 0) = new_temp; 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); bsi_insert_before (&exit_bsi, epilog_stmt, BSI_SAME_STMT);
#endif
} }
...@@ -2274,45 +2272,43 @@ vect_finalize_reduction: ...@@ -2274,45 +2272,43 @@ vect_finalize_reduction:
Find the loop-closed-use at the loop exit of the original scalar result. 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 (The reduction result is expected to have two immediate uses - one at the
latch block, and one at the loop exit). */ 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) 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)))) if (!flow_bb_inside_loop_p (loop, bb_for_stmt (USE_STMT (use_p))))
{ {
exit_phi = 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. */ /* 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 /* FORNOW. Currently not supporting the case that an inner-loop reduction
is not used in the outer-loop (but only outside the outer-loop). */ is not used in the outer-loop (but only outside the outer-loop). */
gcc_assert (STMT_VINFO_RELEVANT_P (stmt_vinfo) gcc_assert (STMT_VINFO_RELEVANT_P (stmt_vinfo)
&& !STMT_VINFO_LIVE_P (stmt_vinfo)); && !STMT_VINFO_LIVE_P (stmt_vinfo));
epilog_stmt = adjustment_def ? epilog_stmt : new_phi; epilog_stmt = adjustment_def ? epilog_stmt : new_phi;
STMT_VINFO_VEC_STMT (stmt_vinfo) = epilog_stmt; STMT_VINFO_VEC_STMT (stmt_vinfo) = epilog_stmt;
set_stmt_info (get_stmt_ann (epilog_stmt), set_stmt_info (get_stmt_ann (epilog_stmt),
new_stmt_vec_info (epilog_stmt, loop_vinfo)); new_stmt_vec_info (epilog_stmt, loop_vinfo));
continue;
}
if (vect_print_dump_info (REPORT_DETAILS)) /* Replace the uses: */
{ orig_name = PHI_RESULT (exit_phi);
fprintf (vect_dump, "vector of partial results after inner-loop:"); FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, orig_name)
print_generic_expr (vect_dump, epilog_stmt, TDF_SLIM); FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
} SET_USE (use_p, new_temp);
return;
} }
VEC_free (tree, heap, phis);
/* 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);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment