* config/i860/i860-protos.h (i860_va_arg): Remove.
[official-gcc.git] / gcc / gimplify.c
blobf60ef89bc48f9b3e2b9d46d4e14d1a107b1ff539
1 /* Tree lowering pass. This pass converts the GENERIC functions-as-trees
2 tree representation into the GIMPLE form.
3 Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4 Major work done by Sebastian Pop <s.pop@laposte.net>,
5 Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "rtl.h"
30 #include "errors.h"
31 #include "varray.h"
32 #include "tree-gimple.h"
33 #include "tree-inline.h"
34 #include "diagnostic.h"
35 #include "langhooks.h"
36 #include "langhooks-def.h"
37 #include "tree-flow.h"
38 #include "cgraph.h"
39 #include "timevar.h"
40 #include "except.h"
41 #include "hashtab.h"
42 #include "flags.h"
43 #include "real.h"
44 #include "function.h"
45 #include "output.h"
46 #include "expr.h"
47 #include "ggc.h"
48 #include "target.h"
50 static struct gimplify_ctx
52 tree current_bind_expr;
53 bool save_stack;
54 tree temps;
55 tree conditional_cleanups;
56 int conditions;
57 tree exit_label;
58 tree return_temp;
59 varray_type case_labels;
60 /* The formal temporary table. Should this be persistent? */
61 htab_t temp_htab;
62 } *gimplify_ctxp;
65 /* Formal (expression) temporary table handling: Multiple occurrences of
66 the same scalar expression are evaluated into the same temporary. */
68 typedef struct gimple_temp_hash_elt
70 tree val; /* Key */
71 tree temp; /* Value */
72 } elt_t;
74 /* Forward declarations. */
75 static enum gimplify_status gimplify_modify_expr_rhs (tree *, tree *, tree *,
76 tree *, tree *, bool);
77 static enum gimplify_status gimplify_compound_expr (tree *, tree *, bool);
80 /* Return a hash value for a formal temporary table entry. */
82 static hashval_t
83 gimple_tree_hash (const void *p)
85 tree t = ((const elt_t *) p)->val;
86 return iterative_hash_expr (t, 0);
89 /* Compare two formal temporary table entries. */
91 static int
92 gimple_tree_eq (const void *p1, const void *p2)
94 tree t1 = ((const elt_t *) p1)->val;
95 tree t2 = ((const elt_t *) p2)->val;
96 enum tree_code code = TREE_CODE (t1);
98 if (TREE_CODE (t2) != code
99 || TREE_TYPE (t1) != TREE_TYPE (t2))
100 return 0;
102 if (!operand_equal_p (t1, t2, 0))
103 return 0;
105 /* Only allow them to compare equal if they also hash equal; otherwise
106 results are nondeterminate, and we fail bootstrap comparison. */
107 if (gimple_tree_hash (p1) != gimple_tree_hash (p2))
108 abort ();
110 return 1;
113 /* Set up a context for the gimplifier. */
115 void
116 push_gimplify_context (void)
118 if (gimplify_ctxp)
119 abort ();
120 gimplify_ctxp
121 = (struct gimplify_ctx *) xcalloc (1, sizeof (struct gimplify_ctx));
122 gimplify_ctxp->temp_htab
123 = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
126 /* Tear down a context for the gimplifier. If BODY is non-null, then
127 put the temporaries into the outer BIND_EXPR. Otherwise, put them
128 in the unexpanded_var_list. */
130 void
131 pop_gimplify_context (tree body)
133 if (!gimplify_ctxp || gimplify_ctxp->current_bind_expr)
134 abort ();
136 if (body)
137 declare_tmp_vars (gimplify_ctxp->temps, body);
138 else
139 record_vars (gimplify_ctxp->temps);
141 #if 0
142 if (!quiet_flag)
143 fprintf (stderr, " collisions: %f ",
144 htab_collisions (gimplify_ctxp->temp_htab));
145 #endif
147 htab_delete (gimplify_ctxp->temp_htab);
148 free (gimplify_ctxp);
149 gimplify_ctxp = NULL;
152 void
153 gimple_push_bind_expr (tree bind)
155 TREE_CHAIN (bind) = gimplify_ctxp->current_bind_expr;
156 gimplify_ctxp->current_bind_expr = bind;
159 void
160 gimple_pop_bind_expr (void)
162 gimplify_ctxp->current_bind_expr
163 = TREE_CHAIN (gimplify_ctxp->current_bind_expr);
166 tree
167 gimple_current_bind_expr (void)
169 return gimplify_ctxp->current_bind_expr;
172 /* Returns true iff there is a COND_EXPR between us and the innermost
173 CLEANUP_POINT_EXPR. This info is used by gimple_push_cleanup. */
175 static bool
176 gimple_conditional_context (void)
178 return gimplify_ctxp->conditions > 0;
181 /* Note that we've entered a COND_EXPR. */
183 static void
184 gimple_push_condition (void)
186 ++(gimplify_ctxp->conditions);
189 /* Note that we've left a COND_EXPR. If we're back at unconditional scope
190 now, add any conditional cleanups we've seen to the prequeue. */
192 static void
193 gimple_pop_condition (tree *pre_p)
195 int conds = --(gimplify_ctxp->conditions);
197 if (conds == 0)
199 append_to_statement_list (gimplify_ctxp->conditional_cleanups, pre_p);
200 gimplify_ctxp->conditional_cleanups = NULL_TREE;
202 else if (conds < 0)
203 abort ();
206 /* A subroutine of append_to_statement_list{,_force}. */
208 static void
209 append_to_statement_list_1 (tree t, tree *list_p, bool side_effects)
211 tree list = *list_p;
212 tree_stmt_iterator i;
214 if (!side_effects)
215 return;
217 if (!list)
219 if (t && TREE_CODE (t) == STATEMENT_LIST)
221 *list_p = t;
222 return;
224 *list_p = list = alloc_stmt_list ();
227 i = tsi_last (list);
228 tsi_link_after (&i, t, TSI_CONTINUE_LINKING);
231 /* Add T to the end of the list container pointed by LIST_P.
232 If T is an expression with no effects, it is ignored. */
234 void
235 append_to_statement_list (tree t, tree *list_p)
237 append_to_statement_list_1 (t, list_p, t ? TREE_SIDE_EFFECTS (t) : false);
240 /* Similar, but the statement is always added, regardless of side effects. */
242 void
243 append_to_statement_list_force (tree t, tree *list_p)
245 append_to_statement_list_1 (t, list_p, t != NULL);
248 /* Both gimplify the statement T and append it to LIST_P. */
250 void
251 gimplify_and_add (tree t, tree *list_p)
253 gimplify_stmt (&t);
254 append_to_statement_list (t, list_p);
257 /* Strip off a legitimate source ending from the input string NAME of
258 length LEN. Rather than having to know the names used by all of
259 our front ends, we strip off an ending of a period followed by
260 up to five characters. (Java uses ".class".) */
262 static inline void
263 remove_suffix (char *name, int len)
265 int i;
267 for (i = 2; i < 8 && len > i; i++)
269 if (name[len - i] == '.')
271 name[len - i] = '\0';
272 break;
277 /* Create a nameless artificial label and put it in the current function
278 context. Returns the newly created label. */
280 tree
281 create_artificial_label (void)
283 tree lab = build_decl (LABEL_DECL, NULL_TREE, void_type_node);
285 DECL_ARTIFICIAL (lab) = 1;
286 DECL_CONTEXT (lab) = current_function_decl;
287 return lab;
290 /* Create a new temporary name with PREFIX. Returns an identifier. */
292 static GTY(()) unsigned int tmp_var_id_num;
294 tree
295 create_tmp_var_name (const char *prefix)
297 char *tmp_name;
299 if (prefix)
301 char *preftmp = ASTRDUP (prefix);
303 remove_suffix (preftmp, strlen (preftmp));
304 prefix = preftmp;
307 ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
308 return get_identifier (tmp_name);
312 /* Create a new temporary variable declaration of type TYPE.
313 Does NOT push it into the current binding. */
315 tree
316 create_tmp_var_raw (tree type, const char *prefix)
318 tree tmp_var;
319 tree new_type;
321 /* Make the type of the variable writable. */
322 new_type = build_type_variant (type, 0, 0);
323 TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
325 tmp_var = build_decl (VAR_DECL, create_tmp_var_name (prefix), type);
327 /* The variable was declared by the compiler. */
328 DECL_ARTIFICIAL (tmp_var) = 1;
329 /* And we don't want debug info for it. */
330 DECL_IGNORED_P (tmp_var) = 1;
332 /* Make the variable writable. */
333 TREE_READONLY (tmp_var) = 0;
335 DECL_EXTERNAL (tmp_var) = 0;
336 TREE_STATIC (tmp_var) = 0;
337 TREE_USED (tmp_var) = 1;
339 return tmp_var;
342 /* Create a new temporary variable declaration of type TYPE. DOES push the
343 variable into the current binding. Further, assume that this is called
344 only from gimplification or optimization, at which point the creation of
345 certain types are bugs. */
347 tree
348 create_tmp_var (tree type, const char *prefix)
350 tree tmp_var;
352 #if defined ENABLE_CHECKING
353 /* We don't allow types that are addressable (meaning we can't make copies),
354 incomplete, or of variable size. */
355 if (TREE_ADDRESSABLE (type)
356 || !COMPLETE_TYPE_P (type)
357 || TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST)
358 abort ();
359 #endif
361 tmp_var = create_tmp_var_raw (type, prefix);
362 gimple_add_tmp_var (tmp_var);
363 return tmp_var;
366 /* Given a tree, try to return a useful variable name that we can use
367 to prefix a temporary that is being assigned the value of the tree.
368 I.E. given <temp> = &A, return A. */
370 const char *
371 get_name (tree t)
373 tree stripped_decl;
375 stripped_decl = t;
376 STRIP_NOPS (stripped_decl);
377 if (DECL_P (stripped_decl) && DECL_NAME (stripped_decl))
378 return IDENTIFIER_POINTER (DECL_NAME (stripped_decl));
379 else
381 switch (TREE_CODE (stripped_decl))
383 case ADDR_EXPR:
384 return get_name (TREE_OPERAND (stripped_decl, 0));
385 break;
386 default:
387 return NULL;
392 /* Create a temporary with a name derived from VAL. Subroutine of
393 lookup_tmp_var; nobody else should call this function. */
395 static inline tree
396 create_tmp_from_val (tree val)
398 return create_tmp_var (TREE_TYPE (val), get_name (val));
401 /* Create a temporary to hold the value of VAL. If IS_FORMAL, try to reuse
402 an existing expression temporary. */
404 static tree
405 lookup_tmp_var (tree val, bool is_formal)
407 if (!is_formal || TREE_SIDE_EFFECTS (val))
408 return create_tmp_from_val (val);
409 else
411 elt_t elt, *elt_p;
412 void **slot;
414 elt.val = val;
415 slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
416 if (*slot == NULL)
418 elt_p = xmalloc (sizeof (*elt_p));
419 elt_p->val = val;
420 elt_p->temp = create_tmp_from_val (val);
421 TREE_READONLY (elt_p->temp) = 1;
422 *slot = (void *) elt_p;
424 else
425 elt_p = (elt_t *) *slot;
427 return elt_p->temp;
431 /* Returns a formal temporary variable initialized with VAL. PRE_P is as
432 in gimplify_expr. Only use this function if:
434 1) The value of the unfactored expression represented by VAL will not
435 change between the initialization and use of the temporary, and
436 2) The temporary will not be otherwise modified.
438 For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
439 and #2 means it is inappropriate for && temps.
441 For other cases, use get_initialized_tmp_var instead. */
443 static tree
444 internal_get_tmp_var (tree val, tree *pre_p, tree *post_p, bool is_formal)
446 tree t, mod;
447 char class;
449 gimplify_expr (&val, pre_p, post_p, is_gimple_rhs, fb_rvalue);
451 t = lookup_tmp_var (val, is_formal);
453 mod = build (MODIFY_EXPR, TREE_TYPE (t), t, val);
455 class = TREE_CODE_CLASS (TREE_CODE (val));
456 if (EXPR_HAS_LOCATION (val))
457 SET_EXPR_LOCUS (mod, EXPR_LOCUS (val));
458 else
459 SET_EXPR_LOCATION (mod, input_location);
461 /* gimplify_modify_expr might want to reduce this further. */
462 gimplify_and_add (mod, pre_p);
463 return t;
466 tree
467 get_formal_tmp_var (tree val, tree *pre_p)
469 return internal_get_tmp_var (val, pre_p, NULL, true);
472 /* Returns a temporary variable initialized with VAL. PRE_P and POST_P
473 are as in gimplify_expr. */
475 tree
476 get_initialized_tmp_var (tree val, tree *pre_p, tree *post_p)
478 return internal_get_tmp_var (val, pre_p, post_p, false);
481 /* Returns true if T is a GIMPLE temporary variable, false otherwise. */
483 bool
484 is_gimple_tmp_var (tree t)
486 /* FIXME this could trigger for other local artificials, too. */
487 return (TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t)
488 && !TREE_STATIC (t) && !DECL_EXTERNAL (t));
491 /* Declares all the variables in VARS in SCOPE. */
493 void
494 declare_tmp_vars (tree vars, tree scope)
496 tree last = vars;
497 if (last)
499 tree temps;
501 /* C99 mode puts the default 'return 0;' for main outside the outer
502 braces. So drill down until we find an actual scope. */
503 while (TREE_CODE (scope) == COMPOUND_EXPR)
504 scope = TREE_OPERAND (scope, 0);
506 if (TREE_CODE (scope) != BIND_EXPR)
507 abort ();
509 temps = nreverse (last);
510 TREE_CHAIN (last) = BIND_EXPR_VARS (scope);
511 BIND_EXPR_VARS (scope) = temps;
515 void
516 gimple_add_tmp_var (tree tmp)
518 if (TREE_CHAIN (tmp) || DECL_SEEN_IN_BIND_EXPR_P (tmp))
519 abort ();
521 DECL_CONTEXT (tmp) = current_function_decl;
522 DECL_SEEN_IN_BIND_EXPR_P (tmp) = 1;
524 if (gimplify_ctxp)
526 TREE_CHAIN (tmp) = gimplify_ctxp->temps;
527 gimplify_ctxp->temps = tmp;
529 else if (cfun)
530 record_vars (tmp);
531 else
532 declare_tmp_vars (tmp, DECL_SAVED_TREE (current_function_decl));
535 /* Determines whether to assign a locus to the statement STMT. */
537 static bool
538 should_carry_locus_p (tree stmt)
540 /* Don't emit a line note for a label. We particularly don't want to
541 emit one for the break label, since it doesn't actually correspond
542 to the beginning of the loop/switch. */
543 if (TREE_CODE (stmt) == LABEL_EXPR)
544 return false;
546 /* Do not annotate empty statements, since it confuses gcov. */
547 if (!TREE_SIDE_EFFECTS (stmt))
548 return false;
550 return true;
553 static void
554 annotate_one_with_locus (tree t, location_t locus)
556 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t)))
557 && ! EXPR_HAS_LOCATION (t)
558 && should_carry_locus_p (t))
559 SET_EXPR_LOCATION (t, locus);
562 void
563 annotate_all_with_locus (tree *stmt_p, location_t locus)
565 tree_stmt_iterator i;
567 if (!*stmt_p)
568 return;
570 for (i = tsi_start (*stmt_p); !tsi_end_p (i); tsi_next (&i))
572 tree t = tsi_stmt (i);
574 #ifdef ENABLE_CHECKING
575 /* Assuming we've already been gimplified, we shouldn't
576 see nested chaining constructs anymore. */
577 if (TREE_CODE (t) == STATEMENT_LIST
578 || TREE_CODE (t) == COMPOUND_EXPR)
579 abort ();
580 #endif
582 annotate_one_with_locus (t, locus);
586 /* Similar to copy_tree_r() but do not copy SAVE_EXPR or TARGET_EXPR nodes.
587 These nodes model computations that should only be done once. If we
588 were to unshare something like SAVE_EXPR(i++), the gimplification
589 process would create wrong code. */
591 static tree
592 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
594 enum tree_code code = TREE_CODE (*tp);
595 /* Don't unshare types, decls, constants and SAVE_EXPR nodes. */
596 if (TREE_CODE_CLASS (code) == 't'
597 || TREE_CODE_CLASS (code) == 'd'
598 || TREE_CODE_CLASS (code) == 'c'
599 || code == SAVE_EXPR || code == TARGET_EXPR
600 /* We can't do anything sensible with a BLOCK used as an expression,
601 but we also can't abort when we see it because of non-expression
602 uses. So just avert our eyes and cross our fingers. Silly Java. */
603 || code == BLOCK)
604 *walk_subtrees = 0;
605 else if (code == BIND_EXPR)
606 abort ();
607 else
608 copy_tree_r (tp, walk_subtrees, data);
610 return NULL_TREE;
613 /* Mark all the _DECL nodes under *TP as volatile. FIXME: This must die
614 after VA_ARG_EXPRs are properly lowered. */
616 static tree
617 mark_decls_volatile_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
618 void *data ATTRIBUTE_UNUSED)
620 if (SSA_VAR_P (*tp))
621 TREE_THIS_VOLATILE (*tp) = 1;
623 return NULL_TREE;
627 /* Callback for walk_tree to unshare most of the shared trees rooted at
628 *TP. If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
629 then *TP is deep copied by calling copy_tree_r.
631 This unshares the same trees as copy_tree_r with the exception of
632 SAVE_EXPR nodes. These nodes model computations that should only be
633 done once. If we were to unshare something like SAVE_EXPR(i++), the
634 gimplification process would create wrong code. */
636 static tree
637 copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
638 void *data ATTRIBUTE_UNUSED)
640 tree t = *tp;
641 enum tree_code code = TREE_CODE (t);
643 /* Skip types, decls, and constants. But we do want to look at their
644 types and the bounds of types. Mark them as visited so we properly
645 unmark their subtrees on the unmark pass. If we've already seen them,
646 don't look down further. */
647 if (TREE_CODE_CLASS (code) == 't'
648 || TREE_CODE_CLASS (code) == 'd'
649 || TREE_CODE_CLASS (code) == 'c')
651 if (TREE_VISITED (t))
652 *walk_subtrees = 0;
653 else
654 TREE_VISITED (t) = 1;
657 /* If this node has been visited already, unshare it and don't look
658 any deeper. */
659 else if (TREE_VISITED (t))
661 walk_tree (tp, mostly_copy_tree_r, NULL, NULL);
662 *walk_subtrees = 0;
665 /* Otherwise, mark the tree as visited and keep looking. */
666 else
668 TREE_VISITED (t) = 1;
669 if (TREE_CODE (*tp) == VA_ARG_EXPR
670 && targetm.calls.gimplify_va_arg_expr == NULL)
672 /* Mark any _DECL inside the operand as volatile to avoid
673 the optimizers messing around with it. We have to do this
674 early, otherwise we might mark a variable as volatile
675 after we gimplify other statements that use the variable
676 assuming it's not volatile. */
678 /* FIXME once most targets define the above hook, this should
679 go away (perhaps along with the #include "target.h"). */
680 walk_tree (&TREE_OPERAND (*tp, 0), mark_decls_volatile_r,
681 NULL, NULL);
685 return NULL_TREE;
688 static tree
689 unmark_visited_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
690 void *data ATTRIBUTE_UNUSED)
692 if (TREE_VISITED (*tp))
693 TREE_VISITED (*tp) = 0;
694 else
695 *walk_subtrees = 0;
697 return NULL_TREE;
700 /* Unshare all the trees in BODY_P, a pointer into the body of FNDECL, and the
701 bodies of any nested functions if we are unsharing the entire body of
702 FNDECL. */
704 static void
705 unshare_body (tree *body_p, tree fndecl)
707 struct cgraph_node *cgn = cgraph_node (fndecl);
709 walk_tree (body_p, copy_if_shared_r, NULL, NULL);
710 if (body_p == &DECL_SAVED_TREE (fndecl))
711 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
712 unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
715 /* Likewise, but mark all trees as not visited. */
717 static void
718 unvisit_body (tree *body_p, tree fndecl)
720 struct cgraph_node *cgn = cgraph_node (fndecl);
722 walk_tree (body_p, unmark_visited_r, NULL, NULL);
723 if (body_p == &DECL_SAVED_TREE (fndecl))
724 for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
725 unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
728 /* Unshare T and all the trees reached from T via TREE_CHAIN. */
730 void
731 unshare_all_trees (tree t)
733 walk_tree (&t, copy_if_shared_r, NULL, NULL);
734 walk_tree (&t, unmark_visited_r, NULL, NULL);
737 /* Unconditionally make an unshared copy of EXPR. This is used when using
738 stored expressions which span multiple functions, such as BINFO_VTABLE,
739 as the normal unsharing process can't tell that they're shared. */
741 tree
742 unshare_expr (tree expr)
744 walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
745 return expr;
748 /* A terser interface for building a representation of a exception
749 specification. */
751 tree
752 gimple_build_eh_filter (tree body, tree allowed, tree failure)
754 tree t;
756 /* FIXME should the allowed types go in TREE_TYPE? */
757 t = build (EH_FILTER_EXPR, void_type_node, allowed, NULL_TREE);
758 append_to_statement_list (failure, &EH_FILTER_FAILURE (t));
760 t = build (TRY_CATCH_EXPR, void_type_node, NULL_TREE, t);
761 append_to_statement_list (body, &TREE_OPERAND (t, 0));
763 return t;
767 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
768 contain statements and have a value. Assign its value to a temporary
769 and give it void_type_node. Returns the temporary, or NULL_TREE if
770 WRAPPER was already void. */
772 tree
773 voidify_wrapper_expr (tree wrapper, tree temp)
775 if (!VOID_TYPE_P (TREE_TYPE (wrapper)))
777 tree *p, sub = wrapper;
779 restart:
780 /* Set p to point to the body of the wrapper. */
781 switch (TREE_CODE (sub))
783 case BIND_EXPR:
784 /* For a BIND_EXPR, the body is operand 1. */
785 p = &BIND_EXPR_BODY (sub);
786 break;
788 default:
789 p = &TREE_OPERAND (sub, 0);
790 break;
793 /* Advance to the last statement. Set all container types to void. */
794 if (TREE_CODE (*p) == STATEMENT_LIST)
796 tree_stmt_iterator i = tsi_last (*p);
797 p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
799 else
801 for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
803 TREE_SIDE_EFFECTS (*p) = 1;
804 TREE_TYPE (*p) = void_type_node;
808 if (p == NULL || IS_EMPTY_STMT (*p))
810 /* Look through exception handling. */
811 else if (TREE_CODE (*p) == TRY_FINALLY_EXPR
812 || TREE_CODE (*p) == TRY_CATCH_EXPR)
814 sub = *p;
815 goto restart;
817 /* The C++ frontend already did this for us. */
818 else if (TREE_CODE (*p) == INIT_EXPR
819 || TREE_CODE (*p) == TARGET_EXPR)
820 temp = TREE_OPERAND (*p, 0);
821 /* If we're returning a dereference, move the dereference
822 outside the wrapper. */
823 else if (TREE_CODE (*p) == INDIRECT_REF)
825 tree ptr = TREE_OPERAND (*p, 0);
826 temp = create_tmp_var (TREE_TYPE (ptr), "retval");
827 *p = build (MODIFY_EXPR, TREE_TYPE (ptr), temp, ptr);
828 temp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (temp)), temp);
829 /* If this is a BIND_EXPR for a const inline function, it might not
830 have TREE_SIDE_EFFECTS set. That is no longer accurate. */
831 TREE_SIDE_EFFECTS (wrapper) = 1;
833 else
835 if (!temp)
836 temp = create_tmp_var (TREE_TYPE (wrapper), "retval");
837 *p = build (MODIFY_EXPR, TREE_TYPE (temp), temp, *p);
838 TREE_SIDE_EFFECTS (wrapper) = 1;
841 TREE_TYPE (wrapper) = void_type_node;
842 return temp;
845 return NULL_TREE;
848 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
849 a temporary through which they communicate. */
851 static void
852 build_stack_save_restore (tree *save, tree *restore)
854 tree save_call, tmp_var;
856 save_call =
857 build_function_call_expr (implicit_built_in_decls[BUILT_IN_STACK_SAVE],
858 NULL_TREE);
859 tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
861 *save = build (MODIFY_EXPR, ptr_type_node, tmp_var, save_call);
862 *restore =
863 build_function_call_expr (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
864 tree_cons (NULL_TREE, tmp_var, NULL_TREE));
867 /* Gimplify a BIND_EXPR. Just voidify and recurse. */
869 static enum gimplify_status
870 gimplify_bind_expr (tree *expr_p, tree temp, tree *pre_p)
872 tree bind_expr = *expr_p;
873 bool old_save_stack = gimplify_ctxp->save_stack;
874 tree t;
876 temp = voidify_wrapper_expr (bind_expr, temp);
878 /* Mark variables seen in this bind expr. */
879 for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
880 DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
882 gimple_push_bind_expr (bind_expr);
883 gimplify_ctxp->save_stack = false;
885 gimplify_to_stmt_list (&BIND_EXPR_BODY (bind_expr));
887 if (gimplify_ctxp->save_stack)
889 tree stack_save, stack_restore;
891 /* Save stack on entry and restore it on exit. Add a try_finally
892 block to achieve this. Note that mudflap depends on the
893 format of the emitted code: see mx_register_decls(). */
894 build_stack_save_restore (&stack_save, &stack_restore);
896 t = build (TRY_FINALLY_EXPR, void_type_node,
897 BIND_EXPR_BODY (bind_expr), NULL_TREE);
898 append_to_statement_list (stack_restore, &TREE_OPERAND (t, 1));
900 BIND_EXPR_BODY (bind_expr) = NULL_TREE;
901 append_to_statement_list (stack_save, &BIND_EXPR_BODY (bind_expr));
902 append_to_statement_list (t, &BIND_EXPR_BODY (bind_expr));
905 gimplify_ctxp->save_stack = old_save_stack;
906 gimple_pop_bind_expr ();
908 if (temp)
910 *expr_p = temp;
911 append_to_statement_list (bind_expr, pre_p);
912 return GS_OK;
914 else
915 return GS_ALL_DONE;
918 /* Gimplify a RETURN_EXPR. If the expression to be returned is not a
919 GIMPLE value, it is assigned to a new temporary and the statement is
920 re-written to return the temporary.
922 PRE_P points to the list where side effects that must happen before
923 STMT should be stored. */
925 static enum gimplify_status
926 gimplify_return_expr (tree stmt, tree *pre_p)
928 tree ret_expr = TREE_OPERAND (stmt, 0);
929 tree result_decl, result;
931 if (!ret_expr || TREE_CODE (ret_expr) == RESULT_DECL)
932 return GS_ALL_DONE;
934 if (ret_expr == error_mark_node)
935 return GS_ERROR;
937 if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
938 result_decl = NULL_TREE;
939 else
941 result_decl = TREE_OPERAND (ret_expr, 0);
942 #ifdef ENABLE_CHECKING
943 if ((TREE_CODE (ret_expr) != MODIFY_EXPR
944 && TREE_CODE (ret_expr) != INIT_EXPR)
945 || TREE_CODE (result_decl) != RESULT_DECL)
946 abort ();
947 #endif
950 /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
951 Recall that aggregate_value_p is FALSE for any aggregate type that is
952 returned in registers. If we're returning values in registers, then
953 we don't want to extend the lifetime of the RESULT_DECL, particularly
954 across another call. In addition, for those aggregates for which
955 hard_function_value generates a PARALLEL, we'll abort during normal
956 expansion of structure assignments; there's special code in expand_return
957 to handle this case that does not exist in expand_expr. */
958 if (!result_decl
959 || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
960 result = result_decl;
961 else if (gimplify_ctxp->return_temp)
962 result = gimplify_ctxp->return_temp;
963 else
965 result = create_tmp_var (TREE_TYPE (result_decl), NULL);
967 /* ??? With complex control flow (usually involving abnormal edges),
968 we can wind up warning about an uninitialized value for this. Due
969 to how this variable is constructed and initialized, this is never
970 true. Give up and never warn. */
971 TREE_NO_WARNING (result) = 1;
973 gimplify_ctxp->return_temp = result;
976 /* Smash the lhs of the MODIFY_EXPR to the temporary we plan to use.
977 Then gimplify the whole thing. */
978 if (result != result_decl)
979 TREE_OPERAND (ret_expr, 0) = result;
981 gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
983 /* If we didn't use a temporary, then the result is just the result_decl.
984 Otherwise we need a simple copy. This should already be gimple. */
985 if (result == result_decl)
986 ret_expr = result;
987 else
988 ret_expr = build (MODIFY_EXPR, TREE_TYPE (result), result_decl, result);
989 TREE_OPERAND (stmt, 0) = ret_expr;
991 return GS_ALL_DONE;
994 /* Gimplifies a DECL_EXPR node *STMT_P by making any necessary allocation
995 and initialization explicit. */
997 static enum gimplify_status
998 gimplify_decl_expr (tree *stmt_p)
1000 tree stmt = *stmt_p;
1001 tree decl = DECL_EXPR_DECL (stmt);
1003 *stmt_p = NULL_TREE;
1005 if (TREE_TYPE (decl) == error_mark_node)
1006 return GS_ERROR;
1008 else if (TREE_CODE (decl) == TYPE_DECL)
1009 gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
1011 else if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
1013 tree init = DECL_INITIAL (decl);
1015 if (!TREE_CONSTANT (DECL_SIZE (decl)))
1017 /* This is a variable-sized decl. Simplify its size and mark it
1018 for deferred expansion. Note that mudflap depends on the format
1019 of the emitted code: see mx_register_decls(). */
1020 tree t, args;
1022 gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
1023 gimplify_one_sizepos (&DECL_SIZE (decl), stmt_p);
1024 gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), stmt_p);
1026 args = tree_cons (NULL, DECL_SIZE_UNIT (decl), NULL);
1027 t = build_fold_addr_expr (decl);
1028 args = tree_cons (NULL, t, args);
1029 t = implicit_built_in_decls[BUILT_IN_STACK_ALLOC];
1030 t = build_function_call_expr (t, args);
1032 gimplify_and_add (t, stmt_p);
1033 DECL_DEFER_OUTPUT (decl) = 1;
1036 if (init && init != error_mark_node)
1038 if (!TREE_STATIC (decl))
1040 DECL_INITIAL (decl) = NULL_TREE;
1041 init = build (MODIFY_EXPR, void_type_node, decl, init);
1042 gimplify_and_add (init, stmt_p);
1044 else
1045 /* We must still examine initializers for static variables
1046 as they may contain a label address. */
1047 walk_tree (&init, force_labels_r, NULL, NULL);
1050 /* This decl isn't mentioned in the enclosing block, so add it to the
1051 list of temps. FIXME it seems a bit of a kludge to say that
1052 anonymous artificial vars aren't pushed, but everything else is. */
1053 if (DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1054 gimple_add_tmp_var (decl);
1057 return GS_ALL_DONE;
1060 /* Gimplify a LOOP_EXPR. Normally this just involves gimplifying the body
1061 and replacing the LOOP_EXPR with goto, but if the loop contains an
1062 EXIT_EXPR, we need to append a label for it to jump to. */
1064 static enum gimplify_status
1065 gimplify_loop_expr (tree *expr_p, tree *pre_p)
1067 tree saved_label = gimplify_ctxp->exit_label;
1068 tree start_label = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
1069 tree jump_stmt = build_and_jump (&LABEL_EXPR_LABEL (start_label));
1071 append_to_statement_list (start_label, pre_p);
1073 gimplify_ctxp->exit_label = NULL_TREE;
1075 gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1077 if (gimplify_ctxp->exit_label)
1079 append_to_statement_list (jump_stmt, pre_p);
1080 *expr_p = build1 (LABEL_EXPR, void_type_node, gimplify_ctxp->exit_label);
1082 else
1083 *expr_p = jump_stmt;
1085 gimplify_ctxp->exit_label = saved_label;
1087 return GS_ALL_DONE;
1090 /* Compare two case labels. Because the front end should already have
1091 made sure that case ranges do not overlap, it is enough to only compare
1092 the CASE_LOW values of each case label. */
1094 static int
1095 compare_case_labels (const void *p1, const void *p2)
1097 tree case1 = *(tree *)p1;
1098 tree case2 = *(tree *)p2;
1100 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1103 /* Sort the case labels in LABEL_VEC in ascending order. */
1105 void
1106 sort_case_labels (tree label_vec)
1108 size_t len = TREE_VEC_LENGTH (label_vec);
1109 tree default_case = TREE_VEC_ELT (label_vec, len - 1);
1111 if (CASE_LOW (default_case))
1113 size_t i;
1115 /* The last label in the vector should be the default case
1116 but it is not. */
1117 for (i = 0; i < len; ++i)
1119 tree t = TREE_VEC_ELT (label_vec, i);
1120 if (!CASE_LOW (t))
1122 default_case = t;
1123 TREE_VEC_ELT (label_vec, i) = TREE_VEC_ELT (label_vec, len - 1);
1124 TREE_VEC_ELT (label_vec, len - 1) = default_case;
1125 break;
1130 qsort (&TREE_VEC_ELT (label_vec, 0), len - 1, sizeof (tree),
1131 compare_case_labels);
1134 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1135 branch to. */
1137 static enum gimplify_status
1138 gimplify_switch_expr (tree *expr_p, tree *pre_p)
1140 tree switch_expr = *expr_p;
1141 enum gimplify_status ret;
1143 ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL,
1144 is_gimple_val, fb_rvalue);
1146 if (SWITCH_BODY (switch_expr))
1148 varray_type labels, saved_labels;
1149 tree label_vec, default_case = NULL_TREE;
1150 size_t i, len;
1152 /* If someone can be bothered to fill in the labels, they can
1153 be bothered to null out the body too. */
1154 if (SWITCH_LABELS (switch_expr))
1155 abort ();
1157 saved_labels = gimplify_ctxp->case_labels;
1158 VARRAY_TREE_INIT (gimplify_ctxp->case_labels, 8, "case_labels");
1160 gimplify_to_stmt_list (&SWITCH_BODY (switch_expr));
1162 labels = gimplify_ctxp->case_labels;
1163 gimplify_ctxp->case_labels = saved_labels;
1165 len = VARRAY_ACTIVE_SIZE (labels);
1167 for (i = 0; i < len; ++i)
1169 tree t = VARRAY_TREE (labels, i);
1170 if (!CASE_LOW (t))
1172 /* The default case must be the last label in the list. */
1173 default_case = t;
1174 VARRAY_TREE (labels, i) = VARRAY_TREE (labels, len - 1);
1175 len--;
1176 break;
1180 label_vec = make_tree_vec (len + 1);
1181 SWITCH_LABELS (*expr_p) = label_vec;
1182 append_to_statement_list (switch_expr, pre_p);
1184 if (! default_case)
1186 /* If the switch has no default label, add one, so that we jump
1187 around the switch body. */
1188 default_case = build (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
1189 NULL_TREE, create_artificial_label ());
1190 append_to_statement_list (SWITCH_BODY (switch_expr), pre_p);
1191 *expr_p = build (LABEL_EXPR, void_type_node,
1192 CASE_LABEL (default_case));
1194 else
1195 *expr_p = SWITCH_BODY (switch_expr);
1197 for (i = 0; i < len; ++i)
1198 TREE_VEC_ELT (label_vec, i) = VARRAY_TREE (labels, i);
1199 TREE_VEC_ELT (label_vec, len) = default_case;
1201 sort_case_labels (label_vec);
1203 SWITCH_BODY (switch_expr) = NULL;
1205 else if (!SWITCH_LABELS (switch_expr))
1206 abort ();
1208 return ret;
1211 static enum gimplify_status
1212 gimplify_case_label_expr (tree *expr_p)
1214 tree expr = *expr_p;
1215 if (gimplify_ctxp->case_labels)
1216 VARRAY_PUSH_TREE (gimplify_ctxp->case_labels, expr);
1217 else
1218 abort ();
1219 *expr_p = build (LABEL_EXPR, void_type_node, CASE_LABEL (expr));
1220 return GS_ALL_DONE;
1223 /* Gimplify a LABELED_BLOCK_EXPR into a LABEL_EXPR following
1224 a (possibly empty) body. */
1226 static enum gimplify_status
1227 gimplify_labeled_block_expr (tree *expr_p)
1229 tree body = LABELED_BLOCK_BODY (*expr_p);
1230 tree label = LABELED_BLOCK_LABEL (*expr_p);
1231 tree t;
1233 DECL_CONTEXT (label) = current_function_decl;
1234 t = build (LABEL_EXPR, void_type_node, label);
1235 if (body != NULL_TREE)
1236 t = build (COMPOUND_EXPR, void_type_node, body, t);
1237 *expr_p = t;
1239 return GS_OK;
1242 /* Gimplify a EXIT_BLOCK_EXPR into a GOTO_EXPR. */
1244 static enum gimplify_status
1245 gimplify_exit_block_expr (tree *expr_p)
1247 tree labeled_block = TREE_OPERAND (*expr_p, 0);
1248 tree label;
1250 /* First operand must be a LABELED_BLOCK_EXPR, which should
1251 already be lowered (or partially lowered) when we get here. */
1252 #if defined ENABLE_CHECKING
1253 if (TREE_CODE (labeled_block) != LABELED_BLOCK_EXPR)
1254 abort ();
1255 #endif
1257 label = LABELED_BLOCK_LABEL (labeled_block);
1258 *expr_p = build1 (GOTO_EXPR, void_type_node, label);
1260 return GS_OK;
1263 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1264 if necessary. */
1266 tree
1267 build_and_jump (tree *label_p)
1269 if (label_p == NULL)
1270 /* If there's nowhere to jump, just fall through. */
1271 return NULL_TREE;
1273 if (*label_p == NULL_TREE)
1275 tree label = create_artificial_label ();
1276 *label_p = label;
1279 return build1 (GOTO_EXPR, void_type_node, *label_p);
1282 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1283 This also involves building a label to jump to and communicating it to
1284 gimplify_loop_expr through gimplify_ctxp->exit_label. */
1286 static enum gimplify_status
1287 gimplify_exit_expr (tree *expr_p)
1289 tree cond = TREE_OPERAND (*expr_p, 0);
1290 tree expr;
1292 expr = build_and_jump (&gimplify_ctxp->exit_label);
1293 expr = build (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1294 *expr_p = expr;
1296 return GS_OK;
1299 /* A helper function to be called via walk_tree. Mark all labels under *TP
1300 as being forced. To be called for DECL_INITIAL of static variables. */
1302 tree
1303 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1305 if (TYPE_P (*tp))
1306 *walk_subtrees = 0;
1307 if (TREE_CODE (*tp) == LABEL_DECL)
1308 FORCED_LABEL (*tp) = 1;
1310 return NULL_TREE;
1313 /* *EXPR_P is a COMPONENT_REF being used as an rvalue. If its type is
1314 different from its canonical type, wrap the whole thing inside a
1315 NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1316 type.
1318 The canonical type of a COMPONENT_REF is the type of the field being
1319 referenced--unless the field is a bit-field which can be read directly
1320 in a smaller mode, in which case the canonical type is the
1321 sign-appropriate type corresponding to that mode. */
1323 static void
1324 canonicalize_component_ref (tree *expr_p)
1326 tree expr = *expr_p;
1327 tree type;
1329 if (TREE_CODE (expr) != COMPONENT_REF)
1330 abort ();
1332 if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1333 type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1334 else
1335 type = TREE_TYPE (TREE_OPERAND (expr, 1));
1337 if (TREE_TYPE (expr) != type)
1339 tree old_type = TREE_TYPE (expr);
1341 /* Set the type of the COMPONENT_REF to the underlying type. */
1342 TREE_TYPE (expr) = type;
1344 /* And wrap the whole thing inside a NOP_EXPR. */
1345 expr = build1 (NOP_EXPR, old_type, expr);
1347 *expr_p = expr;
1351 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1352 to foo, embed that change in the ADDR_EXPR by converting
1353 T array[U];
1354 (T *)&array
1356 &array[L]
1357 where L is the lower bound. For simplicity, only do this for constant
1358 lower bound. */
1360 static void
1361 canonicalize_addr_expr (tree *expr_p)
1363 tree expr = *expr_p;
1364 tree ctype = TREE_TYPE (expr);
1365 tree addr_expr = TREE_OPERAND (expr, 0);
1366 tree atype = TREE_TYPE (addr_expr);
1367 tree dctype, datype, ddatype, otype, obj_expr;
1369 /* Both cast and addr_expr types should be pointers. */
1370 if (!POINTER_TYPE_P (ctype) || !POINTER_TYPE_P (atype))
1371 return;
1373 /* The addr_expr type should be a pointer to an array. */
1374 datype = TREE_TYPE (atype);
1375 if (TREE_CODE (datype) != ARRAY_TYPE)
1376 return;
1378 /* Both cast and addr_expr types should address the same object type. */
1379 dctype = TREE_TYPE (ctype);
1380 ddatype = TREE_TYPE (datype);
1381 if (!lang_hooks.types_compatible_p (ddatype, dctype))
1382 return;
1384 /* The addr_expr and the object type should match. */
1385 obj_expr = TREE_OPERAND (addr_expr, 0);
1386 otype = TREE_TYPE (obj_expr);
1387 if (!lang_hooks.types_compatible_p (otype, datype))
1388 return;
1390 /* The lower bound and element sizes must be constant. */
1391 if (TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
1392 || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1393 || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1394 return;
1396 /* All checks succeeded. Build a new node to merge the cast. */
1397 *expr_p = build4 (ARRAY_REF, dctype, obj_expr,
1398 TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1399 TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1400 size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (dctype),
1401 size_int (TYPE_ALIGN (dctype)
1402 / BITS_PER_UNIT)));
1403 *expr_p = build1 (ADDR_EXPR, ctype, *expr_p);
1406 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR. Remove it and/or other conversions
1407 underneath as appropriate. */
1409 static enum gimplify_status
1410 gimplify_conversion (tree *expr_p)
1412 /* If we still have a conversion at the toplevel, then strip
1413 away all but the outermost conversion. */
1414 if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1416 STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1418 /* And remove the outermost conversion if it's useless. */
1419 if (tree_ssa_useless_type_conversion (*expr_p))
1420 *expr_p = TREE_OPERAND (*expr_p, 0);
1423 /* If we still have a conversion at the toplevel,
1424 then canonicalize some constructs. */
1425 if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1427 tree sub = TREE_OPERAND (*expr_p, 0);
1429 /* If a NOP conversion is changing the type of a COMPONENT_REF
1430 expression, then canonicalize its type now in order to expose more
1431 redundant conversions. */
1432 if (TREE_CODE (sub) == COMPONENT_REF)
1433 canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1435 /* If a NOP conversion is changing a pointer to array of foo
1436 to a pointer to foo, embed that change in the ADDR_EXPR. */
1437 else if (TREE_CODE (sub) == ADDR_EXPR)
1438 canonicalize_addr_expr (expr_p);
1441 return GS_OK;
1444 /* Reduce MIN/MAX_EXPR to a COND_EXPR for further gimplification. */
1446 static enum gimplify_status
1447 gimplify_minimax_expr (tree *expr_p, tree *pre_p, tree *post_p)
1449 tree op1 = TREE_OPERAND (*expr_p, 0);
1450 tree op2 = TREE_OPERAND (*expr_p, 1);
1451 enum tree_code code;
1452 enum gimplify_status r0, r1;
1454 if (TREE_CODE (*expr_p) == MIN_EXPR)
1455 code = LE_EXPR;
1456 else
1457 code = GE_EXPR;
1459 r0 = gimplify_expr (&op1, pre_p, post_p, is_gimple_val, fb_rvalue);
1460 r1 = gimplify_expr (&op2, pre_p, post_p, is_gimple_val, fb_rvalue);
1462 *expr_p = build (COND_EXPR, TREE_TYPE (*expr_p),
1463 build (code, boolean_type_node, op1, op2),
1464 op1, op2);
1466 if (r0 == GS_ERROR || r1 == GS_ERROR)
1467 return GS_ERROR;
1468 else
1469 return GS_OK;
1472 /* Subroutine of gimplify_compound_lval.
1473 Converts an ARRAY_REF to the equivalent *(&array + offset) form. */
1475 static enum gimplify_status
1476 gimplify_array_ref_to_plus (tree *expr_p, tree *pre_p, tree *post_p)
1478 tree array = TREE_OPERAND (*expr_p, 0);
1479 tree arrtype = TREE_TYPE (array);
1480 tree elttype = TREE_TYPE (arrtype);
1481 tree size = array_ref_element_size (*expr_p);
1482 tree ptrtype = build_pointer_type (elttype);
1483 enum tree_code add_code = PLUS_EXPR;
1484 tree idx = TREE_OPERAND (*expr_p, 1);
1485 tree minidx = unshare_expr (array_ref_low_bound (*expr_p));
1486 tree offset, addr, result;
1487 enum gimplify_status ret;
1489 /* If the array domain does not start at zero, apply the offset. */
1490 if (!integer_zerop (minidx))
1492 idx = convert (TREE_TYPE (minidx), idx);
1493 idx = fold (build (MINUS_EXPR, TREE_TYPE (minidx), idx, minidx));
1496 /* If the index is negative -- a technically invalid situation now
1497 that we've biased the index back to zero -- then casting it to
1498 unsigned has ill effects. In particular, -1*4U/4U != -1.
1499 Represent this as a subtraction of a positive rather than addition
1500 of a negative. This will prevent any conversion back to ARRAY_REF
1501 from getting the wrong results from the division. */
1502 if (TREE_CODE (idx) == INTEGER_CST && tree_int_cst_sgn (idx) < 0)
1504 idx = fold (build1 (NEGATE_EXPR, TREE_TYPE (idx), idx));
1505 add_code = MINUS_EXPR;
1508 /* Pointer arithmetic must be done in sizetype. */
1509 idx = fold_convert (sizetype, idx);
1511 /* Convert the index to a byte offset. */
1512 offset = size_binop (MULT_EXPR, size, idx);
1514 ret = gimplify_expr (&array, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
1515 if (ret == GS_ERROR)
1516 return ret;
1518 addr = build_fold_addr_expr_with_type (array, ptrtype);
1519 result = fold (build (add_code, ptrtype, addr, offset));
1520 *expr_p = build1 (INDIRECT_REF, elttype, result);
1522 return GS_OK;
1525 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1526 node pointed by EXPR_P.
1528 compound_lval
1529 : min_lval '[' val ']'
1530 | min_lval '.' ID
1531 | compound_lval '[' val ']'
1532 | compound_lval '.' ID
1534 This is not part of the original SIMPLE definition, which separates
1535 array and member references, but it seems reasonable to handle them
1536 together. Also, this way we don't run into problems with union
1537 aliasing; gcc requires that for accesses through a union to alias, the
1538 union reference must be explicit, which was not always the case when we
1539 were splitting up array and member refs.
1541 PRE_P points to the list where side effects that must happen before
1542 *EXPR_P should be stored.
1544 POST_P points to the list where side effects that must happen after
1545 *EXPR_P should be stored. */
1547 static enum gimplify_status
1548 gimplify_compound_lval (tree *expr_p, tree *pre_p,
1549 tree *post_p, fallback_t fallback)
1551 tree *p;
1552 varray_type stack;
1553 enum gimplify_status ret = GS_OK, tret;
1554 int i;
1556 #if defined ENABLE_CHECKING
1557 if (TREE_CODE (*expr_p) != ARRAY_REF
1558 && TREE_CODE (*expr_p) != ARRAY_RANGE_REF
1559 && TREE_CODE (*expr_p) != COMPONENT_REF
1560 && TREE_CODE (*expr_p) != BIT_FIELD_REF
1561 && TREE_CODE (*expr_p) != REALPART_EXPR
1562 && TREE_CODE (*expr_p) != IMAGPART_EXPR)
1563 abort ();
1564 #endif
1566 /* Create a stack of the subexpressions so later we can walk them in
1567 order from inner to outer. */
1568 VARRAY_TREE_INIT (stack, 10, "stack");
1570 /* We can either handle REALPART_EXPR, IMAGEPART_EXPR anything that
1571 handled_components can deal with. */
1572 for (p = expr_p;
1573 (handled_component_p (*p)
1574 || TREE_CODE (*p) == REALPART_EXPR || TREE_CODE (*p) == IMAGPART_EXPR);
1575 p = &TREE_OPERAND (*p, 0))
1576 VARRAY_PUSH_TREE (stack, *p);
1578 /* Now STACK is a stack of pointers to all the refs we've walked through
1579 and P points to the innermost expression.
1581 Java requires that we elaborated nodes in source order. That
1582 means we must gimplify the inner expression followed by each of
1583 the indices, in order. But we can't gimplify the inner
1584 expression until we deal with any variable bounds, sizes, or
1585 positions in order to deal with PLACEHOLDER_EXPRs.
1587 So we do this in three steps. First we deal with the annotations
1588 for any variables in the components, then we gimplify the base,
1589 then we gimplify any indices, from left to right. */
1590 for (i = VARRAY_ACTIVE_SIZE (stack) - 1; i >= 0; i--)
1592 tree t = VARRAY_TREE (stack, i);
1594 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1596 /* Gimplify the low bound and element type size and put them into
1597 the ARRAY_REF. If these values are set, they have already been
1598 gimplified. */
1599 if (!TREE_OPERAND (t, 2))
1601 tree low = unshare_expr (array_ref_low_bound (t));
1602 if (!is_gimple_min_invariant (low))
1604 TREE_OPERAND (t, 2) = low;
1605 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1606 is_gimple_tmp_var, fb_rvalue);
1607 ret = MIN (ret, tret);
1611 if (!TREE_OPERAND (t, 3))
1613 tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
1614 tree elmt_size = unshare_expr (array_ref_element_size (t));
1615 tree factor = size_int (TYPE_ALIGN (elmt_type) / BITS_PER_UNIT);
1617 /* Divide the element size by the alignment of the element
1618 type (above). */
1619 elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
1621 if (!is_gimple_min_invariant (elmt_size))
1623 TREE_OPERAND (t, 3) = elmt_size;
1624 tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
1625 is_gimple_tmp_var, fb_rvalue);
1626 ret = MIN (ret, tret);
1630 else if (TREE_CODE (t) == COMPONENT_REF)
1632 /* Set the field offset into T and gimplify it. */
1633 if (!TREE_OPERAND (t, 2))
1635 tree offset = unshare_expr (component_ref_field_offset (t));
1636 tree field = TREE_OPERAND (t, 1);
1637 tree factor
1638 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
1640 /* Divide the offset by its alignment. */
1641 offset = size_binop (EXACT_DIV_EXPR, offset, factor);
1643 if (!is_gimple_min_invariant (offset))
1645 TREE_OPERAND (t, 2) = offset;
1646 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1647 is_gimple_tmp_var, fb_rvalue);
1648 ret = MIN (ret, tret);
1654 /* Step 2 is to gimplify the base expression. */
1655 tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1656 ret = MIN (ret, tret);
1658 /* And finally, the indices and operands to BIT_FIELD_REF. During this
1659 loop we also remove any useless conversions. */
1660 for (; VARRAY_ACTIVE_SIZE (stack) > 0; )
1662 tree t = VARRAY_TOP_TREE (stack);
1664 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1666 /* Gimplify the dimension.
1667 Temporary fix for gcc.c-torture/execute/20040313-1.c.
1668 Gimplify non-constant array indices into a temporary
1669 variable.
1670 FIXME - The real fix is to gimplify post-modify
1671 expressions into a minimal gimple lvalue. However, that
1672 exposes bugs in alias analysis. The alias analyzer does
1673 not handle &PTR->FIELD very well. Will fix after the
1674 branch is merged into mainline (dnovillo 2004-05-03). */
1675 if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1677 tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1678 is_gimple_tmp_var, fb_rvalue);
1679 ret = MIN (ret, tret);
1682 else if (TREE_CODE (t) == BIT_FIELD_REF)
1684 tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1685 is_gimple_val, fb_rvalue);
1686 ret = MIN (ret, tret);
1687 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1688 is_gimple_val, fb_rvalue);
1689 ret = MIN (ret, tret);
1692 STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
1694 /* The innermost expression P may have originally had TREE_SIDE_EFFECTS
1695 set which would have caused all the outer expressions in EXPR_P
1696 leading to P to also have had TREE_SIDE_EFFECTS set. */
1697 recalculate_side_effects (t);
1698 VARRAY_POP (stack);
1701 tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1702 ret = MIN (ret, tret);
1704 /* If the outermost expression is a COMPONENT_REF, canonicalize its type. */
1705 if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
1707 canonicalize_component_ref (expr_p);
1708 ret = MIN (ret, GS_OK);
1711 return ret;
1714 /* Gimplify the self modifying expression pointed by EXPR_P (++, --, +=, -=).
1716 PRE_P points to the list where side effects that must happen before
1717 *EXPR_P should be stored.
1719 POST_P points to the list where side effects that must happen after
1720 *EXPR_P should be stored.
1722 WANT_VALUE is nonzero iff we want to use the value of this expression
1723 in another expression. */
1725 static enum gimplify_status
1726 gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
1727 bool want_value)
1729 enum tree_code code;
1730 tree lhs, lvalue, rhs, t1;
1731 bool postfix;
1732 enum tree_code arith_code;
1733 enum gimplify_status ret;
1735 code = TREE_CODE (*expr_p);
1737 #if defined ENABLE_CHECKING
1738 if (code != POSTINCREMENT_EXPR
1739 && code != POSTDECREMENT_EXPR
1740 && code != PREINCREMENT_EXPR
1741 && code != PREDECREMENT_EXPR)
1742 abort ();
1743 #endif
1745 /* Prefix or postfix? */
1746 if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1747 /* Faster to treat as prefix if result is not used. */
1748 postfix = want_value;
1749 else
1750 postfix = false;
1752 /* Add or subtract? */
1753 if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
1754 arith_code = PLUS_EXPR;
1755 else
1756 arith_code = MINUS_EXPR;
1758 /* Gimplify the LHS into a GIMPLE lvalue. */
1759 lvalue = TREE_OPERAND (*expr_p, 0);
1760 ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
1761 if (ret == GS_ERROR)
1762 return ret;
1764 /* Extract the operands to the arithmetic operation. */
1765 lhs = lvalue;
1766 rhs = TREE_OPERAND (*expr_p, 1);
1768 /* For postfix operator, we evaluate the LHS to an rvalue and then use
1769 that as the result value and in the postqueue operation. */
1770 if (postfix)
1772 ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
1773 if (ret == GS_ERROR)
1774 return ret;
1777 t1 = build (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
1778 t1 = build (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
1780 if (postfix)
1782 gimplify_and_add (t1, post_p);
1783 *expr_p = lhs;
1784 return GS_ALL_DONE;
1786 else
1788 *expr_p = t1;
1789 return GS_OK;
1793 /* Gimplify the CALL_EXPR node pointed by EXPR_P. PRE_P points to the
1794 list where side effects that must happen before *EXPR_P should be stored.
1795 WANT_VALUE is true if the result of the call is desired. */
1797 static enum gimplify_status
1798 gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
1800 tree decl;
1801 tree arglist;
1802 enum gimplify_status ret;
1804 #if defined ENABLE_CHECKING
1805 if (TREE_CODE (*expr_p) != CALL_EXPR)
1806 abort ();
1807 #endif
1809 /* For reliable diagnostics during inlining, it is necessary that
1810 every call_expr be annotated with file and line. */
1811 if (! EXPR_HAS_LOCATION (*expr_p))
1812 SET_EXPR_LOCATION (*expr_p, input_location);
1814 /* This may be a call to a builtin function.
1816 Builtin function calls may be transformed into different
1817 (and more efficient) builtin function calls under certain
1818 circumstances. Unfortunately, gimplification can muck things
1819 up enough that the builtin expanders are not aware that certain
1820 transformations are still valid.
1822 So we attempt transformation/gimplification of the call before
1823 we gimplify the CALL_EXPR. At this time we do not manage to
1824 transform all calls in the same manner as the expanders do, but
1825 we do transform most of them. */
1826 decl = get_callee_fndecl (*expr_p);
1827 if (decl && DECL_BUILT_IN (decl))
1829 tree new;
1831 /* If it is allocation of stack, record the need to restore the memory
1832 when the enclosing bind_expr is exited. */
1833 if (DECL_FUNCTION_CODE (decl) == BUILT_IN_STACK_ALLOC)
1834 gimplify_ctxp->save_stack = true;
1836 /* If it is restore of the stack, reset it, since it means we are
1837 regimplifying the bind_expr. Note that we use the fact that
1838 for try_finally_expr, try part is processed first. */
1839 if (DECL_FUNCTION_CODE (decl) == BUILT_IN_STACK_RESTORE)
1840 gimplify_ctxp->save_stack = false;
1842 new = simplify_builtin (*expr_p, !want_value);
1844 if (new && new != *expr_p)
1846 /* There was a transformation of this call which computes the
1847 same value, but in a more efficient way. Return and try
1848 again. */
1849 *expr_p = new;
1850 return GS_OK;
1854 /* There is a sequence point before the call, so any side effects in
1855 the calling expression must occur before the actual call. Force
1856 gimplify_expr to use an internal post queue. */
1857 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, NULL,
1858 is_gimple_call_addr, fb_rvalue);
1860 if (PUSH_ARGS_REVERSED)
1861 TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
1862 for (arglist = TREE_OPERAND (*expr_p, 1); arglist;
1863 arglist = TREE_CHAIN (arglist))
1865 enum gimplify_status t;
1866 bool (*test) (tree);
1867 fallback_t fb;
1869 /* In general, we allow lvalues for function arguments to avoid
1870 extra overhead of copying large aggregates out of even larger
1871 aggregates into temporaries only to copy the temporaries to
1872 the argument list. Make optimizers happy by pulling out to
1873 temporaries those types that fit in registers. */
1874 if (is_gimple_reg_type (TREE_TYPE (TREE_VALUE (arglist))))
1875 test = is_gimple_val, fb = fb_rvalue;
1876 else
1877 test = is_gimple_lvalue, fb = fb_either;
1879 /* There is a sequence point before a function call. Side effects in
1880 the argument list must occur before the actual call. So, when
1881 gimplifying arguments, force gimplify_expr to use an internal
1882 post queue which is then appended to the end of PRE_P. */
1883 t = gimplify_expr (&TREE_VALUE (arglist), pre_p, NULL, test, fb);
1885 if (t == GS_ERROR)
1886 ret = GS_ERROR;
1888 if (PUSH_ARGS_REVERSED)
1889 TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
1891 /* Try this again in case gimplification exposed something. */
1892 if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl))
1894 tree new = simplify_builtin (*expr_p, !want_value);
1896 if (new && new != *expr_p)
1898 /* There was a transformation of this call which computes the
1899 same value, but in a more efficient way. Return and try
1900 again. */
1901 *expr_p = new;
1902 return GS_OK;
1906 /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1907 decl. This allows us to eliminate redundant or useless
1908 calls to "const" functions. */
1909 if (TREE_CODE (*expr_p) == CALL_EXPR
1910 && (call_expr_flags (*expr_p) & (ECF_CONST | ECF_PURE)))
1911 TREE_SIDE_EFFECTS (*expr_p) = 0;
1913 return ret;
1916 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
1917 rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
1919 TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
1920 condition is true or false, respectively. If null, we should generate
1921 our own to skip over the evaluation of this specific expression.
1923 This function is the tree equivalent of do_jump.
1925 shortcut_cond_r should only be called by shortcut_cond_expr. */
1927 static tree
1928 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p)
1930 tree local_label = NULL_TREE;
1931 tree t, expr = NULL;
1933 /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
1934 retain the shortcut semantics. Just insert the gotos here;
1935 shortcut_cond_expr will append the real blocks later. */
1936 if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
1938 /* Turn if (a && b) into
1940 if (a); else goto no;
1941 if (b) goto yes; else goto no;
1942 (no:) */
1944 if (false_label_p == NULL)
1945 false_label_p = &local_label;
1947 t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p);
1948 append_to_statement_list (t, &expr);
1950 t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1951 false_label_p);
1952 append_to_statement_list (t, &expr);
1954 else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
1956 /* Turn if (a || b) into
1958 if (a) goto yes;
1959 if (b) goto yes; else goto no;
1960 (yes:) */
1962 if (true_label_p == NULL)
1963 true_label_p = &local_label;
1965 t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL);
1966 append_to_statement_list (t, &expr);
1968 t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1969 false_label_p);
1970 append_to_statement_list (t, &expr);
1972 else if (TREE_CODE (pred) == COND_EXPR)
1974 /* As long as we're messing with gotos, turn if (a ? b : c) into
1975 if (a)
1976 if (b) goto yes; else goto no;
1977 else
1978 if (c) goto yes; else goto no; */
1979 expr = build (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
1980 shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1981 false_label_p),
1982 shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
1983 false_label_p));
1985 else
1987 expr = build (COND_EXPR, void_type_node, pred,
1988 build_and_jump (true_label_p),
1989 build_and_jump (false_label_p));
1992 if (local_label)
1994 t = build1 (LABEL_EXPR, void_type_node, local_label);
1995 append_to_statement_list (t, &expr);
1998 return expr;
2001 static tree
2002 shortcut_cond_expr (tree expr)
2004 tree pred = TREE_OPERAND (expr, 0);
2005 tree then_ = TREE_OPERAND (expr, 1);
2006 tree else_ = TREE_OPERAND (expr, 2);
2007 tree true_label, false_label, end_label, t;
2008 tree *true_label_p;
2009 tree *false_label_p;
2010 bool emit_end, emit_false;
2011 bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2012 bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2014 /* First do simple transformations. */
2015 if (!else_se)
2017 /* If there is no 'else', turn (a && b) into if (a) if (b). */
2018 while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2020 TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2021 then_ = shortcut_cond_expr (expr);
2022 pred = TREE_OPERAND (pred, 0);
2023 expr = build (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2026 if (!then_se)
2028 /* If there is no 'then', turn
2029 if (a || b); else d
2030 into
2031 if (a); else if (b); else d. */
2032 while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2034 TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2035 else_ = shortcut_cond_expr (expr);
2036 pred = TREE_OPERAND (pred, 0);
2037 expr = build (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2041 /* If we're done, great. */
2042 if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2043 && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2044 return expr;
2046 /* Otherwise we need to mess with gotos. Change
2047 if (a) c; else d;
2049 if (a); else goto no;
2050 c; goto end;
2051 no: d; end:
2052 and recursively gimplify the condition. */
2054 true_label = false_label = end_label = NULL_TREE;
2056 /* If our arms just jump somewhere, hijack those labels so we don't
2057 generate jumps to jumps. */
2059 if (then_
2060 && TREE_CODE (then_) == GOTO_EXPR
2061 && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2063 true_label = GOTO_DESTINATION (then_);
2064 then_ = NULL;
2065 then_se = false;
2068 if (else_
2069 && TREE_CODE (else_) == GOTO_EXPR
2070 && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2072 false_label = GOTO_DESTINATION (else_);
2073 else_ = NULL;
2074 else_se = false;
2077 /* If we aren't hijacking a label for the 'then' branch, it falls through. */
2078 if (true_label)
2079 true_label_p = &true_label;
2080 else
2081 true_label_p = NULL;
2083 /* The 'else' branch also needs a label if it contains interesting code. */
2084 if (false_label || else_se)
2085 false_label_p = &false_label;
2086 else
2087 false_label_p = NULL;
2089 /* If there was nothing else in our arms, just forward the label(s). */
2090 if (!then_se && !else_se)
2091 return shortcut_cond_r (pred, true_label_p, false_label_p);
2093 /* If our last subexpression already has a terminal label, reuse it. */
2094 if (else_se)
2095 expr = expr_last (else_);
2096 else if (then_se)
2097 expr = expr_last (then_);
2098 else
2099 expr = NULL;
2100 if (expr && TREE_CODE (expr) == LABEL_EXPR)
2101 end_label = LABEL_EXPR_LABEL (expr);
2103 /* If we don't care about jumping to the 'else' branch, jump to the end
2104 if the condition is false. */
2105 if (!false_label_p)
2106 false_label_p = &end_label;
2108 /* We only want to emit these labels if we aren't hijacking them. */
2109 emit_end = (end_label == NULL_TREE);
2110 emit_false = (false_label == NULL_TREE);
2112 pred = shortcut_cond_r (pred, true_label_p, false_label_p);
2114 expr = NULL;
2115 append_to_statement_list (pred, &expr);
2117 append_to_statement_list (then_, &expr);
2118 if (else_se)
2120 t = build_and_jump (&end_label);
2121 append_to_statement_list (t, &expr);
2122 if (emit_false)
2124 t = build1 (LABEL_EXPR, void_type_node, false_label);
2125 append_to_statement_list (t, &expr);
2127 append_to_statement_list (else_, &expr);
2129 if (emit_end && end_label)
2131 t = build1 (LABEL_EXPR, void_type_node, end_label);
2132 append_to_statement_list (t, &expr);
2135 return expr;
2138 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE. */
2140 static tree
2141 gimple_boolify (tree expr)
2143 tree type = TREE_TYPE (expr);
2145 if (TREE_CODE (type) == BOOLEAN_TYPE)
2146 return expr;
2148 /* If this is the predicate of a COND_EXPR, it might not even be a
2149 truthvalue yet. */
2150 expr = lang_hooks.truthvalue_conversion (expr);
2152 switch (TREE_CODE (expr))
2154 case TRUTH_AND_EXPR:
2155 case TRUTH_OR_EXPR:
2156 case TRUTH_XOR_EXPR:
2157 case TRUTH_ANDIF_EXPR:
2158 case TRUTH_ORIF_EXPR:
2159 /* Also boolify the arguments of truth exprs. */
2160 TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2161 /* FALLTHRU */
2163 case TRUTH_NOT_EXPR:
2164 TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2165 /* FALLTHRU */
2167 case EQ_EXPR: case NE_EXPR:
2168 case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2169 /* These expressions always produce boolean results. */
2170 TREE_TYPE (expr) = boolean_type_node;
2171 return expr;
2173 default:
2174 /* Other expressions that get here must have boolean values, but
2175 might need to be converted to the appropriate mode. */
2176 return convert (boolean_type_node, expr);
2180 /* Convert the conditional expression pointed by EXPR_P '(p) ? a : b;'
2181 into
2183 if (p) if (p)
2184 t1 = a; a;
2185 else or else
2186 t1 = b; b;
2189 The second form is used when *EXPR_P is of type void.
2191 TARGET is the tree for T1 above.
2193 PRE_P points to the list where side effects that must happen before
2194 *EXPR_P should be stored. */
2196 static enum gimplify_status
2197 gimplify_cond_expr (tree *expr_p, tree *pre_p, tree target)
2199 tree expr = *expr_p;
2200 tree tmp, type;
2201 enum gimplify_status ret;
2203 type = TREE_TYPE (expr);
2204 if (!type)
2205 TREE_TYPE (expr) = void_type_node;
2207 /* If this COND_EXPR has a value, copy the values into a temporary within
2208 the arms. */
2209 else if (! VOID_TYPE_P (type))
2211 if (target)
2213 tmp = target;
2214 ret = GS_OK;
2216 else
2218 tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2219 ret = GS_ALL_DONE;
2222 /* Build the then clause, 't1 = a;'. But don't build an assignment
2223 if this branch is void; in C++ it can be, if it's a throw. */
2224 if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2225 TREE_OPERAND (expr, 1)
2226 = build (MODIFY_EXPR, void_type_node, tmp, TREE_OPERAND (expr, 1));
2228 /* Build the else clause, 't1 = b;'. */
2229 if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2230 TREE_OPERAND (expr, 2)
2231 = build (MODIFY_EXPR, void_type_node, tmp, TREE_OPERAND (expr, 2));
2233 TREE_TYPE (expr) = void_type_node;
2234 recalculate_side_effects (expr);
2236 /* Move the COND_EXPR to the prequeue and use the temp in its place. */
2237 gimplify_and_add (expr, pre_p);
2238 *expr_p = tmp;
2240 return ret;
2243 /* Make sure the condition has BOOLEAN_TYPE. */
2244 TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2246 /* Break apart && and || conditions. */
2247 if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2248 || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2250 expr = shortcut_cond_expr (expr);
2252 if (expr != *expr_p)
2254 *expr_p = expr;
2256 /* We can't rely on gimplify_expr to re-gimplify the expanded
2257 form properly, as cleanups might cause the target labels to be
2258 wrapped in a TRY_FINALLY_EXPR. To prevent that, we need to
2259 set up a conditional context. */
2260 gimple_push_condition ();
2261 gimplify_stmt (expr_p);
2262 gimple_pop_condition (pre_p);
2264 return GS_ALL_DONE;
2268 /* Now do the normal gimplification. */
2269 ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2270 is_gimple_condexpr, fb_rvalue);
2272 gimple_push_condition ();
2274 gimplify_to_stmt_list (&TREE_OPERAND (expr, 1));
2275 gimplify_to_stmt_list (&TREE_OPERAND (expr, 2));
2276 recalculate_side_effects (expr);
2278 gimple_pop_condition (pre_p);
2280 if (ret == GS_ERROR)
2282 else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2283 ret = GS_ALL_DONE;
2284 else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 2)))
2285 /* Rewrite "if (a); else b" to "if (!a) b" */
2287 TREE_OPERAND (expr, 0) = invert_truthvalue (TREE_OPERAND (expr, 0));
2288 ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2289 is_gimple_condexpr, fb_rvalue);
2291 tmp = TREE_OPERAND (expr, 1);
2292 TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 2);
2293 TREE_OPERAND (expr, 2) = tmp;
2295 else
2296 /* Both arms are empty; replace the COND_EXPR with its predicate. */
2297 expr = TREE_OPERAND (expr, 0);
2299 *expr_p = expr;
2300 return ret;
2303 /* A subroutine of gimplify_modify_expr. Replace a MODIFY_EXPR with
2304 a call to __builtin_memcpy. */
2306 static enum gimplify_status
2307 gimplify_modify_expr_to_memcpy (tree *expr_p, bool want_value)
2309 tree args, t, to, to_ptr, from;
2311 to = TREE_OPERAND (*expr_p, 0);
2312 from = TREE_OPERAND (*expr_p, 1);
2314 t = TYPE_SIZE_UNIT (TREE_TYPE (from));
2315 t = unshare_expr (t);
2316 t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, to);
2317 t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, from);
2318 args = tree_cons (NULL, t, NULL);
2320 t = build_fold_addr_expr (from);
2321 args = tree_cons (NULL, t, args);
2323 to_ptr = build_fold_addr_expr (to);
2324 args = tree_cons (NULL, to_ptr, args);
2325 t = implicit_built_in_decls[BUILT_IN_MEMCPY];
2326 t = build_function_call_expr (t, args);
2328 if (want_value)
2330 t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2331 t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2334 *expr_p = t;
2335 return GS_OK;
2338 /* A subroutine of gimplify_modify_expr. Replace a MODIFY_EXPR with
2339 a call to __builtin_memset. In this case we know that the RHS is
2340 a CONSTRUCTOR with an empty element list. */
2342 static enum gimplify_status
2343 gimplify_modify_expr_to_memset (tree *expr_p, bool want_value)
2345 tree args, t, to, to_ptr;
2347 to = TREE_OPERAND (*expr_p, 0);
2349 t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_OPERAND (*expr_p, 1)));
2350 t = unshare_expr (t);
2351 t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, to);
2352 args = tree_cons (NULL, t, NULL);
2354 args = tree_cons (NULL, integer_zero_node, args);
2356 to_ptr = build_fold_addr_expr (to);
2357 args = tree_cons (NULL, to_ptr, args);
2358 t = implicit_built_in_decls[BUILT_IN_MEMSET];
2359 t = build_function_call_expr (t, args);
2361 if (want_value)
2363 t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2364 t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2367 *expr_p = t;
2368 return GS_OK;
2371 /* A subroutine of gimplify_modify_expr. Break out elements of a
2372 CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
2374 Note that we still need to clear any elements that don't have explicit
2375 initializers, so if not all elements are initialized we keep the
2376 original MODIFY_EXPR, we just remove all of the constructor elements. */
2378 static enum gimplify_status
2379 gimplify_init_constructor (tree *expr_p, tree *pre_p,
2380 tree *post_p, bool want_value)
2382 tree object = TREE_OPERAND (*expr_p, 0);
2383 tree ctor = TREE_OPERAND (*expr_p, 1);
2384 tree type = TREE_TYPE (ctor);
2385 enum gimplify_status ret;
2386 tree elt_list;
2388 if (TREE_CODE (ctor) != CONSTRUCTOR)
2389 return GS_UNHANDLED;
2391 elt_list = CONSTRUCTOR_ELTS (ctor);
2393 ret = GS_ALL_DONE;
2394 switch (TREE_CODE (type))
2396 case RECORD_TYPE:
2397 case UNION_TYPE:
2398 case QUAL_UNION_TYPE:
2399 case ARRAY_TYPE:
2401 HOST_WIDE_INT i, num_elements, num_nonzero_elements;
2402 HOST_WIDE_INT num_nonconstant_elements;
2403 bool cleared;
2405 /* Aggregate types must lower constructors to initialization of
2406 individual elements. The exception is that a CONSTRUCTOR node
2407 with no elements indicates zero-initialization of the whole. */
2408 if (elt_list == NULL)
2410 if (want_value)
2412 *expr_p = object;
2413 return GS_OK;
2415 else
2416 return GS_UNHANDLED;
2419 categorize_ctor_elements (ctor, &num_nonzero_elements,
2420 &num_nonconstant_elements);
2421 num_elements = count_type_elements (TREE_TYPE (ctor));
2423 /* If a const aggregate variable is being initialized, then it
2424 should never be a lose to promote the variable to be static. */
2425 if (num_nonconstant_elements == 0
2426 && TREE_READONLY (object)
2427 && TREE_CODE (object) == VAR_DECL)
2429 DECL_INITIAL (object) = ctor;
2430 TREE_STATIC (object) = 1;
2431 if (!DECL_NAME (object))
2432 DECL_NAME (object) = create_tmp_var_name ("C");
2433 walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
2435 /* ??? C++ doesn't automatically append a .<number> to the
2436 assembler name, and even when it does, it looks a FE private
2437 data structures to figure out what that number should be,
2438 which are not set for this variable. I suppose this is
2439 important for local statics for inline functions, which aren't
2440 "local" in the object file sense. So in order to get a unique
2441 TU-local symbol, we must invoke the lhd version now. */
2442 lhd_set_decl_assembler_name (object);
2444 *expr_p = NULL_TREE;
2445 break;
2448 /* If there are "lots" of initialized elements, and all of them
2449 are valid address constants, then the entire initializer can
2450 be dropped to memory, and then memcpy'd out. */
2451 if (num_nonconstant_elements == 0)
2453 HOST_WIDE_INT size = int_size_in_bytes (type);
2454 unsigned int align;
2456 /* ??? We can still get unbounded array types, at least
2457 from the C++ front end. This seems wrong, but attempt
2458 to work around it for now. */
2459 if (size < 0)
2461 size = int_size_in_bytes (TREE_TYPE (object));
2462 if (size >= 0)
2463 TREE_TYPE (ctor) = type = TREE_TYPE (object);
2466 /* Find the maximum alignment we can assume for the object. */
2467 /* ??? Make use of DECL_OFFSET_ALIGN. */
2468 if (DECL_P (object))
2469 align = DECL_ALIGN (object);
2470 else
2471 align = TYPE_ALIGN (type);
2473 if (size > 0 && !can_move_by_pieces (size, align))
2475 tree new = create_tmp_var_raw (type, "C");
2476 gimple_add_tmp_var (new);
2477 TREE_STATIC (new) = 1;
2478 TREE_READONLY (new) = 1;
2479 DECL_INITIAL (new) = ctor;
2480 if (align > DECL_ALIGN (new))
2482 DECL_ALIGN (new) = align;
2483 DECL_USER_ALIGN (new) = 1;
2485 walk_tree (&DECL_INITIAL (new), force_labels_r, NULL, NULL);
2487 TREE_OPERAND (*expr_p, 1) = new;
2488 break;
2492 /* If there are "lots" of initialized elements, even discounting
2493 those that are not address constants (and thus *must* be
2494 computed at runtime), then partition the constructor into
2495 constant and non-constant parts. Block copy the constant
2496 parts in, then generate code for the non-constant parts. */
2497 /* TODO. There's code in cp/typeck.c to do this. */
2499 /* If there are "lots" of zeros, then block clear the object first. */
2500 cleared = false;
2501 if (num_elements - num_nonzero_elements > CLEAR_RATIO
2502 && num_nonzero_elements < num_elements/4)
2503 cleared = true;
2505 /* ??? This bit ought not be needed. For any element not present
2506 in the initializer, we should simply set them to zero. Except
2507 we'd need to *find* the elements that are not present, and that
2508 requires trickery to avoid quadratic compile-time behavior in
2509 large cases or excessive memory use in small cases. */
2510 else
2512 HOST_WIDE_INT len = list_length (elt_list);
2513 if (TREE_CODE (type) == ARRAY_TYPE)
2515 tree nelts = array_type_nelts (type);
2516 if (!host_integerp (nelts, 1)
2517 || tree_low_cst (nelts, 1) + 1 != len)
2518 cleared = 1;;
2520 else if (len != fields_length (type))
2521 cleared = 1;
2524 if (cleared)
2526 /* Zap the CONSTRUCTOR element list, which simplifies this case.
2527 Note that we still have to gimplify, in order to handle the
2528 case of variable sized types. Make an unshared copy of
2529 OBJECT before that so we can match a PLACEHOLDER_EXPR to it
2530 later, if needed. */
2531 CONSTRUCTOR_ELTS (ctor) = NULL_TREE;
2532 object = unshare_expr (TREE_OPERAND (*expr_p, 0));
2533 gimplify_stmt (expr_p);
2534 append_to_statement_list (*expr_p, pre_p);
2537 for (i = 0; elt_list; i++, elt_list = TREE_CHAIN (elt_list))
2539 tree purpose, value, cref, init;
2541 purpose = TREE_PURPOSE (elt_list);
2542 value = TREE_VALUE (elt_list);
2544 if (cleared && initializer_zerop (value))
2545 continue;
2547 if (TREE_CODE (type) == ARRAY_TYPE)
2549 tree t = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
2551 /* ??? Here's to hoping the front end fills in all of the
2552 indicies, so we don't have to figure out what's missing
2553 ourselves. */
2554 if (!purpose)
2555 abort ();
2556 /* ??? Need to handle this. */
2557 if (TREE_CODE (purpose) == RANGE_EXPR)
2558 abort ();
2560 cref = build (ARRAY_REF, t, unshare_expr (object), purpose,
2561 NULL_TREE, NULL_TREE);
2563 else
2564 cref = build (COMPONENT_REF, TREE_TYPE (purpose),
2565 unshare_expr (object), purpose, NULL_TREE);
2567 init = build (MODIFY_EXPR, TREE_TYPE (purpose), cref, value);
2569 /* Each member initialization is a full-expression. */
2570 gimplify_and_add (init, pre_p);
2573 *expr_p = NULL_TREE;
2575 break;
2577 case COMPLEX_TYPE:
2579 tree r, i;
2581 /* Extract the real and imaginary parts out of the ctor. */
2582 r = i = NULL_TREE;
2583 if (elt_list)
2585 r = TREE_VALUE (elt_list);
2586 elt_list = TREE_CHAIN (elt_list);
2587 if (elt_list)
2589 i = TREE_VALUE (elt_list);
2590 if (TREE_CHAIN (elt_list))
2591 abort ();
2594 if (r == NULL || i == NULL)
2596 tree zero = convert (TREE_TYPE (type), integer_zero_node);
2597 if (r == NULL)
2598 r = zero;
2599 if (i == NULL)
2600 i = zero;
2603 /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
2604 represent creation of a complex value. */
2605 if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
2607 ctor = build_complex (type, r, i);
2608 TREE_OPERAND (*expr_p, 1) = ctor;
2610 else
2612 ctor = build (COMPLEX_EXPR, type, r, i);
2613 TREE_OPERAND (*expr_p, 1) = ctor;
2614 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
2615 is_gimple_rhs, fb_rvalue);
2618 break;
2620 case VECTOR_TYPE:
2621 /* Go ahead and simplify constant constructors to VECTOR_CST. */
2622 if (TREE_CONSTANT (ctor))
2623 TREE_OPERAND (*expr_p, 1) = build_vector (type, elt_list);
2624 else
2626 /* Vector types use CONSTRUCTOR all the way through gimple
2627 compilation as a general initializer. */
2628 for (; elt_list; elt_list = TREE_CHAIN (elt_list))
2630 enum gimplify_status tret;
2631 tret = gimplify_expr (&TREE_VALUE (elt_list), pre_p, post_p,
2632 is_gimple_constructor_elt, fb_rvalue);
2633 if (tret == GS_ERROR)
2634 ret = GS_ERROR;
2637 break;
2639 default:
2640 /* So how did we get a CONSTRUCTOR for a scalar type? */
2641 abort ();
2644 if (ret == GS_ERROR)
2645 return GS_ERROR;
2646 else if (want_value)
2648 append_to_statement_list (*expr_p, pre_p);
2649 *expr_p = object;
2650 return GS_OK;
2652 else
2653 return GS_ALL_DONE;
2656 /* Subroutine of gimplify_modify_expr to do simplifications of MODIFY_EXPRs
2657 based on the code of the RHS. We loop for as long as something changes. */
2659 static enum gimplify_status
2660 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
2661 tree *post_p, bool want_value)
2663 enum gimplify_status ret = GS_OK;
2665 while (ret != GS_UNHANDLED)
2666 switch (TREE_CODE (*from_p))
2668 case TARGET_EXPR:
2670 /* If we are initializing something from a TARGET_EXPR, strip the
2671 TARGET_EXPR and initialize it directly, if possible. This can't
2672 be done if the initializer is void, since that implies that the
2673 temporary is set in some non-trivial way.
2675 ??? What about code that pulls out the temp and uses it
2676 elsewhere? I think that such code never uses the TARGET_EXPR as
2677 an initializer. If I'm wrong, we'll abort because the temp won't
2678 have any RTL. In that case, I guess we'll need to replace
2679 references somehow. */
2680 tree init = TARGET_EXPR_INITIAL (*from_p);
2682 if (!VOID_TYPE_P (TREE_TYPE (init)))
2684 *from_p = init;
2685 ret = GS_OK;
2687 else
2688 ret = GS_UNHANDLED;
2690 break;
2692 case COMPOUND_EXPR:
2693 /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
2694 caught. */
2695 gimplify_compound_expr (from_p, pre_p, true);
2696 ret = GS_OK;
2697 break;
2699 case CONSTRUCTOR:
2700 /* If we're initializing from a CONSTRUCTOR, break this into
2701 individual MODIFY_EXPRs. */
2702 return gimplify_init_constructor (expr_p, pre_p, post_p, want_value);
2704 case COND_EXPR:
2705 /* If we're assigning from a ?: expression with ADDRESSABLE type, push
2706 the assignment down into the branches, since we can't generate a
2707 temporary of such a type. */
2708 if (TREE_ADDRESSABLE (TREE_TYPE (*from_p)))
2710 *expr_p = *from_p;
2711 return gimplify_cond_expr (expr_p, pre_p, *to_p);
2713 else
2714 ret = GS_UNHANDLED;
2715 break;
2717 default:
2718 ret = GS_UNHANDLED;
2719 break;
2722 return ret;
2725 /* Gimplify the MODIFY_EXPR node pointed by EXPR_P.
2727 modify_expr
2728 : varname '=' rhs
2729 | '*' ID '=' rhs
2731 PRE_P points to the list where side effects that must happen before
2732 *EXPR_P should be stored.
2734 POST_P points to the list where side effects that must happen after
2735 *EXPR_P should be stored.
2737 WANT_VALUE is nonzero iff we want to use the value of this expression
2738 in another expression. */
2740 static enum gimplify_status
2741 gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
2743 tree *from_p = &TREE_OPERAND (*expr_p, 1);
2744 tree *to_p = &TREE_OPERAND (*expr_p, 0);
2745 enum gimplify_status ret = GS_UNHANDLED;
2747 #if defined ENABLE_CHECKING
2748 if (TREE_CODE (*expr_p) != MODIFY_EXPR && TREE_CODE (*expr_p) != INIT_EXPR)
2749 abort ();
2750 #endif
2752 /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer useful. */
2753 if (TREE_CODE (*expr_p) == INIT_EXPR)
2754 TREE_SET_CODE (*expr_p, MODIFY_EXPR);
2756 /* See if any simplifications can be done based on what the RHS is. */
2757 ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
2758 want_value);
2759 if (ret != GS_UNHANDLED)
2760 return ret;
2762 /* If the value being copied is of variable width, expose the length
2763 if the copy by converting the whole thing to a memcpy/memset.
2764 Note that we need to do this before gimplifying any of the operands
2765 so that we can resolve any PLACEHOLDER_EXPRs in the size.
2766 Also note that the RTL expander uses the size of the expression to
2767 be copied, not of the destination, so that is what we must here.
2768 The types on both sides of the MODIFY_EXPR should be the same,
2769 but they aren't always and there are problems with class-wide types
2770 in Ada where it's hard to make it "correct". */
2771 if (TREE_CODE (TREE_TYPE (*from_p)) != ERROR_MARK
2772 && TYPE_SIZE_UNIT (TREE_TYPE (*from_p))
2773 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (*from_p))) != INTEGER_CST)
2775 if (TREE_CODE (*from_p) == CONSTRUCTOR)
2776 return gimplify_modify_expr_to_memset (expr_p, want_value);
2777 else
2778 return gimplify_modify_expr_to_memcpy (expr_p, want_value);
2781 ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
2782 if (ret == GS_ERROR)
2783 return ret;
2785 ret = gimplify_expr (from_p, pre_p, post_p, is_gimple_rhs, fb_rvalue);
2786 if (ret == GS_ERROR)
2787 return ret;
2789 /* Now see if the above changed *from_p to something we handle specially. */
2790 ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
2791 want_value);
2792 if (ret != GS_UNHANDLED)
2793 return ret;
2795 /* If the destination is already simple, nothing else needed. */
2796 if (is_gimple_tmp_var (*to_p))
2797 ret = GS_ALL_DONE;
2798 else
2800 /* If the RHS of the MODIFY_EXPR may throw or make a nonlocal goto and
2801 the LHS is a user variable, then we need to introduce a temporary.
2802 ie temp = RHS; LHS = temp.
2804 This way the optimizers can determine that the user variable is
2805 only modified if evaluation of the RHS does not throw.
2807 FIXME this should be handled by the is_gimple_rhs predicate. */
2809 if (aggregate_value_p (TREE_TYPE (*from_p), NULL_TREE))
2810 /* Don't force a temp of a large aggregate type; the copy could be
2811 arbitrarily expensive. Instead we will generate a V_MAY_DEF for
2812 the assignment. */;
2813 else if (TREE_CODE (*from_p) == CALL_EXPR
2814 || (flag_non_call_exceptions && tree_could_trap_p (*from_p))
2815 /* If we're dealing with a renamable type, either source or dest
2816 must be a renamed variable. */
2817 || (is_gimple_reg_type (TREE_TYPE (*from_p))
2818 && !is_gimple_reg (*to_p)))
2819 gimplify_expr (from_p, pre_p, post_p, is_gimple_val, fb_rvalue);
2821 ret = want_value ? GS_OK : GS_ALL_DONE;
2824 if (want_value)
2826 append_to_statement_list (*expr_p, pre_p);
2827 *expr_p = *to_p;
2830 return ret;
2833 /* Gimplify a comparison between two variable-sized objects. Do this
2834 with a call to BUILT_IN_MEMCMP. */
2836 static enum gimplify_status
2837 gimplify_variable_sized_compare (tree *expr_p)
2839 tree op0 = TREE_OPERAND (*expr_p, 0);
2840 tree op1 = TREE_OPERAND (*expr_p, 1);
2841 tree args, t, dest;
2843 t = TYPE_SIZE_UNIT (TREE_TYPE (op0));
2844 t = unshare_expr (t);
2845 t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, op0);
2846 args = tree_cons (NULL, t, NULL);
2847 t = build_fold_addr_expr (op1);
2848 args = tree_cons (NULL, t, args);
2849 dest = build_fold_addr_expr (op0);
2850 args = tree_cons (NULL, dest, args);
2851 t = implicit_built_in_decls[BUILT_IN_MEMCMP];
2852 t = build_function_call_expr (t, args);
2853 *expr_p
2854 = build (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
2856 return GS_OK;
2859 /* Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions. EXPR_P
2860 points to the expression to gimplify.
2862 Expressions of the form 'a && b' are gimplified to:
2864 a && b ? true : false
2866 gimplify_cond_expr will do the rest.
2868 PRE_P points to the list where side effects that must happen before
2869 *EXPR_P should be stored. */
2871 static enum gimplify_status
2872 gimplify_boolean_expr (tree *expr_p)
2874 /* Preserve the original type of the expression. */
2875 tree type = TREE_TYPE (*expr_p);
2877 *expr_p = build (COND_EXPR, type, *expr_p,
2878 convert (type, boolean_true_node),
2879 convert (type, boolean_false_node));
2881 return GS_OK;
2884 /* Gimplifies an expression sequence. This function gimplifies each
2885 expression and re-writes the original expression with the last
2886 expression of the sequence in GIMPLE form.
2888 PRE_P points to the list where the side effects for all the
2889 expressions in the sequence will be emitted.
2891 WANT_VALUE is true when the result of the last COMPOUND_EXPR is used. */
2892 /* ??? Should rearrange to share the pre-queue with all the indirect
2893 invocations of gimplify_expr. Would probably save on creations
2894 of statement_list nodes. */
2896 static enum gimplify_status
2897 gimplify_compound_expr (tree *expr_p, tree *pre_p, bool want_value)
2899 tree t = *expr_p;
2903 tree *sub_p = &TREE_OPERAND (t, 0);
2905 if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
2906 gimplify_compound_expr (sub_p, pre_p, false);
2907 else
2908 gimplify_stmt (sub_p);
2909 append_to_statement_list (*sub_p, pre_p);
2911 t = TREE_OPERAND (t, 1);
2913 while (TREE_CODE (t) == COMPOUND_EXPR);
2915 *expr_p = t;
2916 if (want_value)
2917 return GS_OK;
2918 else
2920 gimplify_stmt (expr_p);
2921 return GS_ALL_DONE;
2925 /* Gimplifies a statement list. These may be created either by an
2926 enlightened front-end, or by shortcut_cond_expr. */
2928 static enum gimplify_status
2929 gimplify_statement_list (tree *expr_p)
2931 tree_stmt_iterator i = tsi_start (*expr_p);
2933 while (!tsi_end_p (i))
2935 tree t;
2937 gimplify_stmt (tsi_stmt_ptr (i));
2939 t = tsi_stmt (i);
2940 if (t == NULL)
2941 tsi_delink (&i);
2942 else if (TREE_CODE (t) == STATEMENT_LIST)
2944 tsi_link_before (&i, t, TSI_SAME_STMT);
2945 tsi_delink (&i);
2947 else
2948 tsi_next (&i);
2951 return GS_ALL_DONE;
2954 /* Gimplify a SAVE_EXPR node. EXPR_P points to the expression to
2955 gimplify. After gimplification, EXPR_P will point to a new temporary
2956 that holds the original value of the SAVE_EXPR node.
2958 PRE_P points to the list where side effects that must happen before
2959 *EXPR_P should be stored. */
2961 static enum gimplify_status
2962 gimplify_save_expr (tree *expr_p, tree *pre_p, tree *post_p)
2964 enum gimplify_status ret = GS_ALL_DONE;
2965 tree val;
2967 #if defined ENABLE_CHECKING
2968 if (TREE_CODE (*expr_p) != SAVE_EXPR)
2969 abort ();
2970 #endif
2972 val = TREE_OPERAND (*expr_p, 0);
2974 /* If the operand is already a GIMPLE temporary, just re-write the
2975 SAVE_EXPR node. */
2976 if (is_gimple_tmp_var (val))
2977 *expr_p = val;
2978 /* The operand may be a void-valued expression such as SAVE_EXPRs
2979 generated by the Java frontend for class initialization. It is
2980 being executed only for its side-effects. */
2981 else if (TREE_TYPE (val) == void_type_node)
2983 tree body = TREE_OPERAND (*expr_p, 0);
2984 ret = gimplify_expr (& body, pre_p, post_p, is_gimple_stmt, fb_none);
2985 append_to_statement_list (body, pre_p);
2986 *expr_p = NULL;
2988 else
2989 *expr_p = TREE_OPERAND (*expr_p, 0)
2990 = get_initialized_tmp_var (val, pre_p, post_p);
2992 return ret;
2995 /* Re-write the ADDR_EXPR node pointed by EXPR_P
2997 unary_expr
2998 : ...
2999 | '&' varname
3002 PRE_P points to the list where side effects that must happen before
3003 *EXPR_P should be stored.
3005 POST_P points to the list where side effects that must happen after
3006 *EXPR_P should be stored. */
3008 static enum gimplify_status
3009 gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
3011 tree expr = *expr_p;
3012 tree op0 = TREE_OPERAND (expr, 0);
3013 enum gimplify_status ret;
3015 switch (TREE_CODE (op0))
3017 case INDIRECT_REF:
3018 /* Check if we are dealing with an expression of the form '&*ptr'.
3019 While the front end folds away '&*ptr' into 'ptr', these
3020 expressions may be generated internally by the compiler (e.g.,
3021 builtins like __builtin_va_end). */
3022 *expr_p = TREE_OPERAND (op0, 0);
3023 ret = GS_OK;
3024 break;
3026 case ARRAY_REF:
3027 /* Fold &a[6] to (&a + 6). */
3028 ret = gimplify_array_ref_to_plus (&TREE_OPERAND (expr, 0),
3029 pre_p, post_p);
3031 /* This added an INDIRECT_REF. Fold it away. */
3032 *expr_p = TREE_OPERAND (TREE_OPERAND (expr, 0), 0);
3033 break;
3035 case VIEW_CONVERT_EXPR:
3036 /* Take the address of our operand and then convert it to the type of
3037 this ADDR_EXPR.
3039 ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
3040 all clear. The impact of this transformation is even less clear. */
3041 *expr_p = fold_convert (TREE_TYPE (expr),
3042 build_fold_addr_expr (TREE_OPERAND (op0, 0)));
3043 ret = GS_OK;
3044 break;
3046 default:
3047 /* We use fb_either here because the C frontend sometimes takes
3048 the address of a call that returns a struct. */
3049 ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
3050 is_gimple_addr_expr_arg, fb_either);
3051 if (ret != GS_ERROR)
3053 /* Make sure TREE_INVARIANT, TREE_CONSTANT, and TREE_SIDE_EFFECTS
3054 is set properly. */
3055 recompute_tree_invarant_for_addr_expr (expr);
3057 /* Mark the RHS addressable. */
3058 lang_hooks.mark_addressable (TREE_OPERAND (expr, 0));
3060 break;
3063 /* If the operand is gimplified into a _DECL, mark the address expression
3064 as TREE_INVARIANT. */
3065 if (DECL_P (TREE_OPERAND (expr, 0)))
3066 TREE_INVARIANT (expr) = 1;
3068 return ret;
3071 /* Gimplify the operands of an ASM_EXPR. Input operands should be a gimple
3072 value; output operands should be a gimple lvalue. */
3074 static enum gimplify_status
3075 gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
3077 tree expr = *expr_p;
3078 int noutputs = list_length (ASM_OUTPUTS (expr));
3079 const char **oconstraints
3080 = (const char **) alloca ((noutputs) * sizeof (const char *));
3081 int i;
3082 tree link;
3083 const char *constraint;
3084 bool allows_mem, allows_reg, is_inout;
3085 enum gimplify_status ret, tret;
3087 ASM_STRING (expr)
3088 = resolve_asm_operand_names (ASM_STRING (expr), ASM_OUTPUTS (expr),
3089 ASM_INPUTS (expr));
3091 ret = GS_ALL_DONE;
3092 for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = TREE_CHAIN (link))
3094 oconstraints[i] = constraint
3095 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3097 parse_output_constraint (&constraint, i, 0, 0,
3098 &allows_mem, &allows_reg, &is_inout);
3100 if (!allows_reg && allows_mem)
3101 lang_hooks.mark_addressable (TREE_VALUE (link));
3103 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3104 is_inout ? is_gimple_min_lval : is_gimple_lvalue,
3105 fb_lvalue | fb_mayfail);
3106 if (tret == GS_ERROR)
3108 error ("invalid lvalue in asm output %d", i);
3109 ret = tret;
3112 if (is_inout)
3114 /* An input/output operand. To give the optimizers more
3115 flexibility, split it into separate input and output
3116 operands. */
3117 tree input;
3118 char buf[10];
3119 size_t constraint_len = strlen (constraint);
3121 /* Turn the in/out constraint into an output constraint. */
3122 char *p = xstrdup (constraint);
3123 p[0] = '=';
3124 TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
3125 free (p);
3127 /* And add a matching input constraint. */
3128 if (allows_reg)
3130 sprintf (buf, "%d", i);
3131 input = build_string (strlen (buf), buf);
3133 else
3134 input = build_string (constraint_len - 1, constraint + 1);
3135 input = build_tree_list (build_tree_list (NULL_TREE, input),
3136 unshare_expr (TREE_VALUE (link)));
3137 ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
3141 for (link = ASM_INPUTS (expr); link; ++i, link = TREE_CHAIN (link))
3143 constraint
3144 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3145 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
3146 oconstraints, &allows_mem, &allows_reg);
3148 /* If the operand is a memory input, it should be an lvalue. */
3149 if (!allows_reg && allows_mem)
3151 lang_hooks.mark_addressable (TREE_VALUE (link));
3152 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3153 is_gimple_lvalue, fb_lvalue | fb_mayfail);
3154 if (tret == GS_ERROR)
3156 error ("memory input %d is not directly addressable", i);
3157 ret = tret;
3160 else
3162 tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3163 is_gimple_val, fb_rvalue);
3164 if (tret == GS_ERROR)
3165 ret = tret;
3169 return ret;
3172 /* Gimplify a CLEANUP_POINT_EXPR. Currently this works by adding
3173 WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
3174 gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
3175 return to this function.
3177 FIXME should we complexify the prequeue handling instead? Or use flags
3178 for all the cleanups and let the optimizer tighten them up? The current
3179 code seems pretty fragile; it will break on a cleanup within any
3180 non-conditional nesting. But any such nesting would be broken, anyway;
3181 we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
3182 and continues out of it. We can do that at the RTL level, though, so
3183 having an optimizer to tighten up try/finally regions would be a Good
3184 Thing. */
3186 static enum gimplify_status
3187 gimplify_cleanup_point_expr (tree *expr_p, tree *pre_p)
3189 tree_stmt_iterator iter;
3190 tree body;
3192 tree temp = voidify_wrapper_expr (*expr_p, NULL);
3194 /* We only care about the number of conditions between the innermost
3195 CLEANUP_POINT_EXPR and the cleanup. So save and reset the count. */
3196 int old_conds = gimplify_ctxp->conditions;
3197 gimplify_ctxp->conditions = 0;
3199 body = TREE_OPERAND (*expr_p, 0);
3200 gimplify_to_stmt_list (&body);
3202 gimplify_ctxp->conditions = old_conds;
3204 for (iter = tsi_start (body); !tsi_end_p (iter); )
3206 tree *wce_p = tsi_stmt_ptr (iter);
3207 tree wce = *wce_p;
3209 if (TREE_CODE (wce) == WITH_CLEANUP_EXPR)
3211 if (tsi_one_before_end_p (iter))
3213 tsi_link_before (&iter, TREE_OPERAND (wce, 0), TSI_SAME_STMT);
3214 tsi_delink (&iter);
3215 break;
3217 else
3219 tree sl, tfe;
3221 sl = tsi_split_statement_list_after (&iter);
3222 tfe = build (TRY_FINALLY_EXPR, void_type_node, sl, NULL_TREE);
3223 append_to_statement_list (TREE_OPERAND (wce, 0),
3224 &TREE_OPERAND (tfe, 1));
3225 *wce_p = tfe;
3226 iter = tsi_start (sl);
3229 else
3230 tsi_next (&iter);
3233 if (temp)
3235 *expr_p = temp;
3236 append_to_statement_list (body, pre_p);
3237 return GS_OK;
3239 else
3241 *expr_p = body;
3242 return GS_ALL_DONE;
3246 /* Insert a cleanup marker for gimplify_cleanup_point_expr. CLEANUP
3247 is the cleanup action required. */
3249 static void
3250 gimple_push_cleanup (tree var, tree cleanup, tree *pre_p)
3252 tree wce;
3254 /* Errors can result in improperly nested cleanups. Which results in
3255 confusion when trying to resolve the WITH_CLEANUP_EXPR. */
3256 if (errorcount || sorrycount)
3257 return;
3259 if (gimple_conditional_context ())
3261 /* If we're in a conditional context, this is more complex. We only
3262 want to run the cleanup if we actually ran the initialization that
3263 necessitates it, but we want to run it after the end of the
3264 conditional context. So we wrap the try/finally around the
3265 condition and use a flag to determine whether or not to actually
3266 run the destructor. Thus
3268 test ? f(A()) : 0
3270 becomes (approximately)
3272 flag = 0;
3273 try {
3274 if (test) { A::A(temp); flag = 1; val = f(temp); }
3275 else { val = 0; }
3276 } finally {
3277 if (flag) A::~A(temp);
3282 tree flag = create_tmp_var (boolean_type_node, "cleanup");
3283 tree ffalse = build (MODIFY_EXPR, void_type_node, flag,
3284 boolean_false_node);
3285 tree ftrue = build (MODIFY_EXPR, void_type_node, flag,
3286 boolean_true_node);
3287 cleanup = build (COND_EXPR, void_type_node, flag, cleanup, NULL);
3288 wce = build (WITH_CLEANUP_EXPR, void_type_node, cleanup);
3289 append_to_statement_list (ffalse, &gimplify_ctxp->conditional_cleanups);
3290 append_to_statement_list (wce, &gimplify_ctxp->conditional_cleanups);
3291 append_to_statement_list (ftrue, pre_p);
3293 /* Because of this manipulation, and the EH edges that jump
3294 threading cannot redirect, the temporary (VAR) will appear
3295 to be used uninitialized. Don't warn. */
3296 TREE_NO_WARNING (var) = 1;
3298 else
3300 wce = build (WITH_CLEANUP_EXPR, void_type_node, cleanup);
3301 append_to_statement_list (wce, pre_p);
3304 gimplify_stmt (&TREE_OPERAND (wce, 0));
3307 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR. */
3309 static enum gimplify_status
3310 gimplify_target_expr (tree *expr_p, tree *pre_p, tree *post_p)
3312 tree targ = *expr_p;
3313 tree temp = TARGET_EXPR_SLOT (targ);
3314 tree init = TARGET_EXPR_INITIAL (targ);
3315 enum gimplify_status ret;
3317 if (init)
3319 /* TARGET_EXPR temps aren't part of the enclosing block, so add it
3320 to the temps list. */
3321 gimple_add_tmp_var (temp);
3323 /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
3324 expression is supposed to initialize the slot. */
3325 if (VOID_TYPE_P (TREE_TYPE (init)))
3326 ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
3327 else
3329 /* Special handling for BIND_EXPR can result in fewer temps. */
3330 ret = GS_OK;
3331 if (TREE_CODE (init) == BIND_EXPR)
3332 gimplify_bind_expr (&init, temp, pre_p);
3333 if (init != temp)
3335 init = build (MODIFY_EXPR, void_type_node, temp, init);
3336 ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt,
3337 fb_none);
3340 if (ret == GS_ERROR)
3341 return GS_ERROR;
3342 append_to_statement_list (init, pre_p);
3344 /* If needed, push the cleanup for the temp. */
3345 if (TARGET_EXPR_CLEANUP (targ))
3347 gimplify_stmt (&TARGET_EXPR_CLEANUP (targ));
3348 gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ), pre_p);
3351 /* Only expand this once. */
3352 TREE_OPERAND (targ, 3) = init;
3353 TARGET_EXPR_INITIAL (targ) = NULL_TREE;
3355 else if (!DECL_SEEN_IN_BIND_EXPR_P (temp))
3356 /* We should have expanded this before. */
3357 abort ();
3359 *expr_p = temp;
3360 return GS_OK;
3363 /* Gimplification of expression trees. */
3365 /* Gimplify an expression which appears at statement context; usually, this
3366 means replacing it with a suitably gimple STATEMENT_LIST. */
3368 void
3369 gimplify_stmt (tree *stmt_p)
3371 gimplify_expr (stmt_p, NULL, NULL, is_gimple_stmt, fb_none);
3374 /* Similarly, but force the result to be a STATEMENT_LIST. */
3376 void
3377 gimplify_to_stmt_list (tree *stmt_p)
3379 gimplify_stmt (stmt_p);
3380 if (!*stmt_p)
3381 *stmt_p = alloc_stmt_list ();
3382 else if (TREE_CODE (*stmt_p) != STATEMENT_LIST)
3384 tree t = *stmt_p;
3385 *stmt_p = alloc_stmt_list ();
3386 append_to_statement_list (t, stmt_p);
3391 /* Gimplifies the expression tree pointed by EXPR_P. Return 0 if
3392 gimplification failed.
3394 PRE_P points to the list where side effects that must happen before
3395 EXPR should be stored.
3397 POST_P points to the list where side effects that must happen after
3398 EXPR should be stored, or NULL if there is no suitable list. In
3399 that case, we copy the result to a temporary, emit the
3400 post-effects, and then return the temporary.
3402 GIMPLE_TEST_F points to a function that takes a tree T and
3403 returns nonzero if T is in the GIMPLE form requested by the
3404 caller. The GIMPLE predicates are in tree-gimple.c.
3406 This test is used twice. Before gimplification, the test is
3407 invoked to determine whether *EXPR_P is already gimple enough. If
3408 that fails, *EXPR_P is gimplified according to its code and
3409 GIMPLE_TEST_F is called again. If the test still fails, then a new
3410 temporary variable is created and assigned the value of the
3411 gimplified expression.
3413 FALLBACK tells the function what sort of a temporary we want. If the 1
3414 bit is set, an rvalue is OK. If the 2 bit is set, an lvalue is OK.
3415 If both are set, either is OK, but an lvalue is preferable.
3417 The return value is either GS_ERROR or GS_ALL_DONE, since this function
3418 iterates until solution. */
3420 enum gimplify_status
3421 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
3422 bool (* gimple_test_f) (tree), fallback_t fallback)
3424 tree tmp;
3425 tree internal_pre = NULL_TREE;
3426 tree internal_post = NULL_TREE;
3427 tree save_expr;
3428 int is_statement = (pre_p == NULL);
3429 location_t saved_location;
3430 enum gimplify_status ret;
3432 save_expr = *expr_p;
3433 if (save_expr == NULL_TREE)
3434 return GS_ALL_DONE;
3436 /* We used to check the predicate here and return immediately if it
3437 succeeds. This is wrong; the design is for gimplification to be
3438 idempotent, and for the predicates to only test for valid forms, not
3439 whether they are fully simplified. */
3441 /* Set up our internal queues if needed. */
3442 if (pre_p == NULL)
3443 pre_p = &internal_pre;
3444 if (post_p == NULL)
3445 post_p = &internal_post;
3447 saved_location = input_location;
3448 if (save_expr != error_mark_node
3449 && EXPR_HAS_LOCATION (*expr_p))
3450 input_location = EXPR_LOCATION (*expr_p);
3452 /* Loop over the specific gimplifiers until the toplevel node
3453 remains the same. */
3456 /* Strip away as many useless type conversions as possible
3457 at the toplevel. */
3458 STRIP_USELESS_TYPE_CONVERSION (*expr_p);
3460 /* Remember the expr. */
3461 save_expr = *expr_p;
3463 /* Die, die, die, my darling. */
3464 if (save_expr == error_mark_node
3465 || (TREE_TYPE (save_expr)
3466 && TREE_TYPE (save_expr) == error_mark_node))
3468 ret = GS_ERROR;
3469 break;
3472 /* Do any language-specific gimplification. */
3473 ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
3474 if (ret == GS_OK)
3476 if (*expr_p == NULL_TREE)
3477 break;
3478 if (*expr_p != save_expr)
3479 continue;
3481 else if (ret != GS_UNHANDLED)
3482 break;
3484 ret = GS_OK;
3485 switch (TREE_CODE (*expr_p))
3487 /* First deal with the special cases. */
3489 case POSTINCREMENT_EXPR:
3490 case POSTDECREMENT_EXPR:
3491 case PREINCREMENT_EXPR:
3492 case PREDECREMENT_EXPR:
3493 ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
3494 fallback != fb_none);
3495 break;
3497 case ARRAY_REF:
3498 case ARRAY_RANGE_REF:
3499 case REALPART_EXPR:
3500 case IMAGPART_EXPR:
3501 case COMPONENT_REF:
3502 ret = gimplify_compound_lval (expr_p, pre_p, post_p,
3503 fallback ? fallback : fb_rvalue);
3504 break;
3506 case COND_EXPR:
3507 ret = gimplify_cond_expr (expr_p, pre_p, NULL_TREE);
3508 break;
3510 case CALL_EXPR:
3511 ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
3512 break;
3514 case TREE_LIST:
3515 abort ();
3517 case COMPOUND_EXPR:
3518 ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
3519 break;
3521 case MODIFY_EXPR:
3522 case INIT_EXPR:
3523 ret = gimplify_modify_expr (expr_p, pre_p, post_p,
3524 fallback != fb_none);
3525 break;
3527 case TRUTH_ANDIF_EXPR:
3528 case TRUTH_ORIF_EXPR:
3529 ret = gimplify_boolean_expr (expr_p);
3530 break;
3532 case TRUTH_NOT_EXPR:
3533 TREE_OPERAND (*expr_p, 0)
3534 = gimple_boolify (TREE_OPERAND (*expr_p, 0));
3535 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3536 is_gimple_val, fb_rvalue);
3537 recalculate_side_effects (*expr_p);
3538 break;
3540 case ADDR_EXPR:
3541 ret = gimplify_addr_expr (expr_p, pre_p, post_p);
3542 break;
3544 case VA_ARG_EXPR:
3545 ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
3546 break;
3548 case VIEW_CONVERT_EXPR:
3549 if (VOID_TYPE_P (TREE_TYPE (*expr_p))
3550 || fallback == fb_none)
3552 /* Just strip a conversion to void (or in void context) and
3553 try again. */
3554 *expr_p = TREE_OPERAND (*expr_p, 0);
3555 break;
3558 /* If both types are BLKmode or if one type is of variable size,
3559 convert this into a pointer punning operation. This avoids
3560 copies of large data or making a variable-size temporary.
3562 ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
3563 all clear. The impact of this transformation is even less
3564 clear. */
3566 if ((TYPE_MODE (TREE_TYPE (*expr_p)) == BLKmode
3567 && TYPE_MODE (TREE_TYPE (TREE_OPERAND (*expr_p, 0))) == BLKmode)
3568 || !TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (*expr_p)))
3569 || !TREE_CONSTANT (TYPE_SIZE (TREE_TYPE
3570 (TREE_OPERAND (*expr_p,0)))))
3572 tree restype = TREE_TYPE (*expr_p);
3573 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (*expr_p),
3574 fold_convert (build_pointer_type (restype),
3575 build_fold_addr_expr
3576 (TREE_OPERAND (*expr_p, 0))));
3577 break;
3579 goto unary;
3581 case CONVERT_EXPR:
3582 case NOP_EXPR:
3583 if (IS_EMPTY_STMT (*expr_p))
3585 ret = GS_ALL_DONE;
3586 break;
3589 if (VOID_TYPE_P (TREE_TYPE (*expr_p))
3590 || fallback == fb_none)
3592 /* Just strip a conversion to void (or in void context) and
3593 try again. */
3594 *expr_p = TREE_OPERAND (*expr_p, 0);
3595 break;
3598 ret = gimplify_conversion (expr_p);
3599 if (ret == GS_ERROR)
3600 break;
3601 if (*expr_p != save_expr)
3602 break;
3603 /* FALLTHRU */
3605 case FIX_TRUNC_EXPR:
3606 case FIX_CEIL_EXPR:
3607 case FIX_FLOOR_EXPR:
3608 case FIX_ROUND_EXPR:
3609 unary:
3610 /* unary_expr: ... | '(' cast ')' val | ... */
3611 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3612 is_gimple_val, fb_rvalue);
3613 recalculate_side_effects (*expr_p);
3614 break;
3616 case INDIRECT_REF:
3617 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3618 is_gimple_reg, fb_rvalue);
3619 recalculate_side_effects (*expr_p);
3620 break;
3622 /* Constants need not be gimplified. */
3623 case INTEGER_CST:
3624 case REAL_CST:
3625 case STRING_CST:
3626 case COMPLEX_CST:
3627 case VECTOR_CST:
3628 ret = GS_ALL_DONE;
3629 break;
3631 case CONST_DECL:
3632 *expr_p = DECL_INITIAL (*expr_p);
3633 break;
3635 case DECL_EXPR:
3636 ret = gimplify_decl_expr (expr_p);
3637 break;
3639 case EXC_PTR_EXPR:
3640 /* FIXME make this a decl. */
3641 ret = GS_ALL_DONE;
3642 break;
3644 case BIND_EXPR:
3645 ret = gimplify_bind_expr (expr_p, NULL, pre_p);
3646 break;
3648 case LOOP_EXPR:
3649 ret = gimplify_loop_expr (expr_p, pre_p);
3650 break;
3652 case SWITCH_EXPR:
3653 ret = gimplify_switch_expr (expr_p, pre_p);
3654 break;
3656 case LABELED_BLOCK_EXPR:
3657 ret = gimplify_labeled_block_expr (expr_p);
3658 break;
3660 case EXIT_BLOCK_EXPR:
3661 ret = gimplify_exit_block_expr (expr_p);
3662 break;
3664 case EXIT_EXPR:
3665 ret = gimplify_exit_expr (expr_p);
3666 break;
3668 case GOTO_EXPR:
3669 /* If the target is not LABEL, then it is a computed jump
3670 and the target needs to be gimplified. */
3671 if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
3672 ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
3673 NULL, is_gimple_val, fb_rvalue);
3674 break;
3676 case LABEL_EXPR:
3677 ret = GS_ALL_DONE;
3678 #ifdef ENABLE_CHECKING
3679 if (decl_function_context (LABEL_EXPR_LABEL (*expr_p)) != current_function_decl)
3680 abort ();
3681 #endif
3682 break;
3684 case CASE_LABEL_EXPR:
3685 ret = gimplify_case_label_expr (expr_p);
3686 break;
3688 case RETURN_EXPR:
3689 ret = gimplify_return_expr (*expr_p, pre_p);
3690 break;
3692 case CONSTRUCTOR:
3693 /* Don't reduce this in place; let gimplify_init_constructor work its
3694 magic. Buf if we're just elaborating this for side effects, just
3695 gimplify any element that has side-effects. */
3696 if (fallback == fb_none)
3698 for (tmp = CONSTRUCTOR_ELTS (*expr_p); tmp;
3699 tmp = TREE_CHAIN (tmp))
3700 if (TREE_SIDE_EFFECTS (TREE_VALUE (tmp)))
3701 gimplify_expr (&TREE_VALUE (tmp), pre_p, post_p,
3702 gimple_test_f, fallback);
3704 *expr_p = NULL_TREE;
3707 ret = GS_ALL_DONE;
3708 break;
3710 /* The following are special cases that are not handled by the
3711 original GIMPLE grammar. */
3713 /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
3714 eliminated. */
3715 case SAVE_EXPR:
3716 ret = gimplify_save_expr (expr_p, pre_p, post_p);
3717 break;
3719 case BIT_FIELD_REF:
3721 enum gimplify_status r0, r1, r2;
3723 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3724 is_gimple_lvalue, fb_either);
3725 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3726 is_gimple_val, fb_rvalue);
3727 r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
3728 is_gimple_val, fb_rvalue);
3729 recalculate_side_effects (*expr_p);
3731 ret = MIN (r0, MIN (r1, r2));
3733 break;
3735 case NON_LVALUE_EXPR:
3736 /* This should have been stripped above. */
3737 abort ();
3738 break;
3740 case ASM_EXPR:
3741 ret = gimplify_asm_expr (expr_p, pre_p, post_p);
3742 break;
3744 case TRY_FINALLY_EXPR:
3745 case TRY_CATCH_EXPR:
3746 gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
3747 gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
3748 ret = GS_ALL_DONE;
3749 break;
3751 case CLEANUP_POINT_EXPR:
3752 ret = gimplify_cleanup_point_expr (expr_p, pre_p);
3753 break;
3755 case TARGET_EXPR:
3756 ret = gimplify_target_expr (expr_p, pre_p, post_p);
3757 break;
3759 case CATCH_EXPR:
3760 gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
3761 ret = GS_ALL_DONE;
3762 break;
3764 case EH_FILTER_EXPR:
3765 gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
3766 ret = GS_ALL_DONE;
3767 break;
3769 case OBJ_TYPE_REF:
3771 enum gimplify_status r0, r1;
3772 r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
3773 is_gimple_val, fb_rvalue);
3774 r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
3775 is_gimple_val, fb_rvalue);
3776 ret = MIN (r0, r1);
3778 break;
3780 case MIN_EXPR:
3781 case MAX_EXPR:
3782 ret = gimplify_minimax_expr (expr_p, pre_p, post_p);
3783 break;
3785 case LABEL_DECL:
3786 /* We get here when taking the address of a label. We mark
3787 the label as "forced"; meaning it can never be removed and
3788 it is a potential target for any computed goto. */
3789 FORCED_LABEL (*expr_p) = 1;
3790 ret = GS_ALL_DONE;
3791 break;
3793 case STATEMENT_LIST:
3794 ret = gimplify_statement_list (expr_p);
3795 break;
3797 case VAR_DECL:
3798 /* ??? If this is a local variable, and it has not been seen in any
3799 outer BIND_EXPR, then it's probably the result of a duplicate
3800 declaration, for which we've already issued an error. It would
3801 be really nice if the front end wouldn't leak these at all.
3802 Currently the only known culprit is C++ destructors, as seen
3803 in g++.old-deja/g++.jason/binding.C. */
3804 tmp = *expr_p;
3805 if (!TREE_STATIC (tmp) && !DECL_EXTERNAL (tmp)
3806 && decl_function_context (tmp) == current_function_decl
3807 && !DECL_SEEN_IN_BIND_EXPR_P (tmp))
3809 #ifdef ENABLE_CHECKING
3810 if (!errorcount && !sorrycount)
3811 abort ();
3812 #endif
3813 ret = GS_ERROR;
3815 else
3816 ret = GS_ALL_DONE;
3817 break;
3819 default:
3820 /* If this is a comparison of objects of aggregate type, handle
3821 it specially (by converting to a call to memcmp). It would be
3822 nice to only have to do this for variable-sized objects, but
3823 then we'd have to allow the same nest of reference nodes we
3824 allow for MODIFY_EXPR and that's too complex. */
3825 if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '<'
3826 && (AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 1)))))
3827 ret = gimplify_variable_sized_compare (expr_p);
3829 /* If *EXPR_P does not need to be special-cased, handle it
3830 according to its class. */
3831 else if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '1')
3832 ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
3833 post_p, is_gimple_val, fb_rvalue);
3834 else if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '2'
3835 || TREE_CODE_CLASS (TREE_CODE (*expr_p)) == '<'
3836 || TREE_CODE (*expr_p) == TRUTH_AND_EXPR
3837 || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
3838 || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR)
3840 enum gimplify_status r0, r1;
3842 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
3843 post_p, is_gimple_val, fb_rvalue);
3844 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
3845 post_p, is_gimple_val, fb_rvalue);
3847 ret = MIN (r0, r1);
3849 else if (TREE_CODE_CLASS (TREE_CODE (*expr_p)) == 'd'
3850 || TREE_CODE_CLASS (TREE_CODE (*expr_p)) == 'c')
3852 ret = GS_ALL_DONE;
3853 break;
3855 else
3856 /* Fail if we don't know how to handle this tree code. */
3857 abort ();
3859 recalculate_side_effects (*expr_p);
3860 break;
3863 /* If we replaced *expr_p, gimplify again. */
3864 if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
3865 ret = GS_ALL_DONE;
3867 while (ret == GS_OK);
3869 /* If we encountered an error_mark somewhere nested inside, either
3870 stub out the statement or propagate the error back out. */
3871 if (ret == GS_ERROR)
3873 if (is_statement)
3874 *expr_p = NULL;
3875 goto out;
3878 #ifdef ENABLE_CHECKING
3879 /* This was only valid as a return value from the langhook, which
3880 we handled. Make sure it doesn't escape from any other context. */
3881 if (ret == GS_UNHANDLED)
3882 abort ();
3883 #endif
3885 if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
3887 /* We aren't looking for a value, and we don't have a valid
3888 statement. If it doesn't have side-effects, throw it away. */
3889 if (!TREE_SIDE_EFFECTS (*expr_p))
3890 *expr_p = NULL;
3891 else if (!TREE_THIS_VOLATILE (*expr_p))
3893 /* This is probably a _REF that contains something nested that
3894 has side effects. Recurse through the operands to find it. */
3895 enum tree_code code = TREE_CODE (*expr_p);
3897 if (code == COMPONENT_REF
3898 || code == REALPART_EXPR || code == IMAGPART_EXPR)
3899 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3900 gimple_test_f, fallback);
3901 else if (code == ARRAY_REF || code == ARRAY_RANGE_REF)
3903 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3904 gimple_test_f, fallback);
3905 gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3906 gimple_test_f, fallback);
3908 else
3909 /* Anything else with side-effects
3910 must be converted to a valid statement before we get here. */
3911 abort ();
3913 *expr_p = NULL;
3915 else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p)))
3917 /* Historically, the compiler has treated a bare
3918 reference to a volatile lvalue as forcing a load. */
3919 tree tmp = create_tmp_var (TREE_TYPE (*expr_p), "vol");
3920 *expr_p = build (MODIFY_EXPR, TREE_TYPE (tmp), tmp, *expr_p);
3922 else
3923 /* We can't do anything useful with a volatile reference to
3924 incomplete type, so just throw it away. */
3925 *expr_p = NULL;
3928 /* If we are gimplifying at the statement level, we're done. Tack
3929 everything together and replace the original statement with the
3930 gimplified form. */
3931 if (fallback == fb_none || is_statement)
3933 if (internal_pre || internal_post)
3935 append_to_statement_list (*expr_p, &internal_pre);
3936 append_to_statement_list (internal_post, &internal_pre);
3937 annotate_all_with_locus (&internal_pre, input_location);
3938 *expr_p = internal_pre;
3940 else if (!*expr_p)
3942 else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
3943 annotate_all_with_locus (expr_p, input_location);
3944 else
3945 annotate_one_with_locus (*expr_p, input_location);
3946 goto out;
3949 /* Otherwise we're gimplifying a subexpression, so the resulting value is
3950 interesting. */
3952 /* If it's sufficiently simple already, we're done. Unless we are
3953 handling some post-effects internally; if that's the case, we need to
3954 copy into a temp before adding the post-effects to the tree. */
3955 if (!internal_post && (*gimple_test_f) (*expr_p))
3956 goto out;
3958 /* Otherwise, we need to create a new temporary for the gimplified
3959 expression. */
3961 /* We can't return an lvalue if we have an internal postqueue. The
3962 object the lvalue refers to would (probably) be modified by the
3963 postqueue; we need to copy the value out first, which means an
3964 rvalue. */
3965 if ((fallback & fb_lvalue) && !internal_post
3966 && is_gimple_addr_expr_arg (*expr_p))
3968 /* An lvalue will do. Take the address of the expression, store it
3969 in a temporary, and replace the expression with an INDIRECT_REF of
3970 that temporary. */
3971 tmp = build_fold_addr_expr (*expr_p);
3972 gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
3973 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
3975 else if ((fallback & fb_rvalue) && is_gimple_rhs (*expr_p))
3977 #if defined ENABLE_CHECKING
3978 if (VOID_TYPE_P (TREE_TYPE (*expr_p)))
3979 abort ();
3980 #endif
3982 /* An rvalue will do. Assign the gimplified expression into a new
3983 temporary TMP and replace the original expression with TMP. */
3985 if (internal_post || (fallback & fb_lvalue))
3986 /* The postqueue might change the value of the expression between
3987 the initialization and use of the temporary, so we can't use a
3988 formal temp. FIXME do we care? */
3989 *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
3990 else
3991 *expr_p = get_formal_tmp_var (*expr_p, pre_p);
3993 else if (fallback & fb_mayfail)
3995 /* If this is an asm statement, and the user asked for the impossible,
3996 don't abort. Fail and let gimplify_asm_expr issue an error. */
3997 ret = GS_ERROR;
3998 goto out;
4000 else
4002 fprintf (stderr, "gimplification failed:\n");
4003 print_generic_expr (stderr, *expr_p, 0);
4004 debug_tree (*expr_p);
4005 abort ();
4008 #if defined ENABLE_CHECKING
4009 /* Make sure the temporary matches our predicate. */
4010 if (!(*gimple_test_f) (*expr_p))
4011 abort ();
4012 #endif
4014 if (internal_post)
4016 annotate_all_with_locus (&internal_post, input_location);
4017 append_to_statement_list (internal_post, pre_p);
4020 out:
4021 input_location = saved_location;
4022 return ret;
4025 /* Look through TYPE for variable-sized objects and gimplify each such
4026 size that we find. Add to LIST_P any statements generated. */
4028 void
4029 gimplify_type_sizes (tree type, tree *list_p)
4031 tree field;
4033 switch (TREE_CODE (type))
4035 case ERROR_MARK:
4036 return;
4038 case INTEGER_TYPE:
4039 case ENUMERAL_TYPE:
4040 case BOOLEAN_TYPE:
4041 case CHAR_TYPE:
4042 case REAL_TYPE:
4043 gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
4044 gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
4045 break;
4047 case ARRAY_TYPE:
4048 /* These anonymous types don't have declarations, so handle them here. */
4049 gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
4050 break;
4052 case RECORD_TYPE:
4053 case UNION_TYPE:
4054 case QUAL_UNION_TYPE:
4055 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4056 if (TREE_CODE (field) == FIELD_DECL)
4057 gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
4058 break;
4060 default:
4061 break;
4064 gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
4065 gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
4068 /* Subroutine of the above to gimplify one size or position, *EXPR_P.
4069 We add any required statements to STMT_P. */
4071 void
4072 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
4074 /* We don't do anything if the value isn't there, is constant, or contains
4075 A PLACEHOLDER_EXPR. We also don't want to do anything if it's already
4076 a VAR_DECL. If it's a VAR_DECL from another function, the gimplfier
4077 will want to replace it with a new variable, but that will cause problems
4078 if this type is from outside the function. It's OK to have that here. */
4079 if (*expr_p == NULL_TREE || TREE_CONSTANT (*expr_p)
4080 || TREE_CODE (*expr_p) == VAR_DECL
4081 || CONTAINS_PLACEHOLDER_P (*expr_p))
4082 return;
4084 gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
4087 #ifdef ENABLE_CHECKING
4088 /* Compare types A and B for a "close enough" match. */
4090 static bool
4091 cpt_same_type (tree a, tree b)
4093 if (lang_hooks.types_compatible_p (a, b))
4094 return true;
4096 /* ??? The C++ FE decomposes METHOD_TYPES to FUNCTION_TYPES and doesn't
4097 link them together. This routine is intended to catch type errors
4098 that will affect the optimizers, and the optimizers don't add new
4099 dereferences of function pointers, so ignore it. */
4100 if ((TREE_CODE (a) == FUNCTION_TYPE || TREE_CODE (a) == METHOD_TYPE)
4101 && (TREE_CODE (b) == FUNCTION_TYPE || TREE_CODE (b) == METHOD_TYPE))
4102 return true;
4104 /* ??? The C FE pushes type qualifiers after the fact into the type of
4105 the element from the type of the array. See build_unary_op's handling
4106 of ADDR_EXPR. This seems wrong -- if we were going to do this, we
4107 should have done it when creating the variable in the first place.
4108 Alternately, why aren't the two array types made variants? */
4109 if (TREE_CODE (a) == ARRAY_TYPE && TREE_CODE (b) == ARRAY_TYPE)
4110 return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
4112 /* And because of those, we have to recurse down through pointers. */
4113 if (POINTER_TYPE_P (a) && POINTER_TYPE_P (b))
4114 return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
4116 return false;
4119 /* Check for some cases of the front end missing cast expressions.
4120 The type of a dereference should correspond to the pointer type;
4121 similarly the type of an address should match its object. */
4123 static tree
4124 check_pointer_types_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
4125 void *data ATTRIBUTE_UNUSED)
4127 tree t = *tp;
4128 tree ptype, otype, dtype;
4130 switch (TREE_CODE (t))
4132 case INDIRECT_REF:
4133 case ARRAY_REF:
4134 otype = TREE_TYPE (t);
4135 ptype = TREE_TYPE (TREE_OPERAND (t, 0));
4136 dtype = TREE_TYPE (ptype);
4137 if (!cpt_same_type (otype, dtype))
4138 abort ();
4139 break;
4141 case ADDR_EXPR:
4142 ptype = TREE_TYPE (t);
4143 otype = TREE_TYPE (TREE_OPERAND (t, 0));
4144 dtype = TREE_TYPE (ptype);
4145 if (!cpt_same_type (otype, dtype))
4147 /* &array is allowed to produce a pointer to the element, rather than
4148 a pointer to the array type. We must allow this in order to
4149 properly represent assigning the address of an array in C into
4150 pointer to the element type. */
4151 if (TREE_CODE (otype) == ARRAY_TYPE
4152 && POINTER_TYPE_P (ptype)
4153 && cpt_same_type (TREE_TYPE (otype), dtype))
4154 break;
4155 abort ();
4157 break;
4159 default:
4160 return NULL_TREE;
4164 return NULL_TREE;
4166 #endif
4168 /* Gimplify the body of statements pointed by BODY_P. FNDECL is the
4169 function decl containing BODY. */
4171 void
4172 gimplify_body (tree *body_p, tree fndecl)
4174 location_t saved_location = input_location;
4175 tree body;
4177 timevar_push (TV_TREE_GIMPLIFY);
4178 push_gimplify_context ();
4180 /* Unshare most shared trees in the body and in that of any nested functions.
4181 It would seem we don't have to do this for nested functions because
4182 they are supposed to be output and then the outer function gimplified
4183 first, but the g++ front end doesn't always do it that way. */
4184 unshare_body (body_p, fndecl);
4185 unvisit_body (body_p, fndecl);
4187 /* Make sure input_location isn't set to something wierd. */
4188 input_location = DECL_SOURCE_LOCATION (fndecl);
4190 /* Gimplify the function's body. */
4191 gimplify_stmt (body_p);
4192 body = *body_p;
4194 /* Unshare again, in case gimplification was sloppy. */
4195 unshare_all_trees (body);
4197 if (!body)
4198 body = alloc_stmt_list ();
4199 else if (TREE_CODE (body) == STATEMENT_LIST)
4201 tree t = expr_only (*body_p);
4202 if (t)
4203 body = t;
4206 /* If there isn't an outer BIND_EXPR, add one. */
4207 if (TREE_CODE (body) != BIND_EXPR)
4209 tree b = build (BIND_EXPR, void_type_node, NULL_TREE,
4210 NULL_TREE, NULL_TREE);
4211 TREE_SIDE_EFFECTS (b) = 1;
4212 append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
4213 body = b;
4215 *body_p = body;
4217 pop_gimplify_context (body);
4219 #ifdef ENABLE_CHECKING
4220 walk_tree (body_p, check_pointer_types_r, NULL, NULL);
4221 #endif
4223 timevar_pop (TV_TREE_GIMPLIFY);
4224 input_location = saved_location;
4227 /* Entry point to the gimplification pass. FNDECL is the FUNCTION_DECL
4228 node for the function we want to gimplify. */
4230 void
4231 gimplify_function_tree (tree fndecl)
4233 tree oldfn;
4235 oldfn = current_function_decl;
4236 current_function_decl = fndecl;
4238 gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl);
4240 /* If we're instrumenting function entry/exit, then prepend the call to
4241 the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
4242 catch the exit hook. */
4243 /* ??? Add some way to ignore exceptions for this TFE. */
4244 if (flag_instrument_function_entry_exit
4245 && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl))
4247 tree tf, x, bind;
4249 tf = build (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
4250 TREE_SIDE_EFFECTS (tf) = 1;
4251 x = DECL_SAVED_TREE (fndecl);
4252 append_to_statement_list (x, &TREE_OPERAND (tf, 0));
4253 x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
4254 x = build_function_call_expr (x, NULL);
4255 append_to_statement_list (x, &TREE_OPERAND (tf, 1));
4257 bind = build (BIND_EXPR, void_type_node, NULL, NULL, NULL);
4258 TREE_SIDE_EFFECTS (bind) = 1;
4259 x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
4260 x = build_function_call_expr (x, NULL);
4261 append_to_statement_list (x, &BIND_EXPR_BODY (bind));
4262 append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
4264 DECL_SAVED_TREE (fndecl) = bind;
4267 current_function_decl = oldfn;
4270 #include "gt-gimplify.h"