Re: [patch] Move generic tree functions from expr.h to tree.h

2015-05-27 Thread Richard Biener
On Wed, May 27, 2015 at 12:00 PM, Eric Botcazou ebotca...@adacore.com wrote:
 Hi,

 a few functions manipulating generic trees from expr.c are useful for FEs too
 and some of them (array_ref_{low,up}_bound, get_inner_reference) are already
 declared in tree.h instead of expr.h.  This patch moves 3 similar functions
 (array_ref_element_size, array_at_struct_end_p, component_ref_field_offset).

 Tested on x86_64-suse-linux, OK for the mainline?

No.  Prototypes of functions defined in A.c should be in A.h, not in some other
header.  We've been (slowly) moving to that.  You should have moved them all
to expr.h instead, or move the implementations to tree.c.

Richard.


 2015-05-27  Eric Botcazou  ebotca...@adacore.com

 * expr.h (array_at_struct_end_p): Move to...
 (array_ref_element_size): Likewise.
 (component_ref_field_offset): Likewise.
 * tree.h (array_ref_element_size): ...here.
 (array_at_struct_end_p): Likewise.
 (component_ref_field_offset): Likewise.
 * expr.c (array_ref_up_bound): Move around.


 --
 Eric Botcazou


[patch] Move generic tree functions from expr.h to tree.h

2015-05-27 Thread Eric Botcazou
Hi,

a few functions manipulating generic trees from expr.c are useful for FEs too 
and some of them (array_ref_{low,up}_bound, get_inner_reference) are already 
declared in tree.h instead of expr.h.  This patch moves 3 similar functions 
(array_ref_element_size, array_at_struct_end_p, component_ref_field_offset).

Tested on x86_64-suse-linux, OK for the mainline?


2015-05-27  Eric Botcazou  ebotca...@adacore.com

* expr.h (array_at_struct_end_p): Move to...
(array_ref_element_size): Likewise.
(component_ref_field_offset): Likewise.
* tree.h (array_ref_element_size): ...here.
(array_at_struct_end_p): Likewise.
(component_ref_field_offset): Likewise.
* expr.c (array_ref_up_bound): Move around.


-- 
Eric BotcazouIndex: expr.h
===
--- expr.h	(revision 223736)
+++ expr.h	(working copy)
@@ -281,19 +281,10 @@ rtx get_personality_function (tree);
 extern int can_move_by_pieces (unsigned HOST_WIDE_INT, unsigned int);
 
 extern unsigned HOST_WIDE_INT highest_pow2_factor (const_tree);
-bool array_at_struct_end_p (tree);
-
-/* Return a tree of sizetype representing the size, in bytes, of the element
-   of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-extern tree array_ref_element_size (tree);
 
 extern bool categorize_ctor_elements (const_tree, HOST_WIDE_INT *,
   HOST_WIDE_INT *, bool *);
 
-/* Return a tree representing the offset, in bytes, of the field referenced
-   by EXP.  This does not include any offset in DECL_FIELD_BIT_OFFSET.  */
-extern tree component_ref_field_offset (tree);
-
 extern void expand_operands (tree, tree, rtx, rtx*, rtx*,
 			 enum expand_modifier);
 
Index: expr.c
===
--- expr.c	(revision 223736)
+++ expr.c	(working copy)
@@ -7002,6 +7002,23 @@ array_ref_low_bound (tree exp)
   return build_int_cst (TREE_TYPE (TREE_OPERAND (exp, 1)), 0);
 }
 
+/* Return a tree representing the upper bound of the array mentioned in
+   EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
+
+tree
+array_ref_up_bound (tree exp)
+{
+  tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
+
+  /* If there is a domain type and it has an upper bound, use it, substituting
+ for a PLACEHOLDER_EXPR as needed.  */
+  if (domain_type  TYPE_MAX_VALUE (domain_type))
+return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MAX_VALUE (domain_type), exp);
+
+  /* Otherwise fail.  */
+  return NULL_TREE;
+}
+
 /* Returns true if REF is an array reference to an array at the end of
a structure.  If this is the case, the array may be allocated larger
than its upper bound implies.  */
@@ -7039,23 +7056,6 @@ array_at_struct_end_p (tree ref)
   return true;
 }
 
