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 /* GCC GIMPLE structure
38 Inspired by the SIMPLE C grammar at
40 http://www-acaps.cs.mcgill.ca/info/McCAT/McCAT.html
42 function : FUNCTION_DECL
43 DECL_SAVED_TREE -> compound-stmt
45 compound-stmt: STATEMENT_LIST
60 BIND_EXPR_VARS -> chain of DECLs
61 BIND_EXPR_BLOCK -> BLOCK
62 BIND_EXPR_BODY -> compound-stmt
69 switch-stmt : SWITCH_EXPR
72 op2 -> TREE_VEC of CASE_LABEL_EXPRs
73 The CASE_LABEL_EXPRs are sorted by CASE_LOW,
77 op0 -> LABEL_DECL | val
79 return-stmt : RETURN_EXPR
90 label-stmt : LABEL_EXPR
93 try-stmt : TRY_CATCH_EXPR
104 catch-seq : STATEMENT_LIST
105 members -> CATCH_EXPR
107 modify-stmt : MODIFY_EXPR
111 call-stmt : CALL_EXPR
112 op0 -> val | OBJ_TYPE_REF
115 call-arg-list: TREE_LIST
121 addressable : addr-expr-arg
124 with-size-arg: addressable
127 indirectref : INDIRECT_REF
139 bitfieldref : BIT_FIELD_REF
144 compref : inner-compref
150 inner-compref: min-lval
191 static inline bool is_gimple_id (tree
);
193 /* Validation of GIMPLE expressions. */
195 /* Return true if T is a GIMPLE RHS for an assignment to a temporary. */
198 is_gimple_formal_tmp_rhs (tree t
)
200 enum tree_code code
= TREE_CODE (t
);
202 switch (TREE_CODE_CLASS (code
))
235 return is_gimple_lvalue (t
) || is_gimple_val (t
);
238 /* Returns true iff T is a valid RHS for an assignment to a renamed
239 user -- or front-end generated artificial -- variable. */
242 is_gimple_reg_rhs (tree t
)
244 /* If the RHS of the MODIFY_EXPR may throw or make a nonlocal goto
245 and the LHS is a user variable, then we need to introduce a formal
246 temporary. This way the optimizers can determine that the user
247 variable is only modified if evaluation of the RHS does not throw.
249 Don't force a temp of a non-renamable type; the copy could be
250 arbitrarily expensive. Instead we will generate a V_MAY_DEF for
253 if (is_gimple_reg_type (TREE_TYPE (t
))
254 && ((TREE_CODE (t
) == CALL_EXPR
&& TREE_SIDE_EFFECTS (t
))
255 || tree_could_throw_p (t
)))
258 return is_gimple_formal_tmp_rhs (t
);
261 /* Returns true iff T is a valid RHS for an assignment to an un-renamed
262 LHS, or for a call argument. */
265 is_gimple_mem_rhs (tree t
)
267 /* If we're dealing with a renamable type, either source or dest
268 must be a renamed variable. */
269 if (is_gimple_reg_type (TREE_TYPE (t
)))
270 return is_gimple_val (t
);
272 return is_gimple_formal_tmp_rhs (t
);
275 /* Returns the appropriate RHS predicate for this LHS. */
278 rhs_predicate_for (tree lhs
)
280 if (is_gimple_formal_tmp_var (lhs
))
281 return is_gimple_formal_tmp_rhs
;
282 else if (is_gimple_reg (lhs
))
283 return is_gimple_reg_rhs
;
285 return is_gimple_mem_rhs
;
288 /* Returns true if T is a valid CONSTRUCTOR component in GIMPLE, either
289 a val or another CONSTRUCTOR. */
292 is_gimple_constructor_elt (tree t
)
294 return (is_gimple_val (t
)
295 || TREE_CODE (t
) == CONSTRUCTOR
);
298 /* Return true if T is a valid LHS for a GIMPLE assignment expression. */
301 is_gimple_lvalue (tree t
)
303 return (is_gimple_addressable (t
)
304 || TREE_CODE (t
) == WITH_SIZE_EXPR
305 /* These are complex lvalues, but don't have addresses, so they
307 || TREE_CODE (t
) == BIT_FIELD_REF
);
310 /* Return true if T is a GIMPLE condition. */
313 is_gimple_condexpr (tree t
)
315 return (is_gimple_val (t
)
316 || TREE_CODE_CLASS (TREE_CODE (t
)) == '<');
319 /* Return true if T is something whose address can be taken. */
322 is_gimple_addressable (tree t
)
324 return (is_gimple_id (t
) || handled_component_p (t
)
325 || TREE_CODE (t
) == REALPART_EXPR
326 || TREE_CODE (t
) == IMAGPART_EXPR
327 || TREE_CODE (t
) == INDIRECT_REF
);
330 /* Return true if T is function invariant. Or rather a restricted
331 form of function invariant. */
334 is_gimple_min_invariant (tree t
)
336 switch (TREE_CODE (t
))
339 return TREE_INVARIANT (t
);
346 return !TREE_OVERFLOW (t
);
353 /* Return true if T looks like a valid GIMPLE statement. */
356 is_gimple_stmt (tree t
)
358 enum tree_code code
= TREE_CODE (t
);
360 if (IS_EMPTY_STMT (t
))
367 /* These are only valid if they're void. */
368 return TREE_TYPE (t
) == NULL
|| VOID_TYPE_P (TREE_TYPE (t
));
374 case CASE_LABEL_EXPR
:
376 case TRY_FINALLY_EXPR
:
383 /* These are always void. */
388 /* These are valid regardless of their type. */
396 /* Return true if T is a variable. */
399 is_gimple_variable (tree t
)
401 return (TREE_CODE (t
) == VAR_DECL
402 || TREE_CODE (t
) == PARM_DECL
403 || TREE_CODE (t
) == RESULT_DECL
404 || TREE_CODE (t
) == SSA_NAME
);
407 /* Return true if T is a GIMPLE identifier (something with an address). */
410 is_gimple_id (tree t
)
412 return (is_gimple_variable (t
)
413 || TREE_CODE (t
) == FUNCTION_DECL
414 || TREE_CODE (t
) == LABEL_DECL
415 || TREE_CODE (t
) == CONST_DECL
416 /* Allow string constants, since they are addressable. */
417 || TREE_CODE (t
) == STRING_CST
);
420 /* Return true if TYPE is a suitable type for a scalar register variable. */
423 is_gimple_reg_type (tree type
)
425 return (!AGGREGATE_TYPE_P (type
)
426 && TREE_CODE (type
) != COMPLEX_TYPE
);
430 /* Return true if T is a scalar register variable. */
433 is_gimple_reg (tree t
)
435 if (TREE_CODE (t
) == SSA_NAME
)
436 t
= SSA_NAME_VAR (t
);
438 return (is_gimple_variable (t
)
439 && is_gimple_reg_type (TREE_TYPE (t
))
440 /* A volatile decl is not acceptable because we can't reuse it as
441 needed. We need to copy it into a temp first. */
442 && ! TREE_THIS_VOLATILE (t
)
443 && ! needs_to_live_in_memory (t
));
446 /* Returns true if T is a GIMPLE formal temporary variable. */
449 is_gimple_formal_tmp_var (tree t
)
451 return TREE_CODE (t
) == VAR_DECL
&& DECL_GIMPLE_FORMAL_TEMP_P (t
);
454 /* Returns true if T is a GIMPLE formal temporary register variable. */
457 is_gimple_formal_tmp_reg (tree t
)
459 /* The intent of this is to get hold of a value that won't change.
460 An SSA_NAME qualifies no matter if its of a user variable or not. */
461 if (TREE_CODE (t
) == SSA_NAME
)
464 /* We don't know the lifetime characteristics of user variables. */
465 if (!is_gimple_formal_tmp_var (t
))
468 /* Finally, it must be capable of being placed in a register. */
469 return is_gimple_reg (t
);
472 /* Return true if T is a GIMPLE variable whose address is not needed. */
475 is_gimple_non_addressable (tree t
)
477 if (TREE_CODE (t
) == SSA_NAME
)
478 t
= SSA_NAME_VAR (t
);
480 return (is_gimple_variable (t
) && ! needs_to_live_in_memory (t
));
483 /* Return true if T is a GIMPLE rvalue, i.e. an identifier or a constant. */
486 is_gimple_val (tree t
)
488 /* Make loads from volatiles and memory vars explicit. */
489 if (is_gimple_variable (t
)
490 && is_gimple_reg_type (TREE_TYPE (t
))
491 && !is_gimple_reg (t
))
494 /* FIXME make these decls. That can happen only when we expose the
495 entire landing-pad construct at the tree level. */
496 if (TREE_CODE (t
) == EXC_PTR_EXPR
|| TREE_CODE (t
) == FILTER_EXPR
)
499 return (is_gimple_variable (t
) || is_gimple_min_invariant (t
));
503 /* Return true if T is a GIMPLE minimal lvalue. */
506 is_gimple_min_lval (tree t
)
508 return (is_gimple_id (t
)
509 || TREE_CODE (t
) == INDIRECT_REF
);
512 /* Return true if T is a typecast operation. */
515 is_gimple_cast (tree t
)
517 return (TREE_CODE (t
) == NOP_EXPR
518 || TREE_CODE (t
) == CONVERT_EXPR
519 || TREE_CODE (t
) == FIX_TRUNC_EXPR
520 || TREE_CODE (t
) == FIX_CEIL_EXPR
521 || TREE_CODE (t
) == FIX_FLOOR_EXPR
522 || TREE_CODE (t
) == FIX_ROUND_EXPR
);
525 /* Return true if T is a valid op0 of a CALL_EXPR. */
528 is_gimple_call_addr (tree t
)
530 return (TREE_CODE (t
) == OBJ_TYPE_REF
531 || is_gimple_val (t
));
534 /* If T makes a function call, return the corresponding CALL_EXPR operand.
535 Otherwise, return NULL_TREE. */
538 get_call_expr_in (tree t
)
540 if (TREE_CODE (t
) == MODIFY_EXPR
)
541 t
= TREE_OPERAND (t
, 1);
542 if (TREE_CODE (t
) == WITH_SIZE_EXPR
)
543 t
= TREE_OPERAND (t
, 0);
544 if (TREE_CODE (t
) == CALL_EXPR
)
549 /* Given a memory reference expression, return the base address. Note that,
550 in contrast with get_base_var, this will not recurse inside INDIRECT_REF
551 expressions. Therefore, given the reference PTR->FIELD, this function
552 will return *PTR. Whereas get_base_var would've returned PTR. */
555 get_base_address (tree t
)
557 while (TREE_CODE (t
) == REALPART_EXPR
|| TREE_CODE (t
) == IMAGPART_EXPR
558 || handled_component_p (t
))
559 t
= TREE_OPERAND (t
, 0);
562 || TREE_CODE (t
) == STRING_CST
563 || TREE_CODE (t
) == CONSTRUCTOR
564 || TREE_CODE (t
) == INDIRECT_REF
)
571 recalculate_side_effects (tree t
)
573 enum tree_code code
= TREE_CODE (t
);
574 int fro
= first_rtl_op (code
);
577 switch (TREE_CODE_CLASS (code
))
585 case PREDECREMENT_EXPR
:
586 case PREINCREMENT_EXPR
:
587 case POSTDECREMENT_EXPR
:
588 case POSTINCREMENT_EXPR
:
589 /* All of these have side-effects, no matter what their
598 case '<': /* a comparison expression */
599 case '1': /* a unary arithmetic expression */
600 case '2': /* a binary arithmetic expression */
601 case 'r': /* a reference */
602 TREE_SIDE_EFFECTS (t
) = TREE_THIS_VOLATILE (t
);
603 for (i
= 0; i
< fro
; ++i
)
605 tree op
= TREE_OPERAND (t
, i
);
606 if (op
&& TREE_SIDE_EFFECTS (op
))
607 TREE_SIDE_EFFECTS (t
) = 1;