OSDN Git Service

* gcc.dg/tree-ssa/20040204-1.c: Remove powerpc from xfail list.
[pf3gnuchains/gcc-fork.git] / gcc / gimplify.c
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, 2005 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>.
6
7 This file is part of GCC.
8
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.
13
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.
18
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.  */
23
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"
49
50 static struct gimplify_ctx
51 {
52   tree current_bind_expr;
53   tree temps;
54   tree conditional_cleanups;
55   tree exit_label;
56   tree return_temp;
57   varray_type case_labels;
58   /* The formal temporary table.  Should this be persistent?  */
59   htab_t temp_htab;
60   int conditions;
61   bool save_stack;
62   bool into_ssa;
63 } *gimplify_ctxp;
64
65
66 /* Formal (expression) temporary table handling: Multiple occurrences of
67    the same scalar expression are evaluated into the same temporary.  */
68
69 typedef struct gimple_temp_hash_elt
70 {
71   tree val;   /* Key */
72   tree temp;  /* Value */
73 } elt_t;
74
75 /* Forward declarations.  */
76 static enum gimplify_status gimplify_compound_expr (tree *, tree *, bool);
77 #ifdef ENABLE_CHECKING
78 static bool cpt_same_type (tree a, tree b);
79 #endif
80
81
82 /* Return a hash value for a formal temporary table entry.  */
83
84 static hashval_t
85 gimple_tree_hash (const void *p)
86 {
87   tree t = ((const elt_t *) p)->val;
88   return iterative_hash_expr (t, 0);
89 }
90
91 /* Compare two formal temporary table entries.  */
92
93 static int
94 gimple_tree_eq (const void *p1, const void *p2)
95 {
96   tree t1 = ((const elt_t *) p1)->val;
97   tree t2 = ((const elt_t *) p2)->val;
98   enum tree_code code = TREE_CODE (t1);
99
100   if (TREE_CODE (t2) != code
101       || TREE_TYPE (t1) != TREE_TYPE (t2))
102     return 0;
103
104   if (!operand_equal_p (t1, t2, 0))
105     return 0;
106
107   /* Only allow them to compare equal if they also hash equal; otherwise
108      results are nondeterminate, and we fail bootstrap comparison.  */
109   gcc_assert (gimple_tree_hash (p1) == gimple_tree_hash (p2));
110
111   return 1;
112 }
113
114 /* Set up a context for the gimplifier.  */
115
116 void
117 push_gimplify_context (void)
118 {
119   gcc_assert (!gimplify_ctxp);
120   gimplify_ctxp
121     = (struct gimplify_ctx *) xcalloc (1, sizeof (struct gimplify_ctx));
122   if (optimize)
123     gimplify_ctxp->temp_htab
124       = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
125   else
126     gimplify_ctxp->temp_htab = NULL;
127 }
128
129 /* Tear down a context for the gimplifier.  If BODY is non-null, then
130    put the temporaries into the outer BIND_EXPR.  Otherwise, put them
131    in the unexpanded_var_list.  */
132
133 void
134 pop_gimplify_context (tree body)
135 {
136   tree t;
137
138   gcc_assert (gimplify_ctxp && !gimplify_ctxp->current_bind_expr);
139
140   for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
141     DECL_GIMPLE_FORMAL_TEMP_P (t) = 0;
142
143   if (body)
144     declare_tmp_vars (gimplify_ctxp->temps, body);
145   else
146     record_vars (gimplify_ctxp->temps);
147
148 #if 0
149   if (!quiet_flag && optimize)
150     fprintf (stderr, " collisions: %f ",
151              htab_collisions (gimplify_ctxp->temp_htab));
152 #endif
153
154   if (optimize)
155     htab_delete (gimplify_ctxp->temp_htab);
156   free (gimplify_ctxp);
157   gimplify_ctxp = NULL;
158 }
159
160 void
161 gimple_push_bind_expr (tree bind)
162 {
163   TREE_CHAIN (bind) = gimplify_ctxp->current_bind_expr;
164   gimplify_ctxp->current_bind_expr = bind;
165 }
166
167 void
168 gimple_pop_bind_expr (void)
169 {
170   gimplify_ctxp->current_bind_expr
171     = TREE_CHAIN (gimplify_ctxp->current_bind_expr);
172 }
173
174 tree
175 gimple_current_bind_expr (void)
176 {
177   return gimplify_ctxp->current_bind_expr;
178 }
179
180 /* Returns true iff there is a COND_EXPR between us and the innermost
181    CLEANUP_POINT_EXPR.  This info is used by gimple_push_cleanup.  */
182
183 static bool
184 gimple_conditional_context (void)
185 {
186   return gimplify_ctxp->conditions > 0;
187 }
188
189 /* Note that we've entered a COND_EXPR.  */
190
191 static void
192 gimple_push_condition (void)
193 {
194 #ifdef ENABLE_CHECKING
195   if (gimplify_ctxp->conditions == 0)
196     gcc_assert (!gimplify_ctxp->conditional_cleanups);
197 #endif
198   ++(gimplify_ctxp->conditions);
199 }
200
201 /* Note that we've left a COND_EXPR.  If we're back at unconditional scope
202    now, add any conditional cleanups we've seen to the prequeue.  */
203
204 static void
205 gimple_pop_condition (tree *pre_p)
206 {
207   int conds = --(gimplify_ctxp->conditions);
208
209   gcc_assert (conds >= 0);
210   if (conds == 0)
211     {
212       append_to_statement_list (gimplify_ctxp->conditional_cleanups, pre_p);
213       gimplify_ctxp->conditional_cleanups = NULL_TREE;
214     }
215 }
216
217 /* A subroutine of append_to_statement_list{,_force}.  T is not NULL.  */
218
219 static void
220 append_to_statement_list_1 (tree t, tree *list_p)
221 {
222   tree list = *list_p;
223   tree_stmt_iterator i;
224
225   if (!list)
226     {
227       if (t && TREE_CODE (t) == STATEMENT_LIST)
228         {
229           *list_p = t;
230           return;
231         }
232       *list_p = list = alloc_stmt_list ();
233     }
234
235   i = tsi_last (list);
236   tsi_link_after (&i, t, TSI_CONTINUE_LINKING);
237 }
238
239 /* Add T to the end of the list container pointed by LIST_P.
240    If T is an expression with no effects, it is ignored.  */
241
242 void
243 append_to_statement_list (tree t, tree *list_p)
244 {
245   if (t && TREE_SIDE_EFFECTS (t))
246     append_to_statement_list_1 (t, list_p);
247 }
248
249 /* Similar, but the statement is always added, regardless of side effects.  */
250
251 void
252 append_to_statement_list_force (tree t, tree *list_p)
253 {
254   if (t != NULL_TREE)
255     append_to_statement_list_1 (t, list_p);
256 }
257
258 /* Both gimplify the statement T and append it to LIST_P.  */
259
260 void
261 gimplify_and_add (tree t, tree *list_p)
262 {
263   gimplify_stmt (&t);
264   append_to_statement_list (t, list_p);
265 }
266
267 /* Strip off a legitimate source ending from the input string NAME of
268    length LEN.  Rather than having to know the names used by all of
269    our front ends, we strip off an ending of a period followed by
270    up to five characters.  (Java uses ".class".)  */
271
272 static inline void
273 remove_suffix (char *name, int len)
274 {
275   int i;
276
277   for (i = 2;  i < 8 && len > i;  i++)
278     {
279       if (name[len - i] == '.')
280         {
281           name[len - i] = '\0';
282           break;
283         }
284     }
285 }
286
287 /* Create a nameless artificial label and put it in the current function
288    context.  Returns the newly created label.  */
289
290 tree
291 create_artificial_label (void)
292 {
293   tree lab = build_decl (LABEL_DECL, NULL_TREE, void_type_node);
294
295   DECL_ARTIFICIAL (lab) = 1;
296   DECL_IGNORED_P (lab) = 1;
297   DECL_CONTEXT (lab) = current_function_decl;
298   return lab;
299 }
300
301 /* Create a new temporary name with PREFIX.  Returns an identifier.  */
302
303 static GTY(()) unsigned int tmp_var_id_num;
304
305 tree
306 create_tmp_var_name (const char *prefix)
307 {
308   char *tmp_name;
309
310   if (prefix)
311     {
312       char *preftmp = ASTRDUP (prefix);
313
314       remove_suffix (preftmp, strlen (preftmp));
315       prefix = preftmp;
316     }
317
318   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
319   return get_identifier (tmp_name);
320 }
321
322
323 /* Create a new temporary variable declaration of type TYPE.
324    Does NOT push it into the current binding.  */
325
326 tree
327 create_tmp_var_raw (tree type, const char *prefix)
328 {
329   tree tmp_var;
330   tree new_type;
331
332   /* Make the type of the variable writable.  */
333   new_type = build_type_variant (type, 0, 0);
334   TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
335
336   tmp_var = build_decl (VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
337                         type);
338
339   /* The variable was declared by the compiler.  */
340   DECL_ARTIFICIAL (tmp_var) = 1;
341   /* And we don't want debug info for it.  */
342   DECL_IGNORED_P (tmp_var) = 1;
343
344   /* Make the variable writable.  */
345   TREE_READONLY (tmp_var) = 0;
346
347   DECL_EXTERNAL (tmp_var) = 0;
348   TREE_STATIC (tmp_var) = 0;
349   TREE_USED (tmp_var) = 1;
350
351   return tmp_var;
352 }
353
354 /* Create a new temporary variable declaration of type TYPE.  DOES push the
355    variable into the current binding.  Further, assume that this is called
356    only from gimplification or optimization, at which point the creation of
357    certain types are bugs.  */
358
359 tree
360 create_tmp_var (tree type, const char *prefix)
361 {
362   tree tmp_var;
363
364   /* We don't allow types that are addressable (meaning we can't make copies),
365      incomplete, or of variable size.  */
366   gcc_assert (!TREE_ADDRESSABLE (type)
367               && COMPLETE_TYPE_P (type)
368               && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST);
369
370   tmp_var = create_tmp_var_raw (type, prefix);
371   gimple_add_tmp_var (tmp_var);
372   return tmp_var;
373 }
374
375 /*  Given a tree, try to return a useful variable name that we can use
376     to prefix a temporary that is being assigned the value of the tree.
377     I.E. given  <temp> = &A, return A.  */
378
379 const char *
380 get_name (tree t)
381 {
382   tree stripped_decl;
383
384   stripped_decl = t;
385   STRIP_NOPS (stripped_decl);
386   if (DECL_P (stripped_decl) && DECL_NAME (stripped_decl))
387     return IDENTIFIER_POINTER (DECL_NAME (stripped_decl));
388   else
389     {
390       switch (TREE_CODE (stripped_decl))
391         {
392         case ADDR_EXPR:
393           return get_name (TREE_OPERAND (stripped_decl, 0));
394           break;
395         default:
396           return NULL;
397         }
398     }
399 }
400
401 /* Create a temporary with a name derived from VAL.  Subroutine of
402    lookup_tmp_var; nobody else should call this function.  */
403
404 static inline tree
405 create_tmp_from_val (tree val)
406 {
407   return create_tmp_var (TREE_TYPE (val), get_name (val));
408 }
409
410 /* Create a temporary to hold the value of VAL.  If IS_FORMAL, try to reuse
411    an existing expression temporary.  */
412
413 static tree
414 lookup_tmp_var (tree val, bool is_formal)
415 {
416   tree ret;
417
418   /* If not optimizing, never really reuse a temporary.  local-alloc
419      won't allocate any variable that is used in more than one basic
420      block, which means it will go into memory, causing much extra
421      work in reload and final and poorer code generation, outweighing
422      the extra memory allocation here.  */
423   if (!optimize || !is_formal || TREE_SIDE_EFFECTS (val))
424     ret = create_tmp_from_val (val);
425   else
426     {
427       elt_t elt, *elt_p;
428       void **slot;
429
430       elt.val = val;
431       slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
432       if (*slot == NULL)
433         {
434           elt_p = xmalloc (sizeof (*elt_p));
435           elt_p->val = val;
436           elt_p->temp = ret = create_tmp_from_val (val);
437           *slot = (void *) elt_p;
438         }
439       else
440         {
441           elt_p = (elt_t *) *slot;
442           ret = elt_p->temp;
443         }
444     }
445
446   if (is_formal)
447     DECL_GIMPLE_FORMAL_TEMP_P (ret) = 1;
448
449   return ret;
450 }
451
452 /* Returns a formal temporary variable initialized with VAL.  PRE_P is as
453    in gimplify_expr.  Only use this function if:
454
455    1) The value of the unfactored expression represented by VAL will not
456       change between the initialization and use of the temporary, and
457    2) The temporary will not be otherwise modified.
458
459    For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
460    and #2 means it is inappropriate for && temps.
461
462    For other cases, use get_initialized_tmp_var instead.  */
463
464 static tree
465 internal_get_tmp_var (tree val, tree *pre_p, tree *post_p, bool is_formal)
466 {
467   tree t, mod;
468
469   gimplify_expr (&val, pre_p, post_p, is_gimple_formal_tmp_rhs, fb_rvalue);
470
471   t = lookup_tmp_var (val, is_formal);
472
473   mod = build (MODIFY_EXPR, TREE_TYPE (t), t, val);
474
475   if (EXPR_HAS_LOCATION (val))
476     SET_EXPR_LOCUS (mod, EXPR_LOCUS (val));
477   else
478     SET_EXPR_LOCATION (mod, input_location);
479
480   /* gimplify_modify_expr might want to reduce this further.  */
481   gimplify_and_add (mod, pre_p);
482
483   /* If we're gimplifying into ssa, gimplify_modify_expr will have
484      given our temporary an ssa name.  Find and return it.  */
485   if (gimplify_ctxp->into_ssa)
486     t = TREE_OPERAND (mod, 0);
487
488   return t;
489 }
490
491 tree
492 get_formal_tmp_var (tree val, tree *pre_p)
493 {
494   return internal_get_tmp_var (val, pre_p, NULL, true);
495 }
496
497 /* Returns a temporary variable initialized with VAL.  PRE_P and POST_P
498    are as in gimplify_expr.  */
499
500 tree
501 get_initialized_tmp_var (tree val, tree *pre_p, tree *post_p)
502 {
503   return internal_get_tmp_var (val, pre_p, post_p, false);
504 }
505
506 /* Declares all the variables in VARS in SCOPE.  */
507
508 void
509 declare_tmp_vars (tree vars, tree scope)
510 {
511   tree last = vars;
512   if (last)
513     {
514       tree temps;
515
516       /* C99 mode puts the default 'return 0;' for main outside the outer
517          braces.  So drill down until we find an actual scope.  */
518       while (TREE_CODE (scope) == COMPOUND_EXPR)
519         scope = TREE_OPERAND (scope, 0);
520
521       gcc_assert (TREE_CODE (scope) == BIND_EXPR);
522
523       temps = nreverse (last);
524       TREE_CHAIN (last) = BIND_EXPR_VARS (scope);
525       BIND_EXPR_VARS (scope) = temps;
526     }
527 }
528
529 void
530 gimple_add_tmp_var (tree tmp)
531 {
532   gcc_assert (!TREE_CHAIN (tmp) && !DECL_SEEN_IN_BIND_EXPR_P (tmp));
533
534   DECL_CONTEXT (tmp) = current_function_decl;
535   DECL_SEEN_IN_BIND_EXPR_P (tmp) = 1;
536
537   if (gimplify_ctxp)
538     {
539       TREE_CHAIN (tmp) = gimplify_ctxp->temps;
540       gimplify_ctxp->temps = tmp;
541     }
542   else if (cfun)
543     record_vars (tmp);
544   else
545     declare_tmp_vars (tmp, DECL_SAVED_TREE (current_function_decl));
546 }
547
548 /* Determines whether to assign a locus to the statement STMT.  */
549
550 static bool
551 should_carry_locus_p (tree stmt)
552 {
553   /* Don't emit a line note for a label.  We particularly don't want to
554      emit one for the break label, since it doesn't actually correspond
555      to the beginning of the loop/switch.  */
556   if (TREE_CODE (stmt) == LABEL_EXPR)
557     return false;
558
559   /* Do not annotate empty statements, since it confuses gcov.  */
560   if (!TREE_SIDE_EFFECTS (stmt))
561     return false;
562
563   return true;
564 }
565
566 static void
567 annotate_one_with_locus (tree t, location_t locus)
568 {
569   if (EXPR_P (t) && ! EXPR_HAS_LOCATION (t) && should_carry_locus_p (t))
570     SET_EXPR_LOCATION (t, locus);
571 }
572
573 void
574 annotate_all_with_locus (tree *stmt_p, location_t locus)
575 {
576   tree_stmt_iterator i;
577
578   if (!*stmt_p)
579     return;
580
581   for (i = tsi_start (*stmt_p); !tsi_end_p (i); tsi_next (&i))
582     {
583       tree t = tsi_stmt (i);
584
585       /* Assuming we've already been gimplified, we shouldn't
586           see nested chaining constructs anymore.  */
587       gcc_assert (TREE_CODE (t) != STATEMENT_LIST
588                   && TREE_CODE (t) != COMPOUND_EXPR);
589
590       annotate_one_with_locus (t, locus);
591     }
592 }
593
594 /* Similar to copy_tree_r() but do not copy SAVE_EXPR or TARGET_EXPR nodes.
595    These nodes model computations that should only be done once.  If we
596    were to unshare something like SAVE_EXPR(i++), the gimplification
597    process would create wrong code.  */
598
599 static tree
600 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
601 {
602   enum tree_code code = TREE_CODE (*tp);
603   /* Don't unshare types, decls, constants and SAVE_EXPR nodes.  */
604   if (TREE_CODE_CLASS (code) == tcc_type
605       || TREE_CODE_CLASS (code) == tcc_declaration
606       || TREE_CODE_CLASS (code) == tcc_constant
607       || code == SAVE_EXPR || code == TARGET_EXPR
608       /* We can't do anything sensible with a BLOCK used as an expression,
609          but we also can't abort when we see it because of non-expression
610          uses.  So just avert our eyes and cross our fingers.  Silly Java.  */
611       || code == BLOCK)
612     *walk_subtrees = 0;
613   else
614     {
615       gcc_assert (code != BIND_EXPR);
616       copy_tree_r (tp, walk_subtrees, data);
617     }
618
619   return NULL_TREE;
620 }
621
622 /* Callback for walk_tree to unshare most of the shared trees rooted at
623    *TP.  If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
624    then *TP is deep copied by calling copy_tree_r.
625
626    This unshares the same trees as copy_tree_r with the exception of
627    SAVE_EXPR nodes.  These nodes model computations that should only be
628    done once.  If we were to unshare something like SAVE_EXPR(i++), the
629    gimplification process would create wrong code.  */
630
631 static tree
632 copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
633                   void *data ATTRIBUTE_UNUSED)
634 {
635   tree t = *tp;
636   enum tree_code code = TREE_CODE (t);
637
638   /* Skip types, decls, and constants.  But we do want to look at their
639      types and the bounds of types.  Mark them as visited so we properly
640      unmark their subtrees on the unmark pass.  If we've already seen them,
641      don't look down further.  */
642   if (TREE_CODE_CLASS (code) == tcc_type
643       || TREE_CODE_CLASS (code) == tcc_declaration
644       || TREE_CODE_CLASS (code) == tcc_constant)
645     {
646       if (TREE_VISITED (t))
647         *walk_subtrees = 0;
648       else
649         TREE_VISITED (t) = 1;
650     }
651
652   /* If this node has been visited already, unshare it and don't look
653      any deeper.  */
654   else if (TREE_VISITED (t))
655     {
656       walk_tree (tp, mostly_copy_tree_r, NULL, NULL);
657       *walk_subtrees = 0;
658     }
659
660   /* Otherwise, mark the tree as visited and keep looking.  */
661   else
662     TREE_VISITED (t) = 1;
663
664   return NULL_TREE;
665 }
666
667 static tree
668 unmark_visited_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
669                   void *data ATTRIBUTE_UNUSED)
670 {
671   if (TREE_VISITED (*tp))
672     TREE_VISITED (*tp) = 0;
673   else
674     *walk_subtrees = 0;
675
676   return NULL_TREE;
677 }
678
679 /* Unshare all the trees in BODY_P, a pointer into the body of FNDECL, and the
680    bodies of any nested functions if we are unsharing the entire body of
681    FNDECL.  */
682
683 static void
684 unshare_body (tree *body_p, tree fndecl)
685 {
686   struct cgraph_node *cgn = cgraph_node (fndecl);
687
688   walk_tree (body_p, copy_if_shared_r, NULL, NULL);
689   if (body_p == &DECL_SAVED_TREE (fndecl))
690     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
691       unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
692 }
693
694 /* Likewise, but mark all trees as not visited.  */
695
696 static void
697 unvisit_body (tree *body_p, tree fndecl)
698 {
699   struct cgraph_node *cgn = cgraph_node (fndecl);
700
701   walk_tree (body_p, unmark_visited_r, NULL, NULL);
702   if (body_p == &DECL_SAVED_TREE (fndecl))
703     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
704       unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
705 }
706
707 /* Unshare T and all the trees reached from T via TREE_CHAIN.  */
708
709 void
710 unshare_all_trees (tree t)
711 {
712   walk_tree (&t, copy_if_shared_r, NULL, NULL);
713   walk_tree (&t, unmark_visited_r, NULL, NULL);
714 }
715
716 /* Unconditionally make an unshared copy of EXPR.  This is used when using
717    stored expressions which span multiple functions, such as BINFO_VTABLE,
718    as the normal unsharing process can't tell that they're shared.  */
719
720 tree
721 unshare_expr (tree expr)
722 {
723   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
724   return expr;
725 }
726
727 /* A terser interface for building a representation of an exception
728    specification.  */
729
730 tree
731 gimple_build_eh_filter (tree body, tree allowed, tree failure)
732 {
733   tree t;
734
735   /* FIXME should the allowed types go in TREE_TYPE?  */
736   t = build (EH_FILTER_EXPR, void_type_node, allowed, NULL_TREE);
737   append_to_statement_list (failure, &EH_FILTER_FAILURE (t));
738
739   t = build (TRY_CATCH_EXPR, void_type_node, NULL_TREE, t);
740   append_to_statement_list (body, &TREE_OPERAND (t, 0));
741
742   return t;
743 }
744
745 \f
746 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
747    contain statements and have a value.  Assign its value to a temporary
748    and give it void_type_node.  Returns the temporary, or NULL_TREE if
749    WRAPPER was already void.  */
750
751 tree
752 voidify_wrapper_expr (tree wrapper, tree temp)
753 {
754   if (!VOID_TYPE_P (TREE_TYPE (wrapper)))
755     {
756       tree *p, sub = wrapper;
757
758     restart:
759       /* Set p to point to the body of the wrapper.  */
760       switch (TREE_CODE (sub))
761         {
762         case BIND_EXPR:
763           /* For a BIND_EXPR, the body is operand 1.  */
764           p = &BIND_EXPR_BODY (sub);
765           break;
766
767         default:
768           p = &TREE_OPERAND (sub, 0);
769           break;
770         }
771
772       /* Advance to the last statement.  Set all container types to void.  */
773       if (TREE_CODE (*p) == STATEMENT_LIST)
774         {
775           tree_stmt_iterator i = tsi_last (*p);
776           p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
777         }
778       else
779         {
780           for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
781             {
782               TREE_SIDE_EFFECTS (*p) = 1;
783               TREE_TYPE (*p) = void_type_node;
784             }
785         }
786
787       if (p == NULL || IS_EMPTY_STMT (*p))
788         ;
789       /* Look through exception handling.  */
790       else if (TREE_CODE (*p) == TRY_FINALLY_EXPR
791                || TREE_CODE (*p) == TRY_CATCH_EXPR)
792         {
793           sub = *p;
794           goto restart;
795         }
796       /* The C++ frontend already did this for us.  */
797       else if (TREE_CODE (*p) == INIT_EXPR
798                || TREE_CODE (*p) == TARGET_EXPR)
799         temp = TREE_OPERAND (*p, 0);
800       /* If we're returning a dereference, move the dereference
801          outside the wrapper.  */
802       else if (TREE_CODE (*p) == INDIRECT_REF)
803         {
804           tree ptr = TREE_OPERAND (*p, 0);
805           temp = create_tmp_var (TREE_TYPE (ptr), "retval");
806           *p = build (MODIFY_EXPR, TREE_TYPE (ptr), temp, ptr);
807           temp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (temp)), temp);
808           /* If this is a BIND_EXPR for a const inline function, it might not
809              have TREE_SIDE_EFFECTS set.  That is no longer accurate.  */
810           TREE_SIDE_EFFECTS (wrapper) = 1;
811         }
812       else
813         {
814           if (!temp)
815             temp = create_tmp_var (TREE_TYPE (wrapper), "retval");
816           *p = build (MODIFY_EXPR, TREE_TYPE (temp), temp, *p);
817           TREE_SIDE_EFFECTS (wrapper) = 1;
818         }
819
820       TREE_TYPE (wrapper) = void_type_node;
821       return temp;
822     }
823
824   return NULL_TREE;
825 }
826
827 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
828    a temporary through which they communicate.  */
829
830 static void
831 build_stack_save_restore (tree *save, tree *restore)
832 {
833   tree save_call, tmp_var;
834
835   save_call =
836       build_function_call_expr (implicit_built_in_decls[BUILT_IN_STACK_SAVE],
837                                 NULL_TREE);
838   tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
839
840   *save = build (MODIFY_EXPR, ptr_type_node, tmp_var, save_call);
841   *restore =
842     build_function_call_expr (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
843                               tree_cons (NULL_TREE, tmp_var, NULL_TREE));
844 }
845
846 /* Gimplify a BIND_EXPR.  Just voidify and recurse.  */
847
848 static enum gimplify_status
849 gimplify_bind_expr (tree *expr_p, tree temp, tree *pre_p)
850 {
851   tree bind_expr = *expr_p;
852   bool old_save_stack = gimplify_ctxp->save_stack;
853   tree t;
854
855   temp = voidify_wrapper_expr (bind_expr, temp);
856
857   /* Mark variables seen in this bind expr.  */
858   for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
859     DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
860
861   gimple_push_bind_expr (bind_expr);
862   gimplify_ctxp->save_stack = false;
863
864   gimplify_to_stmt_list (&BIND_EXPR_BODY (bind_expr));
865
866   if (gimplify_ctxp->save_stack)
867     {
868       tree stack_save, stack_restore;
869
870       /* Save stack on entry and restore it on exit.  Add a try_finally
871          block to achieve this.  Note that mudflap depends on the
872          format of the emitted code: see mx_register_decls().  */
873       build_stack_save_restore (&stack_save, &stack_restore);
874
875       t = build (TRY_FINALLY_EXPR, void_type_node,
876                  BIND_EXPR_BODY (bind_expr), NULL_TREE);
877       append_to_statement_list (stack_restore, &TREE_OPERAND (t, 1));
878
879       BIND_EXPR_BODY (bind_expr) = NULL_TREE;
880       append_to_statement_list (stack_save, &BIND_EXPR_BODY (bind_expr));
881       append_to_statement_list (t, &BIND_EXPR_BODY (bind_expr));
882     }
883
884   gimplify_ctxp->save_stack = old_save_stack;
885   gimple_pop_bind_expr ();
886
887   if (temp)
888     {
889       *expr_p = temp;
890       append_to_statement_list (bind_expr, pre_p);
891       return GS_OK;
892     }
893   else
894     return GS_ALL_DONE;
895 }
896
897 /* Gimplify a RETURN_EXPR.  If the expression to be returned is not a
898    GIMPLE value, it is assigned to a new temporary and the statement is
899    re-written to return the temporary.
900
901    PRE_P points to the list where side effects that must happen before
902    STMT should be stored.  */
903
904 static enum gimplify_status
905 gimplify_return_expr (tree stmt, tree *pre_p)
906 {
907   tree ret_expr = TREE_OPERAND (stmt, 0);
908   tree result_decl, result;
909
910   if (!ret_expr || TREE_CODE (ret_expr) == RESULT_DECL
911       || ret_expr == error_mark_node)
912     return GS_ALL_DONE;
913
914   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
915     result_decl = NULL_TREE;
916   else
917     {
918       result_decl = TREE_OPERAND (ret_expr, 0);
919       if (TREE_CODE (result_decl) == INDIRECT_REF)
920         /* See through a return by reference.  */
921         result_decl = TREE_OPERAND (result_decl, 0);
922
923       gcc_assert ((TREE_CODE (ret_expr) == MODIFY_EXPR
924                    || TREE_CODE (ret_expr) == INIT_EXPR)
925                   && TREE_CODE (result_decl) == RESULT_DECL);
926     }
927
928   /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
929      Recall that aggregate_value_p is FALSE for any aggregate type that is
930      returned in registers.  If we're returning values in registers, then
931      we don't want to extend the lifetime of the RESULT_DECL, particularly
932      across another call.  In addition, for those aggregates for which
933      hard_function_value generates a PARALLEL, we'll abort during normal
934      expansion of structure assignments; there's special code in expand_return
935      to handle this case that does not exist in expand_expr.  */
936   if (!result_decl
937       || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
938     result = result_decl;
939   else if (gimplify_ctxp->return_temp)
940     result = gimplify_ctxp->return_temp;
941   else
942     {
943       result = create_tmp_var (TREE_TYPE (result_decl), NULL);
944
945       /* ??? With complex control flow (usually involving abnormal edges),
946          we can wind up warning about an uninitialized value for this.  Due
947          to how this variable is constructed and initialized, this is never
948          true.  Give up and never warn.  */
949       TREE_NO_WARNING (result) = 1;
950
951       gimplify_ctxp->return_temp = result;
952     }
953
954   /* Smash the lhs of the MODIFY_EXPR to the temporary we plan to use.
955      Then gimplify the whole thing.  */
956   if (result != result_decl)
957     TREE_OPERAND (ret_expr, 0) = result;
958
959   gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
960
961   /* If we didn't use a temporary, then the result is just the result_decl.
962      Otherwise we need a simple copy.  This should already be gimple.  */
963   if (result == result_decl)
964     ret_expr = result;
965   else
966     ret_expr = build (MODIFY_EXPR, TREE_TYPE (result), result_decl, result);
967   TREE_OPERAND (stmt, 0) = ret_expr;
968
969   return GS_ALL_DONE;
970 }
971
972 /* Gimplifies a DECL_EXPR node *STMT_P by making any necessary allocation
973    and initialization explicit.  */
974
975 static enum gimplify_status
976 gimplify_decl_expr (tree *stmt_p)
977 {
978   tree stmt = *stmt_p;
979   tree decl = DECL_EXPR_DECL (stmt);
980
981   *stmt_p = NULL_TREE;
982
983   if (TREE_TYPE (decl) == error_mark_node)
984     return GS_ERROR;
985
986   else if (TREE_CODE (decl) == TYPE_DECL)
987     gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
988
989   else if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
990     {
991       tree init = DECL_INITIAL (decl);
992
993       if (!TREE_CONSTANT (DECL_SIZE (decl)))
994         {
995           /* This is a variable-sized decl.  Simplify its size and mark it
996              for deferred expansion.  Note that mudflap depends on the format
997              of the emitted code: see mx_register_decls().  */
998           tree t, args, addr, ptr_type;
999
1000           /* ??? We really shouldn't need to gimplify the type of the variable
1001              since it already should have been done.  But leave this here
1002              for now to avoid disrupting too many things at once.  */
1003           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
1004             gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
1005
1006           gimplify_one_sizepos (&DECL_SIZE (decl), stmt_p);
1007           gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), stmt_p);
1008
1009           /* All occurrences of this decl in final gimplified code will be
1010              replaced by indirection.  Setting DECL_VALUE_EXPR does two
1011              things: First, it lets the rest of the gimplifier know what
1012              replacement to use.  Second, it lets the debug info know
1013              where to find the value.  */
1014           ptr_type = build_pointer_type (TREE_TYPE (decl));
1015           addr = create_tmp_var (ptr_type, get_name (decl));
1016           DECL_IGNORED_P (addr) = 0;
1017           t = build_fold_indirect_ref (addr);
1018           DECL_VALUE_EXPR (decl) = t;
1019
1020           args = tree_cons (NULL, DECL_SIZE_UNIT (decl), NULL);
1021           t = built_in_decls[BUILT_IN_ALLOCA];
1022           t = build_function_call_expr (t, args);
1023           t = fold_convert (ptr_type, t);
1024           t = build2 (MODIFY_EXPR, void_type_node, addr, t);
1025
1026           gimplify_and_add (t, stmt_p);
1027
1028           /* Indicate that we need to restore the stack level when the
1029              enclosing BIND_EXPR is exited.  */
1030           gimplify_ctxp->save_stack = true;
1031         }
1032
1033       if (init && init != error_mark_node)
1034         {
1035           if (!TREE_STATIC (decl))
1036             {
1037               DECL_INITIAL (decl) = NULL_TREE;
1038               init = build (MODIFY_EXPR, void_type_node, decl, init);
1039               gimplify_and_add (init, stmt_p);
1040             }
1041           else
1042             /* We must still examine initializers for static variables
1043                as they may contain a label address.  */
1044             walk_tree (&init, force_labels_r, NULL, NULL);
1045         }
1046
1047       /* This decl isn't mentioned in the enclosing block, so add it to the
1048          list of temps.  FIXME it seems a bit of a kludge to say that
1049          anonymous artificial vars aren't pushed, but everything else is.  */
1050       if (DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1051         gimple_add_tmp_var (decl);
1052     }
1053
1054   return GS_ALL_DONE;
1055 }
1056
1057 /* Gimplify a LOOP_EXPR.  Normally this just involves gimplifying the body
1058    and replacing the LOOP_EXPR with goto, but if the loop contains an
1059    EXIT_EXPR, we need to append a label for it to jump to.  */
1060
1061 static enum gimplify_status
1062 gimplify_loop_expr (tree *expr_p, tree *pre_p)
1063 {
1064   tree saved_label = gimplify_ctxp->exit_label;
1065   tree start_label = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
1066   tree jump_stmt = build_and_jump (&LABEL_EXPR_LABEL (start_label));
1067
1068   append_to_statement_list (start_label, pre_p);
1069
1070   gimplify_ctxp->exit_label = NULL_TREE;
1071
1072   gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1073
1074   if (gimplify_ctxp->exit_label)
1075     {
1076       append_to_statement_list (jump_stmt, pre_p);
1077       *expr_p = build1 (LABEL_EXPR, void_type_node, gimplify_ctxp->exit_label);
1078     }
1079   else
1080     *expr_p = jump_stmt;
1081
1082   gimplify_ctxp->exit_label = saved_label;
1083
1084   return GS_ALL_DONE;
1085 }
1086
1087 /* Compare two case labels.  Because the front end should already have
1088    made sure that case ranges do not overlap, it is enough to only compare
1089    the CASE_LOW values of each case label.  */
1090
1091 static int
1092 compare_case_labels (const void *p1, const void *p2)
1093 {
1094   tree case1 = *(tree *)p1;
1095   tree case2 = *(tree *)p2;
1096
1097   return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1098 }
1099
1100 /* Sort the case labels in LABEL_VEC in place in ascending order.  */
1101
1102 void
1103 sort_case_labels (tree label_vec)
1104 {
1105   size_t len = TREE_VEC_LENGTH (label_vec);
1106   tree default_case = TREE_VEC_ELT (label_vec, len - 1);
1107
1108   if (CASE_LOW (default_case))
1109     {
1110       size_t i;
1111
1112       /* The last label in the vector should be the default case
1113          but it is not.  */
1114       for (i = 0; i < len; ++i)
1115         {
1116           tree t = TREE_VEC_ELT (label_vec, i);
1117           if (!CASE_LOW (t))
1118             {
1119               default_case = t;
1120               TREE_VEC_ELT (label_vec, i) = TREE_VEC_ELT (label_vec, len - 1);
1121               TREE_VEC_ELT (label_vec, len - 1) = default_case;
1122               break;
1123             }
1124         }
1125     }
1126
1127   qsort (&TREE_VEC_ELT (label_vec, 0), len - 1, sizeof (tree),
1128          compare_case_labels);
1129 }
1130
1131 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1132    branch to.  */
1133
1134 static enum gimplify_status
1135 gimplify_switch_expr (tree *expr_p, tree *pre_p)
1136 {
1137   tree switch_expr = *expr_p;
1138   enum gimplify_status ret;
1139
1140   ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL,
1141                        is_gimple_val, fb_rvalue);
1142
1143   if (SWITCH_BODY (switch_expr))
1144     {
1145       varray_type labels, saved_labels;
1146       tree label_vec, default_case = NULL_TREE;
1147       size_t i, len;
1148
1149       /* If someone can be bothered to fill in the labels, they can
1150          be bothered to null out the body too.  */
1151       gcc_assert (!SWITCH_LABELS (switch_expr));
1152
1153       saved_labels = gimplify_ctxp->case_labels;
1154       VARRAY_TREE_INIT (gimplify_ctxp->case_labels, 8, "case_labels");
1155
1156       gimplify_to_stmt_list (&SWITCH_BODY (switch_expr));
1157
1158       labels = gimplify_ctxp->case_labels;
1159       gimplify_ctxp->case_labels = saved_labels;
1160
1161       len = VARRAY_ACTIVE_SIZE (labels);
1162
1163       for (i = 0; i < len; ++i)
1164         {
1165           tree t = VARRAY_TREE (labels, i);
1166           if (!CASE_LOW (t))
1167             {
1168               /* The default case must be the last label in the list.  */
1169               default_case = t;
1170               VARRAY_TREE (labels, i) = VARRAY_TREE (labels, len - 1);
1171               len--;
1172               break;
1173             }
1174         }
1175
1176       label_vec = make_tree_vec (len + 1);
1177       SWITCH_LABELS (*expr_p) = label_vec;
1178       append_to_statement_list (switch_expr, pre_p);
1179
1180       if (! default_case)
1181         {
1182           /* If the switch has no default label, add one, so that we jump
1183              around the switch body.  */
1184           default_case = build (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
1185                                 NULL_TREE, create_artificial_label ());
1186           append_to_statement_list (SWITCH_BODY (switch_expr), pre_p);
1187           *expr_p = build (LABEL_EXPR, void_type_node,
1188                            CASE_LABEL (default_case));
1189         }
1190       else
1191         *expr_p = SWITCH_BODY (switch_expr);
1192
1193       for (i = 0; i < len; ++i)
1194         TREE_VEC_ELT (label_vec, i) = VARRAY_TREE (labels, i);
1195       TREE_VEC_ELT (label_vec, len) = default_case;
1196
1197       sort_case_labels (label_vec);
1198
1199       SWITCH_BODY (switch_expr) = NULL;
1200     }
1201   else
1202     gcc_assert (SWITCH_LABELS (switch_expr));
1203
1204   return ret;
1205 }
1206
1207 static enum gimplify_status
1208 gimplify_case_label_expr (tree *expr_p)
1209 {
1210   tree expr = *expr_p;
1211
1212   gcc_assert (gimplify_ctxp->case_labels);
1213   VARRAY_PUSH_TREE (gimplify_ctxp->case_labels, expr);
1214   *expr_p = build (LABEL_EXPR, void_type_node, CASE_LABEL (expr));
1215   return GS_ALL_DONE;
1216 }
1217
1218 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1219    if necessary.  */
1220
1221 tree
1222 build_and_jump (tree *label_p)
1223 {
1224   if (label_p == NULL)
1225     /* If there's nowhere to jump, just fall through.  */
1226     return NULL_TREE;
1227
1228   if (*label_p == NULL_TREE)
1229     {
1230       tree label = create_artificial_label ();
1231       *label_p = label;
1232     }
1233
1234   return build1 (GOTO_EXPR, void_type_node, *label_p);
1235 }
1236
1237 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1238    This also involves building a label to jump to and communicating it to
1239    gimplify_loop_expr through gimplify_ctxp->exit_label.  */
1240
1241 static enum gimplify_status
1242 gimplify_exit_expr (tree *expr_p)
1243 {
1244   tree cond = TREE_OPERAND (*expr_p, 0);
1245   tree expr;
1246
1247   expr = build_and_jump (&gimplify_ctxp->exit_label);
1248   expr = build (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1249   *expr_p = expr;
1250
1251   return GS_OK;
1252 }
1253
1254 /* A helper function to be called via walk_tree.  Mark all labels under *TP
1255    as being forced.  To be called for DECL_INITIAL of static variables.  */
1256
1257 tree
1258 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1259 {
1260   if (TYPE_P (*tp))
1261     *walk_subtrees = 0;
1262   if (TREE_CODE (*tp) == LABEL_DECL)
1263     FORCED_LABEL (*tp) = 1;
1264
1265   return NULL_TREE;
1266 }
1267
1268 /* *EXPR_P is a COMPONENT_REF being used as an rvalue.  If its type is
1269    different from its canonical type, wrap the whole thing inside a
1270    NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1271    type.
1272
1273    The canonical type of a COMPONENT_REF is the type of the field being
1274    referenced--unless the field is a bit-field which can be read directly
1275    in a smaller mode, in which case the canonical type is the
1276    sign-appropriate type corresponding to that mode.  */
1277
1278 static void
1279 canonicalize_component_ref (tree *expr_p)
1280 {
1281   tree expr = *expr_p;
1282   tree type;
1283
1284   gcc_assert (TREE_CODE (expr) == COMPONENT_REF);
1285
1286   if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1287     type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1288   else
1289     type = TREE_TYPE (TREE_OPERAND (expr, 1));
1290
1291   if (TREE_TYPE (expr) != type)
1292     {
1293       tree old_type = TREE_TYPE (expr);
1294
1295       /* Set the type of the COMPONENT_REF to the underlying type.  */
1296       TREE_TYPE (expr) = type;
1297
1298       /* And wrap the whole thing inside a NOP_EXPR.  */
1299       expr = build1 (NOP_EXPR, old_type, expr);
1300
1301       *expr_p = expr;
1302     }
1303 }
1304
1305 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1306    to foo, embed that change in the ADDR_EXPR by converting
1307       T array[U];
1308       (T *)&array
1309    ==>
1310       &array[L]
1311    where L is the lower bound.  For simplicity, only do this for constant
1312    lower bound.  */
1313
1314 static void
1315 canonicalize_addr_expr (tree *expr_p)
1316 {
1317   tree expr = *expr_p;
1318   tree ctype = TREE_TYPE (expr);
1319   tree addr_expr = TREE_OPERAND (expr, 0);
1320   tree atype = TREE_TYPE (addr_expr);
1321   tree dctype, datype, ddatype, otype, obj_expr;
1322
1323   /* Both cast and addr_expr types should be pointers.  */
1324   if (!POINTER_TYPE_P (ctype) || !POINTER_TYPE_P (atype))
1325     return;
1326
1327   /* The addr_expr type should be a pointer to an array.  */
1328   datype = TREE_TYPE (atype);
1329   if (TREE_CODE (datype) != ARRAY_TYPE)
1330     return;
1331
1332   /* Both cast and addr_expr types should address the same object type.  */
1333   dctype = TREE_TYPE (ctype);
1334   ddatype = TREE_TYPE (datype);
1335   if (!lang_hooks.types_compatible_p (ddatype, dctype))
1336     return;
1337
1338   /* The addr_expr and the object type should match.  */
1339   obj_expr = TREE_OPERAND (addr_expr, 0);
1340   otype = TREE_TYPE (obj_expr);
1341   if (!lang_hooks.types_compatible_p (otype, datype))
1342     return;
1343
1344   /* The lower bound and element sizes must be constant.  */
1345   if (!TYPE_SIZE_UNIT (dctype)
1346       || TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
1347       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1348       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1349     return;
1350
1351   /* All checks succeeded.  Build a new node to merge the cast.  */
1352   *expr_p = build4 (ARRAY_REF, dctype, obj_expr,
1353                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1354                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1355                     size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (dctype),
1356                                 size_int (TYPE_ALIGN_UNIT (dctype))));
1357   *expr_p = build1 (ADDR_EXPR, ctype, *expr_p);
1358 }
1359
1360 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR.  Remove it and/or other conversions
1361    underneath as appropriate.  */
1362
1363 static enum gimplify_status
1364 gimplify_conversion (tree *expr_p)
1365 {
1366   gcc_assert (TREE_CODE (*expr_p) == NOP_EXPR
1367               || TREE_CODE (*expr_p) == CONVERT_EXPR);
1368   
1369   /* Then strip away all but the outermost conversion.  */
1370   STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1371
1372   /* And remove the outermost conversion if it's useless.  */
1373   if (tree_ssa_useless_type_conversion (*expr_p))
1374     *expr_p = TREE_OPERAND (*expr_p, 0);
1375
1376   /* If we still have a conversion at the toplevel,
1377      then canonicalize some constructs.  */
1378   if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1379     {
1380       tree sub = TREE_OPERAND (*expr_p, 0);
1381
1382       /* If a NOP conversion is changing the type of a COMPONENT_REF
1383          expression, then canonicalize its type now in order to expose more
1384          redundant conversions.  */
1385       if (TREE_CODE (sub) == COMPONENT_REF)
1386         canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1387
1388       /* If a NOP conversion is changing a pointer to array of foo
1389          to a pointer to foo, embed that change in the ADDR_EXPR.  */
1390       else if (TREE_CODE (sub) == ADDR_EXPR)
1391         canonicalize_addr_expr (expr_p);
1392     }
1393
1394   return GS_OK;
1395 }
1396
1397 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1398    node pointed by EXPR_P.
1399
1400       compound_lval
1401               : min_lval '[' val ']'
1402               | min_lval '.' ID
1403               | compound_lval '[' val ']'
1404               | compound_lval '.' ID
1405
1406    This is not part of the original SIMPLE definition, which separates
1407    array and member references, but it seems reasonable to handle them
1408    together.  Also, this way we don't run into problems with union
1409    aliasing; gcc requires that for accesses through a union to alias, the
1410    union reference must be explicit, which was not always the case when we
1411    were splitting up array and member refs.
1412
1413    PRE_P points to the list where side effects that must happen before
1414      *EXPR_P should be stored.
1415
1416    POST_P points to the list where side effects that must happen after
1417      *EXPR_P should be stored.  */
1418
1419 static enum gimplify_status
1420 gimplify_compound_lval (tree *expr_p, tree *pre_p,
1421                         tree *post_p, fallback_t fallback)
1422 {
1423   tree *p;
1424   varray_type stack;
1425   enum gimplify_status ret = GS_OK, tret;
1426   int i;
1427
1428   /* Create a stack of the subexpressions so later we can walk them in
1429      order from inner to outer.
1430
1431      This array is very memory consuming.  Don't even think of making
1432      it VARRAY_TREE.  */
1433   VARRAY_GENERIC_PTR_NOGC_INIT (stack, 10, "stack");
1434
1435   /* We can handle anything that get_inner_reference can deal with.  */
1436   for (p = expr_p; handled_component_p (*p); p = &TREE_OPERAND (*p, 0))
1437     VARRAY_PUSH_GENERIC_PTR_NOGC (stack, *p);
1438
1439   gcc_assert (VARRAY_ACTIVE_SIZE (stack));
1440
1441   /* Now STACK is a stack of pointers to all the refs we've walked through
1442      and P points to the innermost expression.
1443
1444      Java requires that we elaborated nodes in source order.  That
1445      means we must gimplify the inner expression followed by each of
1446      the indices, in order.  But we can't gimplify the inner
1447      expression until we deal with any variable bounds, sizes, or
1448      positions in order to deal with PLACEHOLDER_EXPRs.
1449
1450      So we do this in three steps.  First we deal with the annotations
1451      for any variables in the components, then we gimplify the base,
1452      then we gimplify any indices, from left to right.  */
1453   for (i = VARRAY_ACTIVE_SIZE (stack) - 1; i >= 0; i--)
1454     {
1455       tree t = VARRAY_GENERIC_PTR_NOGC (stack, i);
1456
1457       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1458         {
1459           /* Gimplify the low bound and element type size and put them into
1460              the ARRAY_REF.  If these values are set, they have already been
1461              gimplified.  */
1462           if (!TREE_OPERAND (t, 2))
1463             {
1464               tree low = unshare_expr (array_ref_low_bound (t));
1465               if (!is_gimple_min_invariant (low))
1466                 {
1467                   TREE_OPERAND (t, 2) = low;
1468                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1469                                         is_gimple_formal_tmp_reg, fb_rvalue);
1470                   ret = MIN (ret, tret);
1471                 }
1472             }
1473
1474           if (!TREE_OPERAND (t, 3))
1475             {
1476               tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
1477               tree elmt_size = unshare_expr (array_ref_element_size (t));
1478               tree factor = size_int (TYPE_ALIGN_UNIT (elmt_type));
1479
1480               /* Divide the element size by the alignment of the element
1481                  type (above).  */
1482               elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
1483
1484               if (!is_gimple_min_invariant (elmt_size))
1485                 {
1486                   TREE_OPERAND (t, 3) = elmt_size;
1487                   tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
1488                                         is_gimple_formal_tmp_reg, fb_rvalue);
1489                   ret = MIN (ret, tret);
1490                 }
1491             }
1492         }
1493       else if (TREE_CODE (t) == COMPONENT_REF)
1494         {
1495           /* Set the field offset into T and gimplify it.  */
1496           if (!TREE_OPERAND (t, 2))
1497             {
1498               tree offset = unshare_expr (component_ref_field_offset (t));
1499               tree field = TREE_OPERAND (t, 1);
1500               tree factor
1501                 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
1502
1503               /* Divide the offset by its alignment.  */
1504               offset = size_binop (EXACT_DIV_EXPR, offset, factor);
1505
1506               if (!is_gimple_min_invariant (offset))
1507                 {
1508                   TREE_OPERAND (t, 2) = offset;
1509                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1510                                         is_gimple_formal_tmp_reg, fb_rvalue);
1511                   ret = MIN (ret, tret);
1512                 }
1513             }
1514         }
1515     }
1516
1517   /* Step 2 is to gimplify the base expression.  */
1518   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1519   ret = MIN (ret, tret);
1520
1521   /* And finally, the indices and operands to BIT_FIELD_REF.  During this
1522      loop we also remove any useless conversions.  */
1523   for (; VARRAY_ACTIVE_SIZE (stack) > 0; )
1524     {
1525       tree t = VARRAY_TOP_TREE (stack);
1526
1527       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1528         {
1529           /* Gimplify the dimension.
1530              Temporary fix for gcc.c-torture/execute/20040313-1.c.
1531              Gimplify non-constant array indices into a temporary
1532              variable.
1533              FIXME - The real fix is to gimplify post-modify
1534              expressions into a minimal gimple lvalue.  However, that
1535              exposes bugs in alias analysis.  The alias analyzer does
1536              not handle &PTR->FIELD very well.  Will fix after the
1537              branch is merged into mainline (dnovillo 2004-05-03).  */
1538           if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1539             {
1540               tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1541                                     is_gimple_formal_tmp_reg, fb_rvalue);
1542               ret = MIN (ret, tret);
1543             }
1544         }
1545       else if (TREE_CODE (t) == BIT_FIELD_REF)
1546         {
1547           tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1548                                 is_gimple_val, fb_rvalue);
1549           ret = MIN (ret, tret);
1550           tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1551                                 is_gimple_val, fb_rvalue);
1552           ret = MIN (ret, tret);
1553         }
1554
1555       STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
1556
1557       /* The innermost expression P may have originally had TREE_SIDE_EFFECTS
1558          set which would have caused all the outer expressions in EXPR_P
1559          leading to P to also have had TREE_SIDE_EFFECTS set.  */
1560       recalculate_side_effects (t);
1561       VARRAY_POP (stack);
1562     }
1563
1564   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1565   ret = MIN (ret, tret);
1566
1567   /* If the outermost expression is a COMPONENT_REF, canonicalize its type.  */
1568   if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
1569     {
1570       canonicalize_component_ref (expr_p);
1571       ret = MIN (ret, GS_OK);
1572     }
1573
1574   VARRAY_FREE (stack);
1575
1576   return ret;
1577 }
1578
1579 /*  Gimplify the self modifying expression pointed by EXPR_P (++, --, +=, -=).
1580
1581     PRE_P points to the list where side effects that must happen before
1582         *EXPR_P should be stored.
1583
1584     POST_P points to the list where side effects that must happen after
1585         *EXPR_P should be stored.
1586
1587     WANT_VALUE is nonzero iff we want to use the value of this expression
1588         in another expression.  */
1589
1590 static enum gimplify_status
1591 gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
1592                         bool want_value)
1593 {
1594   enum tree_code code;
1595   tree lhs, lvalue, rhs, t1;
1596   bool postfix;
1597   enum tree_code arith_code;
1598   enum gimplify_status ret;
1599
1600   code = TREE_CODE (*expr_p);
1601
1602   gcc_assert (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR
1603               || code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR);
1604
1605   /* Prefix or postfix?  */
1606   if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1607     /* Faster to treat as prefix if result is not used.  */
1608     postfix = want_value;
1609   else
1610     postfix = false;
1611
1612   /* Add or subtract?  */
1613   if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
1614     arith_code = PLUS_EXPR;
1615   else
1616     arith_code = MINUS_EXPR;
1617
1618   /* Gimplify the LHS into a GIMPLE lvalue.  */
1619   lvalue = TREE_OPERAND (*expr_p, 0);
1620   ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
1621   if (ret == GS_ERROR)
1622     return ret;
1623
1624   /* Extract the operands to the arithmetic operation.  */
1625   lhs = lvalue;
1626   rhs = TREE_OPERAND (*expr_p, 1);
1627
1628   /* For postfix operator, we evaluate the LHS to an rvalue and then use
1629      that as the result value and in the postqueue operation.  */
1630   if (postfix)
1631     {
1632       ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
1633       if (ret == GS_ERROR)
1634         return ret;
1635     }
1636
1637   t1 = build (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
1638   t1 = build (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
1639
1640   if (postfix)
1641     {
1642       gimplify_and_add (t1, post_p);
1643       *expr_p = lhs;
1644       return GS_ALL_DONE;
1645     }
1646   else
1647     {
1648       *expr_p = t1;
1649       return GS_OK;
1650     }
1651 }
1652
1653 /* If *EXPR_P has a variable sized type, wrap it in a WITH_SIZE_EXPR.  */
1654
1655 static void
1656 maybe_with_size_expr (tree *expr_p)
1657 {
1658   tree expr = *expr_p;
1659   tree type = TREE_TYPE (expr);
1660   tree size;
1661
1662   /* If we've already wrapped this or the type is error_mark_node, we can't do
1663      anything.  */
1664   if (TREE_CODE (expr) == WITH_SIZE_EXPR
1665       || type == error_mark_node)
1666     return;
1667
1668   /* If the size isn't known or is a constant, we have nothing to do.  */
1669   size = TYPE_SIZE_UNIT (type);
1670   if (!size || TREE_CODE (size) == INTEGER_CST)
1671     return;
1672
1673   /* Otherwise, make a WITH_SIZE_EXPR.  */
1674   size = unshare_expr (size);
1675   size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
1676   *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
1677 }
1678
1679 /* Subroutine of gimplify_call_expr:  Gimplify a single argument.  */
1680
1681 static enum gimplify_status
1682 gimplify_arg (tree *expr_p, tree *pre_p)
1683 {
1684   bool (*test) (tree);
1685   fallback_t fb;
1686
1687   /* In general, we allow lvalues for function arguments to avoid
1688      extra overhead of copying large aggregates out of even larger
1689      aggregates into temporaries only to copy the temporaries to
1690      the argument list.  Make optimizers happy by pulling out to
1691      temporaries those types that fit in registers.  */
1692   if (is_gimple_reg_type (TREE_TYPE (*expr_p)))
1693     test = is_gimple_val, fb = fb_rvalue;
1694   else
1695     test = is_gimple_lvalue, fb = fb_either;
1696
1697   /* If this is a variable sized type, we must remember the size.  */
1698   maybe_with_size_expr (expr_p);
1699
1700   /* There is a sequence point before a function call.  Side effects in
1701      the argument list must occur before the actual call. So, when
1702      gimplifying arguments, force gimplify_expr to use an internal
1703      post queue which is then appended to the end of PRE_P.  */
1704   return gimplify_expr (expr_p, pre_p, NULL, test, fb);
1705 }
1706
1707 /* Gimplify the CALL_EXPR node pointed by EXPR_P.  PRE_P points to the
1708    list where side effects that must happen before *EXPR_P should be stored.
1709    WANT_VALUE is true if the result of the call is desired.  */
1710
1711 static enum gimplify_status
1712 gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
1713 {
1714   tree decl;
1715   tree arglist;
1716   enum gimplify_status ret;
1717
1718   gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
1719
1720   /* For reliable diagnostics during inlining, it is necessary that
1721      every call_expr be annotated with file and line.  */
1722   if (! EXPR_HAS_LOCATION (*expr_p))
1723     SET_EXPR_LOCATION (*expr_p, input_location);
1724
1725   /* This may be a call to a builtin function.
1726
1727      Builtin function calls may be transformed into different
1728      (and more efficient) builtin function calls under certain
1729      circumstances.  Unfortunately, gimplification can muck things
1730      up enough that the builtin expanders are not aware that certain
1731      transformations are still valid.
1732
1733      So we attempt transformation/gimplification of the call before
1734      we gimplify the CALL_EXPR.  At this time we do not manage to
1735      transform all calls in the same manner as the expanders do, but
1736      we do transform most of them.  */
1737   decl = get_callee_fndecl (*expr_p);
1738   if (decl && DECL_BUILT_IN (decl))
1739     {
1740       tree new = fold_builtin (*expr_p, !want_value);
1741
1742       if (new && new != *expr_p)
1743         {
1744           /* There was a transformation of this call which computes the
1745              same value, but in a more efficient way.  Return and try
1746              again.  */
1747           *expr_p = new;
1748           return GS_OK;
1749         }
1750
1751       if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
1752           && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
1753         {
1754           tree arglist = TREE_OPERAND (*expr_p, 1);
1755           
1756           if (!arglist || !TREE_CHAIN (arglist))
1757             {
1758               error ("too few arguments to function %<va_start%>");
1759               *expr_p = build_empty_stmt ();
1760               return GS_OK;
1761             }
1762           
1763           if (fold_builtin_next_arg (TREE_CHAIN (arglist)))
1764             {
1765               *expr_p = build_empty_stmt ();
1766               return GS_OK;
1767             }
1768           /* Avoid gimplifying the second argument to va_start, which needs
1769              to be the plain PARM_DECL.  */
1770           return gimplify_arg (&TREE_VALUE (TREE_OPERAND (*expr_p, 1)), pre_p);
1771         }
1772     }
1773
1774   /* There is a sequence point before the call, so any side effects in
1775      the calling expression must occur before the actual call.  Force
1776      gimplify_expr to use an internal post queue.  */
1777   ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, NULL,
1778                        is_gimple_call_addr, fb_rvalue);
1779
1780   if (PUSH_ARGS_REVERSED)
1781     TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
1782   for (arglist = TREE_OPERAND (*expr_p, 1); arglist;
1783        arglist = TREE_CHAIN (arglist))
1784     {
1785       enum gimplify_status t;
1786
1787       t = gimplify_arg (&TREE_VALUE (arglist), pre_p);
1788
1789       if (t == GS_ERROR)
1790         ret = GS_ERROR;
1791     }
1792   if (PUSH_ARGS_REVERSED)
1793     TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
1794
1795   /* Try this again in case gimplification exposed something.  */
1796   if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl))
1797     {
1798       tree new = fold_builtin (*expr_p, !want_value);
1799
1800       if (new && new != *expr_p)
1801         {
1802           /* There was a transformation of this call which computes the
1803              same value, but in a more efficient way.  Return and try
1804              again.  */
1805           *expr_p = new;
1806           return GS_OK;
1807         }
1808     }
1809
1810   /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1811      decl.  This allows us to eliminate redundant or useless
1812      calls to "const" functions.  */
1813   if (TREE_CODE (*expr_p) == CALL_EXPR
1814       && (call_expr_flags (*expr_p) & (ECF_CONST | ECF_PURE)))
1815     TREE_SIDE_EFFECTS (*expr_p) = 0;
1816
1817   return ret;
1818 }
1819
1820 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
1821    rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
1822
1823    TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
1824    condition is true or false, respectively.  If null, we should generate
1825    our own to skip over the evaluation of this specific expression.
1826
1827    This function is the tree equivalent of do_jump.
1828
1829    shortcut_cond_r should only be called by shortcut_cond_expr.  */
1830
1831 static tree
1832 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p)
1833 {
1834   tree local_label = NULL_TREE;
1835   tree t, expr = NULL;
1836
1837   /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
1838      retain the shortcut semantics.  Just insert the gotos here;
1839      shortcut_cond_expr will append the real blocks later.  */
1840   if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
1841     {
1842       /* Turn if (a && b) into
1843
1844          if (a); else goto no;
1845          if (b) goto yes; else goto no;
1846          (no:) */
1847
1848       if (false_label_p == NULL)
1849         false_label_p = &local_label;
1850
1851       t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p);
1852       append_to_statement_list (t, &expr);
1853
1854       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1855                            false_label_p);
1856       append_to_statement_list (t, &expr);
1857     }
1858   else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
1859     {
1860       /* Turn if (a || b) into
1861
1862          if (a) goto yes;
1863          if (b) goto yes; else goto no;
1864          (yes:) */
1865
1866       if (true_label_p == NULL)
1867         true_label_p = &local_label;
1868
1869       t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL);
1870       append_to_statement_list (t, &expr);
1871
1872       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1873                            false_label_p);
1874       append_to_statement_list (t, &expr);
1875     }
1876   else if (TREE_CODE (pred) == COND_EXPR)
1877     {
1878       /* As long as we're messing with gotos, turn if (a ? b : c) into
1879          if (a)
1880            if (b) goto yes; else goto no;
1881          else
1882            if (c) goto yes; else goto no;  */
1883       expr = build (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
1884                     shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1885                                      false_label_p),
1886                     shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
1887                                      false_label_p));
1888     }
1889   else
1890     {
1891       expr = build (COND_EXPR, void_type_node, pred,
1892                     build_and_jump (true_label_p),
1893                     build_and_jump (false_label_p));
1894     }
1895
1896   if (local_label)
1897     {
1898       t = build1 (LABEL_EXPR, void_type_node, local_label);
1899       append_to_statement_list (t, &expr);
1900     }
1901
1902   return expr;
1903 }
1904
1905 static tree
1906 shortcut_cond_expr (tree expr)
1907 {
1908   tree pred = TREE_OPERAND (expr, 0);
1909   tree then_ = TREE_OPERAND (expr, 1);
1910   tree else_ = TREE_OPERAND (expr, 2);
1911   tree true_label, false_label, end_label, t;
1912   tree *true_label_p;
1913   tree *false_label_p;
1914   bool emit_end, emit_false, jump_over_else;
1915   bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
1916   bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
1917
1918   /* First do simple transformations.  */
1919   if (!else_se)
1920     {
1921       /* If there is no 'else', turn (a && b) into if (a) if (b).  */
1922       while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
1923         {
1924           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
1925           then_ = shortcut_cond_expr (expr);
1926           then_se = then_ && TREE_SIDE_EFFECTS (then_);
1927           pred = TREE_OPERAND (pred, 0);
1928           expr = build (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
1929         }
1930     }
1931   if (!then_se)
1932     {
1933       /* If there is no 'then', turn
1934            if (a || b); else d
1935          into
1936            if (a); else if (b); else d.  */
1937       while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
1938         {
1939           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
1940           else_ = shortcut_cond_expr (expr);
1941           else_se = else_ && TREE_SIDE_EFFECTS (else_);
1942           pred = TREE_OPERAND (pred, 0);
1943           expr = build (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
1944         }
1945     }
1946
1947   /* If we're done, great.  */
1948   if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
1949       && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
1950     return expr;
1951
1952   /* Otherwise we need to mess with gotos.  Change
1953        if (a) c; else d;
1954      to
1955        if (a); else goto no;
1956        c; goto end;
1957        no: d; end:
1958      and recursively gimplify the condition.  */
1959
1960   true_label = false_label = end_label = NULL_TREE;
1961
1962   /* If our arms just jump somewhere, hijack those labels so we don't
1963      generate jumps to jumps.  */
1964
1965   if (then_
1966       && TREE_CODE (then_) == GOTO_EXPR
1967       && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
1968     {
1969       true_label = GOTO_DESTINATION (then_);
1970       then_ = NULL;
1971       then_se = false;
1972     }
1973
1974   if (else_
1975       && TREE_CODE (else_) == GOTO_EXPR
1976       && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
1977     {
1978       false_label = GOTO_DESTINATION (else_);
1979       else_ = NULL;
1980       else_se = false;
1981     }
1982
1983   /* If we aren't hijacking a label for the 'then' branch, it falls through.  */
1984   if (true_label)
1985     true_label_p = &true_label;
1986   else
1987     true_label_p = NULL;
1988
1989   /* The 'else' branch also needs a label if it contains interesting code.  */
1990   if (false_label || else_se)
1991     false_label_p = &false_label;
1992   else
1993     false_label_p = NULL;
1994
1995   /* If there was nothing else in our arms, just forward the label(s).  */
1996   if (!then_se && !else_se)
1997     return shortcut_cond_r (pred, true_label_p, false_label_p);
1998
1999   /* If our last subexpression already has a terminal label, reuse it.  */
2000   if (else_se)
2001     expr = expr_last (else_);
2002   else if (then_se)
2003     expr = expr_last (then_);
2004   else
2005     expr = NULL;
2006   if (expr && TREE_CODE (expr) == LABEL_EXPR)
2007     end_label = LABEL_EXPR_LABEL (expr);
2008
2009   /* If we don't care about jumping to the 'else' branch, jump to the end
2010      if the condition is false.  */
2011   if (!false_label_p)
2012     false_label_p = &end_label;
2013
2014   /* We only want to emit these labels if we aren't hijacking them.  */
2015   emit_end = (end_label == NULL_TREE);
2016   emit_false = (false_label == NULL_TREE);
2017
2018   /* We only emit the jump over the else clause if we have to--if the
2019      then clause may fall through.  Otherwise we can wind up with a
2020      useless jump and a useless label at the end of gimplified code,
2021      which will cause us to think that this conditional as a whole
2022      falls through even if it doesn't.  If we then inline a function
2023      which ends with such a condition, that can cause us to issue an
2024      inappropriate warning about control reaching the end of a
2025      non-void function.  */
2026   jump_over_else = block_may_fallthru (then_);
2027
2028   pred = shortcut_cond_r (pred, true_label_p, false_label_p);
2029
2030   expr = NULL;
2031   append_to_statement_list (pred, &expr);
2032
2033   append_to_statement_list (then_, &expr);
2034   if (else_se)
2035     {
2036       if (jump_over_else)
2037         {
2038           t = build_and_jump (&end_label);
2039           append_to_statement_list (t, &expr);
2040         }
2041       if (emit_false)
2042         {
2043           t = build1 (LABEL_EXPR, void_type_node, false_label);
2044           append_to_statement_list (t, &expr);
2045         }
2046       append_to_statement_list (else_, &expr);
2047     }
2048   if (emit_end && end_label)
2049     {
2050       t = build1 (LABEL_EXPR, void_type_node, end_label);
2051       append_to_statement_list (t, &expr);
2052     }
2053
2054   return expr;
2055 }
2056
2057 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE.  */
2058
2059 static tree
2060 gimple_boolify (tree expr)
2061 {
2062   tree type = TREE_TYPE (expr);
2063
2064   if (TREE_CODE (type) == BOOLEAN_TYPE)
2065     return expr;
2066
2067   /* If this is the predicate of a COND_EXPR, it might not even be a
2068      truthvalue yet.  */
2069   expr = lang_hooks.truthvalue_conversion (expr);
2070
2071   switch (TREE_CODE (expr))
2072     {
2073     case TRUTH_AND_EXPR:
2074     case TRUTH_OR_EXPR:
2075     case TRUTH_XOR_EXPR:
2076     case TRUTH_ANDIF_EXPR:
2077     case TRUTH_ORIF_EXPR:
2078       /* Also boolify the arguments of truth exprs.  */
2079       TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2080       /* FALLTHRU */
2081
2082     case TRUTH_NOT_EXPR:
2083       TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2084       /* FALLTHRU */
2085
2086     case EQ_EXPR: case NE_EXPR:
2087     case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2088       /* These expressions always produce boolean results.  */
2089       TREE_TYPE (expr) = boolean_type_node;
2090       return expr;
2091
2092     default:
2093       /* Other expressions that get here must have boolean values, but
2094          might need to be converted to the appropriate mode.  */
2095       return convert (boolean_type_node, expr);
2096     }
2097 }
2098
2099 /*  Convert the conditional expression pointed by EXPR_P '(p) ? a : b;'
2100     into
2101
2102     if (p)                      if (p)
2103       t1 = a;                     a;
2104     else                or      else
2105       t1 = b;                     b;
2106     t1;
2107
2108     The second form is used when *EXPR_P is of type void.
2109
2110     TARGET is the tree for T1 above.
2111
2112     PRE_P points to the list where side effects that must happen before
2113         *EXPR_P should be stored.
2114
2115    POST_P points to the list where side effects that must happen after
2116      *EXPR_P should be stored.  */
2117
2118 static enum gimplify_status
2119 gimplify_cond_expr (tree *expr_p, tree *pre_p, tree *post_p, tree target)
2120 {
2121   tree expr = *expr_p;
2122   tree tmp, tmp2, type;
2123   enum gimplify_status ret;
2124
2125   type = TREE_TYPE (expr);
2126   if (!type)
2127     TREE_TYPE (expr) = void_type_node;
2128
2129   /* If this COND_EXPR has a value, copy the values into a temporary within
2130      the arms.  */
2131   else if (! VOID_TYPE_P (type))
2132     {
2133       if (target)
2134         {
2135           ret = gimplify_expr (&target, pre_p, post_p,
2136                                is_gimple_min_lval, fb_lvalue);
2137           if (ret != GS_ERROR)
2138             ret = GS_OK;
2139           tmp = target;
2140           tmp2 = unshare_expr (target);
2141         }
2142       else
2143         {
2144           tmp2 = tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2145           ret = GS_ALL_DONE;
2146         }
2147
2148       /* Build the then clause, 't1 = a;'.  But don't build an assignment
2149          if this branch is void; in C++ it can be, if it's a throw.  */
2150       if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2151         TREE_OPERAND (expr, 1)
2152           = build (MODIFY_EXPR, void_type_node, tmp, TREE_OPERAND (expr, 1));
2153
2154       /* Build the else clause, 't1 = b;'.  */
2155       if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2156         TREE_OPERAND (expr, 2)
2157           = build (MODIFY_EXPR, void_type_node, tmp2, TREE_OPERAND (expr, 2));
2158
2159       TREE_TYPE (expr) = void_type_node;
2160       recalculate_side_effects (expr);
2161
2162       /* Move the COND_EXPR to the prequeue.  */
2163       gimplify_and_add (expr, pre_p);
2164
2165       *expr_p = tmp;
2166       return ret;
2167     }
2168
2169   /* Make sure the condition has BOOLEAN_TYPE.  */
2170   TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2171
2172   /* Break apart && and || conditions.  */
2173   if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2174       || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2175     {
2176       expr = shortcut_cond_expr (expr);
2177
2178       if (expr != *expr_p)
2179         {
2180           *expr_p = expr;
2181
2182           /* We can't rely on gimplify_expr to re-gimplify the expanded
2183              form properly, as cleanups might cause the target labels to be
2184              wrapped in a TRY_FINALLY_EXPR.  To prevent that, we need to
2185              set up a conditional context.  */
2186           gimple_push_condition ();
2187           gimplify_stmt (expr_p);
2188           gimple_pop_condition (pre_p);
2189
2190           return GS_ALL_DONE;
2191         }
2192     }
2193
2194   /* Now do the normal gimplification.  */
2195   ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2196                        is_gimple_condexpr, fb_rvalue);
2197
2198   gimple_push_condition ();
2199
2200   gimplify_to_stmt_list (&TREE_OPERAND (expr, 1));
2201   gimplify_to_stmt_list (&TREE_OPERAND (expr, 2));
2202   recalculate_side_effects (expr);
2203
2204   gimple_pop_condition (pre_p);
2205
2206   if (ret == GS_ERROR)
2207     ;
2208   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2209     ret = GS_ALL_DONE;
2210   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 2)))
2211     /* Rewrite "if (a); else b" to "if (!a) b"  */
2212     {
2213       TREE_OPERAND (expr, 0) = invert_truthvalue (TREE_OPERAND (expr, 0));
2214       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2215                            is_gimple_condexpr, fb_rvalue);
2216
2217       tmp = TREE_OPERAND (expr, 1);
2218       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 2);
2219       TREE_OPERAND (expr, 2) = tmp;
2220     }
2221   else
2222     /* Both arms are empty; replace the COND_EXPR with its predicate.  */
2223     expr = TREE_OPERAND (expr, 0);
2224
2225   *expr_p = expr;
2226   return ret;
2227 }
2228
2229 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2230    a call to __builtin_memcpy.  */
2231
2232 static enum gimplify_status
2233 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value)
2234 {
2235   tree args, t, to, to_ptr, from;
2236
2237   to = TREE_OPERAND (*expr_p, 0);
2238   from = TREE_OPERAND (*expr_p, 1);
2239
2240   args = tree_cons (NULL, size, NULL);
2241
2242   t = build_fold_addr_expr (from);
2243   args = tree_cons (NULL, t, args);
2244
2245   to_ptr = build_fold_addr_expr (to);
2246   args = tree_cons (NULL, to_ptr, args);
2247   t = implicit_built_in_decls[BUILT_IN_MEMCPY];
2248   t = build_function_call_expr (t, args);
2249
2250   if (want_value)
2251     {
2252       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2253       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2254     }
2255
2256   *expr_p = t;
2257   return GS_OK;
2258 }
2259
2260 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2261    a call to __builtin_memset.  In this case we know that the RHS is
2262    a CONSTRUCTOR with an empty element list.  */
2263
2264 static enum gimplify_status
2265 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value)
2266 {
2267   tree args, t, to, to_ptr;
2268
2269   to = TREE_OPERAND (*expr_p, 0);
2270
2271   args = tree_cons (NULL, size, NULL);
2272
2273   args = tree_cons (NULL, integer_zero_node, args);
2274
2275   to_ptr = build_fold_addr_expr (to);
2276   args = tree_cons (NULL, to_ptr, args);
2277   t = implicit_built_in_decls[BUILT_IN_MEMSET];
2278   t = build_function_call_expr (t, args);
2279
2280   if (want_value)
2281     {
2282       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2283       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2284     }
2285
2286   *expr_p = t;
2287   return GS_OK;
2288 }
2289
2290 /* A subroutine of gimplify_init_ctor_preeval.  Called via walk_tree,
2291    determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
2292    assignment.  Returns non-null if we detect a potential overlap.  */
2293
2294 struct gimplify_init_ctor_preeval_data
2295 {
2296   /* The base decl of the lhs object.  May be NULL, in which case we
2297      have to assume the lhs is indirect.  */
2298   tree lhs_base_decl;
2299
2300   /* The alias set of the lhs object.  */
2301   int lhs_alias_set;
2302 };
2303
2304 static tree
2305 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
2306 {
2307   struct gimplify_init_ctor_preeval_data *data
2308     = (struct gimplify_init_ctor_preeval_data *) xdata;
2309   tree t = *tp;
2310
2311   /* If we find the base object, obviously we have overlap.  */
2312   if (data->lhs_base_decl == t)
2313     return t;
2314
2315   /* If the constructor component is indirect, determine if we have a
2316      potential overlap with the lhs.  The only bits of information we
2317      have to go on at this point are addressability and alias sets.  */
2318   if (TREE_CODE (t) == INDIRECT_REF
2319       && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2320       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
2321     return t;
2322
2323   if (IS_TYPE_OR_DECL_P (t))
2324     *walk_subtrees = 0;
2325   return NULL;
2326 }
2327
2328 /* A subroutine of gimplify_init_constructor.  Pre-evaluate *EXPR_P,
2329    force values that overlap with the lhs (as described by *DATA)
2330    into temporaries.  */
2331
2332 static void
2333 gimplify_init_ctor_preeval (tree *expr_p, tree *pre_p, tree *post_p,
2334                             struct gimplify_init_ctor_preeval_data *data)
2335 {
2336   enum gimplify_status one;
2337
2338   /* If the value is invariant, then there's nothing to pre-evaluate.
2339      But ensure it doesn't have any side-effects since a SAVE_EXPR is
2340      invariant but has side effects and might contain a reference to
2341      the object we're initializing.  */
2342   if (TREE_INVARIANT (*expr_p) && !TREE_SIDE_EFFECTS (*expr_p))
2343     return;
2344
2345   /* If the type has non-trivial constructors, we can't pre-evaluate.  */
2346   if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
2347     return;
2348
2349   /* Recurse for nested constructors.  */
2350   if (TREE_CODE (*expr_p) == CONSTRUCTOR)
2351     {
2352       tree list;
2353       for (list = CONSTRUCTOR_ELTS (*expr_p); list ; list = TREE_CHAIN (list))
2354         gimplify_init_ctor_preeval (&TREE_VALUE (list), pre_p, post_p, data);
2355       return;
2356     }
2357
2358   /* We can't preevaluate if the type contains a placeholder.  */
2359   if (type_contains_placeholder_p (TREE_TYPE (*expr_p)))
2360     return;
2361
2362   /* Gimplify the constructor element to something appropriate for the rhs
2363      of a MODIFY_EXPR.  Given that we know the lhs is an aggregate, we know
2364      the gimplifier will consider this a store to memory.  Doing this
2365      gimplification now means that we won't have to deal with complicated
2366      language-specific trees, nor trees like SAVE_EXPR that can induce
2367      exponential search behavior.  */
2368   one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
2369   if (one == GS_ERROR)
2370     {
2371       *expr_p = NULL;
2372       return;
2373     }
2374
2375   /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
2376      with the lhs, since "a = { .x=a }" doesn't make sense.  This will
2377      always be true for all scalars, since is_gimple_mem_rhs insists on a
2378      temporary variable for them.  */
2379   if (DECL_P (*expr_p))
2380     return;
2381
2382   /* If this is of variable size, we have no choice but to assume it doesn't
2383      overlap since we can't make a temporary for it.  */
2384   if (!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (*expr_p))))
2385     return;
2386
2387   /* Otherwise, we must search for overlap ...  */
2388   if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
2389     return;
2390
2391   /* ... and if found, force the value into a temporary.  */
2392   *expr_p = get_formal_tmp_var (*expr_p, pre_p);
2393 }
2394
2395 /* A subroutine of gimplify_init_ctor_eval.  Create a loop for
2396    a RANGE_EXPR in a CONSTRUCTOR for an array.
2397
2398       var = lower;
2399     loop_entry:
2400       object[var] = value;
2401       if (var == upper)
2402         goto loop_exit;
2403       var = var + 1;
2404       goto loop_entry;
2405     loop_exit:
2406
2407    We increment var _after_ the loop exit check because we might otherwise
2408    fail if upper == TYPE_MAX_VALUE (type for upper).
2409
2410    Note that we never have to deal with SAVE_EXPRs here, because this has
2411    already been taken care of for us, in gimplify_init_ctor_preeval().  */
2412
2413 static void gimplify_init_ctor_eval (tree, tree, tree *, bool);
2414
2415 static void
2416 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
2417                                tree value, tree array_elt_type,
2418                                tree *pre_p, bool cleared)
2419 {
2420   tree loop_entry_label, loop_exit_label;
2421   tree var, var_type, cref;
2422
2423   loop_entry_label = create_artificial_label ();
2424   loop_exit_label = create_artificial_label ();
2425
2426   /* Create and initialize the index variable.  */
2427   var_type = TREE_TYPE (upper);
2428   var = create_tmp_var (var_type, NULL);
2429   append_to_statement_list (build2 (MODIFY_EXPR, var_type, var, lower), pre_p);
2430
2431   /* Add the loop entry label.  */
2432   append_to_statement_list (build1 (LABEL_EXPR,
2433                                     void_type_node,
2434                                     loop_entry_label),
2435                             pre_p);
2436
2437   /* Build the reference.  */
2438   cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
2439                  var, NULL_TREE, NULL_TREE);
2440
2441   /* If we are a constructor, just call gimplify_init_ctor_eval to do
2442      the store.  Otherwise just assign value to the reference.  */
2443
2444   if (TREE_CODE (value) == CONSTRUCTOR)
2445     /* NB we might have to call ourself recursively through
2446        gimplify_init_ctor_eval if the value is a constructor.  */
2447     gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2448                              pre_p, cleared);
2449   else
2450     append_to_statement_list (build2 (MODIFY_EXPR, TREE_TYPE (cref),
2451                                       cref, value),
2452                               pre_p);
2453
2454   /* We exit the loop when the index var is equal to the upper bound.  */
2455   gimplify_and_add (build3 (COND_EXPR, void_type_node,
2456                             build2 (EQ_EXPR, boolean_type_node,
2457                                     var, upper),
2458                             build1 (GOTO_EXPR,
2459                                     void_type_node,
2460                                     loop_exit_label),
2461                             NULL_TREE),
2462                     pre_p);
2463
2464   /* Otherwise, increment the index var...  */
2465   append_to_statement_list (build2 (MODIFY_EXPR, var_type, var,
2466                                     build2 (PLUS_EXPR, var_type, var,
2467                                             fold_convert (var_type,
2468                                                           integer_one_node))),
2469                             pre_p);
2470
2471   /* ...and jump back to the loop entry.  */
2472   append_to_statement_list (build1 (GOTO_EXPR,
2473                                     void_type_node,
2474                                     loop_entry_label),
2475                             pre_p);
2476
2477   /* Add the loop exit label.  */
2478   append_to_statement_list (build1 (LABEL_EXPR,
2479                                     void_type_node,
2480                                     loop_exit_label),
2481                             pre_p);
2482 }
2483
2484 /* A subroutine of gimplify_init_constructor.  Generate individual
2485    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
2486    assignments should happen.  LIST is the CONSTRUCTOR_ELTS of the
2487    CONSTRUCTOR.  CLEARED is true if the entire LHS object has been
2488    zeroed first.  */
2489
2490 static void
2491 gimplify_init_ctor_eval (tree object, tree list, tree *pre_p, bool cleared)
2492 {
2493   tree array_elt_type = NULL;
2494
2495   if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
2496     array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
2497
2498   for (; list; list = TREE_CHAIN (list))
2499     {
2500       tree purpose, value, cref, init;
2501
2502       purpose = TREE_PURPOSE (list);
2503       value = TREE_VALUE (list);
2504
2505       /* NULL values are created above for gimplification errors.  */
2506       if (value == NULL)
2507         continue;
2508
2509       if (cleared && initializer_zerop (value))
2510         continue;
2511
2512       /* ??? Here's to hoping the front end fills in all of the indices,
2513          so we don't have to figure out what's missing ourselves.  */
2514       gcc_assert (purpose);
2515
2516       /* If we have a RANGE_EXPR, we have to build a loop to assign the
2517          whole range.  */
2518       if (TREE_CODE (purpose) == RANGE_EXPR)
2519         {
2520           tree lower = TREE_OPERAND (purpose, 0);
2521           tree upper = TREE_OPERAND (purpose, 1);
2522
2523           /* If the lower bound is equal to upper, just treat it as if
2524              upper was the index.  */
2525           if (simple_cst_equal (lower, upper))
2526             purpose = upper;
2527           else
2528             {
2529               gimplify_init_ctor_eval_range (object, lower, upper, value,
2530                                              array_elt_type, pre_p, cleared);
2531               continue;
2532             }
2533         }
2534
2535       if (array_elt_type)
2536         {
2537           cref = build (ARRAY_REF, array_elt_type, unshare_expr (object),
2538                         purpose, NULL_TREE, NULL_TREE);
2539         }
2540       else
2541         cref = build (COMPONENT_REF, TREE_TYPE (purpose),
2542                       unshare_expr (object), purpose, NULL_TREE);
2543
2544       if (TREE_CODE (value) == CONSTRUCTOR)
2545         gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2546                                  pre_p, cleared);
2547       else
2548         {
2549           init = build (MODIFY_EXPR, TREE_TYPE (cref), cref, value);
2550           gimplify_and_add (init, pre_p);
2551         }
2552     }
2553 }
2554
2555 /* A subroutine of gimplify_modify_expr.  Break out elements of a
2556    CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
2557
2558    Note that we still need to clear any elements that don't have explicit
2559    initializers, so if not all elements are initialized we keep the
2560    original MODIFY_EXPR, we just remove all of the constructor elements.  */
2561
2562 static enum gimplify_status
2563 gimplify_init_constructor (tree *expr_p, tree *pre_p,
2564                            tree *post_p, bool want_value)
2565 {
2566   tree object;
2567   tree ctor = TREE_OPERAND (*expr_p, 1);
2568   tree type = TREE_TYPE (ctor);
2569   enum gimplify_status ret;
2570   tree elt_list;
2571
2572   if (TREE_CODE (ctor) != CONSTRUCTOR)
2573     return GS_UNHANDLED;
2574
2575   ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
2576                        is_gimple_lvalue, fb_lvalue);
2577   if (ret == GS_ERROR)
2578     return ret;
2579   object = TREE_OPERAND (*expr_p, 0);
2580
2581   elt_list = CONSTRUCTOR_ELTS (ctor);
2582
2583   ret = GS_ALL_DONE;
2584   switch (TREE_CODE (type))
2585     {
2586     case RECORD_TYPE:
2587     case UNION_TYPE:
2588     case QUAL_UNION_TYPE:
2589     case ARRAY_TYPE:
2590       {
2591         struct gimplify_init_ctor_preeval_data preeval_data;
2592         HOST_WIDE_INT num_type_elements, num_ctor_elements;
2593         HOST_WIDE_INT num_nonzero_elements, num_nonconstant_elements;
2594         bool cleared;
2595
2596         /* Aggregate types must lower constructors to initialization of
2597            individual elements.  The exception is that a CONSTRUCTOR node
2598            with no elements indicates zero-initialization of the whole.  */
2599         if (elt_list == NULL)
2600           break;
2601
2602         categorize_ctor_elements (ctor, &num_nonzero_elements,
2603                                   &num_nonconstant_elements,
2604                                   &num_ctor_elements, &cleared);
2605
2606         /* If a const aggregate variable is being initialized, then it
2607            should never be a lose to promote the variable to be static.  */
2608         if (num_nonconstant_elements == 0
2609             && num_nonzero_elements > 1
2610             && TREE_READONLY (object)
2611             && TREE_CODE (object) == VAR_DECL)
2612           {
2613             DECL_INITIAL (object) = ctor;
2614             TREE_STATIC (object) = 1;
2615             if (!DECL_NAME (object))
2616               DECL_NAME (object) = create_tmp_var_name ("C");
2617             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
2618
2619             /* ??? C++ doesn't automatically append a .<number> to the
2620                assembler name, and even when it does, it looks a FE private
2621                data structures to figure out what that number should be,
2622                which are not set for this variable.  I suppose this is
2623                important for local statics for inline functions, which aren't
2624                "local" in the object file sense.  So in order to get a unique
2625                TU-local symbol, we must invoke the lhd version now.  */
2626             lhd_set_decl_assembler_name (object);
2627
2628             *expr_p = NULL_TREE;
2629             break;
2630           }
2631
2632         /* If there are "lots" of initialized elements, and all of them
2633            are valid address constants, then the entire initializer can
2634            be dropped to memory, and then memcpy'd out.  */
2635         if (num_nonconstant_elements == 0)
2636           {
2637             HOST_WIDE_INT size = int_size_in_bytes (type);
2638             unsigned int align;
2639
2640             /* ??? We can still get unbounded array types, at least
2641                from the C++ front end.  This seems wrong, but attempt
2642                to work around it for now.  */
2643             if (size < 0)
2644               {
2645                 size = int_size_in_bytes (TREE_TYPE (object));
2646                 if (size >= 0)
2647                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
2648               }
2649
2650             /* Find the maximum alignment we can assume for the object.  */
2651             /* ??? Make use of DECL_OFFSET_ALIGN.  */
2652             if (DECL_P (object))
2653               align = DECL_ALIGN (object);
2654             else
2655               align = TYPE_ALIGN (type);
2656
2657             if (size > 0 && !can_move_by_pieces (size, align))
2658               {
2659                 tree new = create_tmp_var_raw (type, "C");
2660
2661                 gimple_add_tmp_var (new);
2662                 TREE_STATIC (new) = 1;
2663                 TREE_READONLY (new) = 1;
2664                 DECL_INITIAL (new) = ctor;
2665                 if (align > DECL_ALIGN (new))
2666                   {
2667                     DECL_ALIGN (new) = align;
2668                     DECL_USER_ALIGN (new) = 1;
2669                   }
2670                 walk_tree (&DECL_INITIAL (new), force_labels_r, NULL, NULL);
2671
2672                 TREE_OPERAND (*expr_p, 1) = new;
2673
2674                 /* This is no longer an assignment of a CONSTRUCTOR, but
2675                    we still may have processing to do on the LHS.  So
2676                    pretend we didn't do anything here to let that happen.  */
2677                 return GS_UNHANDLED;
2678               }
2679           }
2680
2681         /* If there are "lots" of initialized elements, even discounting
2682            those that are not address constants (and thus *must* be
2683            computed at runtime), then partition the constructor into
2684            constant and non-constant parts.  Block copy the constant
2685            parts in, then generate code for the non-constant parts.  */
2686         /* TODO.  There's code in cp/typeck.c to do this.  */
2687
2688         num_type_elements = count_type_elements (TREE_TYPE (ctor));
2689
2690         /* If there are "lots" of zeros, then block clear the object first.  */
2691         if (num_type_elements - num_nonzero_elements > CLEAR_RATIO
2692             && num_nonzero_elements < num_type_elements/4)
2693           cleared = true;
2694
2695         /* ??? This bit ought not be needed.  For any element not present
2696            in the initializer, we should simply set them to zero.  Except
2697            we'd need to *find* the elements that are not present, and that
2698            requires trickery to avoid quadratic compile-time behavior in
2699            large cases or excessive memory use in small cases.  */
2700         else if (num_ctor_elements < num_type_elements)
2701           cleared = true;
2702
2703         if (cleared)
2704           {
2705             /* Zap the CONSTRUCTOR element list, which simplifies this case.
2706                Note that we still have to gimplify, in order to handle the
2707                case of variable sized types.  Avoid shared tree structures.  */
2708             CONSTRUCTOR_ELTS (ctor) = NULL_TREE;
2709             object = unshare_expr (object);
2710             gimplify_stmt (expr_p);
2711             append_to_statement_list (*expr_p, pre_p);
2712           }
2713
2714         /* If we have not block cleared the object, or if there are nonzero
2715            elements in the constructor, add assignments to the individual
2716            scalar fields of the object.  */
2717         if (!cleared || num_nonzero_elements > 0)
2718           {
2719             preeval_data.lhs_base_decl = get_base_address (object);
2720             if (!DECL_P (preeval_data.lhs_base_decl))
2721               preeval_data.lhs_base_decl = NULL;
2722             preeval_data.lhs_alias_set = get_alias_set (object);
2723
2724             gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
2725                                         pre_p, post_p, &preeval_data);
2726             gimplify_init_ctor_eval (object, elt_list, pre_p, cleared);
2727           }
2728
2729         *expr_p = NULL_TREE;
2730       }
2731       break;
2732
2733     case COMPLEX_TYPE:
2734       {
2735         tree r, i;
2736
2737         /* Extract the real and imaginary parts out of the ctor.  */
2738         r = i = NULL_TREE;
2739         if (elt_list)
2740           {
2741             r = TREE_VALUE (elt_list);
2742             elt_list = TREE_CHAIN (elt_list);
2743             if (elt_list)
2744               {
2745                 i = TREE_VALUE (elt_list);
2746                 gcc_assert (!TREE_CHAIN (elt_list));
2747               }
2748           }
2749         if (r == NULL || i == NULL)
2750           {
2751             tree zero = convert (TREE_TYPE (type), integer_zero_node);
2752             if (r == NULL)
2753               r = zero;
2754             if (i == NULL)
2755               i = zero;
2756           }
2757
2758         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
2759            represent creation of a complex value.  */
2760         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
2761           {
2762             ctor = build_complex (type, r, i);
2763             TREE_OPERAND (*expr_p, 1) = ctor;
2764           }
2765         else
2766           {
2767             ctor = build (COMPLEX_EXPR, type, r, i);
2768             TREE_OPERAND (*expr_p, 1) = ctor;
2769             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
2770                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
2771                                  fb_rvalue);
2772           }
2773       }
2774       break;
2775
2776     case VECTOR_TYPE:
2777       /* Go ahead and simplify constant constructors to VECTOR_CST.  */
2778       if (TREE_CONSTANT (ctor))
2779         {
2780           tree tem;
2781
2782           /* Even when ctor is constant, it might contain non-*_CST
2783              elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
2784              belong into VECTOR_CST nodes.  */
2785           for (tem = elt_list; tem; tem = TREE_CHAIN (tem))
2786             if (! CONSTANT_CLASS_P (TREE_VALUE (tem)))
2787               break;
2788
2789           if (! tem)
2790             {
2791               TREE_OPERAND (*expr_p, 1) = build_vector (type, elt_list);
2792               break;
2793             }
2794         }
2795
2796       /* Vector types use CONSTRUCTOR all the way through gimple
2797          compilation as a general initializer.  */
2798       for (; elt_list; elt_list = TREE_CHAIN (elt_list))
2799         {
2800           enum gimplify_status tret;
2801           tret = gimplify_expr (&TREE_VALUE (elt_list), pre_p, post_p,
2802                                 is_gimple_val, fb_rvalue);
2803           if (tret == GS_ERROR)
2804             ret = GS_ERROR;
2805         }
2806       break;
2807
2808     default:
2809       /* So how did we get a CONSTRUCTOR for a scalar type?  */
2810       gcc_unreachable ();
2811     }
2812
2813   if (ret == GS_ERROR)
2814     return GS_ERROR;
2815   else if (want_value)
2816     {
2817       append_to_statement_list (*expr_p, pre_p);
2818       *expr_p = object;
2819       return GS_OK;
2820     }
2821   else
2822     return GS_ALL_DONE;
2823 }
2824
2825 /* Subroutine of gimplify_modify_expr to do simplifications of MODIFY_EXPRs
2826    based on the code of the RHS.  We loop for as long as something changes.  */
2827
2828 static enum gimplify_status
2829 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
2830                           tree *post_p, bool want_value)
2831 {
2832   enum gimplify_status ret = GS_OK;
2833
2834   while (ret != GS_UNHANDLED)
2835     switch (TREE_CODE (*from_p))
2836       {
2837       case INDIRECT_REF:
2838         {
2839           /* If we have code like 
2840
2841                 *(const A*)(A*)&x
2842
2843              where the type of "x" is a (possibly cv-qualified variant
2844              of "A"), treat the entire expression as identical to "x".
2845              This kind of code arises in C++ when an object is bound
2846              to a const reference, and if "x" is a TARGET_EXPR we want
2847              to take advantage of the optimization below.  */
2848           tree pointer;
2849
2850           pointer = TREE_OPERAND (*from_p, 0);
2851           STRIP_NOPS (pointer);
2852           if (TREE_CODE (pointer) == ADDR_EXPR
2853               && (lang_hooks.types_compatible_p 
2854                   (TREE_TYPE (TREE_OPERAND (pointer, 0)),
2855                    TREE_TYPE (*from_p))))
2856             {
2857               *from_p = TREE_OPERAND (pointer, 0); 
2858               ret = GS_OK;
2859             }
2860           else
2861             ret = GS_UNHANDLED;
2862           break;
2863         }
2864
2865       case TARGET_EXPR:
2866         {
2867           /* If we are initializing something from a TARGET_EXPR, strip the
2868              TARGET_EXPR and initialize it directly, if possible.  This can't
2869              be done if the initializer is void, since that implies that the
2870              temporary is set in some non-trivial way.
2871
2872              ??? What about code that pulls out the temp and uses it
2873              elsewhere? I think that such code never uses the TARGET_EXPR as
2874              an initializer.  If I'm wrong, we'll abort because the temp won't
2875              have any RTL.  In that case, I guess we'll need to replace
2876              references somehow.  */
2877           tree init = TARGET_EXPR_INITIAL (*from_p);
2878
2879           if (!VOID_TYPE_P (TREE_TYPE (init)))
2880             {
2881               *from_p = init;
2882               ret = GS_OK;
2883             }
2884           else
2885             ret = GS_UNHANDLED;
2886         }
2887         break;
2888
2889       case COMPOUND_EXPR:
2890         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
2891            caught.  */
2892         gimplify_compound_expr (from_p, pre_p, true);
2893         ret = GS_OK;
2894         break;
2895
2896       case CONSTRUCTOR:
2897         /* If we're initializing from a CONSTRUCTOR, break this into
2898            individual MODIFY_EXPRs.  */
2899         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value);
2900
2901       case COND_EXPR:
2902         /* If we're assigning to a non-register type, push the assignment
2903            down into the branches.  This is mandatory for ADDRESSABLE types,
2904            since we cannot generate temporaries for such, but it saves a
2905            copy in other cases as well.  */
2906         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
2907           {
2908             *expr_p = *from_p;
2909             return gimplify_cond_expr (expr_p, pre_p, post_p, *to_p);
2910           }
2911         else
2912           ret = GS_UNHANDLED;
2913         break;
2914
2915       default:
2916         ret = GS_UNHANDLED;
2917         break;
2918       }
2919
2920   return ret;
2921 }
2922
2923 /* Gimplify the MODIFY_EXPR node pointed by EXPR_P.
2924
2925       modify_expr
2926               : varname '=' rhs
2927               | '*' ID '=' rhs
2928
2929     PRE_P points to the list where side effects that must happen before
2930         *EXPR_P should be stored.
2931
2932     POST_P points to the list where side effects that must happen after
2933         *EXPR_P should be stored.
2934
2935     WANT_VALUE is nonzero iff we want to use the value of this expression
2936         in another expression.  */
2937
2938 static enum gimplify_status
2939 gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
2940 {
2941   tree *from_p = &TREE_OPERAND (*expr_p, 1);
2942   tree *to_p = &TREE_OPERAND (*expr_p, 0);
2943   enum gimplify_status ret = GS_UNHANDLED;
2944
2945   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
2946               || TREE_CODE (*expr_p) == INIT_EXPR);
2947
2948   /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer useful.  */
2949   if (TREE_CODE (*expr_p) == INIT_EXPR)
2950     TREE_SET_CODE (*expr_p, MODIFY_EXPR);
2951
2952   /* See if any simplifications can be done based on what the RHS is.  */
2953   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
2954                                   want_value);
2955   if (ret != GS_UNHANDLED)
2956     return ret;
2957
2958   /* If the value being copied is of variable width, compute the length
2959      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
2960      before gimplifying any of the operands so that we can resolve any
2961      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
2962      the size of the expression to be copied, not of the destination, so
2963      that is what we must here.  */
2964   maybe_with_size_expr (from_p);
2965
2966   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
2967   if (ret == GS_ERROR)
2968     return ret;
2969
2970   ret = gimplify_expr (from_p, pre_p, post_p,
2971                        rhs_predicate_for (*to_p), fb_rvalue);
2972   if (ret == GS_ERROR)
2973     return ret;
2974
2975   /* Now see if the above changed *from_p to something we handle specially.  */
2976   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
2977                                   want_value);
2978   if (ret != GS_UNHANDLED)
2979     return ret;
2980
2981   /* If we've got a variable sized assignment between two lvalues (i.e. does
2982      not involve a call), then we can make things a bit more straightforward
2983      by converting the assignment to memcpy or memset.  */
2984   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
2985     {
2986       tree from = TREE_OPERAND (*from_p, 0);
2987       tree size = TREE_OPERAND (*from_p, 1);
2988
2989       if (TREE_CODE (from) == CONSTRUCTOR)
2990         return gimplify_modify_expr_to_memset (expr_p, size, want_value);
2991       if (is_gimple_addressable (from))
2992         {
2993           *from_p = from;
2994           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value);
2995         }
2996     }
2997
2998   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
2999     {
3000       /* If we've somehow already got an SSA_NAME on the LHS, then
3001          we're probably modifying it twice.  Not good.  */
3002       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
3003       *to_p = make_ssa_name (*to_p, *expr_p);
3004     }
3005
3006   if (want_value)
3007     {
3008       append_to_statement_list (*expr_p, pre_p);
3009       *expr_p = *to_p;
3010       return GS_OK;
3011     }
3012
3013   return GS_ALL_DONE;
3014 }
3015
3016 /*  Gimplify a comparison between two variable-sized objects.  Do this
3017     with a call to BUILT_IN_MEMCMP.  */
3018
3019 static enum gimplify_status
3020 gimplify_variable_sized_compare (tree *expr_p)
3021 {
3022   tree op0 = TREE_OPERAND (*expr_p, 0);
3023   tree op1 = TREE_OPERAND (*expr_p, 1);
3024   tree args, t, dest;
3025
3026   t = TYPE_SIZE_UNIT (TREE_TYPE (op0));
3027   t = unshare_expr (t);
3028   t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, op0);
3029   args = tree_cons (NULL, t, NULL);
3030   t = build_fold_addr_expr (op1);
3031   args = tree_cons (NULL, t, args);
3032   dest = build_fold_addr_expr (op0);
3033   args = tree_cons (NULL, dest, args);
3034   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
3035   t = build_function_call_expr (t, args);
3036   *expr_p
3037     = build (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
3038
3039   return GS_OK;
3040 }
3041
3042 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
3043     points to the expression to gimplify.
3044
3045     Expressions of the form 'a && b' are gimplified to:
3046
3047         a && b ? true : false
3048
3049     gimplify_cond_expr will do the rest.
3050
3051     PRE_P points to the list where side effects that must happen before
3052         *EXPR_P should be stored.  */
3053
3054 static enum gimplify_status
3055 gimplify_boolean_expr (tree *expr_p)
3056 {
3057   /* Preserve the original type of the expression.  */
3058   tree type = TREE_TYPE (*expr_p);
3059
3060   *expr_p = build (COND_EXPR, type, *expr_p,
3061                    convert (type, boolean_true_node),
3062                    convert (type, boolean_false_node));
3063
3064   return GS_OK;
3065 }
3066
3067 /* Gimplifies an expression sequence.  This function gimplifies each
3068    expression and re-writes the original expression with the last
3069    expression of the sequence in GIMPLE form.
3070
3071    PRE_P points to the list where the side effects for all the
3072        expressions in the sequence will be emitted.
3073
3074    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
3075 /* ??? Should rearrange to share the pre-queue with all the indirect
3076    invocations of gimplify_expr.  Would probably save on creations
3077    of statement_list nodes.  */
3078
3079 static enum gimplify_status
3080 gimplify_compound_expr (tree *expr_p, tree *pre_p, bool want_value)
3081 {
3082   tree t = *expr_p;
3083
3084   do
3085     {
3086       tree *sub_p = &TREE_OPERAND (t, 0);
3087
3088       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
3089         gimplify_compound_expr (sub_p, pre_p, false);
3090       else
3091         gimplify_stmt (sub_p);
3092       append_to_statement_list (*sub_p, pre_p);
3093
3094       t = TREE_OPERAND (t, 1);
3095     }
3096   while (TREE_CODE (t) == COMPOUND_EXPR);
3097
3098   *expr_p = t;
3099   if (want_value)
3100     return GS_OK;
3101   else
3102     {
3103       gimplify_stmt (expr_p);
3104       return GS_ALL_DONE;
3105     }
3106 }
3107
3108 /* Gimplifies a statement list.  These may be created either by an
3109    enlightened front-end, or by shortcut_cond_expr.  */
3110
3111 static enum gimplify_status
3112 gimplify_statement_list (tree *expr_p)
3113 {
3114   tree_stmt_iterator i = tsi_start (*expr_p);
3115
3116   while (!tsi_end_p (i))
3117     {
3118       tree t;
3119
3120       gimplify_stmt (tsi_stmt_ptr (i));
3121
3122       t = tsi_stmt (i);
3123       if (t == NULL)
3124         tsi_delink (&i);
3125       else if (TREE_CODE (t) == STATEMENT_LIST)
3126         {
3127           tsi_link_before (&i, t, TSI_SAME_STMT);
3128           tsi_delink (&i);
3129         }
3130       else
3131         tsi_next (&i);
3132     }
3133
3134   return GS_ALL_DONE;
3135 }
3136
3137 /*  Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
3138     gimplify.  After gimplification, EXPR_P will point to a new temporary
3139     that holds the original value of the SAVE_EXPR node.
3140
3141     PRE_P points to the list where side effects that must happen before
3142         *EXPR_P should be stored.  */
3143
3144 static enum gimplify_status
3145 gimplify_save_expr (tree *expr_p, tree *pre_p, tree *post_p)
3146 {
3147   enum gimplify_status ret = GS_ALL_DONE;
3148   tree val;
3149
3150   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
3151   val = TREE_OPERAND (*expr_p, 0);
3152
3153   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
3154   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
3155     {
3156       /* The operand may be a void-valued expression such as SAVE_EXPRs
3157          generated by the Java frontend for class initialization.  It is
3158          being executed only for its side-effects.  */
3159       if (TREE_TYPE (val) == void_type_node)
3160         {
3161           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3162                                is_gimple_stmt, fb_none);
3163           append_to_statement_list (TREE_OPERAND (*expr_p, 0), pre_p);
3164           val = NULL;
3165         }
3166       else
3167         val = get_initialized_tmp_var (val, pre_p, post_p);
3168
3169       TREE_OPERAND (*expr_p, 0) = val;
3170       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
3171     }
3172
3173   *expr_p = val;
3174
3175   return ret;
3176 }
3177
3178 /*  Re-write the ADDR_EXPR node pointed by EXPR_P
3179
3180       unary_expr
3181               : ...
3182               | '&' varname
3183               ...
3184
3185     PRE_P points to the list where side effects that must happen before
3186         *EXPR_P should be stored.
3187
3188     POST_P points to the list where side effects that must happen after
3189         *EXPR_P should be stored.  */
3190
3191 static enum gimplify_status
3192 gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
3193 {
3194   tree expr = *expr_p;
3195   tree op0 = TREE_OPERAND (expr, 0);
3196   enum gimplify_status ret;
3197
3198   switch (TREE_CODE (op0))
3199     {
3200     case INDIRECT_REF:
3201     case MISALIGNED_INDIRECT_REF:
3202     do_indirect_ref:
3203       /* Check if we are dealing with an expression of the form '&*ptr'.
3204          While the front end folds away '&*ptr' into 'ptr', these
3205          expressions may be generated internally by the compiler (e.g.,
3206          builtins like __builtin_va_end).  */
3207       /* Caution: the silent array decomposition semantics we allow for
3208          ADDR_EXPR means we can't always discard the pair.  */
3209       {
3210         tree op00 = TREE_OPERAND (op0, 0);
3211         tree t_expr = TREE_TYPE (expr);
3212         tree t_op00 = TREE_TYPE (op00);
3213
3214         if (!lang_hooks.types_compatible_p (t_expr, t_op00))
3215           {
3216 #ifdef ENABLE_CHECKING
3217             tree t_op0 = TREE_TYPE (op0);
3218             gcc_assert (TREE_CODE (t_op0) == ARRAY_TYPE
3219                         && POINTER_TYPE_P (t_expr)
3220                         && cpt_same_type (TREE_TYPE (t_op0),
3221                                           TREE_TYPE (t_expr))
3222                         && POINTER_TYPE_P (t_op00)
3223                         && cpt_same_type (t_op0, TREE_TYPE (t_op00)));
3224 #endif
3225             op00 = fold_convert (TREE_TYPE (expr), op00);
3226           }
3227         *expr_p = op00;
3228         ret = GS_OK;
3229       }
3230       break;
3231
3232     case VIEW_CONVERT_EXPR:
3233       /* Take the address of our operand and then convert it to the type of
3234          this ADDR_EXPR.
3235
3236          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
3237          all clear.  The impact of this transformation is even less clear.  */
3238
3239       /* If the operand is a useless conversion, look through it.  Doing so
3240          guarantees that the ADDR_EXPR and its operand will remain of the
3241          same type.  */
3242       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
3243         op0 = TREE_OPERAND (op0, 0);
3244
3245       *expr_p = fold_convert (TREE_TYPE (expr),
3246                               build_fold_addr_expr (TREE_OPERAND (op0, 0)));
3247       ret = GS_OK;
3248       break;
3249
3250     default:
3251       /* We use fb_either here because the C frontend sometimes takes
3252          the address of a call that returns a struct; see
3253          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
3254          the implied temporary explicit.  */
3255       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
3256                            is_gimple_addressable, fb_either);
3257       if (ret != GS_ERROR)
3258         {
3259           op0 = TREE_OPERAND (expr, 0);
3260
3261           /* For various reasons, the gimplification of the expression
3262              may have made a new INDIRECT_REF.  */
3263           if (TREE_CODE (op0) == INDIRECT_REF)
3264             goto do_indirect_ref;
3265
3266           /* Make sure TREE_INVARIANT, TREE_CONSTANT, and TREE_SIDE_EFFECTS
3267              is set properly.  */
3268           recompute_tree_invarant_for_addr_expr (expr);
3269
3270           /* Mark the RHS addressable.  */
3271           lang_hooks.mark_addressable (TREE_OPERAND (expr, 0));
3272         }
3273       break;
3274     }
3275
3276   return ret;
3277 }
3278
3279 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
3280    value; output operands should be a gimple lvalue.  */
3281
3282 static enum gimplify_status
3283 gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
3284 {
3285   tree expr = *expr_p;
3286   int noutputs = list_length (ASM_OUTPUTS (expr));
3287   const char **oconstraints
3288     = (const char **) alloca ((noutputs) * sizeof (const char *));
3289   int i;
3290   tree link;
3291   const char *constraint;
3292   bool allows_mem, allows_reg, is_inout;
3293   enum gimplify_status ret, tret;
3294
3295   ret = GS_ALL_DONE;
3296   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = TREE_CHAIN (link))
3297     {
3298       size_t constraint_len;
3299       oconstraints[i] = constraint
3300         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3301       constraint_len = strlen (constraint);
3302       if (constraint_len == 0)
3303         continue;
3304
3305       parse_output_constraint (&constraint, i, 0, 0,
3306                                &allows_mem, &allows_reg, &is_inout);
3307
3308       if (!allows_reg && allows_mem)
3309         lang_hooks.mark_addressable (TREE_VALUE (link));
3310
3311       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3312                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
3313                             fb_lvalue | fb_mayfail);
3314       if (tret == GS_ERROR)
3315         {
3316           error ("invalid lvalue in asm output %d", i);
3317           ret = tret;
3318         }
3319
3320       if (is_inout)
3321         {
3322           /* An input/output operand.  To give the optimizers more
3323              flexibility, split it into separate input and output
3324              operands.  */
3325           tree input;
3326           char buf[10];
3327
3328           /* Turn the in/out constraint into an output constraint.  */
3329           char *p = xstrdup (constraint);
3330           p[0] = '=';
3331           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
3332           free (p);
3333
3334           /* And add a matching input constraint.  */
3335           if (allows_reg)
3336             {
3337               sprintf (buf, "%d", i);
3338               input = build_string (strlen (buf), buf);
3339             }
3340           else
3341             input = build_string (constraint_len - 1, constraint + 1);
3342           input = build_tree_list (build_tree_list (NULL_TREE, input),
3343                                    unshare_expr (TREE_VALUE (link)));
3344           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
3345         }
3346     }
3347
3348   for (link = ASM_INPUTS (expr); link; ++i, link = TREE_CHAIN (link))
3349     {
3350       constraint
3351         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3352       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
3353                               oconstraints, &allows_mem, &allows_reg);
3354
3355       /* If the operand is a memory input, it should be an lvalue.  */
3356       if (!allows_reg && allows_mem)
3357         {
3358           lang_hooks.mark_addressable (TREE_VALUE (link));
3359           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3360                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
3361           if (tret == GS_ERROR)
3362             {
3363               error ("memory input %d is not directly addressable", i);
3364               ret = tret;
3365             }
3366         }
3367       else
3368         {
3369           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3370                                 is_gimple_asm_val, fb_rvalue);
3371           if (tret == GS_ERROR)
3372             ret = tret;
3373         }
3374     }
3375
3376   return ret;
3377 }
3378
3379 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
3380    WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
3381    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
3382    return to this function.
3383
3384    FIXME should we complexify the prequeue handling instead?  Or use flags
3385    for all the cleanups and let the optimizer tighten them up?  The current
3386    code seems pretty fragile; it will break on a cleanup within any
3387    non-conditional nesting.  But any such nesting would be broken, anyway;
3388    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
3389    and continues out of it.  We can do that at the RTL level, though, so
3390    having an optimizer to tighten up try/finally regions would be a Good
3391    Thing.  */
3392
3393 static enum gimplify_status
3394 gimplify_cleanup_point_expr (tree *expr_p, tree *pre_p)
3395 {
3396   tree_stmt_iterator iter;
3397   tree body;
3398
3399   tree temp = voidify_wrapper_expr (*expr_p, NULL);
3400
3401   /* We only care about the number of conditions between the innermost
3402      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count.  */
3403   int old_conds = gimplify_ctxp->conditions;
3404   gimplify_ctxp->conditions = 0;
3405
3406   body = TREE_OPERAND (*expr_p, 0);
3407   gimplify_to_stmt_list (&body);
3408
3409   gimplify_ctxp->conditions = old_conds;
3410
3411   for (iter = tsi_start (body); !tsi_end_p (iter); )
3412     {
3413       tree *wce_p = tsi_stmt_ptr (iter);
3414       tree wce = *wce_p;
3415
3416       if (TREE_CODE (wce) == WITH_CLEANUP_EXPR)
3417         {
3418           if (tsi_one_before_end_p (iter))
3419             {
3420               tsi_link_before (&iter, TREE_OPERAND (wce, 0), TSI_SAME_STMT);
3421               tsi_delink (&iter);
3422               break;
3423             }
3424           else
3425             {
3426               tree sl, tfe;
3427               enum tree_code code;
3428
3429               if (CLEANUP_EH_ONLY (wce))
3430                 code = TRY_CATCH_EXPR;
3431               else
3432                 code = TRY_FINALLY_EXPR;
3433
3434               sl = tsi_split_statement_list_after (&iter);
3435               tfe = build (code, void_type_node, sl, NULL_TREE);
3436               append_to_statement_list (TREE_OPERAND (wce, 0),
3437                                         &TREE_OPERAND (tfe, 1));
3438               *wce_p = tfe;
3439               iter = tsi_start (sl);
3440             }
3441         }
3442       else
3443         tsi_next (&iter);
3444     }
3445
3446   if (temp)
3447     {
3448       *expr_p = temp;
3449       append_to_statement_list (body, pre_p);
3450       return GS_OK;
3451     }
3452   else
3453     {
3454       *expr_p = body;
3455       return GS_ALL_DONE;
3456     }
3457 }
3458
3459 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
3460    is the cleanup action required.  */
3461
3462 static void
3463 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, tree *pre_p)
3464 {
3465   tree wce;
3466
3467   /* Errors can result in improperly nested cleanups.  Which results in
3468      confusion when trying to resolve the WITH_CLEANUP_EXPR.  */
3469   if (errorcount || sorrycount)
3470     return;
3471
3472   if (gimple_conditional_context ())
3473     {
3474       /* If we're in a conditional context, this is more complex.  We only
3475          want to run the cleanup if we actually ran the initialization that
3476          necessitates it, but we want to run it after the end of the
3477          conditional context.  So we wrap the try/finally around the
3478          condition and use a flag to determine whether or not to actually
3479          run the destructor.  Thus
3480
3481            test ? f(A()) : 0
3482
3483          becomes (approximately)
3484
3485            flag = 0;
3486            try {
3487              if (test) { A::A(temp); flag = 1; val = f(temp); }
3488              else { val = 0; }
3489            } finally {
3490              if (flag) A::~A(temp);
3491            }
3492            val
3493       */
3494
3495       tree flag = create_tmp_var (boolean_type_node, "cleanup");
3496       tree ffalse = build (MODIFY_EXPR, void_type_node, flag,
3497                            boolean_false_node);
3498       tree ftrue = build (MODIFY_EXPR, void_type_node, flag,
3499                           boolean_true_node);
3500       cleanup = build (COND_EXPR, void_type_node, flag, cleanup, NULL);
3501       wce = build (WITH_CLEANUP_EXPR, void_type_node, cleanup);
3502       append_to_statement_list (ffalse, &gimplify_ctxp->conditional_cleanups);
3503       append_to_statement_list (wce, &gimplify_ctxp->conditional_cleanups);
3504       append_to_statement_list (ftrue, pre_p);
3505
3506       /* Because of this manipulation, and the EH edges that jump
3507          threading cannot redirect, the temporary (VAR) will appear
3508          to be used uninitialized.  Don't warn.  */
3509       TREE_NO_WARNING (var) = 1;
3510     }
3511   else
3512     {
3513       wce = build (WITH_CLEANUP_EXPR, void_type_node, cleanup);
3514       CLEANUP_EH_ONLY (wce) = eh_only;
3515       append_to_statement_list (wce, pre_p);
3516     }
3517
3518   gimplify_stmt (&TREE_OPERAND (wce, 0));
3519 }
3520
3521 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
3522
3523 static enum gimplify_status
3524 gimplify_target_expr (tree *expr_p, tree *pre_p, tree *post_p)
3525 {
3526   tree targ = *expr_p;
3527   tree temp = TARGET_EXPR_SLOT (targ);
3528   tree init = TARGET_EXPR_INITIAL (targ);
3529   enum gimplify_status ret;
3530
3531   if (init)
3532     {
3533       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
3534          to the temps list.  */
3535       gimple_add_tmp_var (temp);
3536
3537       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
3538          expression is supposed to initialize the slot.  */
3539       if (VOID_TYPE_P (TREE_TYPE (init)))
3540         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
3541       else
3542         {
3543           /* Special handling for BIND_EXPR can result in fewer temps.  */
3544           ret = GS_OK;
3545           if (TREE_CODE (init) == BIND_EXPR)
3546             gimplify_bind_expr (&init, temp, pre_p);
3547           if (init != temp)
3548             {
3549               init = build (MODIFY_EXPR, void_type_node, temp, init);
3550               ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt,
3551                                    fb_none);
3552             }
3553         }
3554       if (ret == GS_ERROR)
3555         return GS_ERROR;
3556       append_to_statement_list (init, pre_p);
3557
3558       /* If needed, push the cleanup for the temp.  */
3559       if (TARGET_EXPR_CLEANUP (targ))
3560         {
3561           gimplify_stmt (&TARGET_EXPR_CLEANUP (targ));
3562           gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
3563                                CLEANUP_EH_ONLY (targ), pre_p);
3564         }
3565
3566       /* Only expand this once.  */
3567       TREE_OPERAND (targ, 3) = init;
3568       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
3569     }
3570   else
3571     /* We should have expanded this before.  */
3572     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
3573
3574   *expr_p = temp;
3575   return GS_OK;
3576 }
3577
3578 /* Gimplification of expression trees.  */
3579
3580 /* Gimplify an expression which appears at statement context; usually, this
3581    means replacing it with a suitably gimple STATEMENT_LIST.  */
3582
3583 void
3584 gimplify_stmt (tree *stmt_p)
3585 {
3586   gimplify_expr (stmt_p, NULL, NULL, is_gimple_stmt, fb_none);
3587 }
3588
3589 /* Similarly, but force the result to be a STATEMENT_LIST.  */
3590
3591 void
3592 gimplify_to_stmt_list (tree *stmt_p)
3593 {
3594   gimplify_stmt (stmt_p);
3595   if (!*stmt_p)
3596     *stmt_p = alloc_stmt_list ();
3597   else if (TREE_CODE (*stmt_p) != STATEMENT_LIST)
3598     {
3599       tree t = *stmt_p;
3600       *stmt_p = alloc_stmt_list ();
3601       append_to_statement_list (t, stmt_p);
3602     }
3603 }
3604
3605
3606 /*  Gimplifies the expression tree pointed by EXPR_P.  Return 0 if
3607     gimplification failed.
3608
3609     PRE_P points to the list where side effects that must happen before
3610         EXPR should be stored.
3611
3612     POST_P points to the list where side effects that must happen after
3613         EXPR should be stored, or NULL if there is no suitable list.  In
3614         that case, we copy the result to a temporary, emit the
3615         post-effects, and then return the temporary.
3616
3617     GIMPLE_TEST_F points to a function that takes a tree T and
3618         returns nonzero if T is in the GIMPLE form requested by the
3619         caller.  The GIMPLE predicates are in tree-gimple.c.
3620
3621         This test is used twice.  Before gimplification, the test is
3622         invoked to determine whether *EXPR_P is already gimple enough.  If
3623         that fails, *EXPR_P is gimplified according to its code and
3624         GIMPLE_TEST_F is called again.  If the test still fails, then a new
3625         temporary variable is created and assigned the value of the
3626         gimplified expression.
3627
3628     FALLBACK tells the function what sort of a temporary we want.  If the 1
3629         bit is set, an rvalue is OK.  If the 2 bit is set, an lvalue is OK.
3630         If both are set, either is OK, but an lvalue is preferable.
3631
3632     The return value is either GS_ERROR or GS_ALL_DONE, since this function
3633     iterates until solution.  */
3634
3635 enum gimplify_status
3636 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
3637                bool (* gimple_test_f) (tree), fallback_t fallback)
3638 {
3639   tree tmp;
3640   tree internal_pre = NULL_TREE;
3641   tree internal_post = NULL_TREE;
3642   tree save_expr;
3643   int is_statement = (pre_p == NULL);
3644   location_t saved_location;
3645   enum gimplify_status ret;
3646
3647   save_expr = *expr_p;
3648   if (save_expr == NULL_TREE)
3649     return GS_ALL_DONE;
3650
3651   /* We used to check the predicate here and return immediately if it
3652      succeeds.  This is wrong; the design is for gimplification to be
3653      idempotent, and for the predicates to only test for valid forms, not
3654      whether they are fully simplified.  */
3655
3656   /* Set up our internal queues if needed.  */
3657   if (pre_p == NULL)
3658     pre_p = &internal_pre;
3659   if (post_p == NULL)
3660     post_p = &internal_post;
3661
3662   saved_location = input_location;
3663   if (save_expr != error_mark_node
3664       && EXPR_HAS_LOCATION (*expr_p))
3665     input_location = EXPR_LOCATION (*expr_p);
3666
3667   /* Loop over the specific gimplifiers until the toplevel node
3668      remains the same.  */
3669   do
3670     {
3671       /* Strip away as many useless type conversions as possible
3672          at the toplevel.  */
3673       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
3674
3675       /* Remember the expr.  */
3676       save_expr = *expr_p;
3677
3678       /* Die, die, die, my darling.  */
3679       if (save_expr == error_mark_node
3680           || (TREE_TYPE (save_expr)
3681               && TREE_TYPE (save_expr) == error_mark_node))
3682         {
3683           ret = GS_ERROR;
3684           break;
3685         }
3686
3687       /* Do any language-specific gimplification.  */
3688       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
3689       if (ret == GS_OK)
3690         {
3691           if (*expr_p == NULL_TREE)
3692             break;
3693           if (*expr_p != save_expr)
3694             continue;
3695         }
3696       else if (ret != GS_UNHANDLED)
3697         break;
3698
3699       ret = GS_OK;
3700       switch (TREE_CODE (*expr_p))
3701         {
3702           /* First deal with the special cases.  */
3703
3704         case POSTINCREMENT_EXPR:
3705         case POSTDECREMENT_EXPR:
3706         case PREINCREMENT_EXPR:
3707         case PREDECREMENT_EXPR:
3708           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
3709                                         fallback != fb_none);
3710           break;
3711
3712         case ARRAY_REF:
3713         case ARRAY_RANGE_REF:
3714         case REALPART_EXPR:
3715         case IMAGPART_EXPR:
3716         case COMPONENT_REF:
3717         case VIEW_CONVERT_EXPR:
3718           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
3719                                         fallback ? fallback : fb_rvalue);
3720           break;
3721
3722         case COND_EXPR:
3723           ret = gimplify_cond_expr (expr_p, pre_p, post_p, NULL_TREE);
3724           break;
3725
3726         case CALL_EXPR:
3727           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
3728           break;
3729
3730         case TREE_LIST:
3731           gcc_unreachable ();
3732
3733         case COMPOUND_EXPR:
3734           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
3735           break;
3736
3737         case MODIFY_EXPR:
3738         case INIT_EXPR:
3739           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
3740                                       fallback != fb_none);
3741           break;
3742
3743         case TRUTH_ANDIF_EXPR:
3744         case TRUTH_ORIF_EXPR:
3745           ret = gimplify_boolean_expr (expr_p);
3746           break;
3747
3748         case TRUTH_NOT_EXPR:
3749           TREE_OPERAND (*expr_p, 0)
3750             = gimple_boolify (TREE_OPERAND (*expr_p, 0));
3751           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3752                                is_gimple_val, fb_rvalue);
3753           recalculate_side_effects (*expr_p);
3754           break;
3755
3756         case ADDR_EXPR:
3757           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
3758           break;
3759
3760         case VA_ARG_EXPR:
3761           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
3762           break;
3763
3764         case CONVERT_EXPR:
3765         case NOP_EXPR:
3766           if (IS_EMPTY_STMT (*expr_p))
3767             {
3768               ret = GS_ALL_DONE;
3769               break;
3770             }
3771
3772           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
3773               || fallback == fb_none)
3774             {
3775               /* Just strip a conversion to void (or in void context) and
3776                  try again.  */
3777               *expr_p = TREE_OPERAND (*expr_p, 0);
3778               break;
3779             }
3780
3781           ret = gimplify_conversion (expr_p);
3782           if (ret == GS_ERROR)
3783             break;
3784           if (*expr_p != save_expr)
3785             break;
3786           /* FALLTHRU */
3787
3788         case FIX_TRUNC_EXPR:
3789         case FIX_CEIL_EXPR:
3790         case FIX_FLOOR_EXPR:
3791         case FIX_ROUND_EXPR:
3792           /* unary_expr: ... | '(' cast ')' val | ...  */
3793           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3794                                is_gimple_val, fb_rvalue);
3795           recalculate_side_effects (*expr_p);
3796           break;
3797
3798         case ALIGN_INDIRECT_REF:
3799         case MISALIGNED_INDIRECT_REF:
3800         case INDIRECT_REF:
3801           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3802                                is_gimple_reg, fb_rvalue);
3803           recalculate_side_effects (*expr_p);
3804           break;
3805
3806           /* Constants need not be gimplified.  */
3807         case INTEGER_CST:
3808         case REAL_CST:
3809         case STRING_CST:
3810         case COMPLEX_CST:
3811         case VECTOR_CST:
3812           ret = GS_ALL_DONE;
3813           break;
3814
3815         case CONST_DECL:
3816           /* If we require an lvalue, such as for ADDR_EXPR, retain the
3817              CONST_DECL node.  Otherwise the decl is replaceable by its
3818              value.  */
3819           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
3820           if (fallback & fb_lvalue)
3821             ret = GS_ALL_DONE;
3822           else
3823             *expr_p = DECL_INITIAL (*expr_p);
3824           break;
3825
3826         case DECL_EXPR:
3827           ret = gimplify_decl_expr (expr_p);
3828           break;
3829
3830         case EXC_PTR_EXPR:
3831           /* FIXME make this a decl.  */
3832           ret = GS_ALL_DONE;
3833           break;
3834
3835         case BIND_EXPR:
3836           ret = gimplify_bind_expr (expr_p, NULL, pre_p);
3837           break;
3838
3839         case LOOP_EXPR:
3840           ret = gimplify_loop_expr (expr_p, pre_p);
3841           break;
3842
3843         case SWITCH_EXPR:
3844           ret = gimplify_switch_expr (expr_p, pre_p);
3845           break;
3846
3847         case EXIT_EXPR:
3848           ret = gimplify_exit_expr (expr_p);
3849           break;
3850
3851         case GOTO_EXPR:
3852           /* If the target is not LABEL, then it is a computed jump
3853              and the target needs to be gimplified.  */
3854           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
3855             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
3856                                  NULL, is_gimple_val, fb_rvalue);
3857           break;
3858
3859         case LABEL_EXPR:
3860           ret = GS_ALL_DONE;
3861           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
3862                       == current_function_decl);
3863           break;
3864
3865         case CASE_LABEL_EXPR:
3866           ret = gimplify_case_label_expr (expr_p);
3867           break;
3868
3869         case RETURN_EXPR:
3870           ret = gimplify_return_expr (*expr_p, pre_p);
3871           break;
3872
3873         case CONSTRUCTOR:
3874           /* Don't reduce this in place; let gimplify_init_constructor work its
3875              magic.  Buf if we're just elaborating this for side effects, just
3876              gimplify any element that has side-effects.  */
3877           if (fallback == fb_none)
3878             {
3879               for (tmp = CONSTRUCTOR_ELTS (*expr_p); tmp;
3880                    tmp = TREE_CHAIN (tmp))
3881                 if (TREE_SIDE_EFFECTS (TREE_VALUE (tmp)))
3882                   gimplify_expr (&TREE_VALUE (tmp), pre_p, post_p,
3883                                  gimple_test_f, fallback);
3884
3885               *expr_p = NULL_TREE;
3886             }
3887
3888           ret = GS_ALL_DONE;
3889           break;
3890
3891           /* The following are special cases that are not handled by the
3892              original GIMPLE grammar.  */
3893
3894           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
3895              eliminated.  */
3896         case SAVE_EXPR:
3897           ret = gimplify_save_expr (expr_p, pre_p, post_p);
3898           break;
3899
3900         case BIT_FIELD_REF:
3901           {
3902             enum gimplify_status r0, r1, r2;
3903
3904             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3905                                 is_gimple_lvalue, fb_either);
3906             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3907                                 is_gimple_val, fb_rvalue);
3908             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
3909                                 is_gimple_val, fb_rvalue);
3910             recalculate_side_effects (*expr_p);
3911
3912             ret = MIN (r0, MIN (r1, r2));
3913           }
3914           break;
3915
3916         case NON_LVALUE_EXPR:
3917           /* This should have been stripped above.  */
3918           gcc_unreachable ();
3919
3920         case ASM_EXPR:
3921           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
3922           break;
3923
3924         case TRY_FINALLY_EXPR:
3925         case TRY_CATCH_EXPR:
3926           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
3927           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
3928           ret = GS_ALL_DONE;
3929           break;
3930
3931         case CLEANUP_POINT_EXPR:
3932           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
3933           break;
3934
3935         case TARGET_EXPR:
3936           ret = gimplify_target_expr (expr_p, pre_p, post_p);
3937           break;
3938
3939         case CATCH_EXPR:
3940           gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
3941           ret = GS_ALL_DONE;
3942           break;
3943
3944         case EH_FILTER_EXPR:
3945           gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
3946           ret = GS_ALL_DONE;
3947           break;
3948
3949         case OBJ_TYPE_REF:
3950           {
3951             enum gimplify_status r0, r1;
3952             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
3953                                 is_gimple_val, fb_rvalue);
3954             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
3955                                 is_gimple_val, fb_rvalue);
3956             ret = MIN (r0, r1);
3957           }
3958           break;
3959
3960         case LABEL_DECL:
3961           /* We get here when taking the address of a label.  We mark
3962              the label as "forced"; meaning it can never be removed and
3963              it is a potential target for any computed goto.  */
3964           FORCED_LABEL (*expr_p) = 1;
3965           ret = GS_ALL_DONE;
3966           break;
3967
3968         case STATEMENT_LIST:
3969           ret = gimplify_statement_list (expr_p);
3970           break;
3971
3972         case WITH_SIZE_EXPR:
3973           {
3974             enum gimplify_status r0, r1;
3975             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
3976                                 post_p == &internal_post ? NULL : post_p,
3977                                 gimple_test_f, fallback);
3978             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3979                                 is_gimple_val, fb_rvalue);
3980           }
3981           break;
3982
3983         case VAR_DECL:
3984           /* ??? If this is a local variable, and it has not been seen in any
3985              outer BIND_EXPR, then it's probably the result of a duplicate
3986              declaration, for which we've already issued an error.  It would
3987              be really nice if the front end wouldn't leak these at all.
3988              Currently the only known culprit is C++ destructors, as seen
3989              in g++.old-deja/g++.jason/binding.C.  */
3990           tmp = *expr_p;
3991           if (!TREE_STATIC (tmp) && !DECL_EXTERNAL (tmp)
3992               && decl_function_context (tmp) == current_function_decl
3993               && !DECL_SEEN_IN_BIND_EXPR_P (tmp))
3994             {
3995               gcc_assert (errorcount || sorrycount);
3996               ret = GS_ERROR;
3997               break;
3998             }
3999           /* FALLTHRU */
4000
4001         case PARM_DECL:
4002           tmp = *expr_p;
4003
4004           /* If this is a local variable sized decl, it must be accessed
4005              indirectly.  Perform that substitution.  */
4006           if (DECL_VALUE_EXPR (tmp))
4007             {
4008               *expr_p = unshare_expr (DECL_VALUE_EXPR (tmp));
4009               ret = GS_OK;
4010               break;
4011             }
4012
4013           ret = GS_ALL_DONE;
4014           break;
4015
4016         case SSA_NAME:
4017           /* Allow callbacks into the gimplifier during optimization.  */
4018           ret = GS_ALL_DONE;
4019           break;
4020
4021         default:
4022           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
4023             {
4024             case tcc_comparison:
4025               /* If this is a comparison of objects of aggregate type,
4026                  handle it specially (by converting to a call to
4027                  memcmp).  It would be nice to only have to do this
4028                  for variable-sized objects, but then we'd have to
4029                  allow the same nest of reference nodes we allow for
4030                  MODIFY_EXPR and that's too complex.  */
4031               if (!AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 1))))
4032                 goto expr_2;
4033               ret = gimplify_variable_sized_compare (expr_p);
4034               break;
4035
4036             /* If *EXPR_P does not need to be special-cased, handle it
4037                according to its class.  */
4038             case tcc_unary:
4039               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
4040                                    post_p, is_gimple_val, fb_rvalue);
4041               break;
4042
4043             case tcc_binary:
4044             expr_2:
4045               {
4046                 enum gimplify_status r0, r1;
4047
4048                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
4049                                     post_p, is_gimple_val, fb_rvalue);
4050                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
4051                                     post_p, is_gimple_val, fb_rvalue);
4052
4053                 ret = MIN (r0, r1);
4054                 break;
4055               }
4056
4057             case tcc_declaration:
4058             case tcc_constant:
4059               ret = GS_ALL_DONE;
4060               goto dont_recalculate;
4061
4062             default:
4063               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
4064                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
4065                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
4066               goto expr_2;
4067             }
4068
4069           recalculate_side_effects (*expr_p);
4070         dont_recalculate:
4071           break;
4072         }
4073
4074       /* If we replaced *expr_p, gimplify again.  */
4075       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
4076         ret = GS_ALL_DONE;
4077     }
4078   while (ret == GS_OK);
4079
4080   /* If we encountered an error_mark somewhere nested inside, either
4081      stub out the statement or propagate the error back out.  */
4082   if (ret == GS_ERROR)
4083     {
4084       if (is_statement)
4085         *expr_p = NULL;
4086       goto out;
4087     }
4088
4089   /* This was only valid as a return value from the langhook, which
4090      we handled.  Make sure it doesn't escape from any other context.  */
4091   gcc_assert (ret != GS_UNHANDLED);
4092
4093   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
4094     {
4095       /* We aren't looking for a value, and we don't have a valid
4096          statement.  If it doesn't have side-effects, throw it away.  */
4097       if (!TREE_SIDE_EFFECTS (*expr_p))
4098         *expr_p = NULL;
4099       else if (!TREE_THIS_VOLATILE (*expr_p))
4100         {
4101           /* This is probably a _REF that contains something nested that
4102              has side effects.  Recurse through the operands to find it.  */
4103           enum tree_code code = TREE_CODE (*expr_p);
4104
4105           switch (code)
4106             {
4107             case COMPONENT_REF:
4108             case REALPART_EXPR: case IMAGPART_EXPR:
4109               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4110                              gimple_test_f, fallback);
4111               break;
4112
4113             case ARRAY_REF: case ARRAY_RANGE_REF:
4114               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4115                              gimple_test_f, fallback);
4116               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
4117                              gimple_test_f, fallback);
4118               break;
4119
4120             default:
4121                /* Anything else with side-effects must be converted to
4122                   a valid statement before we get here.  */
4123               gcc_unreachable ();
4124             }
4125
4126           *expr_p = NULL;
4127         }
4128       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p)))
4129         {
4130           /* Historically, the compiler has treated a bare
4131              reference to a volatile lvalue as forcing a load.  */
4132           tree tmp = create_tmp_var (TREE_TYPE (*expr_p), "vol");
4133           *expr_p = build (MODIFY_EXPR, TREE_TYPE (tmp), tmp, *expr_p);
4134         }
4135       else
4136         /* We can't do anything useful with a volatile reference to
4137            incomplete type, so just throw it away.  */
4138         *expr_p = NULL;
4139     }
4140
4141   /* If we are gimplifying at the statement level, we're done.  Tack
4142      everything together and replace the original statement with the
4143      gimplified form.  */
4144   if (fallback == fb_none || is_statement)
4145     {
4146       if (internal_pre || internal_post)
4147         {
4148           append_to_statement_list (*expr_p, &internal_pre);
4149           append_to_statement_list (internal_post, &internal_pre);
4150           annotate_all_with_locus (&internal_pre, input_location);
4151           *expr_p = internal_pre;
4152         }
4153       else if (!*expr_p)
4154         ;
4155       else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
4156         annotate_all_with_locus (expr_p, input_location);
4157       else
4158         annotate_one_with_locus (*expr_p, input_location);
4159       goto out;
4160     }
4161
4162   /* Otherwise we're gimplifying a subexpression, so the resulting value is
4163      interesting.  */
4164
4165   /* If it's sufficiently simple already, we're done.  Unless we are
4166      handling some post-effects internally; if that's the case, we need to
4167      copy into a temp before adding the post-effects to the tree.  */
4168   if (!internal_post && (*gimple_test_f) (*expr_p))
4169     goto out;
4170
4171   /* Otherwise, we need to create a new temporary for the gimplified
4172      expression.  */
4173
4174   /* We can't return an lvalue if we have an internal postqueue.  The
4175      object the lvalue refers to would (probably) be modified by the
4176      postqueue; we need to copy the value out first, which means an
4177      rvalue.  */
4178   if ((fallback & fb_lvalue) && !internal_post
4179       && is_gimple_addressable (*expr_p))
4180     {
4181       /* An lvalue will do.  Take the address of the expression, store it
4182          in a temporary, and replace the expression with an INDIRECT_REF of
4183          that temporary.  */
4184       tmp = build_fold_addr_expr (*expr_p);
4185       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
4186       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
4187     }
4188   else if ((fallback & fb_rvalue) && is_gimple_formal_tmp_rhs (*expr_p))
4189     {
4190       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
4191
4192       /* An rvalue will do.  Assign the gimplified expression into a new
4193          temporary TMP and replace the original expression with TMP.  */
4194
4195       if (internal_post || (fallback & fb_lvalue))
4196         /* The postqueue might change the value of the expression between
4197            the initialization and use of the temporary, so we can't use a
4198            formal temp.  FIXME do we care?  */
4199         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
4200       else
4201         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
4202
4203       if (TREE_CODE (*expr_p) != SSA_NAME)
4204         DECL_GIMPLE_FORMAL_TEMP_P (*expr_p) = 1;
4205     }
4206   else
4207     {
4208 #ifdef ENABLE_CHECKING
4209       if (!(fallback & fb_mayfail))
4210         {
4211           fprintf (stderr, "gimplification failed:\n");
4212           print_generic_expr (stderr, *expr_p, 0);
4213           debug_tree (*expr_p);
4214           internal_error ("gimplification failed");
4215         }
4216 #endif
4217       gcc_assert (fallback & fb_mayfail);
4218       /* If this is an asm statement, and the user asked for the
4219          impossible, don't abort.  Fail and let gimplify_asm_expr
4220          issue an error.  */
4221       ret = GS_ERROR;
4222       goto out;
4223     }
4224
4225   /* Make sure the temporary matches our predicate.  */
4226   gcc_assert ((*gimple_test_f) (*expr_p));
4227
4228   if (internal_post)
4229     {
4230       annotate_all_with_locus (&internal_post, input_location);
4231       append_to_statement_list (internal_post, pre_p);
4232     }
4233
4234  out:
4235   input_location = saved_location;
4236   return ret;
4237 }
4238
4239 /* Look through TYPE for variable-sized objects and gimplify each such
4240    size that we find.  Add to LIST_P any statements generated.  */
4241
4242 void
4243 gimplify_type_sizes (tree type, tree *list_p)
4244 {
4245   tree field, t;
4246
4247   /* Note that we do not check for TYPE_SIZES_GIMPLIFIED already set because
4248      that's not supposed to happen on types where gimplification does anything.
4249      We should assert that it isn't set, but we can indeed be called multiple
4250      times on pointers.  Unfortunately, this includes fat pointers which we
4251      can't easily test for.  We could pass TYPE down to gimplify_one_sizepos
4252      and test there, but it doesn't seem worth it.  */
4253
4254   /* We first do the main variant, then copy into any other variants. */
4255   type = TYPE_MAIN_VARIANT (type);
4256
4257   switch (TREE_CODE (type))
4258     {
4259     case ERROR_MARK:
4260       return;
4261
4262     case INTEGER_TYPE:
4263     case ENUMERAL_TYPE:
4264     case BOOLEAN_TYPE:
4265     case CHAR_TYPE:
4266     case REAL_TYPE:
4267       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
4268       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
4269
4270       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
4271         {
4272           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
4273           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
4274           TYPE_SIZES_GIMPLIFIED (t) = 1;
4275         }
4276       break;
4277
4278     case ARRAY_TYPE:
4279       /* These types may not have declarations, so handle them here.  */
4280       if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (type)))
4281         gimplify_type_sizes (TREE_TYPE (type), list_p);
4282
4283       if (!TYPE_SIZES_GIMPLIFIED (TYPE_DOMAIN (type)))
4284           gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
4285       break;
4286
4287     case RECORD_TYPE:
4288     case UNION_TYPE:
4289     case QUAL_UNION_TYPE:
4290       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4291         if (TREE_CODE (field) == FIELD_DECL)
4292           gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
4293       break;
4294
4295     default:
4296       break;
4297     }
4298
4299   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
4300   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
4301
4302   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
4303     {
4304       TYPE_SIZE (t) = TYPE_SIZE (type);
4305       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
4306       TYPE_SIZES_GIMPLIFIED (t) = 1;
4307     }
4308
4309   TYPE_SIZES_GIMPLIFIED (type) = 1;
4310 }
4311
4312 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
4313    a size or position, has had all of its SAVE_EXPRs evaluated.
4314    We add any required statements to STMT_P.  */
4315
4316 void
4317 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
4318 {
4319   /* We don't do anything if the value isn't there, is constant, or contains
4320      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
4321      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplfier
4322      will want to replace it with a new variable, but that will cause problems
4323      if this type is from outside the function.  It's OK to have that here.  */
4324   if (*expr_p == NULL_TREE || TREE_CONSTANT (*expr_p)
4325       || TREE_CODE (*expr_p) == VAR_DECL
4326       || CONTAINS_PLACEHOLDER_P (*expr_p))
4327     return;
4328
4329   *expr_p = unshare_expr (*expr_p);
4330   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
4331 }
4332 \f
4333 #ifdef ENABLE_CHECKING
4334 /* Compare types A and B for a "close enough" match.  */
4335
4336 static bool
4337 cpt_same_type (tree a, tree b)
4338 {
4339   if (lang_hooks.types_compatible_p (a, b))
4340     return true;
4341
4342   /* ??? The C++ FE decomposes METHOD_TYPES to FUNCTION_TYPES and doesn't
4343      link them together.  This routine is intended to catch type errors
4344      that will affect the optimizers, and the optimizers don't add new
4345      dereferences of function pointers, so ignore it.  */
4346   if ((TREE_CODE (a) == FUNCTION_TYPE || TREE_CODE (a) == METHOD_TYPE)
4347       && (TREE_CODE (b) == FUNCTION_TYPE || TREE_CODE (b) == METHOD_TYPE))
4348     return true;
4349
4350   /* ??? The C FE pushes type qualifiers after the fact into the type of
4351      the element from the type of the array.  See build_unary_op's handling
4352      of ADDR_EXPR.  This seems wrong -- if we were going to do this, we
4353      should have done it when creating the variable in the first place.
4354      Alternately, why aren't the two array types made variants?  */
4355   if (TREE_CODE (a) == ARRAY_TYPE && TREE_CODE (b) == ARRAY_TYPE)
4356     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
4357
4358   /* And because of those, we have to recurse down through pointers.  */
4359   if (POINTER_TYPE_P (a) && POINTER_TYPE_P (b))
4360     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
4361
4362   return false;
4363 }
4364
4365 /* Check for some cases of the front end missing cast expressions.
4366    The type of a dereference should correspond to the pointer type;
4367    similarly the type of an address should match its object.  */
4368
4369 static tree
4370 check_pointer_types_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
4371                        void *data ATTRIBUTE_UNUSED)
4372 {
4373   tree t = *tp;
4374   tree ptype, otype, dtype;
4375
4376   switch (TREE_CODE (t))
4377     {
4378     case INDIRECT_REF:
4379     case ARRAY_REF:
4380       otype = TREE_TYPE (t);
4381       ptype = TREE_TYPE (TREE_OPERAND (t, 0));
4382       dtype = TREE_TYPE (ptype);
4383       gcc_assert (cpt_same_type (otype, dtype));
4384       break;
4385
4386     case ADDR_EXPR:
4387       ptype = TREE_TYPE (t);
4388       otype = TREE_TYPE (TREE_OPERAND (t, 0));
4389       dtype = TREE_TYPE (ptype);
4390       if (!cpt_same_type (otype, dtype))
4391         {
4392           /* &array is allowed to produce a pointer to the element, rather than
4393              a pointer to the array type.  We must allow this in order to
4394              properly represent assigning the address of an array in C into
4395              pointer to the element type.  */
4396           gcc_assert (TREE_CODE (otype) == ARRAY_TYPE
4397                       && POINTER_TYPE_P (ptype)
4398                       && cpt_same_type (TREE_TYPE (otype), dtype));
4399           break;
4400         }
4401       break;
4402
4403     default:
4404       return NULL_TREE;
4405     }
4406
4407
4408   return NULL_TREE;
4409 }
4410 #endif
4411
4412 /* Gimplify the body of statements pointed by BODY_P.  FNDECL is the
4413    function decl containing BODY.  */
4414
4415 void
4416 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
4417 {
4418   location_t saved_location = input_location;
4419   tree body, parm_stmts;
4420
4421   timevar_push (TV_TREE_GIMPLIFY);
4422   push_gimplify_context ();
4423
4424   /* Unshare most shared trees in the body and in that of any nested functions.
4425      It would seem we don't have to do this for nested functions because
4426      they are supposed to be output and then the outer function gimplified
4427      first, but the g++ front end doesn't always do it that way.  */
4428   unshare_body (body_p, fndecl);
4429   unvisit_body (body_p, fndecl);
4430
4431   /* Make sure input_location isn't set to something wierd.  */
4432   input_location = DECL_SOURCE_LOCATION (fndecl);
4433
4434   /* Resolve callee-copies.  This has to be done before processing
4435      the body so that DECL_VALUE_EXPR gets processed correctly.  */
4436   parm_stmts = do_parms ? gimplify_parameters () : NULL;
4437
4438   /* Gimplify the function's body.  */
4439   gimplify_stmt (body_p);
4440   body = *body_p;
4441
4442   if (!body)
4443     body = alloc_stmt_list ();
4444   else if (TREE_CODE (body) == STATEMENT_LIST)
4445     {
4446       tree t = expr_only (*body_p);
4447       if (t)
4448         body = t;
4449     }
4450
4451   /* If there isn't an outer BIND_EXPR, add one.  */
4452   if (TREE_CODE (body) != BIND_EXPR)
4453     {
4454       tree b = build (BIND_EXPR, void_type_node, NULL_TREE,
4455                       NULL_TREE, NULL_TREE);
4456       TREE_SIDE_EFFECTS (b) = 1;
4457       append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
4458       body = b;
4459     }
4460
4461   /* If we had callee-copies statements, insert them at the beginning
4462      of the function.  */
4463   if (parm_stmts)
4464     {
4465       append_to_statement_list_force (BIND_EXPR_BODY (body), &parm_stmts);
4466       BIND_EXPR_BODY (body) = parm_stmts;
4467     }
4468
4469   /* Unshare again, in case gimplification was sloppy.  */
4470   unshare_all_trees (body);
4471
4472   *body_p = body;
4473
4474   pop_gimplify_context (body);
4475
4476 #ifdef ENABLE_CHECKING
4477   walk_tree (body_p, check_pointer_types_r, NULL, NULL);
4478 #endif
4479
4480   timevar_pop (TV_TREE_GIMPLIFY);
4481   input_location = saved_location;
4482 }
4483
4484 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
4485    node for the function we want to gimplify.  */
4486
4487 void
4488 gimplify_function_tree (tree fndecl)
4489 {
4490   tree oldfn;
4491
4492   oldfn = current_function_decl;
4493   current_function_decl = fndecl;
4494   cfun = DECL_STRUCT_FUNCTION (fndecl);
4495   if (cfun == NULL)
4496     allocate_struct_function (fndecl);
4497
4498   gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
4499
4500   /* If we're instrumenting function entry/exit, then prepend the call to
4501      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
4502      catch the exit hook.  */
4503   /* ??? Add some way to ignore exceptions for this TFE.  */
4504   if (flag_instrument_function_entry_exit
4505       && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl))
4506     {
4507       tree tf, x, bind;
4508
4509       tf = build (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
4510       TREE_SIDE_EFFECTS (tf) = 1;
4511       x = DECL_SAVED_TREE (fndecl);
4512       append_to_statement_list (x, &TREE_OPERAND (tf, 0));
4513       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
4514       x = build_function_call_expr (x, NULL);
4515       append_to_statement_list (x, &TREE_OPERAND (tf, 1));
4516
4517       bind = build (BIND_EXPR, void_type_node, NULL, NULL, NULL);
4518       TREE_SIDE_EFFECTS (bind) = 1;
4519       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
4520       x = build_function_call_expr (x, NULL);
4521       append_to_statement_list (x, &BIND_EXPR_BODY (bind));
4522       append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
4523
4524       DECL_SAVED_TREE (fndecl) = bind;
4525     }
4526
4527   current_function_decl = oldfn;
4528   cfun = oldfn ? DECL_STRUCT_FUNCTION (oldfn) : NULL;
4529 }
4530
4531 \f
4532 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
4533    force the result to be either ssa_name or an invariant, otherwise
4534    just force it to be a rhs expression.  If VAR is not NULL, make the
4535    base variable of the final destination be VAR if suitable.  */
4536
4537 tree
4538 force_gimple_operand (tree expr, tree *stmts, bool simple, tree var)
4539 {
4540   tree t;
4541   enum gimplify_status ret;
4542   gimple_predicate gimple_test_f;
4543
4544   *stmts = NULL_TREE;
4545
4546   if (is_gimple_val (expr))
4547     return expr;
4548
4549   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
4550
4551   push_gimplify_context ();
4552   gimplify_ctxp->into_ssa = true;
4553
4554   if (var)
4555     expr = build (MODIFY_EXPR, TREE_TYPE (var), var, expr);
4556
4557   ret = gimplify_expr (&expr, stmts, NULL,
4558                        gimple_test_f, fb_rvalue);
4559   gcc_assert (ret != GS_ERROR);
4560
4561   for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
4562     add_referenced_tmp_var (t);
4563
4564   pop_gimplify_context (NULL);
4565
4566   return expr;
4567 }
4568
4569 #include "gt-gimplify.h"