1 /* Gimple decl, type, and expression support functions.
3 Copyright (C) 2007-2023 Free Software Foundation, Inc.
4 Contributed by Aldy Hernandez <aldyh@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
28 #include "stringpool.h"
29 #include "gimple-ssa.h"
30 #include "fold-const.h"
33 #include "stor-layout.h"
37 #include "tree-pass.h"
38 #include "stringpool.h"
42 /* ----- Type related ----- */
44 /* Return true if the conversion from INNER_TYPE to OUTER_TYPE is a
45 useless type conversion, otherwise return false.
47 This function implicitly defines the middle-end type system. With
48 the notion of 'a < b' meaning that useless_type_conversion_p (a, b)
49 holds and 'a > b' meaning that useless_type_conversion_p (b, a) holds,
50 the following invariants shall be fulfilled:
52 1) useless_type_conversion_p is transitive.
53 If a < b and b < c then a < c.
55 2) useless_type_conversion_p is not symmetric.
56 From a < b does not follow a > b.
58 3) Types define the available set of operations applicable to values.
59 A type conversion is useless if the operations for the target type
60 is a subset of the operations for the source type. For example
61 casts to void* are useless, casts from void* are not (void* can't
62 be dereferenced or offsetted, but copied, hence its set of operations
63 is a strict subset of that of all other data pointer types). Casts
64 to const T* are useless (can't be written to), casts from const T*
68 useless_type_conversion_p (tree outer_type
, tree inner_type
)
70 /* Do the following before stripping toplevel qualifiers. */
71 if (POINTER_TYPE_P (inner_type
)
72 && POINTER_TYPE_P (outer_type
))
74 /* Do not lose casts between pointers to different address spaces. */
75 if (TYPE_ADDR_SPACE (TREE_TYPE (outer_type
))
76 != TYPE_ADDR_SPACE (TREE_TYPE (inner_type
)))
78 /* Do not lose casts to function pointer types. */
79 if (FUNC_OR_METHOD_TYPE_P (TREE_TYPE (outer_type
))
80 && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (inner_type
)))
84 /* From now on qualifiers on value types do not matter. */
85 inner_type
= TYPE_MAIN_VARIANT (inner_type
);
86 outer_type
= TYPE_MAIN_VARIANT (outer_type
);
88 if (inner_type
== outer_type
)
91 /* Changes in machine mode are never useless conversions because the RTL
92 middle-end expects explicit conversions between modes. */
93 if (TYPE_MODE (inner_type
) != TYPE_MODE (outer_type
))
96 /* If both the inner and outer types are integral types, then the
97 conversion is not necessary if they have the same mode and
98 signedness and precision, and both or neither are boolean. */
99 if (INTEGRAL_TYPE_P (inner_type
)
100 && INTEGRAL_TYPE_P (outer_type
))
102 /* Preserve changes in signedness or precision. */
103 if (TYPE_UNSIGNED (inner_type
) != TYPE_UNSIGNED (outer_type
)
104 || TYPE_PRECISION (inner_type
) != TYPE_PRECISION (outer_type
))
107 /* Preserve conversions to/from BOOLEAN_TYPE if types are not
109 if (((TREE_CODE (inner_type
) == BOOLEAN_TYPE
)
110 != (TREE_CODE (outer_type
) == BOOLEAN_TYPE
))
111 && TYPE_PRECISION (outer_type
) != 1)
114 /* Preserve conversions to/from BITINT_TYPE. While we don't
115 need to care that much about such conversions within a function's
116 body, we need to prevent changing BITINT_TYPE to INTEGER_TYPE
117 of the same precision or vice versa when passed to functions,
118 especially for varargs. */
119 if ((TREE_CODE (inner_type
) == BITINT_TYPE
)
120 != (TREE_CODE (outer_type
) == BITINT_TYPE
))
123 /* We don't need to preserve changes in the types minimum or
124 maximum value in general as these do not generate code
125 unless the types precisions are different. */
129 /* Scalar floating point types with the same mode are compatible. */
130 else if (SCALAR_FLOAT_TYPE_P (inner_type
)
131 && SCALAR_FLOAT_TYPE_P (outer_type
))
134 /* Fixed point types with the same mode are compatible. */
135 else if (FIXED_POINT_TYPE_P (inner_type
)
136 && FIXED_POINT_TYPE_P (outer_type
))
137 return TYPE_SATURATING (inner_type
) == TYPE_SATURATING (outer_type
);
139 /* We need to take special care recursing to pointed-to types. */
140 else if (POINTER_TYPE_P (inner_type
)
141 && POINTER_TYPE_P (outer_type
))
143 /* We do not care for const qualification of the pointed-to types
144 as const qualification has no semantic value to the middle-end. */
146 /* Otherwise pointers/references are equivalent. */
150 /* Recurse for complex types. */
151 else if (TREE_CODE (inner_type
) == COMPLEX_TYPE
152 && TREE_CODE (outer_type
) == COMPLEX_TYPE
)
153 return useless_type_conversion_p (TREE_TYPE (outer_type
),
154 TREE_TYPE (inner_type
));
156 /* Recurse for vector types with the same number of subparts. */
157 else if (VECTOR_TYPE_P (inner_type
)
158 && VECTOR_TYPE_P (outer_type
))
159 return (known_eq (TYPE_VECTOR_SUBPARTS (inner_type
),
160 TYPE_VECTOR_SUBPARTS (outer_type
))
161 && useless_type_conversion_p (TREE_TYPE (outer_type
),
162 TREE_TYPE (inner_type
))
163 && targetm
.compatible_vector_types_p (inner_type
, outer_type
));
165 else if (TREE_CODE (inner_type
) == ARRAY_TYPE
166 && TREE_CODE (outer_type
) == ARRAY_TYPE
)
168 /* Preserve various attributes. */
169 if (TYPE_REVERSE_STORAGE_ORDER (inner_type
)
170 != TYPE_REVERSE_STORAGE_ORDER (outer_type
))
172 if (TYPE_STRING_FLAG (inner_type
) != TYPE_STRING_FLAG (outer_type
))
175 /* Conversions from array types with unknown extent to
176 array types with known extent are not useless. */
177 if (!TYPE_DOMAIN (inner_type
) && TYPE_DOMAIN (outer_type
))
180 /* Nor are conversions from array types with non-constant size to
181 array types with constant size or to different size. */
182 if (TYPE_SIZE (outer_type
)
183 && TREE_CODE (TYPE_SIZE (outer_type
)) == INTEGER_CST
184 && (!TYPE_SIZE (inner_type
)
185 || TREE_CODE (TYPE_SIZE (inner_type
)) != INTEGER_CST
186 || !tree_int_cst_equal (TYPE_SIZE (outer_type
),
187 TYPE_SIZE (inner_type
))))
190 /* Check conversions between arrays with partially known extents.
191 If the array min/max values are constant they have to match.
192 Otherwise allow conversions to unknown and variable extents.
193 In particular this declares conversions that may change the
194 mode to BLKmode as useless. */
195 if (TYPE_DOMAIN (inner_type
)
196 && TYPE_DOMAIN (outer_type
)
197 && TYPE_DOMAIN (inner_type
) != TYPE_DOMAIN (outer_type
))
199 tree inner_min
= TYPE_MIN_VALUE (TYPE_DOMAIN (inner_type
));
200 tree outer_min
= TYPE_MIN_VALUE (TYPE_DOMAIN (outer_type
));
201 tree inner_max
= TYPE_MAX_VALUE (TYPE_DOMAIN (inner_type
));
202 tree outer_max
= TYPE_MAX_VALUE (TYPE_DOMAIN (outer_type
));
204 /* After gimplification a variable min/max value carries no
205 additional information compared to a NULL value. All that
206 matters has been lowered to be part of the IL. */
207 if (inner_min
&& TREE_CODE (inner_min
) != INTEGER_CST
)
208 inner_min
= NULL_TREE
;
209 if (outer_min
&& TREE_CODE (outer_min
) != INTEGER_CST
)
210 outer_min
= NULL_TREE
;
211 if (inner_max
&& TREE_CODE (inner_max
) != INTEGER_CST
)
212 inner_max
= NULL_TREE
;
213 if (outer_max
&& TREE_CODE (outer_max
) != INTEGER_CST
)
214 outer_max
= NULL_TREE
;
216 /* Conversions NULL / variable <- cst are useless, but not
217 the other way around. */
220 || !tree_int_cst_equal (inner_min
, outer_min
)))
224 || !tree_int_cst_equal (inner_max
, outer_max
)))
228 /* Recurse on the element check. */
229 return useless_type_conversion_p (TREE_TYPE (outer_type
),
230 TREE_TYPE (inner_type
));
233 else if (FUNC_OR_METHOD_TYPE_P (inner_type
)
234 && TREE_CODE (inner_type
) == TREE_CODE (outer_type
))
236 tree outer_parm
, inner_parm
;
238 /* If the return types are not compatible bail out. */
239 if (!useless_type_conversion_p (TREE_TYPE (outer_type
),
240 TREE_TYPE (inner_type
)))
243 /* Method types should belong to a compatible base class. */
244 if (TREE_CODE (inner_type
) == METHOD_TYPE
245 && !useless_type_conversion_p (TYPE_METHOD_BASETYPE (outer_type
),
246 TYPE_METHOD_BASETYPE (inner_type
)))
249 /* A conversion to an unprototyped argument list is ok. */
250 if (!prototype_p (outer_type
))
253 /* If the unqualified argument types are compatible the conversion
255 if (TYPE_ARG_TYPES (outer_type
) == TYPE_ARG_TYPES (inner_type
))
258 for (outer_parm
= TYPE_ARG_TYPES (outer_type
),
259 inner_parm
= TYPE_ARG_TYPES (inner_type
);
260 outer_parm
&& inner_parm
;
261 outer_parm
= TREE_CHAIN (outer_parm
),
262 inner_parm
= TREE_CHAIN (inner_parm
))
263 if (!useless_type_conversion_p
264 (TYPE_MAIN_VARIANT (TREE_VALUE (outer_parm
)),
265 TYPE_MAIN_VARIANT (TREE_VALUE (inner_parm
))))
268 /* If there is a mismatch in the number of arguments the functions
269 are not compatible. */
270 if (outer_parm
|| inner_parm
)
273 /* Defer to the target if necessary. */
274 if (TYPE_ATTRIBUTES (inner_type
) || TYPE_ATTRIBUTES (outer_type
))
275 return comp_type_attributes (outer_type
, inner_type
) != 0;
280 /* For aggregates we rely on TYPE_CANONICAL exclusively and require
281 explicit conversions for types involving to be structurally
283 else if (AGGREGATE_TYPE_P (inner_type
)
284 && TREE_CODE (inner_type
) == TREE_CODE (outer_type
))
285 return TYPE_CANONICAL (inner_type
)
286 && TYPE_CANONICAL (inner_type
) == TYPE_CANONICAL (outer_type
);
288 else if (TREE_CODE (inner_type
) == OFFSET_TYPE
289 && TREE_CODE (outer_type
) == OFFSET_TYPE
)
290 return useless_type_conversion_p (TREE_TYPE (outer_type
),
291 TREE_TYPE (inner_type
))
292 && useless_type_conversion_p
293 (TYPE_OFFSET_BASETYPE (outer_type
),
294 TYPE_OFFSET_BASETYPE (inner_type
));
300 /* ----- Decl related ----- */
302 /* Set sequence SEQ to be the GIMPLE body for function FN. */
305 gimple_set_body (tree fndecl
, gimple_seq seq
)
307 struct function
*fn
= DECL_STRUCT_FUNCTION (fndecl
);
310 /* If FNDECL still does not have a function structure associated
311 with it, then it does not make sense for it to receive a
313 gcc_assert (seq
== NULL
);
316 fn
->gimple_body
= seq
;
320 /* Return the body of GIMPLE statements for function FN. After the
321 CFG pass, the function body doesn't exist anymore because it has
322 been split up into basic blocks. In this case, it returns
326 gimple_body (tree fndecl
)
328 struct function
*fn
= DECL_STRUCT_FUNCTION (fndecl
);
329 return fn
? fn
->gimple_body
: NULL
;
332 /* Return true when FNDECL has Gimple body either in unlowered
335 gimple_has_body_p (tree fndecl
)
337 struct function
*fn
= DECL_STRUCT_FUNCTION (fndecl
);
338 return (gimple_body (fndecl
) || (fn
&& fn
->cfg
&& !(fn
->curr_properties
& PROP_rtl
)));
341 /* Return a printable name for symbol DECL. */
344 gimple_decl_printable_name (tree decl
, int verbosity
)
346 if (!DECL_NAME (decl
))
349 if (HAS_DECL_ASSEMBLER_NAME_P (decl
) && DECL_ASSEMBLER_NAME_SET_P (decl
))
351 int dmgl_opts
= DMGL_NO_OPTS
;
355 dmgl_opts
= DMGL_VERBOSE
359 if (TREE_CODE (decl
) == FUNCTION_DECL
)
360 dmgl_opts
|= DMGL_PARAMS
;
363 const char *mangled_str
364 = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME_RAW (decl
));
365 const char *str
= cplus_demangle_v3 (mangled_str
, dmgl_opts
);
366 return str
? str
: mangled_str
;
369 return IDENTIFIER_POINTER (DECL_NAME (decl
));
373 /* Create a new VAR_DECL and copy information from VAR to it. */
376 copy_var_decl (tree var
, tree name
, tree type
)
378 tree copy
= build_decl (DECL_SOURCE_LOCATION (var
), VAR_DECL
, name
, type
);
380 TREE_ADDRESSABLE (copy
) = TREE_ADDRESSABLE (var
);
381 TREE_THIS_VOLATILE (copy
) = TREE_THIS_VOLATILE (var
);
382 DECL_NOT_GIMPLE_REG_P (copy
) = DECL_NOT_GIMPLE_REG_P (var
);
383 DECL_ARTIFICIAL (copy
) = DECL_ARTIFICIAL (var
);
384 DECL_IGNORED_P (copy
) = DECL_IGNORED_P (var
);
385 DECL_CONTEXT (copy
) = DECL_CONTEXT (var
);
386 TREE_USED (copy
) = 1;
387 DECL_SEEN_IN_BIND_EXPR_P (copy
) = 1;
388 DECL_ATTRIBUTES (copy
) = DECL_ATTRIBUTES (var
);
389 if (DECL_USER_ALIGN (var
))
391 SET_DECL_ALIGN (copy
, DECL_ALIGN (var
));
392 DECL_USER_ALIGN (copy
) = 1;
395 copy_warning (copy
, var
);
399 /* Strip off a legitimate source ending from the input string NAME of
400 length LEN. Rather than having to know the names used by all of
401 our front ends, we strip off an ending of a period followed by
402 up to four characters. (like ".cpp".) */
405 remove_suffix (char *name
, int len
)
409 for (i
= 2; i
< 7 && len
> i
; i
++)
411 if (name
[len
- i
] == '.')
413 name
[len
- i
] = '\0';
419 /* Create a new temporary name with PREFIX. Return an identifier. */
421 static GTY(()) unsigned int tmp_var_id_num
;
424 create_tmp_var_name (const char *prefix
)
430 char *preftmp
= ASTRDUP (prefix
);
432 remove_suffix (preftmp
, strlen (preftmp
));
433 clean_symbol_name (preftmp
);
438 ASM_FORMAT_PRIVATE_NAME (tmp_name
, prefix
? prefix
: "T", tmp_var_id_num
++);
439 return get_identifier (tmp_name
);
442 /* Create a new temporary variable declaration of type TYPE.
443 Do NOT push it into the current binding. */
446 create_tmp_var_raw (tree type
, const char *prefix
)
450 tmp_var
= build_decl (input_location
,
451 VAR_DECL
, prefix
? create_tmp_var_name (prefix
) : NULL
,
454 /* The variable was declared by the compiler. */
455 DECL_ARTIFICIAL (tmp_var
) = 1;
456 /* And we don't want debug info for it. */
457 DECL_IGNORED_P (tmp_var
) = 1;
458 /* And we don't want even the fancy names of those printed in
459 -fdump-final-insns= dumps. */
460 DECL_NAMELESS (tmp_var
) = 1;
462 /* Make the variable writable. */
463 TREE_READONLY (tmp_var
) = 0;
465 DECL_EXTERNAL (tmp_var
) = 0;
466 TREE_STATIC (tmp_var
) = 0;
467 TREE_USED (tmp_var
) = 1;
472 /* Create a new temporary variable declaration of type TYPE. DO push the
473 variable into the current binding. Further, assume that this is called
474 only from gimplification or optimization, at which point the creation of
475 certain types are bugs. */
478 create_tmp_var (tree type
, const char *prefix
)
482 /* We don't allow types that are addressable (meaning we can't make copies),
483 or incomplete. We also used to reject every variable size objects here,
484 but now support those for which a constant upper bound can be obtained.
485 The processing for variable sizes is performed in gimple_add_tmp_var,
486 point at which it really matters and possibly reached via paths not going
487 through this function, e.g. after direct calls to create_tmp_var_raw. */
488 gcc_assert (!TREE_ADDRESSABLE (type
) && COMPLETE_TYPE_P (type
));
490 tmp_var
= create_tmp_var_raw (type
, prefix
);
491 gimple_add_tmp_var (tmp_var
);
495 /* Create a new temporary variable declaration of type TYPE by calling
496 create_tmp_var and if TYPE is a vector or a complex number, mark the new
497 temporary as gimple register. */
500 create_tmp_reg (tree type
, const char *prefix
)
502 return create_tmp_var (type
, prefix
);
505 /* Create a new temporary variable declaration of type TYPE by calling
506 create_tmp_var and if TYPE is a vector or a complex number, mark the new
507 temporary as gimple register. */
510 create_tmp_reg_fn (struct function
*fn
, tree type
, const char *prefix
)
514 tmp
= create_tmp_var_raw (type
, prefix
);
515 gimple_add_tmp_var_fn (fn
, tmp
);
521 /* ----- Expression related ----- */
523 /* Extract the operands and code for expression EXPR into *SUBCODE_P,
524 *OP1_P, *OP2_P and *OP3_P respectively. */
527 extract_ops_from_tree (tree expr
, enum tree_code
*subcode_p
, tree
*op1_p
,
528 tree
*op2_p
, tree
*op3_p
)
530 *subcode_p
= TREE_CODE (expr
);
531 switch (get_gimple_rhs_class (*subcode_p
))
533 case GIMPLE_TERNARY_RHS
:
535 *op1_p
= TREE_OPERAND (expr
, 0);
536 *op2_p
= TREE_OPERAND (expr
, 1);
537 *op3_p
= TREE_OPERAND (expr
, 2);
540 case GIMPLE_BINARY_RHS
:
542 *op1_p
= TREE_OPERAND (expr
, 0);
543 *op2_p
= TREE_OPERAND (expr
, 1);
547 case GIMPLE_UNARY_RHS
:
549 *op1_p
= TREE_OPERAND (expr
, 0);
554 case GIMPLE_SINGLE_RHS
:
566 /* Extract operands for a GIMPLE_COND statement out of COND_EXPR tree COND. */
569 gimple_cond_get_ops_from_tree (tree cond
, enum tree_code
*code_p
,
570 tree
*lhs_p
, tree
*rhs_p
)
572 gcc_assert (COMPARISON_CLASS_P (cond
)
573 || TREE_CODE (cond
) == TRUTH_NOT_EXPR
574 || is_gimple_min_invariant (cond
)
575 || SSA_VAR_P (cond
));
576 gcc_checking_assert (!tree_could_throw_p (cond
));
578 extract_ops_from_tree (cond
, code_p
, lhs_p
, rhs_p
);
580 /* Canonicalize conditionals of the form 'if (!VAL)'. */
581 if (*code_p
== TRUTH_NOT_EXPR
)
584 gcc_assert (*lhs_p
&& *rhs_p
== NULL_TREE
);
585 *rhs_p
= build_zero_cst (TREE_TYPE (*lhs_p
));
587 /* Canonicalize conditionals of the form 'if (VAL)' */
588 else if (TREE_CODE_CLASS (*code_p
) != tcc_comparison
)
591 gcc_assert (*lhs_p
&& *rhs_p
== NULL_TREE
);
592 *rhs_p
= build_zero_cst (TREE_TYPE (*lhs_p
));
596 /* Return true if T is a valid LHS for a GIMPLE assignment expression. */
599 is_gimple_lvalue (tree t
)
601 return (is_gimple_addressable (t
)
602 || TREE_CODE (t
) == WITH_SIZE_EXPR
603 /* These are complex lvalues, but don't have addresses, so they
605 || TREE_CODE (t
) == BIT_FIELD_REF
);
608 /* Helper for is_gimple_condexpr and is_gimple_condexpr_for_cond. */
611 is_gimple_condexpr_1 (tree t
, bool allow_traps
, bool allow_cplx
)
614 return (is_gimple_val (t
)
615 || (COMPARISON_CLASS_P (t
)
616 && (allow_traps
|| !tree_could_throw_p (t
))
617 && ((op0
= TREE_OPERAND (t
, 0)), true)
618 && (allow_cplx
|| TREE_CODE (TREE_TYPE (op0
)) != COMPLEX_TYPE
)
619 && is_gimple_val (op0
)
620 && is_gimple_val (TREE_OPERAND (t
, 1))));
623 /* Like is_gimple_condexpr, but does not allow T to trap. */
626 is_gimple_condexpr_for_cond (tree t
)
628 return is_gimple_condexpr_1 (t
, false, true);
631 /* Canonicalize a tree T for use in a COND_EXPR as conditional. Returns
632 a canonicalized tree that is valid for a COND_EXPR or NULL_TREE, if
633 we failed to create one. */
636 canonicalize_cond_expr_cond (tree t
)
638 /* Strip conversions around boolean operations. */
639 if (CONVERT_EXPR_P (t
)
640 && (truth_value_p (TREE_CODE (TREE_OPERAND (t
, 0)))
641 || TREE_CODE (TREE_TYPE (TREE_OPERAND (t
, 0)))
643 t
= TREE_OPERAND (t
, 0);
645 /* For !x use x == 0. */
646 if (TREE_CODE (t
) == TRUTH_NOT_EXPR
)
648 tree top0
= TREE_OPERAND (t
, 0);
649 t
= build2 (EQ_EXPR
, TREE_TYPE (t
),
650 top0
, build_int_cst (TREE_TYPE (top0
), 0));
652 /* For cmp ? 1 : 0 use cmp. */
653 else if (TREE_CODE (t
) == COND_EXPR
654 && COMPARISON_CLASS_P (TREE_OPERAND (t
, 0))
655 && integer_onep (TREE_OPERAND (t
, 1))
656 && integer_zerop (TREE_OPERAND (t
, 2)))
658 tree top0
= TREE_OPERAND (t
, 0);
659 t
= build2 (TREE_CODE (top0
), TREE_TYPE (t
),
660 TREE_OPERAND (top0
, 0), TREE_OPERAND (top0
, 1));
662 /* For x ^ y use x != y. */
663 else if (TREE_CODE (t
) == BIT_XOR_EXPR
)
664 t
= build2 (NE_EXPR
, TREE_TYPE (t
),
665 TREE_OPERAND (t
, 0), TREE_OPERAND (t
, 1));
667 /* We don't know where this will be used so allow both traps and
668 _Complex. The caller is responsible for more precise checking. */
669 if (is_gimple_condexpr_1 (t
, true, true))
675 /* Return true if T is a gimple address. */
678 is_gimple_address (const_tree t
)
682 if (TREE_CODE (t
) != ADDR_EXPR
)
685 op
= TREE_OPERAND (t
, 0);
686 while (handled_component_p (op
))
688 if ((TREE_CODE (op
) == ARRAY_REF
689 || TREE_CODE (op
) == ARRAY_RANGE_REF
)
690 && !is_gimple_val (TREE_OPERAND (op
, 1)))
693 op
= TREE_OPERAND (op
, 0);
696 if (CONSTANT_CLASS_P (op
)
697 || TREE_CODE (op
) == TARGET_MEM_REF
698 || TREE_CODE (op
) == MEM_REF
)
701 switch (TREE_CODE (op
))
716 /* Return true if T is a gimple invariant address. */
719 is_gimple_invariant_address (const_tree t
)
723 if (TREE_CODE (t
) != ADDR_EXPR
)
726 op
= strip_invariant_refs (TREE_OPERAND (t
, 0));
730 if (TREE_CODE (op
) == MEM_REF
)
732 const_tree op0
= TREE_OPERAND (op
, 0);
733 return (TREE_CODE (op0
) == ADDR_EXPR
734 && (CONSTANT_CLASS_P (TREE_OPERAND (op0
, 0))
735 || decl_address_invariant_p (TREE_OPERAND (op0
, 0))));
738 return CONSTANT_CLASS_P (op
) || decl_address_invariant_p (op
);
741 /* Return true if T is a gimple invariant address at IPA level
742 (so addresses of variables on stack are not allowed). */
745 is_gimple_ip_invariant_address (const_tree t
)
749 if (TREE_CODE (t
) != ADDR_EXPR
)
752 op
= strip_invariant_refs (TREE_OPERAND (t
, 0));
756 if (TREE_CODE (op
) == MEM_REF
)
758 const_tree op0
= TREE_OPERAND (op
, 0);
759 return (TREE_CODE (op0
) == ADDR_EXPR
760 && (CONSTANT_CLASS_P (TREE_OPERAND (op0
, 0))
761 || decl_address_ip_invariant_p (TREE_OPERAND (op0
, 0))));
764 return CONSTANT_CLASS_P (op
) || decl_address_ip_invariant_p (op
);
767 /* Return true if T is a GIMPLE minimal invariant. It's a restricted
768 form of function invariant. */
771 is_gimple_min_invariant (const_tree t
)
773 if (TREE_CODE (t
) == ADDR_EXPR
)
774 return is_gimple_invariant_address (t
);
776 return is_gimple_constant (t
);
779 /* Return true if T is a GIMPLE interprocedural invariant. It's a restricted
780 form of gimple minimal invariant. */
783 is_gimple_ip_invariant (const_tree t
)
785 if (TREE_CODE (t
) == ADDR_EXPR
)
786 return is_gimple_ip_invariant_address (t
);
788 return is_gimple_constant (t
);
791 /* Return true if T is a non-aggregate register variable. */
794 is_gimple_reg (tree t
)
796 if (virtual_operand_p (t
))
799 if (TREE_CODE (t
) == SSA_NAME
)
802 if (!is_gimple_variable (t
))
805 if (!is_gimple_reg_type (TREE_TYPE (t
)))
808 /* A volatile decl is not acceptable because we can't reuse it as
809 needed. We need to copy it into a temp first. */
810 if (TREE_THIS_VOLATILE (t
))
813 /* We define "registers" as things that can be renamed as needed,
814 which with our infrastructure does not apply to memory. */
815 if (needs_to_live_in_memory (t
))
818 /* Hard register variables are an interesting case. For those that
819 are call-clobbered, we don't know where all the calls are, since
820 we don't (want to) take into account which operations will turn
821 into libcalls at the rtl level. For those that are call-saved,
822 we don't currently model the fact that calls may in fact change
823 global hard registers, nor do we examine ASM_CLOBBERS at the tree
824 level, and so miss variable changes that might imply. All around,
825 it seems safest to not do too much optimization with these at the
826 tree level at all. We'll have to rely on the rtl optimizers to
827 clean this up, as there we've got all the appropriate bits exposed. */
828 if (VAR_P (t
) && DECL_HARD_REGISTER (t
))
831 /* Variables can be marked as having partial definitions, avoid
832 putting them into SSA form. */
833 return !DECL_NOT_GIMPLE_REG_P (t
);
837 /* Return true if T is a GIMPLE rvalue, i.e. an identifier or a constant. */
840 is_gimple_val (tree t
)
842 /* Make loads from volatiles and memory vars explicit. */
843 if (is_gimple_variable (t
)
844 && is_gimple_reg_type (TREE_TYPE (t
))
845 && !is_gimple_reg (t
))
848 return (is_gimple_variable (t
) || is_gimple_min_invariant (t
));
851 /* Similarly, but accept hard registers as inputs to asm statements. */
854 is_gimple_asm_val (tree t
)
856 if (VAR_P (t
) && DECL_HARD_REGISTER (t
))
859 return is_gimple_val (t
);
862 /* Return true if T is a GIMPLE minimal lvalue. */
865 is_gimple_min_lval (tree t
)
867 if (!(t
= CONST_CAST_TREE (strip_invariant_refs (t
))))
869 return (is_gimple_id (t
) || TREE_CODE (t
) == MEM_REF
);
872 /* Return true if T is a valid function operand of a CALL_EXPR. */
875 is_gimple_call_addr (tree t
)
877 return (TREE_CODE (t
) == OBJ_TYPE_REF
|| is_gimple_val (t
));
880 /* Return true if T is a valid address operand of a MEM_REF. */
883 is_gimple_mem_ref_addr (tree t
)
885 return (is_gimple_reg (t
)
886 || TREE_CODE (t
) == INTEGER_CST
887 || (TREE_CODE (t
) == ADDR_EXPR
888 && (CONSTANT_CLASS_P (TREE_OPERAND (t
, 0))
889 || decl_address_invariant_p (TREE_OPERAND (t
, 0)))));
892 /* Hold trees marked addressable during expand. */
894 static hash_set
<tree
> *mark_addressable_queue
;
896 /* Mark X as addressable or queue it up if called during expand. We
897 don't want to apply it immediately during expand because decls are
898 made addressable at that point due to RTL-only concerns, such as
899 uses of memcpy for block moves, and TREE_ADDRESSABLE changes
900 is_gimple_reg, which might make it seem like a variable that used
901 to be a gimple_reg shouldn't have been an SSA name. So we queue up
902 this flag setting and only apply it when we're done with GIMPLE and
903 only RTL issues matter. */
906 mark_addressable_1 (tree x
)
908 if (!currently_expanding_to_rtl
)
910 TREE_ADDRESSABLE (x
) = 1;
914 if (!mark_addressable_queue
)
915 mark_addressable_queue
= new hash_set
<tree
>();
916 mark_addressable_queue
->add (x
);
919 /* Adaptor for mark_addressable_1 for use in hash_set traversal. */
922 mark_addressable_2 (tree
const &x
, void * ATTRIBUTE_UNUSED
= NULL
)
924 mark_addressable_1 (x
);
928 /* Mark all queued trees as addressable, and empty the queue. To be
929 called right after clearing CURRENTLY_EXPANDING_TO_RTL. */
932 flush_mark_addressable_queue ()
934 gcc_assert (!currently_expanding_to_rtl
);
935 if (mark_addressable_queue
)
937 mark_addressable_queue
->traverse
<void*, mark_addressable_2
> (NULL
);
938 delete mark_addressable_queue
;
939 mark_addressable_queue
= NULL
;
943 /* Mark X addressable. Unlike the langhook we expect X to be in gimple
944 form and we don't do any syntax checking. */
947 mark_addressable (tree x
)
949 if (TREE_CODE (x
) == WITH_SIZE_EXPR
)
950 x
= TREE_OPERAND (x
, 0);
951 while (handled_component_p (x
))
952 x
= TREE_OPERAND (x
, 0);
953 if ((TREE_CODE (x
) == MEM_REF
954 || TREE_CODE (x
) == TARGET_MEM_REF
)
955 && TREE_CODE (TREE_OPERAND (x
, 0)) == ADDR_EXPR
)
956 x
= TREE_OPERAND (TREE_OPERAND (x
, 0), 0);
958 && TREE_CODE (x
) != PARM_DECL
959 && TREE_CODE (x
) != RESULT_DECL
)
961 mark_addressable_1 (x
);
963 /* Also mark the artificial SSA_NAME that points to the partition of X. */
965 && !DECL_EXTERNAL (x
)
967 && cfun
->gimple_df
!= NULL
968 && cfun
->gimple_df
->decls_to_pointers
!= NULL
)
970 tree
*namep
= cfun
->gimple_df
->decls_to_pointers
->get (x
);
972 mark_addressable_1 (*namep
);
976 /* Returns true iff T is a valid RHS for an assignment to a renamed
977 user -- or front-end generated artificial -- variable. */
980 is_gimple_reg_rhs (tree t
)
982 return get_gimple_rhs_class (TREE_CODE (t
)) != GIMPLE_INVALID_RHS
;
985 #include "gt-gimple-expr.h"