Commit b4e3fabb by Richard Kenner Committed by Richard Kenner

tree.def (ARRAY_RANGE_REF): New code.

	* tree.def (ARRAY_RANGE_REF): New code.
	* alias.c (handled_component_p, can_address_p): Handle it.
	* dwarf2out.c (loc_descriptor_from_tree): Likewise.
	* explow.c (set_mem_attributes): Likewise.
	* expr.c (expand_assignment, get_inner_reference): Likewise.
	(expand_expr, expand_expr_unaligned, do_jump): Likewise.
	* fold-const.c (operand_equal_p): Likewise.
	* tree.c (staticp, stabilize_reference): Likewise.
	* varasm.c (decode_addr_const): Likewise.

From-SVN: r42848
parent c7d468e6
Mon Jun 4 09:21:19 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree.def (ARRAY_RANGE_REF): New code.
* alias.c (handled_component_p, can_address_p): Handle it.
* dwarf2out.c (loc_descriptor_from_tree): Likewise.
* explow.c (set_mem_attributes): Likewise.
* expr.c (expand_assignment, get_inner_reference): Likewise.
(expand_expr, expand_expr_unaligned, do_jump): Likewise.
* fold-const.c (operand_equal_p): Likewise.
* tree.c (staticp, stabilize_reference): Likewise.
* varasm.c (decode_addr_const): Likewise.
Sun Jun 3 21:59:51 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> Sun Jun 3 21:59:51 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* reload.c (reload_inner_reg_of_subreg): Return 1 for PLUS. * reload.c (reload_inner_reg_of_subreg): Return 1 for PLUS.
......
...@@ -412,6 +412,7 @@ handled_component_p (t) ...@@ -412,6 +412,7 @@ handled_component_p (t)
case BIT_FIELD_REF: case BIT_FIELD_REF:
case COMPONENT_REF: case COMPONENT_REF:
case ARRAY_REF: case ARRAY_REF:
case ARRAY_RANGE_REF:
case NON_LVALUE_EXPR: case NON_LVALUE_EXPR:
return 1; return 1;
...@@ -445,7 +446,7 @@ can_address_p (t) ...@@ -445,7 +446,7 @@ can_address_p (t)
&& can_address_p (TREE_OPERAND (t, 0))) && can_address_p (TREE_OPERAND (t, 0)))
return 1; return 1;
else if (TREE_CODE (t) == ARRAY_REF else if ((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
&& ! TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0))) && ! TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0)))
&& can_address_p (TREE_OPERAND (t, 0))) && can_address_p (TREE_OPERAND (t, 0)))
return 1; return 1;
......
...@@ -7592,6 +7592,7 @@ loc_descriptor_from_tree (loc, addressp) ...@@ -7592,6 +7592,7 @@ loc_descriptor_from_tree (loc, addressp)
case COMPONENT_REF: case COMPONENT_REF:
case BIT_FIELD_REF: case BIT_FIELD_REF:
case ARRAY_REF: case ARRAY_REF:
case ARRAY_RANGE_REF:
{ {
tree obj, offset; tree obj, offset;
HOST_WIDE_INT bitsize, bitpos, bytepos; HOST_WIDE_INT bitsize, bitpos, bytepos;
......
/* Subroutines for manipulating rtx's in semantically interesting ways. /* Subroutines for manipulating rtx's in semantically interesting ways.
Copyright (C) 1987, 1991, 1994, 1995, 1996, 1997, 1998, Copyright (C) 1987, 1991, 1994, 1995, 1996, 1997, 1998,
1999, 2000 Free Software Foundation, Inc. 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -702,6 +702,7 @@ set_mem_attributes (ref, t, objectp) ...@@ -702,6 +702,7 @@ set_mem_attributes (ref, t, objectp)
if (DECL_P (t)) if (DECL_P (t))
MEM_SCALAR_P (ref) = 1; MEM_SCALAR_P (ref) = 1;
else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF
|| TREE_CODE (t) == ARRAY_RANGE_REF
|| TREE_CODE (t) == BIT_FIELD_REF) || TREE_CODE (t) == BIT_FIELD_REF)
MEM_IN_STRUCT_P (ref) = 1; MEM_IN_STRUCT_P (ref) = 1;
} }
......
...@@ -3675,7 +3675,7 @@ expand_assignment (to, from, want_value, suggest_reg) ...@@ -3675,7 +3675,7 @@ expand_assignment (to, from, want_value, suggest_reg)
problem. */ problem. */
if (TREE_CODE (to) == COMPONENT_REF || TREE_CODE (to) == BIT_FIELD_REF if (TREE_CODE (to) == COMPONENT_REF || TREE_CODE (to) == BIT_FIELD_REF
|| TREE_CODE (to) == ARRAY_REF) || TREE_CODE (to) == ARRAY_REF || TREE_CODE (to) == ARRAY_RANGE_REF)
{ {
enum machine_mode mode1; enum machine_mode mode1;
HOST_WIDE_INT bitsize, bitpos; HOST_WIDE_INT bitsize, bitpos;
...@@ -5333,8 +5333,8 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode, ...@@ -5333,8 +5333,8 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode,
} }
/* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF, /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
or an ARRAY_REF, look for nested COMPONENT_REFs, BIT_FIELD_REFs, or an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these
ARRAY_REFs and find the ultimate containing object, which we return. codes and find the ultimate containing object, which we return.
We set *PBITSIZE to the size in bits that we want, *PBITPOS to the We set *PBITSIZE to the size in bits that we want, *PBITPOS to the
bit position, and *PUNSIGNEDP to the signedness of the field. bit position, and *PUNSIGNEDP to the signedness of the field.
...@@ -5438,12 +5438,14 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode, ...@@ -5438,12 +5438,14 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
alignment = MIN (alignment, DECL_OFFSET_ALIGN (field)); alignment = MIN (alignment, DECL_OFFSET_ALIGN (field));
} }
else if (TREE_CODE (exp) == ARRAY_REF) else if (TREE_CODE (exp) == ARRAY_REF
|| TREE_CODE (exp) == ARRAY_RANGE_REF)
{ {
tree index = TREE_OPERAND (exp, 1); tree index = TREE_OPERAND (exp, 1);
tree domain = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0))); tree array = TREE_OPERAND (exp, 0);
tree domain = TYPE_DOMAIN (TREE_TYPE (array));
tree low_bound = (domain ? TYPE_MIN_VALUE (domain) : 0); tree low_bound = (domain ? TYPE_MIN_VALUE (domain) : 0);
tree unit_size = TYPE_SIZE_UNIT (TREE_TYPE (exp)); tree unit_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array)));
/* We assume all arrays have sizes that are a multiple of a byte. /* We assume all arrays have sizes that are a multiple of a byte.
First subtract the lower bound, if any, in the type of the First subtract the lower bound, if any, in the type of the
...@@ -5461,8 +5463,7 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode, ...@@ -5461,8 +5463,7 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, exp); index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, exp);
if (! TREE_CONSTANT (unit_size) if (! TREE_CONSTANT (unit_size)
&& contains_placeholder_p (unit_size)) && contains_placeholder_p (unit_size))
unit_size = build (WITH_RECORD_EXPR, sizetype, unit_size, unit_size = build (WITH_RECORD_EXPR, sizetype, unit_size, array);
TREE_OPERAND (exp, 0));
offset = size_binop (PLUS_EXPR, offset, offset = size_binop (PLUS_EXPR, offset,
size_binop (MULT_EXPR, size_binop (MULT_EXPR,
...@@ -6117,10 +6118,12 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6117,10 +6118,12 @@ expand_expr (exp, target, tmode, modifier)
return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, return expand_expr (TREE_OPERAND (exp, 0), const0_rtx,
VOIDmode, ro_modifier); VOIDmode, ro_modifier);
else if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<' else if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<'
|| code == ARRAY_REF) || code == ARRAY_REF || code == ARRAY_RANGE_REF)
{ {
expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, ro_modifier); expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, ro_modifier); ro_modifier);
expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode,
ro_modifier);
return const0_rtx; return const0_rtx;
} }
else if ((code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR) else if ((code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
...@@ -6131,9 +6134,12 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6131,9 +6134,12 @@ expand_expr (exp, target, tmode, modifier)
VOIDmode, ro_modifier); VOIDmode, ro_modifier);
else if (code == BIT_FIELD_REF) else if (code == BIT_FIELD_REF)
{ {
expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, ro_modifier); expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, ro_modifier); ro_modifier);
expand_expr (TREE_OPERAND (exp, 2), const0_rtx, VOIDmode, ro_modifier); expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode,
ro_modifier);
expand_expr (TREE_OPERAND (exp, 2), const0_rtx, VOIDmode,
ro_modifier);
return const0_rtx; return const0_rtx;
} }
; ;
...@@ -6150,6 +6156,7 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6150,6 +6156,7 @@ expand_expr (exp, target, tmode, modifier)
&& TREE_CODE (exp) != INTEGER_CST && TREE_CODE (exp) != INTEGER_CST
&& TREE_CODE (exp) != PARM_DECL && TREE_CODE (exp) != PARM_DECL
&& TREE_CODE (exp) != ARRAY_REF && TREE_CODE (exp) != ARRAY_REF
&& TREE_CODE (exp) != ARRAY_RANGE_REF
&& TREE_CODE (exp) != COMPONENT_REF && TREE_CODE (exp) != COMPONENT_REF
&& TREE_CODE (exp) != BIT_FIELD_REF && TREE_CODE (exp) != BIT_FIELD_REF
&& TREE_CODE (exp) != INDIRECT_REF && TREE_CODE (exp) != INDIRECT_REF
...@@ -6168,6 +6175,7 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6168,6 +6175,7 @@ expand_expr (exp, target, tmode, modifier)
&& TREE_CODE (exp) != INTEGER_CST && TREE_CODE (exp) != INTEGER_CST
&& TREE_CODE (exp) != PARM_DECL && TREE_CODE (exp) != PARM_DECL
&& TREE_CODE (exp) != ARRAY_REF && TREE_CODE (exp) != ARRAY_REF
&& TREE_CODE (exp) != ARRAY_RANGE_REF
&& TREE_CODE (exp) != COMPONENT_REF && TREE_CODE (exp) != COMPONENT_REF
&& TREE_CODE (exp) != BIT_FIELD_REF && TREE_CODE (exp) != BIT_FIELD_REF
&& TREE_CODE (exp) != INDIRECT_REF && TREE_CODE (exp) != INDIRECT_REF
...@@ -6906,11 +6914,12 @@ expand_expr (exp, target, tmode, modifier) ...@@ -6906,11 +6914,12 @@ expand_expr (exp, target, tmode, modifier)
case COMPONENT_REF: case COMPONENT_REF:
case BIT_FIELD_REF: case BIT_FIELD_REF:
case ARRAY_RANGE_REF:
/* If the operand is a CONSTRUCTOR, we can just extract the /* If the operand is a CONSTRUCTOR, we can just extract the
appropriate field if it is present. Don't do this if we have appropriate field if it is present. Don't do this if we have
already written the data since we want to refer to that copy already written the data since we want to refer to that copy
and varasm.c assumes that's what we'll do. */ and varasm.c assumes that's what we'll do. */
if (code != ARRAY_REF if (code == COMPONENT_REF
&& TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR
&& TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0) && TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0)
{ {
...@@ -8468,8 +8477,10 @@ expand_expr (exp, target, tmode, modifier) ...@@ -8468,8 +8477,10 @@ expand_expr (exp, target, tmode, modifier)
temp = expand_assignment (lhs, rhs, ! ignore, original_target != 0); temp = expand_assignment (lhs, rhs, ! ignore, original_target != 0);
if (TYPE_NONCOPIED_PARTS (lhs_type) != 0 && !fixed_type_p (rhs)) if (TYPE_NONCOPIED_PARTS (lhs_type) != 0 && !fixed_type_p (rhs))
noncopied_parts = init_noncopied_parts (stabilize_reference (lhs), noncopied_parts
TYPE_NONCOPIED_PARTS (lhs_type)); = init_noncopied_parts (stabilize_reference (lhs),
TYPE_NONCOPIED_PARTS (lhs_type));
while (noncopied_parts != 0) while (noncopied_parts != 0)
{ {
expand_assignment (TREE_VALUE (noncopied_parts), expand_assignment (TREE_VALUE (noncopied_parts),
...@@ -8529,8 +8540,9 @@ expand_expr (exp, target, tmode, modifier) ...@@ -8529,8 +8540,9 @@ expand_expr (exp, target, tmode, modifier)
if (TYPE_NONCOPIED_PARTS (lhs_type) != 0 if (TYPE_NONCOPIED_PARTS (lhs_type) != 0
&& ! (fixed_type_p (lhs) && fixed_type_p (rhs))) && ! (fixed_type_p (lhs) && fixed_type_p (rhs)))
noncopied_parts = save_noncopied_parts (stabilize_reference (lhs), noncopied_parts
TYPE_NONCOPIED_PARTS (lhs_type)); = save_noncopied_parts (stabilize_reference (lhs),
TYPE_NONCOPIED_PARTS (lhs_type));
temp = expand_assignment (lhs, rhs, ! ignore, original_target != 0); temp = expand_assignment (lhs, rhs, ! ignore, original_target != 0);
while (noncopied_parts != 0) while (noncopied_parts != 0)
...@@ -8946,11 +8958,12 @@ expand_expr_unaligned (exp, palign) ...@@ -8946,11 +8958,12 @@ expand_expr_unaligned (exp, palign)
case COMPONENT_REF: case COMPONENT_REF:
case BIT_FIELD_REF: case BIT_FIELD_REF:
case ARRAY_RANGE_REF:
/* If the operand is a CONSTRUCTOR, we can just extract the /* If the operand is a CONSTRUCTOR, we can just extract the
appropriate field if it is present. Don't do this if we have appropriate field if it is present. Don't do this if we have
already written the data since we want to refer to that copy already written the data since we want to refer to that copy
and varasm.c assumes that's what we'll do. */ and varasm.c assumes that's what we'll do. */
if (TREE_CODE (exp) != ARRAY_REF if (TREE_CODE (exp) == COMPONENT_REF
&& TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR
&& TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0) && TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0)
{ {
...@@ -9522,7 +9535,8 @@ do_jump (exp, if_false_label, if_true_label) ...@@ -9522,7 +9535,8 @@ do_jump (exp, if_false_label, if_true_label)
case NOP_EXPR: case NOP_EXPR:
if (TREE_CODE (TREE_OPERAND (exp, 0)) == COMPONENT_REF if (TREE_CODE (TREE_OPERAND (exp, 0)) == COMPONENT_REF
|| TREE_CODE (TREE_OPERAND (exp, 0)) == BIT_FIELD_REF || TREE_CODE (TREE_OPERAND (exp, 0)) == BIT_FIELD_REF
|| TREE_CODE (TREE_OPERAND (exp, 0)) == ARRAY_REF) || TREE_CODE (TREE_OPERAND (exp, 0)) == ARRAY_REF
|| TREE_CODE (TREE_OPERAND (exp, 0)) == ARRAY_RANGE_REF)
goto normal; goto normal;
case CONVERT_EXPR: case CONVERT_EXPR:
/* If we are narrowing the operand, we have to do the compare in the /* If we are narrowing the operand, we have to do the compare in the
...@@ -9628,6 +9642,7 @@ do_jump (exp, if_false_label, if_true_label) ...@@ -9628,6 +9642,7 @@ do_jump (exp, if_false_label, if_true_label)
case COMPONENT_REF: case COMPONENT_REF:
case BIT_FIELD_REF: case BIT_FIELD_REF:
case ARRAY_REF: case ARRAY_REF:
case ARRAY_RANGE_REF:
{ {
HOST_WIDE_INT bitsize, bitpos; HOST_WIDE_INT bitsize, bitpos;
int unsignedp; int unsignedp;
......
...@@ -2396,6 +2396,7 @@ operand_equal_p (arg0, arg1, only_const) ...@@ -2396,6 +2396,7 @@ operand_equal_p (arg0, arg1, only_const)
case COMPONENT_REF: case COMPONENT_REF:
case ARRAY_REF: case ARRAY_REF:
case ARRAY_RANGE_REF:
return (operand_equal_p (TREE_OPERAND (arg0, 0), return (operand_equal_p (TREE_OPERAND (arg0, 0),
TREE_OPERAND (arg1, 0), 0) TREE_OPERAND (arg1, 0), 0)
&& operand_equal_p (TREE_OPERAND (arg0, 1), && operand_equal_p (TREE_OPERAND (arg0, 1),
......
...@@ -1518,6 +1518,7 @@ staticp (arg) ...@@ -1518,6 +1518,7 @@ staticp (arg)
#endif #endif
case ARRAY_REF: case ARRAY_REF:
case ARRAY_RANGE_REF:
if (TREE_CODE (TYPE_SIZE (TREE_TYPE (arg))) == INTEGER_CST if (TREE_CODE (TYPE_SIZE (TREE_TYPE (arg))) == INTEGER_CST
&& TREE_CODE (TREE_OPERAND (arg, 1)) == INTEGER_CST) && TREE_CODE (TREE_OPERAND (arg, 1)) == INTEGER_CST)
return staticp (TREE_OPERAND (arg, 0)); return staticp (TREE_OPERAND (arg, 0));
...@@ -2209,6 +2210,12 @@ stabilize_reference (ref) ...@@ -2209,6 +2210,12 @@ stabilize_reference (ref)
stabilize_reference_1 (TREE_OPERAND (ref, 1))); stabilize_reference_1 (TREE_OPERAND (ref, 1)));
break; break;
case ARRAY_RANGE_REF:
result = build_nt (ARRAY_RANGE_REF,
stabilize_reference (TREE_OPERAND (ref, 0)),
stabilize_reference_1 (TREE_OPERAND (ref, 1)));
break;
case COMPOUND_EXPR: case COMPOUND_EXPR:
/* We cannot wrap the first expression in a SAVE_EXPR, as then /* We cannot wrap the first expression in a SAVE_EXPR, as then
it wouldn't be ignored. This matters when dealing with it wouldn't be ignored. This matters when dealing with
......
/* This file contains the definitions and documentation for the /* This file contains the definitions and documentation for the
tree codes used in the GNU C compiler. tree codes used in the GNU C compiler.
Copyright (C) 1987, 1988, 1993, 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. Copyright (C) 1987, 1988, 1993, 1995, 1997, 1998, 2000, 2001
Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -369,10 +370,15 @@ DEFTREECODE (INDIRECT_REF, "indirect_ref", 'r', 1) ...@@ -369,10 +370,15 @@ DEFTREECODE (INDIRECT_REF, "indirect_ref", 'r', 1)
/* Pascal `^` on a file. One operand, an expression for the file. */ /* Pascal `^` on a file. One operand, an expression for the file. */
DEFTREECODE (BUFFER_REF, "buffer_ref", 'r', 1) DEFTREECODE (BUFFER_REF, "buffer_ref", 'r', 1)
/* Array indexing in languages other than C. /* Array indexing.
Operand 0 is the array; operand 1 is a (single) array index. */ Operand 0 is the array; operand 1 is a (single) array index. */
DEFTREECODE (ARRAY_REF, "array_ref", 'r', 2) DEFTREECODE (ARRAY_REF, "array_ref", 'r', 2)
/* Likewise, except that the result is a range of the array. The starting
index of the array is taken from operand 0 and the size of the range
is taken from the type of the expression. */
DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", 'r', 2)
/* Constructor: return an aggregate value made from specified components. /* Constructor: return an aggregate value made from specified components.
In C, this is used only for structure and array initializers. In C, this is used only for structure and array initializers.
Also used for SET_TYPE in Chill (and potentially Pascal). Also used for SET_TYPE in Chill (and potentially Pascal).
......
...@@ -2180,7 +2180,8 @@ decode_addr_const (exp, value) ...@@ -2180,7 +2180,8 @@ decode_addr_const (exp, value)
offset += int_byte_position (TREE_OPERAND (target, 1)); offset += int_byte_position (TREE_OPERAND (target, 1));
target = TREE_OPERAND (target, 0); target = TREE_OPERAND (target, 0);
} }
else if (TREE_CODE (target) == ARRAY_REF) else if (TREE_CODE (target) == ARRAY_REF
|| TREE_CODE (target) == ARRAY_RANGE_REF)
{ {
offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1) offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
* tree_low_cst (TREE_OPERAND (target, 1), 0)); * tree_low_cst (TREE_OPERAND (target, 1), 0));
......
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