diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2013-02-06 10:47:24 +0000 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2013-02-06 11:47:24 +0100 |
commit | a75ea2953b2cc328db203807fd769f17bcd4c476 (patch) | |
tree | faab0c1f5011b395ce016d1d0669a8ce65902b00 /gcc | |
parent | 9b7424a705ede81bcf45b214744872e54ffb9297 (diff) | |
download | gcc-a75ea2953b2cc328db203807fd769f17bcd4c476.zip gcc-a75ea2953b2cc328db203807fd769f17bcd4c476.tar.gz gcc-a75ea2953b2cc328db203807fd769f17bcd4c476.tar.bz2 |
snames.ads-tmpl (Name_Loop_Optimize, [...]): New pragma-related names.
2013-02-06 Eric Botcazou <ebotcazou@adacore.com>
* snames.ads-tmpl (Name_Loop_Optimize, Name_No_Unroll,
Name_Unroll, Name_No_Vector, Name_Vector): New pragma-related
names.
(Pragma_Id): Add Pragma_Loop_Optimize value.
* par-prag.adb (Prag): Handle Pragma_Loop_Optimize.
* sem_prag.adb (Check_Loop_Invariant_Variant_Placement): Rename to...
(Check_Loop_Pragma_Placement): ...this.
(Analyze_Pragma)
<Pragma_Loop_Invariant>: Adjust to above renaming.
<Loop_Variant>: Likewise.
<Pragma_Loop_Optimize>: Implement new pragma Loop_Optimize.
(Sig_Flags): Add Pragma_Loop_Optimize.
* gnat_rm.texi (Implementation Defined Pragmas): Add Loop_Optimize.
* gnat_ugn.texi (Vectorization of loops): Mention Loop_Optimize.
From-SVN: r195799
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/ada/gnat_rm.texi | 76 | ||||
-rw-r--r-- | gcc/ada/gnat_ugn.texi | 11 | ||||
-rw-r--r-- | gcc/ada/par-prag.adb | 1 | ||||
-rw-r--r-- | gcc/ada/sem_prag.adb | 47 | ||||
-rw-r--r-- | gcc/ada/snames.ads-tmpl | 6 |
6 files changed, 147 insertions, 11 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 8f99e15..af53653 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,20 @@ +2013-02-06 Eric Botcazou <ebotcazou@adacore.com> + + * snames.ads-tmpl (Name_Loop_Optimize, Name_No_Unroll, + Name_Unroll, Name_No_Vector, Name_Vector): New pragma-related + names. + (Pragma_Id): Add Pragma_Loop_Optimize value. + * par-prag.adb (Prag): Handle Pragma_Loop_Optimize. + * sem_prag.adb (Check_Loop_Invariant_Variant_Placement): Rename to... + (Check_Loop_Pragma_Placement): ...this. + (Analyze_Pragma) + <Pragma_Loop_Invariant>: Adjust to above renaming. + <Loop_Variant>: Likewise. + <Pragma_Loop_Optimize>: Implement new pragma Loop_Optimize. + (Sig_Flags): Add Pragma_Loop_Optimize. + * gnat_rm.texi (Implementation Defined Pragmas): Add Loop_Optimize. + * gnat_ugn.texi (Vectorization of loops): Mention Loop_Optimize. + 2013-02-06 Robert Dewar <dewar@adacore.com> * osint.ads: Minor fix of typo. diff --git a/gcc/ada/gnat_rm.texi b/gcc/ada/gnat_rm.texi index 1d2003e..1c250d0 100644 --- a/gcc/ada/gnat_rm.texi +++ b/gcc/ada/gnat_rm.texi @@ -176,6 +176,7 @@ Implementation Defined Pragmas * Pragma Linker_Destructor:: * Pragma Linker_Section:: * Pragma Long_Float:: +* Pragma Loop_Optimize:: * Pragma Machine_Attribute:: * Pragma Main:: * Pragma Main_Storage:: @@ -925,6 +926,7 @@ consideration, the use of these pragmas should be minimized. * Pragma Linker_Destructor:: * Pragma Linker_Section:: * Pragma Long_Float:: +* Pragma Loop_Optimize:: * Pragma Machine_Attribute:: * Pragma Main:: * Pragma Main_Storage:: @@ -2927,6 +2929,7 @@ the target's overriding subprogram kind. @node Pragma Implicit_Packing @unnumberedsec Pragma Implicit_Packing @findex Implicit_Packing +@cindex Rational Profile @noindent Syntax: @@ -3845,6 +3848,55 @@ For further details on this pragma, see the @cite{DEC Ada Language Reference Manual}, section 3.5.7b. Note that to use this pragma, the standard runtime libraries must be recompiled. +@node Pragma Loop_Optimize +@unnumberedsec Pragma Loop_Optimize +@findex Loop_Optimize +@noindent +Syntax: + +@smallexample @c ada +pragma Loop_Optimize (OPTIMIZATION_HINT @{, OPTIMIZATION_HINT@}); + +OPTIMIZATION_HINT ::= No_Unroll | Unroll | No_Vector | Vector +@end smallexample + +@noindent +This pragma must appear immediately within a loop statement. It allows the +programmer to specify optimization hints for the enclosing loop. The hints +are not mutually exclusive and can be freely mixed, but not all combinations +will yield a sensible outcome. + +There are four supported optimization hints for a loop: +@itemize @bullet +@item No_Unroll + +The loop must not be unrolled. This is a strong hint: the compiler will not +unroll a loop marked with this hint. + +@item Unroll + +The loop should be unrolled. This is a weak hint: the compiler will try to +apply unrolling to this loop preferably to other optimizations, notably +vectorization, but there is no guarantee that the loop will be unrolled. + +@item No_Vector + +The loop must not be vectorized. This is a strong hint: the compiler will not +vectorize a loop marked with this hint. + +@item Vector + +The loop should be vectorized. This is a weak hint: the compiler will try to +apply vectorization to this loop preferably to other optimizations, notably +unrolling, but there is no guarantee that the loop will be vectorized. + +@end itemize + +These hints do not void the need to pass the appropriate switches to the +compiler in order to enable the relevant optimizations, that is to say +@option{-funroll-loops} for unrolling and @option{-ftree-vectorize} for +vectorization. + @node Pragma Machine_Attribute @unnumberedsec Pragma Machine_Attribute @findex Machine_Attribute @@ -4865,6 +4917,29 @@ This set of restrictions causes the automatic selection of a simplified version of the run time that provides improved performance for the limited set of tasking functionality permitted by this set of restrictions. +@node Pragma Profile (Rational) +@unnumberedsec Pragma Profile (Rational) +@findex Rational compatibility mode +@noindent +Syntax: + +@smallexample @c ada +pragma Profile (Rational); +@end smallexample + +@noindent +The Rational profile is intended to facilitate porting legacy code that +compiles with the Rational APEX compiler, even when the code includes non- +conforming Ada constructs. The profile enables the following three pragmas: + + +@itemize @bullet +pragma Implicit_Packing; +pragma Overriding_Renamings; +pragma Use_VADS_Size; +@end itemize + +@noindent @node Pragma Psect_Object @unnumberedsec Pragma Psect_Object @findex Psect_Object @@ -6021,6 +6096,7 @@ of Ada as an implementation-defined pragma. @node Pragma Use_VADS_Size @unnumberedsec Pragma Use_VADS_Size @cindex @code{Size}, VADS compatibility +@cindex Rational profile @findex Use_VADS_Size @noindent Syntax: diff --git a/gcc/ada/gnat_ugn.texi b/gcc/ada/gnat_ugn.texi index f36faff..bf00fc7 100644 --- a/gcc/ada/gnat_ugn.texi +++ b/gcc/ada/gnat_ugn.texi @@ -10978,6 +10978,17 @@ types. This is so because, the less information the compiler has about the bounds of the array, the more fallback code it needs to generate in order to fix things up at run time. +It is possible to specify that a given loop should be subject to vectorization +preferably to other optimizations by means of pragma @code{Loop_Optimize}: + +@smallexample @c ada + pragma Loop_Optimize (Vector); +@end smallexample + +@noindent +placed immediately within the loop will convey the appropriate hint to the +compiler for this loop. + You can obtain information about the vectorization performed by the compiler by specifying @option{-ftree-vectorizer-verbose=N}. For more details of this switch, see @ref{Debugging Options,,Options for Debugging Your Program diff --git a/gcc/ada/par-prag.adb b/gcc/ada/par-prag.adb index 4e02bfb..60bc6c1 100644 --- a/gcc/ada/par-prag.adb +++ b/gcc/ada/par-prag.adb @@ -1203,6 +1203,7 @@ begin Pragma_Locking_Policy | Pragma_Long_Float | Pragma_Loop_Invariant | + Pragma_Loop_Optimize | Pragma_Loop_Variant | Pragma_Machine_Attribute | Pragma_Main | diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 70916cd..2a67b85 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -618,9 +618,9 @@ package body Sem_Prag is -- Common processing for first argument of pragma Interrupt_Handler or -- pragma Attach_Handler. - procedure Check_Loop_Invariant_Variant_Placement; - -- Verify whether pragma Loop_Invariant or pragma Loop_Variant appear - -- immediately within a construct restricted to loops. + procedure Check_Loop_Pragma_Placement; + -- Verify whether pragma Loop_Invariant or Loop_Optimize or Loop_Variant + -- appear immediately within a construct restricted to loops. procedure Check_Is_In_Decl_Part_Or_Package_Spec; -- Check that pragma appears in a declarative part, or in a package @@ -1922,11 +1922,11 @@ package body Sem_Prag is end if; end Check_Interrupt_Or_Attach_Handler; - -------------------------------------------- - -- Check_Loop_Invariant_Variant_Placement -- - -------------------------------------------- + --------------------------------- + -- Check_Loop_Pragma_Placement -- + --------------------------------- - procedure Check_Loop_Invariant_Variant_Placement is + procedure Check_Loop_Pragma_Placement is procedure Placement_Error (Constr : Node_Id); pragma No_Return (Placement_Error); -- Node Constr denotes the last loop restricted construct before we @@ -1955,7 +1955,7 @@ package body Sem_Prag is Prev : Node_Id; Stmt : Node_Id; - -- Start of processing for Check_Loop_Invariant_Variant_Placement + -- Start of processing for Check_Loop_Pragma_Placement begin Prev := N; @@ -2011,7 +2011,7 @@ package body Sem_Prag is return; end if; end loop; - end Check_Loop_Invariant_Variant_Placement; + end Check_Loop_Pragma_Placement; ------------------------------------------- -- Check_Is_In_Decl_Part_Or_Package_Spec -- @@ -12341,7 +12341,7 @@ package body Sem_Prag is GNAT_Pragma; S14_Pragma; Check_Arg_Count (1); - Check_Loop_Invariant_Variant_Placement; + Check_Loop_Pragma_Placement; -- Completely ignore if disabled @@ -12370,6 +12370,30 @@ package body Sem_Prag is Analyze (N); end Loop_Invariant; + ------------------- + -- Loop_Optimize -- + ------------------- + + -- pragma Loop_Optimize ( OPTIMIZATION_HINT {, OPTIMIZATION_HINT } ); + + -- OPTIMIZATION_HINT ::= No_Unroll | Unroll | No_Vector | Vector + + when Pragma_Loop_Optimize => Loop_Optimize : declare + Hint : Node_Id; + + begin + GNAT_Pragma; + Check_At_Least_N_Arguments (1); + Check_No_Identifiers; + Hint := First (Pragma_Argument_Associations (N)); + while Present (Hint) loop + Check_Arg_Is_One_Of (Hint, Name_No_Unroll, Name_Unroll, + Name_No_Vector, Name_Vector); + Next (Hint); + end loop; + Check_Loop_Pragma_Placement; + end Loop_Optimize; + ------------------ -- Loop_Variant -- ------------------ @@ -12388,7 +12412,7 @@ package body Sem_Prag is GNAT_Pragma; S14_Pragma; Check_At_Least_N_Arguments (1); - Check_Loop_Invariant_Variant_Placement; + Check_Loop_Pragma_Placement; -- Completely ignore if disabled @@ -16598,6 +16622,7 @@ package body Sem_Prag is Pragma_Locking_Policy => -1, Pragma_Long_Float => -1, Pragma_Loop_Invariant => -1, + Pragma_Loop_Optimize => -1, Pragma_Loop_Variant => -1, Pragma_Machine_Attribute => -1, Pragma_Main => -1, diff --git a/gcc/ada/snames.ads-tmpl b/gcc/ada/snames.ads-tmpl index 55c6329..91c9aee 100644 --- a/gcc/ada/snames.ads-tmpl +++ b/gcc/ada/snames.ads-tmpl @@ -408,6 +408,7 @@ package Snames is Name_Locking_Policy : constant Name_Id := N + $; Name_Long_Float : constant Name_Id := N + $; -- VMS Name_Loop_Invariant : constant Name_Id := N + $; -- GNAT + Name_Loop_Optimize : constant Name_Id := N + $; -- GNAT Name_Loop_Variant : constant Name_Id := N + $; -- GNAT Name_No_Run_Time : constant Name_Id := N + $; -- GNAT Name_No_Strict_Aliasing : constant Name_Id := N + $; -- GNAT @@ -727,6 +728,8 @@ package Snames is Name_No_Specification_Of_Aspect : constant Name_Id := N + $; Name_No_Task_Attributes : constant Name_Id := N + $; Name_No_Task_Attributes_Package : constant Name_Id := N + $; + Name_No_Unroll : constant Name_Id := N + $; + Name_No_Vector : constant Name_Id := N + $; Name_Nominal : constant Name_Id := N + $; Name_On : constant Name_Id := N + $; Name_Optional : constant Name_Id := N + $; @@ -762,10 +765,12 @@ package Snames is Name_Unit_Name : constant Name_Id := N + $; Name_Unknown : constant Name_Id := N + $; Name_Unrestricted : constant Name_Id := N + $; + Name_Unroll : constant Name_Id := N + $; Name_Uppercase : constant Name_Id := N + $; Name_User : constant Name_Id := N + $; Name_Variant : constant Name_Id := N + $; Name_VAX_Float : constant Name_Id := N + $; + Name_Vector : constant Name_Id := N + $; Name_VMS : constant Name_Id := N + $; Name_Vtable_Ptr : constant Name_Id := N + $; Name_Working_Storage : constant Name_Id := N + $; @@ -1705,6 +1710,7 @@ package Snames is Pragma_Locking_Policy, Pragma_Long_Float, Pragma_Loop_Invariant, + Pragma_Loop_Optimize, Pragma_Loop_Variant, Pragma_No_Run_Time, Pragma_No_Strict_Aliasing, |