-/* Return a tree representing the upper bound of the array mentioned in
-   EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-
-tree
-array_ref_up_bound (tree exp)
-{
-  tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
-
-  /* If there is a domain type and it has an upper bound, use it, substituting
- for a PLACEHOLDER_EXPR as needed.  */
-  if (domain_type  TYPE_MAX_VALUE (domain_type))
-return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MAX_VALUE (domain_type), exp);
-
-  /* Otherwise fail.  */
-  return NULL_TREE;
-}
-
 /* Return a tree representing the offset, in bytes, of the field referenced
by EXP.  This does not include any offset in DECL_FIELD_BIT_OFFSET.  */
 
Index: tree.h
===
--- tree.h	(revision 223736)
+++ tree.h	(working copy)
@@ -5051,12 +5051,6 @@ tree_int_cst_compare (const_tree t1, con
 extern void set_decl_rtl (tree, rtx);
 extern bool complete_ctor_at_level_p (const_tree, HOST_WIDE_INT, const_tree);
 
-/* Return a tree representing the upper bound of the array mentioned in
-   EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-extern tree array_ref_up_bound (tree);
-
-extern tree build_personality_function (const char *);
-
 /* Given an expression EXP that is a handled_component_p,
look for the ultimate containing object, which is returned and specify
the access position and size.  */
@@ -5064,10 +5058,28 @@ extern tree get_inner_reference (tree, H
  tree *, machine_mode *, int *, int *,
  bool);
 
+/* Return a tree of sizetype representing the size, in bytes, of the element
+   of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
+extern tree array_ref_element_size (tree);
+
+/* Return a tree representing the upper bound of the array mentioned in
+   EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
+extern tree array_ref_up_bound (tree);
+
 /* Return a tree representing the lower bound of the array mentioned in
EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
 extern tree array_ref_low_bound (tree);
 
+/* Returns true if REF is an array reference to an array at the end of
+   a structure.  If this is the case, the array may be allocated larger
+   than its 

Re: [patch] Move generic tree functions from expr.h to tree.h

2015-05-27 Thread Eric Botcazou
 No.  Prototypes of functions defined in A.c should be in A.h, not in some
 other header.  We've been (slowly) moving to that.  You should have moved
 them all to expr.h instead, or move the implementations to tree.c.

The former is simply not possible since expr.h is poisoned for FEs...  I can 
move the implementations to tree.c but get_inner_reference is one of them.

-- 
Eric Botcazou


Re: [patch] Move generic tree functions from expr.h to tree.h

2015-05-27 Thread Richard Biener
On Wed, May 27, 2015 at 12:50 PM, Eric Botcazou ebotca...@adacore.com wrote:
 No.  Prototypes of functions defined in A.c should be in A.h, not in some
 other header.  We've been (slowly) moving to that.  You should have moved
 them all to expr.h instead, or move the implementations to tree.c.

 The former is simply not possible since expr.h is poisoned for FEs...  I can
 move the implementations to tree.c but get_inner_reference is one of them.

You can leave get_inner_reference in its place then ... or move it.  It's hardly
only used by expansion now.

Richard.

 --
 Eric Botcazou


Re: [patch] Move generic tree functions from expr.h to tree.h

2015-05-27 Thread Eric Botcazou
 You can leave get_inner_reference in its place then ... or move it.  It's
 hardly only used by expansion now.

Yes, but it's a hot function and I'd rather preserve its SVN history so I'm 
leaving it in its original place.  Thanks for the review.

Here's the patch I have installed after having tested it on x86_64-suse-linux.


2015-05-27  Eric Botcazou  ebotca...@adacore.com

* expr.h (array_at_struct_end_p): Move to...
(array_ref_element_size): Likewise.
(component_ref_field_offset): Likewise.
* tree.h (array_ref_element_size): ...here.
(array_at_struct_end_p): Likewise.
(component_ref_field_offset): Likewise.
* expr.c (array_ref_element_size): Move to...
(array_ref_low_bound): Likewise.
(array_at_struct_end_p): Likewise.
(array_ref_up_bound): Likewise.
(component_ref_field_offset): Likewise.
* tree.c (array_ref_element_size): ...here.
(array_ref_low_bound): Likewise.
(array_ref_up_bound): Likewise.
(array_at_struct_end_p): Likewise.
(component_ref_field_offset): Likewise.


-- 
Eric BotcazouIndex: expr.h
===
--- expr.h	(revision 223736)
+++ expr.h	(working copy)
@@ -281,19 +281,10 @@ rtx get_personality_function (tree);
 extern int can_move_by_pieces (unsigned HOST_WIDE_INT, unsigned int);
 
 extern unsigned HOST_WIDE_INT highest_pow2_factor (const_tree);
-bool array_at_struct_end_p (tree);
-
-/* Return a tree of sizetype representing the size, in bytes, of the element
-   of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-extern tree array_ref_element_size (tree);
 
 extern bool categorize_ctor_elements (const_tree, HOST_WIDE_INT *,
   HOST_WIDE_INT *, bool *);
 
-/* Return a tree representing the offset, in bytes, of the field referenced
-   by EXP.  This does not include any offset in DECL_FIELD_BIT_OFFSET.  */
-extern tree component_ref_field_offset (tree);
-
 extern void expand_operands (tree, tree, rtx, rtx*, rtx*,
 			 enum expand_modifier);
 
Index: expr.c
===
--- expr.c	(revision 223736)
+++ expr.c	(working copy)
@@ -6953,139 +6953,6 @@ get_inner_reference (tree exp, HOST_WIDE
   return exp;
 }
 
-/* Return a tree of sizetype representing the size, in bytes, of the element
-   of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-
-tree
-array_ref_element_size (tree exp)
-{
-  tree aligned_size = TREE_OPERAND (exp, 3);
-  tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)));
-  location_t loc = EXPR_LOCATION (exp);
-
-  /* If a size was specified in the ARRAY_REF, it's the size measured
- in alignment units of the element type.  So multiply by that value.  */
-  if (aligned_size)
-{
-  /* ??? tree_ssa_useless_type_conversion will eliminate casts to
-	 sizetype from another type of the same width and signedness.  */
-  if (TREE_TYPE (aligned_size) != sizetype)
-	aligned_size = fold_convert_loc (loc, sizetype, aligned_size);
-  return size_binop_loc (loc, MULT_EXPR, aligned_size,
-			 size_int (TYPE_ALIGN_UNIT (elmt_type)));
-}
-
-  /* Otherwise, take the size from that of the element type.  Substitute
- any PLACEHOLDER_EXPR that we have.  */
-  else
-return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (elmt_type), exp);
-}
-
-/* Return a tree representing the lower bound of the array mentioned in
-   EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-
-tree
-array_ref_low_bound (tree exp)
-{
-  tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
-
-  /* If a lower bound is specified in EXP, use it.  */
-  if (TREE_OPERAND (exp, 2))
-return TREE_OPERAND (exp, 2);
-
-  /* Otherwise, if there is a domain type and it has a lower bound, use it,
- substituting for a PLACEHOLDER_EXPR as needed.  */
-  if (domain_type  TYPE_MIN_VALUE (domain_type))
-return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MIN_VALUE (domain_type), exp);
-
-  /* Otherwise, return a zero of the appropriate type.  */
-  return build_int_cst (TREE_TYPE (TREE_OPERAND (exp, 1)), 0);
-}
-
-/* Returns true if REF is an array reference to an array at the end of
-   a structure.  If this is the case, the array may be allocated larger
-   than its upper bound implies.  */
-
-bool
-array_at_struct_end_p (tree ref)
-{
-  if (TREE_CODE (ref) != ARRAY_REF
-   TREE_CODE (ref) != ARRAY_RANGE_REF)
-return false;
-
-  while (handled_component_p (ref))
-{
-  /* If the reference chain contains a component reference to a
- non-union type and there follows another field the reference
-	 is not at the end of a structure.  */
-  if (TREE_CODE (ref) == COMPONENT_REF
-	   TREE_CODE (TREE_TYPE (TREE_OPERAND (ref, 0))) == RECORD_TYPE)
-	{
-	  tree nextf = DECL_CHAIN (TREE_OPERAND (ref, 1));
-	  while (nextf  TREE_CODE (nextf) != FIELD_DECL)
-	nextf = DECL_CHAIN (nextf);
-	  if (nextf)
-	return false;