Commit 966b587e by Eric Botcazou Committed by Eric Botcazou

stor-layout.c (skip_simple_constant_arithmetic): Move to...

	* stor-layout.c (skip_simple_constant_arithmetic): Move to...
	* tree.c (skip_simple_constant_arithmetic): ...here and make public.
	(skip_simple_arithmetic): Tidy up.
	* tree.h (skip_simple_constant_arithmetic): Declare.
ada/
	* gcc-interface/decl.c (elaborate_expression_1): Skip only constant
	arithmetics when looking for a read-only variable in the expression.

From-SVN: r197815
parent 76545796
2013-04-11 Eric Botcazou <ebotcazou@adacore.com>
* stor-layout.c (skip_simple_constant_arithmetic): Move to...
* tree.c (skip_simple_constant_arithmetic): ...here and make public.
(skip_simple_arithmetic): Tidy up.
* tree.h (skip_simple_constant_arithmetic): Declare.
2013-04-11 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com> 2013-04-11 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
* config/aarch64/aarch64.h (REVERSIBLE_CC_MODE): Define. * config/aarch64/aarch64.h (REVERSIBLE_CC_MODE): Define.
......
2013-04-11 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (elaborate_expression_1): Skip only constant
arithmetics when looking for a read-only variable in the expression.
2013-04-11 Javier Miranda <miranda@adacore.com> 2013-04-11 Javier Miranda <miranda@adacore.com>
* check.ads, exp_ch6.adb (Install_Null_Excluding_Check): No check in * check.ads, exp_ch6.adb (Install_Null_Excluding_Check): No check in
......
...@@ -6186,12 +6186,13 @@ elaborate_expression_1 (tree gnu_expr, Entity_Id gnat_entity, tree gnu_name, ...@@ -6186,12 +6186,13 @@ elaborate_expression_1 (tree gnu_expr, Entity_Id gnat_entity, tree gnu_name,
expr_variable_p = false; expr_variable_p = false;
else else
{ {
/* Skip any conversions and simple arithmetics to see if the expression /* Skip any conversions and simple constant arithmetics to see if the
is based on a read-only variable. expression is based on a read-only variable.
??? This really should remain read-only, but we have to think about ??? This really should remain read-only, but we have to think about
the typing of the tree here. */ the typing of the tree here. */
tree inner tree inner = remove_conversions (gnu_expr, true);
= skip_simple_arithmetic (remove_conversions (gnu_expr, true));
inner = skip_simple_constant_arithmetic (inner);
if (handled_component_p (inner)) if (handled_component_p (inner))
{ {
......
...@@ -98,32 +98,6 @@ variable_size (tree size) ...@@ -98,32 +98,6 @@ variable_size (tree size)
/* An array of functions used for self-referential size computation. */ /* An array of functions used for self-referential size computation. */
static GTY(()) vec<tree, va_gc> *size_functions; static GTY(()) vec<tree, va_gc> *size_functions;
/* Look inside EXPR into simple arithmetic operations involving constants.
Return the outermost non-arithmetic or non-constant node. */
static tree
skip_simple_constant_arithmetic (tree expr)
{
while (true)
{
if (UNARY_CLASS_P (expr))
expr = TREE_OPERAND (expr, 0);
else if (BINARY_CLASS_P (expr))
{
if (TREE_CONSTANT (TREE_OPERAND (expr, 1)))
expr = TREE_OPERAND (expr, 0);
else if (TREE_CONSTANT (TREE_OPERAND (expr, 0)))
expr = TREE_OPERAND (expr, 1);
else
break;
}
else
break;
}
return expr;
}
/* Similar to copy_tree_r but do not copy component references involving /* Similar to copy_tree_r but do not copy component references involving
PLACEHOLDER_EXPRs. These nodes are spotted in find_placeholder_in_expr PLACEHOLDER_EXPRs. These nodes are spotted in find_placeholder_in_expr
and substituted in substitute_in_expr. */ and substituted in substitute_in_expr. */
......
2013-04-11 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/array23.adb: New test.
* gnat.dg/array23_pkg[123].ads: New helpers.
2013-04-11 Jeff Law <law@redhat.com> 2013-04-11 Jeff Law <law@redhat.com>
PR tree-optimization/56900 PR tree-optimization/56900
......
-- { dg-do link }
with Array23_Pkg1;
with Array23_Pkg2;
procedure Array23 is
A : Array23_Pkg1.Arr;
begin
A(Array23_Pkg2.One)(1) := 0;
end;
with Array23_Pkg2;
package Array23_Pkg1 is
C2 : Natural := Array23_Pkg2.C1;
subtype Index is Natural range 0 .. C2;
type Inner is array (Index) of Natural;
type Arr is array (Array23_Pkg2.Index) of Inner;
end Array23_Pkg1;
with Array23_Pkg3;
package Array23_Pkg2 is
C1 : Natural := Array23_Pkg3.C0;
type Enum is (Zero, One, Two);
subtype Index is Enum range One .. Enum'val(C1);
end Array23_Pkg2;
package Array23_Pkg3 is
C0 : Natural := 2;
end Array23_Pkg3;
...@@ -2830,14 +2830,12 @@ save_expr (tree expr) ...@@ -2830,14 +2830,12 @@ save_expr (tree expr)
return t; return t;
} }
/* Look inside EXPR and into any simple arithmetic operations. Return /* Look inside EXPR into any simple arithmetic operations. Return the
the innermost non-arithmetic node. */ outermost non-arithmetic or non-invariant node. */
tree tree
skip_simple_arithmetic (tree expr) skip_simple_arithmetic (tree expr)
{ {
tree inner;
/* We don't care about whether this can be used as an lvalue in this /* We don't care about whether this can be used as an lvalue in this
context. */ context. */
while (TREE_CODE (expr) == NON_LVALUE_EXPR) while (TREE_CODE (expr) == NON_LVALUE_EXPR)
...@@ -2847,17 +2845,16 @@ skip_simple_arithmetic (tree expr) ...@@ -2847,17 +2845,16 @@ skip_simple_arithmetic (tree expr)
a constant, it will be more efficient to not make another SAVE_EXPR since a constant, it will be more efficient to not make another SAVE_EXPR since
it will allow better simplification and GCSE will be able to merge the it will allow better simplification and GCSE will be able to merge the
computations if they actually occur. */ computations if they actually occur. */
inner = expr; while (true)
while (1)
{ {
if (UNARY_CLASS_P (inner)) if (UNARY_CLASS_P (expr))
inner = TREE_OPERAND (inner, 0); expr = TREE_OPERAND (expr, 0);
else if (BINARY_CLASS_P (inner)) else if (BINARY_CLASS_P (expr))
{ {
if (tree_invariant_p (TREE_OPERAND (inner, 1))) if (tree_invariant_p (TREE_OPERAND (expr, 1)))
inner = TREE_OPERAND (inner, 0); expr = TREE_OPERAND (expr, 0);
else if (tree_invariant_p (TREE_OPERAND (inner, 0))) else if (tree_invariant_p (TREE_OPERAND (expr, 0)))
inner = TREE_OPERAND (inner, 1); expr = TREE_OPERAND (expr, 1);
else else
break; break;
} }
...@@ -2865,9 +2862,37 @@ skip_simple_arithmetic (tree expr) ...@@ -2865,9 +2862,37 @@ skip_simple_arithmetic (tree expr)
break; break;
} }
return inner; return expr;
} }
/* Look inside EXPR into simple arithmetic operations involving constants.
Return the outermost non-arithmetic or non-constant node. */
tree
skip_simple_constant_arithmetic (tree expr)
{
while (TREE_CODE (expr) == NON_LVALUE_EXPR)
expr = TREE_OPERAND (expr, 0);
while (true)
{
if (UNARY_CLASS_P (expr))
expr = TREE_OPERAND (expr, 0);
else if (BINARY_CLASS_P (expr))
{
if (TREE_CONSTANT (TREE_OPERAND (expr, 1)))
expr = TREE_OPERAND (expr, 0);
else if (TREE_CONSTANT (TREE_OPERAND (expr, 0)))
expr = TREE_OPERAND (expr, 1);
else
break;
}
else
break;
}
return expr;
}
/* Return which tree structure is used by T. */ /* Return which tree structure is used by T. */
......
...@@ -5339,11 +5339,16 @@ extern tree staticp (tree); ...@@ -5339,11 +5339,16 @@ extern tree staticp (tree);
extern tree save_expr (tree); extern tree save_expr (tree);
/* Look inside EXPR and into any simple arithmetic operations. Return /* Look inside EXPR into any simple arithmetic operations. Return the
the innermost non-arithmetic node. */ outermost non-arithmetic or non-invariant node. */
extern tree skip_simple_arithmetic (tree); extern tree skip_simple_arithmetic (tree);
/* Look inside EXPR into simple arithmetic operations involving constants.
Return the outermost non-arithmetic or non-constant node. */
extern tree skip_simple_constant_arithmetic (tree);
/* Return which tree structure is used by T. */ /* Return which tree structure is used by T. */
enum tree_node_structure_enum tree_node_structure (const_tree); enum tree_node_structure_enum tree_node_structure (const_tree);
......
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