From 646f94144c017251b6a4eff7bbf74da43201cea1 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 21 Mar 2011 12:11:06 +0000 Subject: [PATCH] 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 --- gcc/ada/ChangeLog | 8 ++++++-- gcc/ada/gcc-interface/decl.c | 20 ++++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 46e4e22f2c9..a61c1e69e70 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,8 +1,12 @@ +2011-03-21 Eric Botcazou + + * gcc-interface/decl.c (elaborate_expression_1): When optimization is + disabled, use the variable for bounds of loop iteration scheme. + 2011-03-21 Kai Tietz PR target/12171 - * gcc-interface/utils.c (gnat_internal_attribute_table): - Add new element. + * gcc-interface/utils.c (gnat_internal_attribute_table): Add new column 2011-03-17 Eric Botcazou diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 696e49a703b..f254ac4d0fc 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; -- 2.30.2