aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/decl.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2011-03-21 12:11:06 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-03-21 12:11:06 +0000
commit646f94144c017251b6a4eff7bbf74da43201cea1 (patch)
treef1ec6d9682d666e81c7acf43d8f1b277617396f6 /gcc/ada/gcc-interface/decl.c
parenteb97510932f53389907b8f0a20fdc37acdf62f1b (diff)
downloadgcc-646f94144c017251b6a4eff7bbf74da43201cea1.zip
gcc-646f94144c017251b6a4eff7bbf74da43201cea1.tar.gz
gcc-646f94144c017251b6a4eff7bbf74da43201cea1.tar.bz2
decl.c (elaborate_expression_1): When optimization is disabled, use the variable for bounds of loop iteration scheme.
* gcc-interface/decl.c (elaborate_expression_1): When optimization is disabled, use the variable for bounds of loop iteration scheme. From-SVN: r171220
Diffstat (limited to 'gcc/ada/gcc-interface/decl.c')
-rw-r--r--gcc/ada/gcc-interface/decl.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 696e49a..f254ac4 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -6004,7 +6004,7 @@ elaborate_expression_1 (tree gnu_expr, Entity_Id gnat_entity, tree gnu_name,
bool definition, bool need_debug)
{
const bool expr_global_p = Is_Public (gnat_entity) || global_bindings_p ();
- bool expr_variable_p;
+ bool expr_variable_p, use_variable;
tree gnu_decl;
/* In most cases, we won't see a naked FIELD_DECL because a discriminant
@@ -6058,8 +6058,18 @@ elaborate_expression_1 (tree gnu_expr, Entity_Id gnat_entity, tree gnu_name,
&& (TREE_READONLY (inner) || DECL_READONLY_ONCE_ELAB (inner)));
}
- /* Now create the variable if we need it. */
- if (need_debug || (expr_variable_p && expr_global_p))
+ /* We only need to use the variable if we are in a global context since GCC
+ can do the right thing in the local case. However, when not optimizing,
+ use it for bounds of loop iteration scheme to avoid code duplication. */
+ use_variable = expr_variable_p
+ && (expr_global_p
+ || (!optimize
+ && Is_Itype (gnat_entity)
+ && Nkind (Associated_Node_For_Itype (gnat_entity))
+ == N_Loop_Parameter_Specification));
+
+ /* Now create it, possibly only for debugging purposes. */
+ if (use_variable || need_debug)
gnu_decl
= create_var_decl (create_concat_name (gnat_entity,
IDENTIFIER_POINTER (gnu_name)),
@@ -6067,9 +6077,7 @@ elaborate_expression_1 (tree gnu_expr, Entity_Id gnat_entity, tree gnu_name,
!need_debug, Is_Public (gnat_entity),
!definition, expr_global_p, NULL, gnat_entity);
- /* We only need to use this variable if we are in global context since GCC
- can do the right thing in the local case. */
- if (expr_global_p && expr_variable_p)
+ if (use_variable)
return gnu_decl;
return expr_variable_p ? gnat_save_expr (gnu_expr) : gnu_expr;