Commit 8a9b4fa1 by Eric Botcazou Committed by Eric Botcazou

tree-cfg.c (replace_loop_annotate_in_block): New function extracted from...

	* tree-cfg.c (replace_loop_annotate_in_block): New function extracted
	from...
	(replace_loop_annotate): ...here.  Call it on the header and on the
	latch block, if any.  Restore proper behavior of final cleanup.

From-SVN: r217602
parent d03f2c17
2014-11-15 Eric Botcazou <ebotcazou@adacore.com> 2014-11-15 Eric Botcazou <ebotcazou@adacore.com>
* tree-cfg.c (replace_loop_annotate_in_block): New function extracted
from...
(replace_loop_annotate): ...here. Call it on the header and on the
latch block, if any. Restore proper behavior of final cleanup.
2014-11-15 Eric Botcazou <ebotcazou@adacore.com>
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Add log message * tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Add log message
for max-completely-peeled-insns limit. for max-completely-peeled-insns limit.
2014-11-15 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt44.ad[sb]: New test.
2014-11-15 Tobias Burnus <burnus@net-b.de> 2014-11-15 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/binding_label_tests_4.f03: Add dg-excess-errors. * gfortran.dg/binding_label_tests_4.f03: Add dg-excess-errors.
......
-- { dg-do compile }
-- { dg-options "-O" }
package body Opt44 is
procedure Addsub (X, Y : Sarray; R : out Sarray; N : Integer) is
begin
for I in Sarray'Range loop
pragma Loop_Optimize (Ivdep);
pragma Loop_Optimize (Vector);
if N > 0 then
R(I) := X(I) + Y(I);
else
R(I) := X(I) - Y(I);
end if;
end loop;
end;
end Opt44;
package Opt44 is
type Sarray is array (1 .. 4) of Float;
for Sarray'Alignment use 16;
procedure Addsub (X, Y : Sarray; R : out Sarray; N : Integer);
end Opt44;
...@@ -265,13 +265,56 @@ build_gimple_cfg (gimple_seq seq) ...@@ -265,13 +265,56 @@ build_gimple_cfg (gimple_seq seq)
discriminator_per_locus = NULL; discriminator_per_locus = NULL;
} }
/* Look for ANNOTATE calls with loop annotation kind in BB; if found, remove
them and propagate the information to LOOP. We assume that the annotations
come immediately before the condition in BB, if any. */
static void
replace_loop_annotate_in_block (basic_block bb, struct loop *loop)
{
gimple_stmt_iterator gsi = gsi_last_bb (bb);
gimple stmt = gsi_stmt (gsi);
if (!(stmt && gimple_code (stmt) == GIMPLE_COND))
return;
for (gsi_prev_nondebug (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))
{
stmt = gsi_stmt (gsi);
if (gimple_code (stmt) != GIMPLE_CALL)
break;
if (!gimple_call_internal_p (stmt)
|| gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
break;
switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1)))
{
case annot_expr_ivdep_kind:
loop->safelen = INT_MAX;
break;
case annot_expr_no_vector_kind:
loop->dont_vectorize = true;
break;
case annot_expr_vector_kind:
loop->force_vectorize = true;
cfun->has_force_vectorize_loops = true;
break;
default:
gcc_unreachable ();
}
stmt = gimple_build_assign (gimple_call_lhs (stmt),
gimple_call_arg (stmt, 0));
gsi_replace (&gsi, stmt, true);
}
}
/* Look for ANNOTATE calls with loop annotation kind; if found, remove /* Look for ANNOTATE calls with loop annotation kind; if found, remove
them and propagate the information to the loop. We assume that the them and propagate the information to the loop. We assume that the
annotations come immediately before the condition of the loop. */ annotations come immediately before the condition of the loop. */
static void static void
replace_loop_annotate () replace_loop_annotate (void)
{ {
struct loop *loop; struct loop *loop;
basic_block bb; basic_block bb;
...@@ -280,37 +323,12 @@ replace_loop_annotate () ...@@ -280,37 +323,12 @@ replace_loop_annotate ()
FOR_EACH_LOOP (loop, 0) FOR_EACH_LOOP (loop, 0)
{ {
gsi = gsi_last_bb (loop->header); /* First look into the header. */
stmt = gsi_stmt (gsi); replace_loop_annotate_in_block (loop->header, loop);
if (!(stmt && gimple_code (stmt) == GIMPLE_COND))
continue; /* Then look into the latch, if any. */
for (gsi_prev_nondebug (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi)) if (loop->latch)
{ replace_loop_annotate_in_block (loop->latch, loop);
stmt = gsi_stmt (gsi);
if (gimple_code (stmt) != GIMPLE_CALL)
break;
if (!gimple_call_internal_p (stmt)
|| gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
break;
switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1)))
{
case annot_expr_ivdep_kind:
loop->safelen = INT_MAX;
break;
case annot_expr_no_vector_kind:
loop->dont_vectorize = true;
break;
case annot_expr_vector_kind:
loop->force_vectorize = true;
cfun->has_force_vectorize_loops = true;
break;
default:
gcc_unreachable ();
}
stmt = gimple_build_assign (gimple_call_lhs (stmt),
gimple_call_arg (stmt, 0));
gsi_replace (&gsi, stmt, true);
}
} }
/* Remove IFN_ANNOTATE. Safeguard for the case loop->latch == NULL. */ /* Remove IFN_ANNOTATE. Safeguard for the case loop->latch == NULL. */
...@@ -320,10 +338,11 @@ replace_loop_annotate () ...@@ -320,10 +338,11 @@ replace_loop_annotate ()
{ {
stmt = gsi_stmt (gsi); stmt = gsi_stmt (gsi);
if (gimple_code (stmt) != GIMPLE_CALL) if (gimple_code (stmt) != GIMPLE_CALL)
break; continue;
if (!gimple_call_internal_p (stmt) if (!gimple_call_internal_p (stmt)
|| gimple_call_internal_fn (stmt) != IFN_ANNOTATE) || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
break; continue;
switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1))) switch ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1)))
{ {
case annot_expr_ivdep_kind: case annot_expr_ivdep_kind:
...@@ -333,6 +352,7 @@ replace_loop_annotate () ...@@ -333,6 +352,7 @@ replace_loop_annotate ()
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
warning_at (gimple_location (stmt), 0, "ignoring loop annotation"); warning_at (gimple_location (stmt), 0, "ignoring loop annotation");
stmt = gimple_build_assign (gimple_call_lhs (stmt), stmt = gimple_build_assign (gimple_call_lhs (stmt),
gimple_call_arg (stmt, 0)); gimple_call_arg (stmt, 0));
......
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