aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-04-14 14:18:26 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-04-14 14:18:26 +0000
commit3418f5e92a6071ffb4d877c1824b0cf0406dbfe1 (patch)
treeb966c153d01e685a86c6307ca5047e636042ea7b /gcc/ada/gcc-interface
parentcddaefa37616be8fdc85d6e627962f828c75ae2b (diff)
downloadgcc-3418f5e92a6071ffb4d877c1824b0cf0406dbfe1.zip
gcc-3418f5e92a6071ffb4d877c1824b0cf0406dbfe1.tar.gz
gcc-3418f5e92a6071ffb4d877c1824b0cf0406dbfe1.tar.bz2
snames.ads-tmpl (Name_Ivdep): New pragma-related name.
* snames.ads-tmpl (Name_Ivdep): New pragma-related name. * sem_prag.adb (Analyze_Pragma) <Pragma_Loop_Optimize>: Add support for Ivdep hint. * gnat_rm.texi (Implementation Defined Pragmas): Document new Ivdep hint for Loop_Optimize. * gnat_ugn.texi (Vectorization of loops): Mention new Ivdep hint. * gcc-interface/trans.c (Pragma_to_gnu) <Pragma_Loop_Optimize>: Deal with new Ivdep hint. * gcc-interface/ada-tree.h (LOOP_STMT_IVDEP): New macro. * gcc-interface/trans.c (Pragma_to_gnu) <Pragma_Loop_Optimize>: Deal with new Ivdep hint. (gnat_gimplify_stmt) <LOOP_STMT>: Propagate the loop hints. From-SVN: r209375
Diffstat (limited to 'gcc/ada/gcc-interface')
-rw-r--r--gcc/ada/gcc-interface/ada-tree.h11
-rw-r--r--gcc/ada/gcc-interface/trans.c23
2 files changed, 23 insertions, 11 deletions
diff --git a/gcc/ada/gcc-interface/ada-tree.h b/gcc/ada/gcc-interface/ada-tree.h
index c1b45ef..5ea386f 100644
--- a/gcc/ada/gcc-interface/ada-tree.h
+++ b/gcc/ada/gcc-interface/ada-tree.h
@@ -6,7 +6,7 @@
* *
* C Header File *
* *
- * Copyright (C) 1992-2013, Free Software Foundation, Inc. *
+ * Copyright (C) 1992-2014, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
@@ -504,10 +504,11 @@ do { \
#define LOOP_STMT_TOP_UPDATE_P(NODE) TREE_LANG_FLAG_1 (LOOP_STMT_CHECK (NODE))
/* Optimization hints on loops. */
-#define LOOP_STMT_NO_UNROLL(NODE) TREE_LANG_FLAG_2 (LOOP_STMT_CHECK (NODE))
-#define LOOP_STMT_UNROLL(NODE) TREE_LANG_FLAG_3 (LOOP_STMT_CHECK (NODE))
-#define LOOP_STMT_NO_VECTOR(NODE) TREE_LANG_FLAG_4 (LOOP_STMT_CHECK (NODE))
-#define LOOP_STMT_VECTOR(NODE) TREE_LANG_FLAG_5 (LOOP_STMT_CHECK (NODE))
+#define LOOP_STMT_IVDEP(NODE) TREE_LANG_FLAG_2 (LOOP_STMT_CHECK (NODE))
+#define LOOP_STMT_NO_UNROLL(NODE) TREE_LANG_FLAG_3 (LOOP_STMT_CHECK (NODE))
+#define LOOP_STMT_UNROLL(NODE) TREE_LANG_FLAG_4 (LOOP_STMT_CHECK (NODE))
+#define LOOP_STMT_NO_VECTOR(NODE) TREE_LANG_FLAG_5 (LOOP_STMT_CHECK (NODE))
+#define LOOP_STMT_VECTOR(NODE) TREE_LANG_FLAG_6 (LOOP_STMT_CHECK (NODE))
#define EXIT_STMT_COND(NODE) TREE_OPERAND_CHECK_CODE (NODE, EXIT_STMT, 0)
#define EXIT_STMT_LABEL(NODE) TREE_OPERAND_CHECK_CODE (NODE, EXIT_STMT, 1)
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 59358ff..3ab503f 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -1268,10 +1268,14 @@ Pragma_to_gnu (Node_Id gnat_node)
Present (gnat_temp);
gnat_temp = Next (gnat_temp))
{
- tree gnu_loop_stmt = gnu_loop_stack ->last ()->stmt;
+ tree gnu_loop_stmt = gnu_loop_stack->last ()->stmt;
switch (Chars (Expression (gnat_temp)))
{
+ case Name_Ivdep:
+ LOOP_STMT_IVDEP (gnu_loop_stmt) = 1;
+ break;
+
case Name_No_Unroll:
LOOP_STMT_NO_UNROLL (gnu_loop_stmt) = 1;
break;
@@ -7747,13 +7751,20 @@ gnat_gimplify_stmt (tree *stmt_p)
tree gnu_cond = LOOP_STMT_COND (stmt);
tree gnu_update = LOOP_STMT_UPDATE (stmt);
tree gnu_end_label = LOOP_STMT_LABEL (stmt);
- tree t;
/* Build the condition expression from the test, if any. */
if (gnu_cond)
- gnu_cond
- = build3 (COND_EXPR, void_type_node, gnu_cond, alloc_stmt_list (),
- build1 (GOTO_EXPR, void_type_node, gnu_end_label));
+ {
+ /* Deal with the optimization hints. */
+ if (LOOP_STMT_IVDEP (stmt))
+ gnu_cond = build2 (ANNOTATE_EXPR, TREE_TYPE (gnu_cond), gnu_cond,
+ build_int_cst (integer_type_node,
+ annot_expr_ivdep_kind));
+
+ gnu_cond
+ = build3 (COND_EXPR, void_type_node, gnu_cond, NULL_TREE,
+ build1 (GOTO_EXPR, void_type_node, gnu_end_label));
+ }
/* Set to emit the statements of the loop. */
*stmt_p = NULL_TREE;
@@ -7782,7 +7793,7 @@ gnat_gimplify_stmt (tree *stmt_p)
if (gnu_update && !LOOP_STMT_TOP_UPDATE_P (stmt))
append_to_statement_list (gnu_update, stmt_p);
- t = build1 (GOTO_EXPR, void_type_node, gnu_start_label);
+ tree t = build1 (GOTO_EXPR, void_type_node, gnu_start_label);
SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (gnu_end_label));
append_to_statement_list (t, stmt_p);