1 /* Functions to analyze and validate GIMPLE trees.
2 Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
4 Rewritten by Jason Merrill <jason@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
25 #include "coretypes.h"
29 #include "tree-gimple.h"
30 #include "tree-flow.h"
36 /* For the definitive definition of GIMPLE, see doc/tree-ssa.texi. */
38 static inline bool is_gimple_id (tree
);
40 /* Validation of GIMPLE expressions. */
42 /* Return true if T is a GIMPLE RHS for an assignment to a temporary. */
45 is_gimple_formal_tmp_rhs (tree t
)
47 enum tree_code code
= TREE_CODE (t
);
49 switch (TREE_CODE_CLASS (code
))
82 return is_gimple_lvalue (t
) || is_gimple_val (t
);
85 /* Returns true iff T is a valid RHS for an assignment to a renamed
86 user -- or front-end generated artificial -- variable. */
89 is_gimple_reg_rhs (tree t
)
91 /* If the RHS of the MODIFY_EXPR may throw or make a nonlocal goto
92 and the LHS is a user variable, then we need to introduce a formal
93 temporary. This way the optimizers can determine that the user
94 variable is only modified if evaluation of the RHS does not throw.
96 Don't force a temp of a non-renamable type; the copy could be
97 arbitrarily expensive. Instead we will generate a V_MAY_DEF for
100 if (is_gimple_reg_type (TREE_TYPE (t
))
101 && ((TREE_CODE (t
) == CALL_EXPR
&& TREE_SIDE_EFFECTS (t
))
102 || tree_could_throw_p (t
)))
105 return is_gimple_formal_tmp_rhs (t
);
108 /* Returns true iff T is a valid RHS for an assignment to an un-renamed
109 LHS, or for a call argument. */
112 is_gimple_mem_rhs (tree t
)
114 /* If we're dealing with a renamable type, either source or dest
115 must be a renamed variable. */
116 if (is_gimple_reg_type (TREE_TYPE (t
)))
117 return is_gimple_val (t
);
119 return is_gimple_formal_tmp_rhs (t
);
122 /* Returns the appropriate RHS predicate for this LHS. */
125 rhs_predicate_for (tree lhs
)
127 if (is_gimple_formal_tmp_var (lhs
))
128 return is_gimple_formal_tmp_rhs
;
129 else if (is_gimple_reg (lhs
))
130 return is_gimple_reg_rhs
;
132 return is_gimple_mem_rhs
;
135 /* Returns true if T is a valid CONSTRUCTOR component in GIMPLE, either
136 a val or another CONSTRUCTOR. */
139 is_gimple_constructor_elt (tree t
)
141 return (is_gimple_val (t
)
142 || TREE_CODE (t
) == CONSTRUCTOR
);
145 /* Return true if T is a valid LHS for a GIMPLE assignment expression. */
148 is_gimple_lvalue (tree t
)
150 return (is_gimple_addressable (t
)
151 || TREE_CODE (t
) == WITH_SIZE_EXPR
152 /* These are complex lvalues, but don't have addresses, so they
154 || TREE_CODE (t
) == BIT_FIELD_REF
);
157 /* Return true if T is a GIMPLE condition. */
160 is_gimple_condexpr (tree t
)
162 return (is_gimple_val (t
) || COMPARISON_CLASS_P (t
));
165 /* Return true if T is something whose address can be taken. */
168 is_gimple_addressable (tree t
)
170 return (is_gimple_id (t
) || handled_component_p (t
)
171 || TREE_CODE (t
) == REALPART_EXPR
172 || TREE_CODE (t
) == IMAGPART_EXPR
173 || INDIRECT_REF_P (t
));
177 /* Return true if T is function invariant. Or rather a restricted
178 form of function invariant. */
181 is_gimple_min_invariant (tree t
)
183 switch (TREE_CODE (t
))
186 return TREE_INVARIANT (t
);
193 return !TREE_OVERFLOW (t
);
200 /* Return true if T looks like a valid GIMPLE statement. */
203 is_gimple_stmt (tree t
)
205 enum tree_code code
= TREE_CODE (t
);
207 if (IS_EMPTY_STMT (t
))
214 /* These are only valid if they're void. */
215 return TREE_TYPE (t
) == NULL
|| VOID_TYPE_P (TREE_TYPE (t
));
221 case CASE_LABEL_EXPR
:
223 case TRY_FINALLY_EXPR
:
230 /* These are always void. */
235 /* These are valid regardless of their type. */
243 /* Return true if T is a variable. */
246 is_gimple_variable (tree t
)
248 return (TREE_CODE (t
) == VAR_DECL
249 || TREE_CODE (t
) == PARM_DECL
250 || TREE_CODE (t
) == RESULT_DECL
251 || TREE_CODE (t
) == SSA_NAME
);
254 /* Return true if T is a GIMPLE identifier (something with an address). */
257 is_gimple_id (tree t
)
259 return (is_gimple_variable (t
)
260 || TREE_CODE (t
) == FUNCTION_DECL
261 || TREE_CODE (t
) == LABEL_DECL
262 || TREE_CODE (t
) == CONST_DECL
263 /* Allow string constants, since they are addressable. */
264 || TREE_CODE (t
) == STRING_CST
);
267 /* Return true if TYPE is a suitable type for a scalar register variable. */
270 is_gimple_reg_type (tree type
)
272 return (!AGGREGATE_TYPE_P (type
)
273 && TREE_CODE (type
) != COMPLEX_TYPE
);
277 /* Return true if T is a scalar register variable. */
280 is_gimple_reg (tree t
)
282 if (TREE_CODE (t
) == SSA_NAME
)
283 t
= SSA_NAME_VAR (t
);
285 return (is_gimple_variable (t
)
286 && is_gimple_reg_type (TREE_TYPE (t
))
287 /* A volatile decl is not acceptable because we can't reuse it as
288 needed. We need to copy it into a temp first. */
289 && ! TREE_THIS_VOLATILE (t
)
290 && ! needs_to_live_in_memory (t
));
293 /* Returns true if T is a GIMPLE formal temporary variable. */
296 is_gimple_formal_tmp_var (tree t
)
298 if (TREE_CODE (t
) == SSA_NAME
)
301 return TREE_CODE (t
) == VAR_DECL
&& DECL_GIMPLE_FORMAL_TEMP_P (t
);
304 /* Returns true if T is a GIMPLE formal temporary register variable. */
307 is_gimple_formal_tmp_reg (tree t
)
309 /* The intent of this is to get hold of a value that won't change.
310 An SSA_NAME qualifies no matter if its of a user variable or not. */
311 if (TREE_CODE (t
) == SSA_NAME
)
314 /* We don't know the lifetime characteristics of user variables. */
315 if (!is_gimple_formal_tmp_var (t
))
318 /* Finally, it must be capable of being placed in a register. */
319 return is_gimple_reg (t
);
322 /* Return true if T is a GIMPLE variable whose address is not needed. */
325 is_gimple_non_addressable (tree t
)
327 if (TREE_CODE (t
) == SSA_NAME
)
328 t
= SSA_NAME_VAR (t
);
330 return (is_gimple_variable (t
) && ! needs_to_live_in_memory (t
));
333 /* Return true if T is a GIMPLE rvalue, i.e. an identifier or a constant. */
336 is_gimple_val (tree t
)
338 /* Make loads from volatiles and memory vars explicit. */
339 if (is_gimple_variable (t
)
340 && is_gimple_reg_type (TREE_TYPE (t
))
341 && !is_gimple_reg (t
))
344 /* FIXME make these decls. That can happen only when we expose the
345 entire landing-pad construct at the tree level. */
346 if (TREE_CODE (t
) == EXC_PTR_EXPR
|| TREE_CODE (t
) == FILTER_EXPR
)
349 return (is_gimple_variable (t
) || is_gimple_min_invariant (t
));
353 /* Return true if T is a GIMPLE minimal lvalue. */
356 is_gimple_min_lval (tree t
)
358 return (is_gimple_id (t
)
359 || TREE_CODE (t
) == INDIRECT_REF
);
362 /* Return true if T is a typecast operation. */
365 is_gimple_cast (tree t
)
367 return (TREE_CODE (t
) == NOP_EXPR
368 || TREE_CODE (t
) == CONVERT_EXPR
369 || TREE_CODE (t
) == FIX_TRUNC_EXPR
370 || TREE_CODE (t
) == FIX_CEIL_EXPR
371 || TREE_CODE (t
) == FIX_FLOOR_EXPR
372 || TREE_CODE (t
) == FIX_ROUND_EXPR
);
375 /* Return true if T is a valid op0 of a CALL_EXPR. */
378 is_gimple_call_addr (tree t
)
380 return (TREE_CODE (t
) == OBJ_TYPE_REF
381 || is_gimple_val (t
));
384 /* If T makes a function call, return the corresponding CALL_EXPR operand.
385 Otherwise, return NULL_TREE. */
388 get_call_expr_in (tree t
)
390 if (TREE_CODE (t
) == MODIFY_EXPR
)
391 t
= TREE_OPERAND (t
, 1);
392 if (TREE_CODE (t
) == WITH_SIZE_EXPR
)
393 t
= TREE_OPERAND (t
, 0);
394 if (TREE_CODE (t
) == CALL_EXPR
)
399 /* Given a memory reference expression, return the base address. Note that,
400 in contrast with get_base_var, this will not recurse inside INDIRECT_REF
401 expressions. Therefore, given the reference PTR->FIELD, this function
402 will return *PTR. Whereas get_base_var would've returned PTR. */
405 get_base_address (tree t
)
407 while (TREE_CODE (t
) == REALPART_EXPR
|| TREE_CODE (t
) == IMAGPART_EXPR
408 || handled_component_p (t
))
409 t
= TREE_OPERAND (t
, 0);
412 || TREE_CODE (t
) == STRING_CST
413 || TREE_CODE (t
) == CONSTRUCTOR
414 || INDIRECT_REF_P (t
))
421 recalculate_side_effects (tree t
)
423 enum tree_code code
= TREE_CODE (t
);
424 int fro
= first_rtl_op (code
);
427 switch (TREE_CODE_CLASS (code
))
435 case PREDECREMENT_EXPR
:
436 case PREINCREMENT_EXPR
:
437 case POSTDECREMENT_EXPR
:
438 case POSTINCREMENT_EXPR
:
439 /* All of these have side-effects, no matter what their
448 case tcc_comparison
: /* a comparison expression */
449 case tcc_unary
: /* a unary arithmetic expression */
450 case tcc_binary
: /* a binary arithmetic expression */
451 case tcc_reference
: /* a reference */
452 TREE_SIDE_EFFECTS (t
) = TREE_THIS_VOLATILE (t
);
453 for (i
= 0; i
< fro
; ++i
)
455 tree op
= TREE_OPERAND (t
, i
);
456 if (op
&& TREE_SIDE_EFFECTS (op
))
457 TREE_SIDE_EFFECTS (t
) = 1;
462 /* Can never be used with non-expressions. */