Commit ff27462e by Eric Botcazou Committed by Eric Botcazou

cfgloop.h (struct loop): Document usage of USHRT_MAX for unroll.

	* cfgloop.h (struct loop): Document usage of USHRT_MAX for unroll.
	* loop-unroll.c (decide_unroll_constant_iterations): Implement it.
	(decide_unroll_runtime_iterations): Likewise.
	(decide_unroll_stupid): Likewise.

From-SVN: r255165
parent 39335d14
2017-11-27 Eric Botcazou <ebotcazou@adacore.com>
* cfgloop.h (struct loop): Document usage of USHRT_MAX for unroll.
* loop-unroll.c (decide_unroll_constant_iterations): Implement it.
(decide_unroll_runtime_iterations): Likewise.
(decide_unroll_stupid): Likewise.
2017-11-27 Igor Tsimbalist <igor.v.tsimbalist@intel.com>
PR target/83109
......@@ -221,9 +221,10 @@ struct GTY ((chain_next ("%h.next"))) loop {
/* True if the loop is part of an oacc kernels region. */
unsigned in_oacc_kernels_region : 1;
/* The number of times to unroll the loop. 0, means no information
given, just do what we always do. A value of 1, means don't unroll
the loop. */
/* The number of times to unroll the loop. 0 means no information given,
just do what we always do. A value of 1 means do not unroll the loop.
A value of USHRT_MAX means unroll with no specific unrolling factor.
Other values means unroll with the given unrolling factor. */
unsigned short unroll;
/* For SIMD loops, this is a unique identifier of the loop, referenced
......
......@@ -395,7 +395,7 @@ decide_unroll_constant_iterations (struct loop *loop, int flags)
}
/* Check for an explicit unrolling factor. */
if (loop->unroll)
if (loop->unroll > 0 && loop->unroll < USHRT_MAX)
{
/* However we cannot unroll completely at the RTL level a loop with
constant number of iterations; it should have been peeled instead. */
......@@ -693,7 +693,7 @@ decide_unroll_runtime_iterations (struct loop *loop, int flags)
if (targetm.loop_unroll_adjust)
nunroll = targetm.loop_unroll_adjust (nunroll, loop);
if (loop->unroll)
if (loop->unroll > 0 && loop->unroll < USHRT_MAX)
nunroll = loop->unroll;
/* Skip big loops. */
......@@ -1177,7 +1177,7 @@ decide_unroll_stupid (struct loop *loop, int flags)
if (targetm.loop_unroll_adjust)
nunroll = targetm.loop_unroll_adjust (nunroll, loop);
if (loop->unroll)
if (loop->unroll > 0 && loop->unroll < USHRT_MAX)
nunroll = loop->unroll;
/* Skip big loops. */
......
2017-11-27 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/unroll1.ads: Remove alignment clause.
* gnat.dg/unroll2.ads: Likewise.
* gnat.dg/unroll3.ads: Likewise.
* gnat.dg/unroll1.adb: Remove bogus comment terminator.
* gnat.dg/unroll2.adb: Likewise.
* gnat.dg/unroll3.adb: Likewise.
* gnat.dg/unroll4.ad[sb]: New testcase.
* gnat.dg/unroll4_pkg.ads: New helper.
2017-11-27 Igor Tsimbalist <igor.v.tsimbalist@intel.com>
PR target/83109
......
......@@ -23,5 +23,5 @@ package body Unroll1 is
end Unroll1;
-- { dg-final { scan-tree-dump-times "Not unrolling loop .: user didn't want it unrolled completely" 2 "cunrolli" } } */
-- { dg-final { scan-rtl-dump-times "Not unrolling loop, user didn't want it unrolled" 2 "loop2_unroll" } } */
-- { dg-final { scan-tree-dump-times "Not unrolling loop .: user didn't want it unrolled completely" 2 "cunrolli" } }
-- { dg-final { scan-rtl-dump-times "Not unrolling loop, user didn't want it unrolled" 2 "loop2_unroll" } }
package Unroll1 is
type Sarray is array (1 .. 4) of Float;
for Sarray'Alignment use 16;
function "+" (X, Y : Sarray) return Sarray;
procedure Add (X, Y : Sarray; R : out Sarray);
......
......@@ -23,4 +23,4 @@ package body Unroll2 is
end Unroll2;
-- { dg-final { scan-tree-dump-times "note: loop with 3 iterations completely unrolled" 2 "cunrolli" } } */
-- { dg-final { scan-tree-dump-times "note: loop with 3 iterations completely unrolled" 2 "cunrolli" } }
package Unroll2 is
type Sarray is array (1 .. 4) of Float;
for Sarray'Alignment use 16;
function "+" (X, Y : Sarray) return Sarray;
procedure Add (X, Y : Sarray; R : out Sarray);
......
......@@ -23,4 +23,4 @@ package body Unroll3 is
end Unroll3;
-- { dg-final { scan-tree-dump-times "note: loop with 3 iterations completely unrolled" 2 "cunroll" } } */
-- { dg-final { scan-tree-dump-times "note: loop with 3 iterations completely unrolled" 2 "cunroll" } }
package Unroll3 is
type Sarray is array (1 .. 4) of Float;
for Sarray'Alignment use 16;
function "+" (X, Y : Sarray) return Sarray;
procedure Add (X, Y : Sarray; R : out Sarray);
......
-- { dg-do compile }
-- { dg-options "-O -fdump-rtl-loop2_unroll-details" }
package body Unroll4 is
function "+" (X, Y : Sarray) return Sarray is
R : Sarray;
begin
for I in Sarray'Range loop
pragma Loop_Optimize (Unroll);
R(I) := X(I) + Y(I);
end loop;
return R;
end;
procedure Add (X, Y : Sarray; R : out Sarray) is
begin
for I in Sarray'Range loop
pragma Loop_Optimize (Unroll);
R(I) := X(I) + Y(I);
end loop;
end;
end Unroll4;
-- { dg-final { scan-rtl-dump-times "note: loop unrolled 7 times" 2 "loop2_unroll" } }
with Unroll4_Pkg; use Unroll4_Pkg;
package Unroll4 is
type Sarray is array (1 .. N) of Float;
function "+" (X, Y : Sarray) return Sarray;
procedure Add (X, Y : Sarray; R : out Sarray);
end Unroll4;
package Unroll4_Pkg is
function N return Positive;
end Unroll4_Pkg;
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