OSDN Git Service

2005-06-01 Daniel Berlin <dberlin@dberlin.org>
[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 "varray.h"
31 #include "tree-gimple.h"
32 #include "tree-inline.h"
33 #include "diagnostic.h"
34 #include "langhooks.h"
35 #include "langhooks-def.h"
36 #include "tree-flow.h"
37 #include "cgraph.h"
38 #include "timevar.h"
39 #include "except.h"
40 #include "hashtab.h"
41 #include "flags.h"
42 #include "real.h"
43 #include "function.h"
44 #include "output.h"
45 #include "expr.h"
46 #include "ggc.h"
47 #include "toplev.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   VEC(tree,heap) *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 static 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 static 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 just die 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 static 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 die 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   if ((TREE_CODE (decl) == TYPE_DECL
987        || TREE_CODE (decl) == VAR_DECL)
988       && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
989     gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
990
991   if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
992     {
993       tree init = DECL_INITIAL (decl);
994
995       if (!TREE_CONSTANT (DECL_SIZE (decl)))
996         {
997           /* This is a variable-sized decl.  Simplify its size and mark it
998              for deferred expansion.  Note that mudflap depends on the format
999              of the emitted code: see mx_register_decls().  */
1000           tree t, args, addr, ptr_type;
1001
1002           gimplify_one_sizepos (&DECL_SIZE (decl), stmt_p);
1003           gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), stmt_p);
1004
1005           /* All occurrences of this decl in final gimplified code will be
1006              replaced by indirection.  Setting DECL_VALUE_EXPR does two
1007              things: First, it lets the rest of the gimplifier know what
1008              replacement to use.  Second, it lets the debug info know
1009              where to find the value.  */
1010           ptr_type = build_pointer_type (TREE_TYPE (decl));
1011           addr = create_tmp_var (ptr_type, get_name (decl));
1012           DECL_IGNORED_P (addr) = 0;
1013           t = build_fold_indirect_ref (addr);
1014           SET_DECL_VALUE_EXPR (decl, t);
1015           DECL_HAS_VALUE_EXPR_P (decl) = 1;
1016
1017           args = tree_cons (NULL, DECL_SIZE_UNIT (decl), NULL);
1018           t = built_in_decls[BUILT_IN_ALLOCA];
1019           t = build_function_call_expr (t, args);
1020           t = fold_convert (ptr_type, t);
1021           t = build2 (MODIFY_EXPR, void_type_node, addr, t);
1022
1023           gimplify_and_add (t, stmt_p);
1024
1025           /* Indicate that we need to restore the stack level when the
1026              enclosing BIND_EXPR is exited.  */
1027           gimplify_ctxp->save_stack = true;
1028         }
1029
1030       if (init && init != error_mark_node)
1031         {
1032           if (!TREE_STATIC (decl))
1033             {
1034               DECL_INITIAL (decl) = NULL_TREE;
1035               init = build (MODIFY_EXPR, void_type_node, decl, init);
1036               gimplify_and_add (init, stmt_p);
1037             }
1038           else
1039             /* We must still examine initializers for static variables
1040                as they may contain a label address.  */
1041             walk_tree (&init, force_labels_r, NULL, NULL);
1042         }
1043
1044       /* This decl isn't mentioned in the enclosing block, so add it to the
1045          list of temps.  FIXME it seems a bit of a kludge to say that
1046          anonymous artificial vars aren't pushed, but everything else is.  */
1047       if (DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1048         gimple_add_tmp_var (decl);
1049     }
1050
1051   return GS_ALL_DONE;
1052 }
1053
1054 /* Gimplify a LOOP_EXPR.  Normally this just involves gimplifying the body
1055    and replacing the LOOP_EXPR with goto, but if the loop contains an
1056    EXIT_EXPR, we need to append a label for it to jump to.  */
1057
1058 static enum gimplify_status
1059 gimplify_loop_expr (tree *expr_p, tree *pre_p)
1060 {
1061   tree saved_label = gimplify_ctxp->exit_label;
1062   tree start_label = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
1063   tree jump_stmt = build_and_jump (&LABEL_EXPR_LABEL (start_label));
1064
1065   append_to_statement_list (start_label, pre_p);
1066
1067   gimplify_ctxp->exit_label = NULL_TREE;
1068
1069   gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1070
1071   if (gimplify_ctxp->exit_label)
1072     {
1073       append_to_statement_list (jump_stmt, pre_p);
1074       *expr_p = build1 (LABEL_EXPR, void_type_node, gimplify_ctxp->exit_label);
1075     }
1076   else
1077     *expr_p = jump_stmt;
1078
1079   gimplify_ctxp->exit_label = saved_label;
1080
1081   return GS_ALL_DONE;
1082 }
1083
1084 /* Compare two case labels.  Because the front end should already have
1085    made sure that case ranges do not overlap, it is enough to only compare
1086    the CASE_LOW values of each case label.  */
1087
1088 static int
1089 compare_case_labels (const void *p1, const void *p2)
1090 {
1091   tree case1 = *(tree *)p1;
1092   tree case2 = *(tree *)p2;
1093
1094   return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1095 }
1096
1097 /* Sort the case labels in LABEL_VEC in place in ascending order.  */
1098
1099 void
1100 sort_case_labels (tree label_vec)
1101 {
1102   size_t len = TREE_VEC_LENGTH (label_vec);
1103   tree default_case = TREE_VEC_ELT (label_vec, len - 1);
1104
1105   if (CASE_LOW (default_case))
1106     {
1107       size_t i;
1108
1109       /* The last label in the vector should be the default case
1110          but it is not.  */
1111       for (i = 0; i < len; ++i)
1112         {
1113           tree t = TREE_VEC_ELT (label_vec, i);
1114           if (!CASE_LOW (t))
1115             {
1116               default_case = t;
1117               TREE_VEC_ELT (label_vec, i) = TREE_VEC_ELT (label_vec, len - 1);
1118               TREE_VEC_ELT (label_vec, len - 1) = default_case;
1119               break;
1120             }
1121         }
1122     }
1123
1124   qsort (&TREE_VEC_ELT (label_vec, 0), len - 1, sizeof (tree),
1125          compare_case_labels);
1126 }
1127
1128 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1129    branch to.  */
1130
1131 static enum gimplify_status
1132 gimplify_switch_expr (tree *expr_p, tree *pre_p)
1133 {
1134   tree switch_expr = *expr_p;
1135   enum gimplify_status ret;
1136
1137   ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL,
1138                        is_gimple_val, fb_rvalue);
1139
1140   if (SWITCH_BODY (switch_expr))
1141     {
1142       VEC(tree,heap) *labels, *saved_labels;
1143       tree label_vec, default_case = NULL_TREE;
1144       size_t i, len;
1145
1146       /* If someone can be bothered to fill in the labels, they can
1147          be bothered to null out the body too.  */
1148       gcc_assert (!SWITCH_LABELS (switch_expr));
1149
1150       saved_labels = gimplify_ctxp->case_labels;
1151       gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
1152
1153       gimplify_to_stmt_list (&SWITCH_BODY (switch_expr));
1154
1155       labels = gimplify_ctxp->case_labels;
1156       gimplify_ctxp->case_labels = saved_labels;
1157
1158       len = VEC_length (tree, labels);
1159
1160       for (i = 0; i < len; ++i)
1161         {
1162           tree t = VEC_index (tree, labels, i);
1163           if (!CASE_LOW (t))
1164             {
1165               /* The default case must be the last label in the list.  */
1166               default_case = t;
1167               VEC_replace (tree, labels, i, VEC_index (tree, labels, len - 1));
1168               len--;
1169               break;
1170             }
1171         }
1172
1173       label_vec = make_tree_vec (len + 1);
1174       SWITCH_LABELS (*expr_p) = label_vec;
1175       append_to_statement_list (switch_expr, pre_p);
1176
1177       if (! default_case)
1178         {
1179           /* If the switch has no default label, add one, so that we jump
1180              around the switch body.  */
1181           default_case = build (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
1182                                 NULL_TREE, create_artificial_label ());
1183           append_to_statement_list (SWITCH_BODY (switch_expr), pre_p);
1184           *expr_p = build (LABEL_EXPR, void_type_node,
1185                            CASE_LABEL (default_case));
1186         }
1187       else
1188         *expr_p = SWITCH_BODY (switch_expr);
1189
1190       for (i = 0; i < len; ++i)
1191         TREE_VEC_ELT (label_vec, i) = VEC_index (tree, labels, i);
1192       TREE_VEC_ELT (label_vec, len) = default_case;
1193
1194       VEC_free (tree, heap, labels);
1195
1196       sort_case_labels (label_vec);
1197
1198       SWITCH_BODY (switch_expr) = NULL;
1199     }
1200   else
1201     gcc_assert (SWITCH_LABELS (switch_expr));
1202
1203   return ret;
1204 }
1205
1206 static enum gimplify_status
1207 gimplify_case_label_expr (tree *expr_p)
1208 {
1209   tree expr = *expr_p;
1210
1211   gcc_assert (gimplify_ctxp->case_labels);
1212   VEC_safe_push (tree, heap, gimplify_ctxp->case_labels, expr);
1213   *expr_p = build (LABEL_EXPR, void_type_node, CASE_LABEL (expr));
1214   return GS_ALL_DONE;
1215 }
1216
1217 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1218    if necessary.  */
1219
1220 tree
1221 build_and_jump (tree *label_p)
1222 {
1223   if (label_p == NULL)
1224     /* If there's nowhere to jump, just fall through.  */
1225     return NULL_TREE;
1226
1227   if (*label_p == NULL_TREE)
1228     {
1229       tree label = create_artificial_label ();
1230       *label_p = label;
1231     }
1232
1233   return build1 (GOTO_EXPR, void_type_node, *label_p);
1234 }
1235
1236 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1237    This also involves building a label to jump to and communicating it to
1238    gimplify_loop_expr through gimplify_ctxp->exit_label.  */
1239
1240 static enum gimplify_status
1241 gimplify_exit_expr (tree *expr_p)
1242 {
1243   tree cond = TREE_OPERAND (*expr_p, 0);
1244   tree expr;
1245
1246   expr = build_and_jump (&gimplify_ctxp->exit_label);
1247   expr = build (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1248   *expr_p = expr;
1249
1250   return GS_OK;
1251 }
1252
1253 /* A helper function to be called via walk_tree.  Mark all labels under *TP
1254    as being forced.  To be called for DECL_INITIAL of static variables.  */
1255
1256 tree
1257 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1258 {
1259   if (TYPE_P (*tp))
1260     *walk_subtrees = 0;
1261   if (TREE_CODE (*tp) == LABEL_DECL)
1262     FORCED_LABEL (*tp) = 1;
1263
1264   return NULL_TREE;
1265 }
1266
1267 /* *EXPR_P is a COMPONENT_REF being used as an rvalue.  If its type is
1268    different from its canonical type, wrap the whole thing inside a
1269    NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1270    type.
1271
1272    The canonical type of a COMPONENT_REF is the type of the field being
1273    referenced--unless the field is a bit-field which can be read directly
1274    in a smaller mode, in which case the canonical type is the
1275    sign-appropriate type corresponding to that mode.  */
1276
1277 static void
1278 canonicalize_component_ref (tree *expr_p)
1279 {
1280   tree expr = *expr_p;
1281   tree type;
1282
1283   gcc_assert (TREE_CODE (expr) == COMPONENT_REF);
1284
1285   if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1286     type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1287   else
1288     type = TREE_TYPE (TREE_OPERAND (expr, 1));
1289
1290   if (TREE_TYPE (expr) != type)
1291     {
1292       tree old_type = TREE_TYPE (expr);
1293
1294       /* Set the type of the COMPONENT_REF to the underlying type.  */
1295       TREE_TYPE (expr) = type;
1296
1297       /* And wrap the whole thing inside a NOP_EXPR.  */
1298       expr = build1 (NOP_EXPR, old_type, expr);
1299
1300       *expr_p = expr;
1301     }
1302 }
1303
1304 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1305    to foo, embed that change in the ADDR_EXPR by converting
1306       T array[U];
1307       (T *)&array
1308    ==>
1309       &array[L]
1310    where L is the lower bound.  For simplicity, only do this for constant
1311    lower bound.  */
1312
1313 static void
1314 canonicalize_addr_expr (tree *expr_p)
1315 {
1316   tree expr = *expr_p;
1317   tree ctype = TREE_TYPE (expr);
1318   tree addr_expr = TREE_OPERAND (expr, 0);
1319   tree atype = TREE_TYPE (addr_expr);
1320   tree dctype, datype, ddatype, otype, obj_expr;
1321
1322   /* Both cast and addr_expr types should be pointers.  */
1323   if (!POINTER_TYPE_P (ctype) || !POINTER_TYPE_P (atype))
1324     return;
1325
1326   /* The addr_expr type should be a pointer to an array.  */
1327   datype = TREE_TYPE (atype);
1328   if (TREE_CODE (datype) != ARRAY_TYPE)
1329     return;
1330
1331   /* Both cast and addr_expr types should address the same object type.  */
1332   dctype = TREE_TYPE (ctype);
1333   ddatype = TREE_TYPE (datype);
1334   if (!lang_hooks.types_compatible_p (ddatype, dctype))
1335     return;
1336
1337   /* The addr_expr and the object type should match.  */
1338   obj_expr = TREE_OPERAND (addr_expr, 0);
1339   otype = TREE_TYPE (obj_expr);
1340   if (!lang_hooks.types_compatible_p (otype, datype))
1341     return;
1342
1343   /* The lower bound and element sizes must be constant.  */
1344   if (!TYPE_SIZE_UNIT (dctype)
1345       || TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
1346       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1347       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1348     return;
1349
1350   /* All checks succeeded.  Build a new node to merge the cast.  */
1351   *expr_p = build4 (ARRAY_REF, dctype, obj_expr,
1352                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1353                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1354                     size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (dctype),
1355                                 size_int (TYPE_ALIGN_UNIT (dctype))));
1356   *expr_p = build1 (ADDR_EXPR, ctype, *expr_p);
1357 }
1358
1359 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR.  Remove it and/or other conversions
1360    underneath as appropriate.  */
1361
1362 static enum gimplify_status
1363 gimplify_conversion (tree *expr_p)
1364 {
1365   gcc_assert (TREE_CODE (*expr_p) == NOP_EXPR
1366               || TREE_CODE (*expr_p) == CONVERT_EXPR);
1367   
1368   /* Then strip away all but the outermost conversion.  */
1369   STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1370
1371   /* And remove the outermost conversion if it's useless.  */
1372   if (tree_ssa_useless_type_conversion (*expr_p))
1373     *expr_p = TREE_OPERAND (*expr_p, 0);
1374
1375   /* If we still have a conversion at the toplevel,
1376      then canonicalize some constructs.  */
1377   if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1378     {
1379       tree sub = TREE_OPERAND (*expr_p, 0);
1380
1381       /* If a NOP conversion is changing the type of a COMPONENT_REF
1382          expression, then canonicalize its type now in order to expose more
1383          redundant conversions.  */
1384       if (TREE_CODE (sub) == COMPONENT_REF)
1385         canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1386
1387       /* If a NOP conversion is changing a pointer to array of foo
1388          to a pointer to foo, embed that change in the ADDR_EXPR.  */
1389       else if (TREE_CODE (sub) == ADDR_EXPR)
1390         canonicalize_addr_expr (expr_p);
1391     }
1392
1393   return GS_OK;
1394 }
1395
1396 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1397    node pointed by EXPR_P.
1398
1399       compound_lval
1400               : min_lval '[' val ']'
1401               | min_lval '.' ID
1402               | compound_lval '[' val ']'
1403               | compound_lval '.' ID
1404
1405    This is not part of the original SIMPLE definition, which separates
1406    array and member references, but it seems reasonable to handle them
1407    together.  Also, this way we don't run into problems with union
1408    aliasing; gcc requires that for accesses through a union to alias, the
1409    union reference must be explicit, which was not always the case when we
1410    were splitting up array and member refs.
1411
1412    PRE_P points to the list where side effects that must happen before
1413      *EXPR_P should be stored.
1414
1415    POST_P points to the list where side effects that must happen after
1416      *EXPR_P should be stored.  */
1417
1418 static enum gimplify_status
1419 gimplify_compound_lval (tree *expr_p, tree *pre_p,
1420                         tree *post_p, fallback_t fallback)
1421 {
1422   tree *p;
1423   VEC(tree,heap) *stack;
1424   enum gimplify_status ret = GS_OK, tret;
1425   int i;
1426
1427   /* Create a stack of the subexpressions so later we can walk them in
1428      order from inner to outer.  */
1429   stack = VEC_alloc (tree, heap, 10);
1430
1431   /* We can handle anything that get_inner_reference can deal with.  */
1432   for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
1433     {
1434       /* Fold INDIRECT_REFs now to turn them into ARRAY_REFs.  */
1435       if (TREE_CODE (*p) == INDIRECT_REF)
1436         *p = fold_indirect_ref (*p);
1437       if (!handled_component_p (*p))
1438         break;
1439       VEC_safe_push (tree, heap, stack, *p);
1440     }
1441
1442   gcc_assert (VEC_length (tree, stack));
1443
1444   /* Now STACK is a stack of pointers to all the refs we've walked through
1445      and P points to the innermost expression.
1446
1447      Java requires that we elaborated nodes in source order.  That
1448      means we must gimplify the inner expression followed by each of
1449      the indices, in order.  But we can't gimplify the inner
1450      expression until we deal with any variable bounds, sizes, or
1451      positions in order to deal with PLACEHOLDER_EXPRs.
1452
1453      So we do this in three steps.  First we deal with the annotations
1454      for any variables in the components, then we gimplify the base,
1455      then we gimplify any indices, from left to right.  */
1456   for (i = VEC_length (tree, stack) - 1; i >= 0; i--)
1457     {
1458       tree t = VEC_index (tree, stack, i);
1459
1460       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1461         {
1462           /* Gimplify the low bound and element type size and put them into
1463              the ARRAY_REF.  If these values are set, they have already been
1464              gimplified.  */
1465           if (!TREE_OPERAND (t, 2))
1466             {
1467               tree low = unshare_expr (array_ref_low_bound (t));
1468               if (!is_gimple_min_invariant (low))
1469                 {
1470                   TREE_OPERAND (t, 2) = low;
1471                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1472                                         is_gimple_formal_tmp_reg, fb_rvalue);
1473                   ret = MIN (ret, tret);
1474                 }
1475             }
1476
1477           if (!TREE_OPERAND (t, 3))
1478             {
1479               tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
1480               tree elmt_size = unshare_expr (array_ref_element_size (t));
1481               tree factor = size_int (TYPE_ALIGN_UNIT (elmt_type));
1482
1483               /* Divide the element size by the alignment of the element
1484                  type (above).  */
1485               elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
1486
1487               if (!is_gimple_min_invariant (elmt_size))
1488                 {
1489                   TREE_OPERAND (t, 3) = elmt_size;
1490                   tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
1491                                         is_gimple_formal_tmp_reg, fb_rvalue);
1492                   ret = MIN (ret, tret);
1493                 }
1494             }
1495         }
1496       else if (TREE_CODE (t) == COMPONENT_REF)
1497         {
1498           /* Set the field offset into T and gimplify it.  */
1499           if (!TREE_OPERAND (t, 2))
1500             {
1501               tree offset = unshare_expr (component_ref_field_offset (t));
1502               tree field = TREE_OPERAND (t, 1);
1503               tree factor
1504                 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
1505
1506               /* Divide the offset by its alignment.  */
1507               offset = size_binop (EXACT_DIV_EXPR, offset, factor);
1508
1509               if (!is_gimple_min_invariant (offset))
1510                 {
1511                   TREE_OPERAND (t, 2) = offset;
1512                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1513                                         is_gimple_formal_tmp_reg, fb_rvalue);
1514                   ret = MIN (ret, tret);
1515                 }
1516             }
1517         }
1518     }
1519
1520   /* Step 2 is to gimplify the base expression.  */
1521   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1522   ret = MIN (ret, tret);
1523
1524   /* And finally, the indices and operands to BIT_FIELD_REF.  During this
1525      loop we also remove any useless conversions.  */
1526   for (; VEC_length (tree, stack) > 0; )
1527     {
1528       tree t = VEC_pop (tree, stack);
1529
1530       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1531         {
1532           /* Gimplify the dimension.
1533              Temporary fix for gcc.c-torture/execute/20040313-1.c.
1534              Gimplify non-constant array indices into a temporary
1535              variable.
1536              FIXME - The real fix is to gimplify post-modify
1537              expressions into a minimal gimple lvalue.  However, that
1538              exposes bugs in alias analysis.  The alias analyzer does
1539              not handle &PTR->FIELD very well.  Will fix after the
1540              branch is merged into mainline (dnovillo 2004-05-03).  */
1541           if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1542             {
1543               tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1544                                     is_gimple_formal_tmp_reg, fb_rvalue);
1545               ret = MIN (ret, tret);
1546             }
1547         }
1548       else if (TREE_CODE (t) == BIT_FIELD_REF)
1549         {
1550           tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1551                                 is_gimple_val, fb_rvalue);
1552           ret = MIN (ret, tret);
1553           tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1554                                 is_gimple_val, fb_rvalue);
1555           ret = MIN (ret, tret);
1556         }
1557
1558       STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
1559
1560       /* The innermost expression P may have originally had TREE_SIDE_EFFECTS
1561          set which would have caused all the outer expressions in EXPR_P
1562          leading to P to also have had TREE_SIDE_EFFECTS set.  */
1563       recalculate_side_effects (t);
1564     }
1565
1566   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1567   ret = MIN (ret, tret);
1568
1569   /* If the outermost expression is a COMPONENT_REF, canonicalize its type.  */
1570   if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
1571     {
1572       canonicalize_component_ref (expr_p);
1573       ret = MIN (ret, GS_OK);
1574     }
1575
1576   VEC_free (tree, heap, stack);
1577
1578   return ret;
1579 }
1580
1581 /*  Gimplify the self modifying expression pointed by EXPR_P (++, --, +=, -=).
1582
1583     PRE_P points to the list where side effects that must happen before
1584         *EXPR_P should be stored.
1585
1586     POST_P points to the list where side effects that must happen after
1587         *EXPR_P should be stored.
1588
1589     WANT_VALUE is nonzero iff we want to use the value of this expression
1590         in another expression.  */
1591
1592 static enum gimplify_status
1593 gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
1594                         bool want_value)
1595 {
1596   enum tree_code code;
1597   tree lhs, lvalue, rhs, t1;
1598   bool postfix;
1599   enum tree_code arith_code;
1600   enum gimplify_status ret;
1601
1602   code = TREE_CODE (*expr_p);
1603
1604   gcc_assert (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR
1605               || code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR);
1606
1607   /* Prefix or postfix?  */
1608   if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1609     /* Faster to treat as prefix if result is not used.  */
1610     postfix = want_value;
1611   else
1612     postfix = false;
1613
1614   /* Add or subtract?  */
1615   if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
1616     arith_code = PLUS_EXPR;
1617   else
1618     arith_code = MINUS_EXPR;
1619
1620   /* Gimplify the LHS into a GIMPLE lvalue.  */
1621   lvalue = TREE_OPERAND (*expr_p, 0);
1622   ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
1623   if (ret == GS_ERROR)
1624     return ret;
1625
1626   /* Extract the operands to the arithmetic operation.  */
1627   lhs = lvalue;
1628   rhs = TREE_OPERAND (*expr_p, 1);
1629
1630   /* For postfix operator, we evaluate the LHS to an rvalue and then use
1631      that as the result value and in the postqueue operation.  */
1632   if (postfix)
1633     {
1634       ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
1635       if (ret == GS_ERROR)
1636         return ret;
1637     }
1638
1639   t1 = build (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
1640   t1 = build (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
1641
1642   if (postfix)
1643     {
1644       gimplify_and_add (t1, post_p);
1645       *expr_p = lhs;
1646       return GS_ALL_DONE;
1647     }
1648   else
1649     {
1650       *expr_p = t1;
1651       return GS_OK;
1652     }
1653 }
1654
1655 /* If *EXPR_P has a variable sized type, wrap it in a WITH_SIZE_EXPR.  */
1656
1657 static void
1658 maybe_with_size_expr (tree *expr_p)
1659 {
1660   tree expr = *expr_p;
1661   tree type = TREE_TYPE (expr);
1662   tree size;
1663
1664   /* If we've already wrapped this or the type is error_mark_node, we can't do
1665      anything.  */
1666   if (TREE_CODE (expr) == WITH_SIZE_EXPR
1667       || type == error_mark_node)
1668     return;
1669
1670   /* If the size isn't known or is a constant, we have nothing to do.  */
1671   size = TYPE_SIZE_UNIT (type);
1672   if (!size || TREE_CODE (size) == INTEGER_CST)
1673     return;
1674
1675   /* Otherwise, make a WITH_SIZE_EXPR.  */
1676   size = unshare_expr (size);
1677   size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
1678   *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
1679 }
1680
1681 /* Subroutine of gimplify_call_expr:  Gimplify a single argument.  */
1682
1683 static enum gimplify_status
1684 gimplify_arg (tree *expr_p, tree *pre_p)
1685 {
1686   bool (*test) (tree);
1687   fallback_t fb;
1688
1689   /* In general, we allow lvalues for function arguments to avoid
1690      extra overhead of copying large aggregates out of even larger
1691      aggregates into temporaries only to copy the temporaries to
1692      the argument list.  Make optimizers happy by pulling out to
1693      temporaries those types that fit in registers.  */
1694   if (is_gimple_reg_type (TREE_TYPE (*expr_p)))
1695     test = is_gimple_val, fb = fb_rvalue;
1696   else
1697     test = is_gimple_lvalue, fb = fb_either;
1698
1699   /* If this is a variable sized type, we must remember the size.  */
1700   maybe_with_size_expr (expr_p);
1701
1702   /* There is a sequence point before a function call.  Side effects in
1703      the argument list must occur before the actual call. So, when
1704      gimplifying arguments, force gimplify_expr to use an internal
1705      post queue which is then appended to the end of PRE_P.  */
1706   return gimplify_expr (expr_p, pre_p, NULL, test, fb);
1707 }
1708
1709 /* Gimplify the CALL_EXPR node pointed by EXPR_P.  PRE_P points to the
1710    list where side effects that must happen before *EXPR_P should be stored.
1711    WANT_VALUE is true if the result of the call is desired.  */
1712
1713 static enum gimplify_status
1714 gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
1715 {
1716   tree decl;
1717   tree arglist;
1718   enum gimplify_status ret;
1719
1720   gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
1721
1722   /* For reliable diagnostics during inlining, it is necessary that
1723      every call_expr be annotated with file and line.  */
1724   if (! EXPR_HAS_LOCATION (*expr_p))
1725     SET_EXPR_LOCATION (*expr_p, input_location);
1726
1727   /* This may be a call to a builtin function.
1728
1729      Builtin function calls may be transformed into different
1730      (and more efficient) builtin function calls under certain
1731      circumstances.  Unfortunately, gimplification can muck things
1732      up enough that the builtin expanders are not aware that certain
1733      transformations are still valid.
1734
1735      So we attempt transformation/gimplification of the call before
1736      we gimplify the CALL_EXPR.  At this time we do not manage to
1737      transform all calls in the same manner as the expanders do, but
1738      we do transform most of them.  */
1739   decl = get_callee_fndecl (*expr_p);
1740   if (decl && DECL_BUILT_IN (decl))
1741     {
1742       tree fndecl = get_callee_fndecl (*expr_p);
1743       tree arglist = TREE_OPERAND (*expr_p, 1);
1744       tree new = fold_builtin (fndecl, arglist, !want_value);
1745
1746       if (new && new != *expr_p)
1747         {
1748           /* There was a transformation of this call which computes the
1749              same value, but in a more efficient way.  Return and try
1750              again.  */
1751           *expr_p = new;
1752           return GS_OK;
1753         }
1754
1755       if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
1756           && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
1757         {
1758           if (!arglist || !TREE_CHAIN (arglist))
1759             {
1760               error ("too few arguments to function %<va_start%>");
1761               *expr_p = build_empty_stmt ();
1762               return GS_OK;
1763             }
1764           
1765           if (fold_builtin_next_arg (TREE_CHAIN (arglist)))
1766             {
1767               *expr_p = build_empty_stmt ();
1768               return GS_OK;
1769             }
1770           /* Avoid gimplifying the second argument to va_start, which needs
1771              to be the plain PARM_DECL.  */
1772           return gimplify_arg (&TREE_VALUE (TREE_OPERAND (*expr_p, 1)), pre_p);
1773         }
1774     }
1775
1776   /* There is a sequence point before the call, so any side effects in
1777      the calling expression must occur before the actual call.  Force
1778      gimplify_expr to use an internal post queue.  */
1779   ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, NULL,
1780                        is_gimple_call_addr, fb_rvalue);
1781
1782   if (PUSH_ARGS_REVERSED)
1783     TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
1784   for (arglist = TREE_OPERAND (*expr_p, 1); arglist;
1785        arglist = TREE_CHAIN (arglist))
1786     {
1787       enum gimplify_status t;
1788
1789       t = gimplify_arg (&TREE_VALUE (arglist), pre_p);
1790
1791       if (t == GS_ERROR)
1792         ret = GS_ERROR;
1793     }
1794   if (PUSH_ARGS_REVERSED)
1795     TREE_OPERAND (*expr_p, 1) = nreverse (TREE_OPERAND (*expr_p, 1));
1796
1797   /* Try this again in case gimplification exposed something.  */
1798   if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl))
1799     {
1800       tree fndecl = get_callee_fndecl (*expr_p);
1801       tree arglist = TREE_OPERAND (*expr_p, 1);
1802       tree new = fold_builtin (fndecl, arglist, !want_value);
1803
1804       if (new && new != *expr_p)
1805         {
1806           /* There was a transformation of this call which computes the
1807              same value, but in a more efficient way.  Return and try
1808              again.  */
1809           *expr_p = new;
1810           return GS_OK;
1811         }
1812     }
1813
1814   /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
1815      decl.  This allows us to eliminate redundant or useless
1816      calls to "const" functions.  */
1817   if (TREE_CODE (*expr_p) == CALL_EXPR
1818       && (call_expr_flags (*expr_p) & (ECF_CONST | ECF_PURE)))
1819     TREE_SIDE_EFFECTS (*expr_p) = 0;
1820
1821   return ret;
1822 }
1823
1824 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
1825    rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
1826
1827    TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
1828    condition is true or false, respectively.  If null, we should generate
1829    our own to skip over the evaluation of this specific expression.
1830
1831    This function is the tree equivalent of do_jump.
1832
1833    shortcut_cond_r should only be called by shortcut_cond_expr.  */
1834
1835 static tree
1836 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p)
1837 {
1838   tree local_label = NULL_TREE;
1839   tree t, expr = NULL;
1840
1841   /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
1842      retain the shortcut semantics.  Just insert the gotos here;
1843      shortcut_cond_expr will append the real blocks later.  */
1844   if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
1845     {
1846       /* Turn if (a && b) into
1847
1848          if (a); else goto no;
1849          if (b) goto yes; else goto no;
1850          (no:) */
1851
1852       if (false_label_p == NULL)
1853         false_label_p = &local_label;
1854
1855       t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p);
1856       append_to_statement_list (t, &expr);
1857
1858       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1859                            false_label_p);
1860       append_to_statement_list (t, &expr);
1861     }
1862   else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
1863     {
1864       /* Turn if (a || b) into
1865
1866          if (a) goto yes;
1867          if (b) goto yes; else goto no;
1868          (yes:) */
1869
1870       if (true_label_p == NULL)
1871         true_label_p = &local_label;
1872
1873       t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL);
1874       append_to_statement_list (t, &expr);
1875
1876       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1877                            false_label_p);
1878       append_to_statement_list (t, &expr);
1879     }
1880   else if (TREE_CODE (pred) == COND_EXPR)
1881     {
1882       /* As long as we're messing with gotos, turn if (a ? b : c) into
1883          if (a)
1884            if (b) goto yes; else goto no;
1885          else
1886            if (c) goto yes; else goto no;  */
1887       expr = build (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
1888                     shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
1889                                      false_label_p),
1890                     shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
1891                                      false_label_p));
1892     }
1893   else
1894     {
1895       expr = build (COND_EXPR, void_type_node, pred,
1896                     build_and_jump (true_label_p),
1897                     build_and_jump (false_label_p));
1898     }
1899
1900   if (local_label)
1901     {
1902       t = build1 (LABEL_EXPR, void_type_node, local_label);
1903       append_to_statement_list (t, &expr);
1904     }
1905
1906   return expr;
1907 }
1908
1909 static tree
1910 shortcut_cond_expr (tree expr)
1911 {
1912   tree pred = TREE_OPERAND (expr, 0);
1913   tree then_ = TREE_OPERAND (expr, 1);
1914   tree else_ = TREE_OPERAND (expr, 2);
1915   tree true_label, false_label, end_label, t;
1916   tree *true_label_p;
1917   tree *false_label_p;
1918   bool emit_end, emit_false, jump_over_else;
1919   bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
1920   bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
1921
1922   /* First do simple transformations.  */
1923   if (!else_se)
1924     {
1925       /* If there is no 'else', turn (a && b) into if (a) if (b).  */
1926       while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
1927         {
1928           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
1929           then_ = shortcut_cond_expr (expr);
1930           then_se = then_ && TREE_SIDE_EFFECTS (then_);
1931           pred = TREE_OPERAND (pred, 0);
1932           expr = build (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
1933         }
1934     }
1935   if (!then_se)
1936     {
1937       /* If there is no 'then', turn
1938            if (a || b); else d
1939          into
1940            if (a); else if (b); else d.  */
1941       while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
1942         {
1943           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
1944           else_ = shortcut_cond_expr (expr);
1945           else_se = else_ && TREE_SIDE_EFFECTS (else_);
1946           pred = TREE_OPERAND (pred, 0);
1947           expr = build (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
1948         }
1949     }
1950
1951   /* If we're done, great.  */
1952   if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
1953       && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
1954     return expr;
1955
1956   /* Otherwise we need to mess with gotos.  Change
1957        if (a) c; else d;
1958      to
1959        if (a); else goto no;
1960        c; goto end;
1961        no: d; end:
1962      and recursively gimplify the condition.  */
1963
1964   true_label = false_label = end_label = NULL_TREE;
1965
1966   /* If our arms just jump somewhere, hijack those labels so we don't
1967      generate jumps to jumps.  */
1968
1969   if (then_
1970       && TREE_CODE (then_) == GOTO_EXPR
1971       && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
1972     {
1973       true_label = GOTO_DESTINATION (then_);
1974       then_ = NULL;
1975       then_se = false;
1976     }
1977
1978   if (else_
1979       && TREE_CODE (else_) == GOTO_EXPR
1980       && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
1981     {
1982       false_label = GOTO_DESTINATION (else_);
1983       else_ = NULL;
1984       else_se = false;
1985     }
1986
1987   /* If we aren't hijacking a label for the 'then' branch, it falls through.  */
1988   if (true_label)
1989     true_label_p = &true_label;
1990   else
1991     true_label_p = NULL;
1992
1993   /* The 'else' branch also needs a label if it contains interesting code.  */
1994   if (false_label || else_se)
1995     false_label_p = &false_label;
1996   else
1997     false_label_p = NULL;
1998
1999   /* If there was nothing else in our arms, just forward the label(s).  */
2000   if (!then_se && !else_se)
2001     return shortcut_cond_r (pred, true_label_p, false_label_p);
2002
2003   /* If our last subexpression already has a terminal label, reuse it.  */
2004   if (else_se)
2005     expr = expr_last (else_);
2006   else if (then_se)
2007     expr = expr_last (then_);
2008   else
2009     expr = NULL;
2010   if (expr && TREE_CODE (expr) == LABEL_EXPR)
2011     end_label = LABEL_EXPR_LABEL (expr);
2012
2013   /* If we don't care about jumping to the 'else' branch, jump to the end
2014      if the condition is false.  */
2015   if (!false_label_p)
2016     false_label_p = &end_label;
2017
2018   /* We only want to emit these labels if we aren't hijacking them.  */
2019   emit_end = (end_label == NULL_TREE);
2020   emit_false = (false_label == NULL_TREE);
2021
2022   /* We only emit the jump over the else clause if we have to--if the
2023      then clause may fall through.  Otherwise we can wind up with a
2024      useless jump and a useless label at the end of gimplified code,
2025      which will cause us to think that this conditional as a whole
2026      falls through even if it doesn't.  If we then inline a function
2027      which ends with such a condition, that can cause us to issue an
2028      inappropriate warning about control reaching the end of a
2029      non-void function.  */
2030   jump_over_else = block_may_fallthru (then_);
2031
2032   pred = shortcut_cond_r (pred, true_label_p, false_label_p);
2033
2034   expr = NULL;
2035   append_to_statement_list (pred, &expr);
2036
2037   append_to_statement_list (then_, &expr);
2038   if (else_se)
2039     {
2040       if (jump_over_else)
2041         {
2042           t = build_and_jump (&end_label);
2043           append_to_statement_list (t, &expr);
2044         }
2045       if (emit_false)
2046         {
2047           t = build1 (LABEL_EXPR, void_type_node, false_label);
2048           append_to_statement_list (t, &expr);
2049         }
2050       append_to_statement_list (else_, &expr);
2051     }
2052   if (emit_end && end_label)
2053     {
2054       t = build1 (LABEL_EXPR, void_type_node, end_label);
2055       append_to_statement_list (t, &expr);
2056     }
2057
2058   return expr;
2059 }
2060
2061 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE.  */
2062
2063 static tree
2064 gimple_boolify (tree expr)
2065 {
2066   tree type = TREE_TYPE (expr);
2067
2068   if (TREE_CODE (type) == BOOLEAN_TYPE)
2069     return 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                     fallback_t fallback)
2121 {
2122   tree expr = *expr_p;
2123   tree tmp, tmp2, type;
2124   enum gimplify_status ret;
2125
2126   type = TREE_TYPE (expr);
2127   if (!type)
2128     TREE_TYPE (expr) = void_type_node;
2129
2130   /* If this COND_EXPR has a value, copy the values into a temporary within
2131      the arms.  */
2132   else if (! VOID_TYPE_P (type))
2133     {
2134       tree result;
2135
2136       if (target)
2137         {
2138           ret = gimplify_expr (&target, pre_p, post_p,
2139                                is_gimple_min_lval, fb_lvalue);
2140           if (ret != GS_ERROR)
2141             ret = GS_OK;
2142           result = tmp = target;
2143           tmp2 = unshare_expr (target);
2144         }
2145       else if ((fallback & fb_lvalue) == 0)
2146         {
2147           result = tmp2 = tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2148           ret = GS_ALL_DONE;
2149         }
2150       else
2151         {
2152           tree type = build_pointer_type (TREE_TYPE (expr));
2153
2154           if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2155             TREE_OPERAND (expr, 1) =
2156               build_fold_addr_expr (TREE_OPERAND (expr, 1));
2157
2158           if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2159             TREE_OPERAND (expr, 2) =
2160               build_fold_addr_expr (TREE_OPERAND (expr, 2));
2161           
2162           tmp2 = tmp = create_tmp_var (type, "iftmp");
2163
2164           expr = build (COND_EXPR, void_type_node, TREE_OPERAND (expr, 0),
2165                         TREE_OPERAND (expr, 1), TREE_OPERAND (expr, 2));
2166
2167           result = build_fold_indirect_ref (tmp);
2168           ret = GS_ALL_DONE;
2169         }
2170
2171       /* Build the then clause, 't1 = a;'.  But don't build an assignment
2172          if this branch is void; in C++ it can be, if it's a throw.  */
2173       if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2174         TREE_OPERAND (expr, 1)
2175           = build (MODIFY_EXPR, void_type_node, tmp, TREE_OPERAND (expr, 1));
2176
2177       /* Build the else clause, 't1 = b;'.  */
2178       if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2179         TREE_OPERAND (expr, 2)
2180           = build (MODIFY_EXPR, void_type_node, tmp2, TREE_OPERAND (expr, 2));
2181
2182       TREE_TYPE (expr) = void_type_node;
2183       recalculate_side_effects (expr);
2184
2185       /* Move the COND_EXPR to the prequeue.  */
2186       gimplify_and_add (expr, pre_p);
2187
2188       *expr_p = result;
2189       return ret;
2190     }
2191
2192   /* Make sure the condition has BOOLEAN_TYPE.  */
2193   TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2194
2195   /* Break apart && and || conditions.  */
2196   if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2197       || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2198     {
2199       expr = shortcut_cond_expr (expr);
2200
2201       if (expr != *expr_p)
2202         {
2203           *expr_p = expr;
2204
2205           /* We can't rely on gimplify_expr to re-gimplify the expanded
2206              form properly, as cleanups might cause the target labels to be
2207              wrapped in a TRY_FINALLY_EXPR.  To prevent that, we need to
2208              set up a conditional context.  */
2209           gimple_push_condition ();
2210           gimplify_stmt (expr_p);
2211           gimple_pop_condition (pre_p);
2212
2213           return GS_ALL_DONE;
2214         }
2215     }
2216
2217   /* Now do the normal gimplification.  */
2218   ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2219                        is_gimple_condexpr, fb_rvalue);
2220
2221   gimple_push_condition ();
2222
2223   gimplify_to_stmt_list (&TREE_OPERAND (expr, 1));
2224   gimplify_to_stmt_list (&TREE_OPERAND (expr, 2));
2225   recalculate_side_effects (expr);
2226
2227   gimple_pop_condition (pre_p);
2228
2229   if (ret == GS_ERROR)
2230     ;
2231   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2232     ret = GS_ALL_DONE;
2233   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 2)))
2234     /* Rewrite "if (a); else b" to "if (!a) b"  */
2235     {
2236       TREE_OPERAND (expr, 0) = invert_truthvalue (TREE_OPERAND (expr, 0));
2237       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2238                            is_gimple_condexpr, fb_rvalue);
2239
2240       tmp = TREE_OPERAND (expr, 1);
2241       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 2);
2242       TREE_OPERAND (expr, 2) = tmp;
2243     }
2244   else
2245     /* Both arms are empty; replace the COND_EXPR with its predicate.  */
2246     expr = TREE_OPERAND (expr, 0);
2247
2248   *expr_p = expr;
2249   return ret;
2250 }
2251
2252 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2253    a call to __builtin_memcpy.  */
2254
2255 static enum gimplify_status
2256 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value)
2257 {
2258   tree args, t, to, to_ptr, from;
2259
2260   to = TREE_OPERAND (*expr_p, 0);
2261   from = TREE_OPERAND (*expr_p, 1);
2262
2263   args = tree_cons (NULL, size, NULL);
2264
2265   t = build_fold_addr_expr (from);
2266   args = tree_cons (NULL, t, args);
2267
2268   to_ptr = build_fold_addr_expr (to);
2269   args = tree_cons (NULL, to_ptr, args);
2270   t = implicit_built_in_decls[BUILT_IN_MEMCPY];
2271   t = build_function_call_expr (t, args);
2272
2273   if (want_value)
2274     {
2275       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2276       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2277     }
2278
2279   *expr_p = t;
2280   return GS_OK;
2281 }
2282
2283 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2284    a call to __builtin_memset.  In this case we know that the RHS is
2285    a CONSTRUCTOR with an empty element list.  */
2286
2287 static enum gimplify_status
2288 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value)
2289 {
2290   tree args, t, to, to_ptr;
2291
2292   to = TREE_OPERAND (*expr_p, 0);
2293
2294   args = tree_cons (NULL, size, NULL);
2295
2296   args = tree_cons (NULL, integer_zero_node, args);
2297
2298   to_ptr = build_fold_addr_expr (to);
2299   args = tree_cons (NULL, to_ptr, args);
2300   t = implicit_built_in_decls[BUILT_IN_MEMSET];
2301   t = build_function_call_expr (t, args);
2302
2303   if (want_value)
2304     {
2305       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2306       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2307     }
2308
2309   *expr_p = t;
2310   return GS_OK;
2311 }
2312
2313 /* A subroutine of gimplify_init_ctor_preeval.  Called via walk_tree,
2314    determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
2315    assignment.  Returns non-null if we detect a potential overlap.  */
2316
2317 struct gimplify_init_ctor_preeval_data
2318 {
2319   /* The base decl of the lhs object.  May be NULL, in which case we
2320      have to assume the lhs is indirect.  */
2321   tree lhs_base_decl;
2322
2323   /* The alias set of the lhs object.  */
2324   int lhs_alias_set;
2325 };
2326
2327 static tree
2328 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
2329 {
2330   struct gimplify_init_ctor_preeval_data *data
2331     = (struct gimplify_init_ctor_preeval_data *) xdata;
2332   tree t = *tp;
2333
2334   /* If we find the base object, obviously we have overlap.  */
2335   if (data->lhs_base_decl == t)
2336     return t;
2337
2338   /* If the constructor component is indirect, determine if we have a
2339      potential overlap with the lhs.  The only bits of information we
2340      have to go on at this point are addressability and alias sets.  */
2341   if (TREE_CODE (t) == INDIRECT_REF
2342       && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2343       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
2344     return t;
2345
2346   if (IS_TYPE_OR_DECL_P (t))
2347     *walk_subtrees = 0;
2348   return NULL;
2349 }
2350
2351 /* A subroutine of gimplify_init_constructor.  Pre-evaluate *EXPR_P,
2352    force values that overlap with the lhs (as described by *DATA)
2353    into temporaries.  */
2354
2355 static void
2356 gimplify_init_ctor_preeval (tree *expr_p, tree *pre_p, tree *post_p,
2357                             struct gimplify_init_ctor_preeval_data *data)
2358 {
2359   enum gimplify_status one;
2360
2361   /* If the value is invariant, then there's nothing to pre-evaluate.
2362      But ensure it doesn't have any side-effects since a SAVE_EXPR is
2363      invariant but has side effects and might contain a reference to
2364      the object we're initializing.  */
2365   if (TREE_INVARIANT (*expr_p) && !TREE_SIDE_EFFECTS (*expr_p))
2366     return;
2367
2368   /* If the type has non-trivial constructors, we can't pre-evaluate.  */
2369   if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
2370     return;
2371
2372   /* Recurse for nested constructors.  */
2373   if (TREE_CODE (*expr_p) == CONSTRUCTOR)
2374     {
2375       tree list;
2376       for (list = CONSTRUCTOR_ELTS (*expr_p); list ; list = TREE_CHAIN (list))
2377         gimplify_init_ctor_preeval (&TREE_VALUE (list), pre_p, post_p, data);
2378       return;
2379     }
2380
2381   /* We can't preevaluate if the type contains a placeholder.  */
2382   if (type_contains_placeholder_p (TREE_TYPE (*expr_p)))
2383     return;
2384
2385   /* Gimplify the constructor element to something appropriate for the rhs
2386      of a MODIFY_EXPR.  Given that we know the lhs is an aggregate, we know
2387      the gimplifier will consider this a store to memory.  Doing this
2388      gimplification now means that we won't have to deal with complicated
2389      language-specific trees, nor trees like SAVE_EXPR that can induce
2390      exponential search behavior.  */
2391   one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
2392   if (one == GS_ERROR)
2393     {
2394       *expr_p = NULL;
2395       return;
2396     }
2397
2398   /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
2399      with the lhs, since "a = { .x=a }" doesn't make sense.  This will
2400      always be true for all scalars, since is_gimple_mem_rhs insists on a
2401      temporary variable for them.  */
2402   if (DECL_P (*expr_p))
2403     return;
2404
2405   /* If this is of variable size, we have no choice but to assume it doesn't
2406      overlap since we can't make a temporary for it.  */
2407   if (!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (*expr_p))))
2408     return;
2409
2410   /* Otherwise, we must search for overlap ...  */
2411   if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
2412     return;
2413
2414   /* ... and if found, force the value into a temporary.  */
2415   *expr_p = get_formal_tmp_var (*expr_p, pre_p);
2416 }
2417
2418 /* A subroutine of gimplify_init_ctor_eval.  Create a loop for
2419    a RANGE_EXPR in a CONSTRUCTOR for an array.
2420
2421       var = lower;
2422     loop_entry:
2423       object[var] = value;
2424       if (var == upper)
2425         goto loop_exit;
2426       var = var + 1;
2427       goto loop_entry;
2428     loop_exit:
2429
2430    We increment var _after_ the loop exit check because we might otherwise
2431    fail if upper == TYPE_MAX_VALUE (type for upper).
2432
2433    Note that we never have to deal with SAVE_EXPRs here, because this has
2434    already been taken care of for us, in gimplify_init_ctor_preeval().  */
2435
2436 static void gimplify_init_ctor_eval (tree, tree, tree *, bool);
2437
2438 static void
2439 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
2440                                tree value, tree array_elt_type,
2441                                tree *pre_p, bool cleared)
2442 {
2443   tree loop_entry_label, loop_exit_label;
2444   tree var, var_type, cref;
2445
2446   loop_entry_label = create_artificial_label ();
2447   loop_exit_label = create_artificial_label ();
2448
2449   /* Create and initialize the index variable.  */
2450   var_type = TREE_TYPE (upper);
2451   var = create_tmp_var (var_type, NULL);
2452   append_to_statement_list (build2 (MODIFY_EXPR, var_type, var, lower), pre_p);
2453
2454   /* Add the loop entry label.  */
2455   append_to_statement_list (build1 (LABEL_EXPR,
2456                                     void_type_node,
2457                                     loop_entry_label),
2458                             pre_p);
2459
2460   /* Build the reference.  */
2461   cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
2462                  var, NULL_TREE, NULL_TREE);
2463
2464   /* If we are a constructor, just call gimplify_init_ctor_eval to do
2465      the store.  Otherwise just assign value to the reference.  */
2466
2467   if (TREE_CODE (value) == CONSTRUCTOR)
2468     /* NB we might have to call ourself recursively through
2469        gimplify_init_ctor_eval if the value is a constructor.  */
2470     gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2471                              pre_p, cleared);
2472   else
2473     append_to_statement_list (build2 (MODIFY_EXPR, TREE_TYPE (cref),
2474                                       cref, value),
2475                               pre_p);
2476
2477   /* We exit the loop when the index var is equal to the upper bound.  */
2478   gimplify_and_add (build3 (COND_EXPR, void_type_node,
2479                             build2 (EQ_EXPR, boolean_type_node,
2480                                     var, upper),
2481                             build1 (GOTO_EXPR,
2482                                     void_type_node,
2483                                     loop_exit_label),
2484                             NULL_TREE),
2485                     pre_p);
2486
2487   /* Otherwise, increment the index var...  */
2488   append_to_statement_list (build2 (MODIFY_EXPR, var_type, var,
2489                                     build2 (PLUS_EXPR, var_type, var,
2490                                             fold_convert (var_type,
2491                                                           integer_one_node))),
2492                             pre_p);
2493
2494   /* ...and jump back to the loop entry.  */
2495   append_to_statement_list (build1 (GOTO_EXPR,
2496                                     void_type_node,
2497                                     loop_entry_label),
2498                             pre_p);
2499
2500   /* Add the loop exit label.  */
2501   append_to_statement_list (build1 (LABEL_EXPR,
2502                                     void_type_node,
2503                                     loop_exit_label),
2504                             pre_p);
2505 }
2506
2507 /* Return true if FDECL is accessing a field that is zero sized.  */
2508    
2509 static bool
2510 zero_sized_field_decl (tree fdecl)
2511 {
2512   if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl) 
2513       && integer_zerop (DECL_SIZE (fdecl)))
2514     return true;
2515   return false;
2516 }
2517
2518 /* A subroutine of gimplify_init_constructor.  Generate individual
2519    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
2520    assignments should happen.  LIST is the CONSTRUCTOR_ELTS of the
2521    CONSTRUCTOR.  CLEARED is true if the entire LHS object has been
2522    zeroed first.  */
2523
2524 static void
2525 gimplify_init_ctor_eval (tree object, tree list, tree *pre_p, bool cleared)
2526 {
2527   tree array_elt_type = NULL;
2528
2529   if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
2530     array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
2531
2532   for (; list; list = TREE_CHAIN (list))
2533     {
2534       tree purpose, value, cref, init;
2535
2536       purpose = TREE_PURPOSE (list);
2537       value = TREE_VALUE (list);
2538
2539       /* NULL values are created above for gimplification errors.  */
2540       if (value == NULL)
2541         continue;
2542
2543       if (cleared && initializer_zerop (value))
2544         continue;
2545
2546       /* ??? Here's to hoping the front end fills in all of the indices,
2547          so we don't have to figure out what's missing ourselves.  */
2548       gcc_assert (purpose);
2549
2550       if (zero_sized_field_decl (purpose))
2551         continue;
2552
2553       /* If we have a RANGE_EXPR, we have to build a loop to assign the
2554          whole range.  */
2555       if (TREE_CODE (purpose) == RANGE_EXPR)
2556         {
2557           tree lower = TREE_OPERAND (purpose, 0);
2558           tree upper = TREE_OPERAND (purpose, 1);
2559
2560           /* If the lower bound is equal to upper, just treat it as if
2561              upper was the index.  */
2562           if (simple_cst_equal (lower, upper))
2563             purpose = upper;
2564           else
2565             {
2566               gimplify_init_ctor_eval_range (object, lower, upper, value,
2567                                              array_elt_type, pre_p, cleared);
2568               continue;
2569             }
2570         }
2571
2572       if (array_elt_type)
2573         {
2574           cref = build (ARRAY_REF, array_elt_type, unshare_expr (object),
2575                         purpose, NULL_TREE, NULL_TREE);
2576         }
2577       else
2578         cref = build (COMPONENT_REF, TREE_TYPE (purpose),
2579                       unshare_expr (object), purpose, NULL_TREE);
2580
2581       if (TREE_CODE (value) == CONSTRUCTOR)
2582         gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2583                                  pre_p, cleared);
2584       else
2585         {
2586           init = build (MODIFY_EXPR, TREE_TYPE (cref), cref, value);
2587           gimplify_and_add (init, pre_p);
2588         }
2589     }
2590 }
2591
2592 /* A subroutine of gimplify_modify_expr.  Break out elements of a
2593    CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
2594
2595    Note that we still need to clear any elements that don't have explicit
2596    initializers, so if not all elements are initialized we keep the
2597    original MODIFY_EXPR, we just remove all of the constructor elements.  */
2598
2599 static enum gimplify_status
2600 gimplify_init_constructor (tree *expr_p, tree *pre_p,
2601                            tree *post_p, bool want_value)
2602 {
2603   tree object;
2604   tree ctor = TREE_OPERAND (*expr_p, 1);
2605   tree type = TREE_TYPE (ctor);
2606   enum gimplify_status ret;
2607   tree elt_list;
2608
2609   if (TREE_CODE (ctor) != CONSTRUCTOR)
2610     return GS_UNHANDLED;
2611
2612   ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
2613                        is_gimple_lvalue, fb_lvalue);
2614   if (ret == GS_ERROR)
2615     return ret;
2616   object = TREE_OPERAND (*expr_p, 0);
2617
2618   elt_list = CONSTRUCTOR_ELTS (ctor);
2619
2620   ret = GS_ALL_DONE;
2621   switch (TREE_CODE (type))
2622     {
2623     case RECORD_TYPE:
2624     case UNION_TYPE:
2625     case QUAL_UNION_TYPE:
2626     case ARRAY_TYPE:
2627       {
2628         struct gimplify_init_ctor_preeval_data preeval_data;
2629         HOST_WIDE_INT num_type_elements, num_ctor_elements;
2630         HOST_WIDE_INT num_nonzero_elements, num_nonconstant_elements;
2631         bool cleared;
2632
2633         /* Aggregate types must lower constructors to initialization of
2634            individual elements.  The exception is that a CONSTRUCTOR node
2635            with no elements indicates zero-initialization of the whole.  */
2636         if (elt_list == NULL)
2637           break;
2638
2639         categorize_ctor_elements (ctor, &num_nonzero_elements,
2640                                   &num_nonconstant_elements,
2641                                   &num_ctor_elements, &cleared);
2642
2643         /* If a const aggregate variable is being initialized, then it
2644            should never be a lose to promote the variable to be static.  */
2645         if (num_nonconstant_elements == 0
2646             && num_nonzero_elements > 1
2647             && TREE_READONLY (object)
2648             && TREE_CODE (object) == VAR_DECL)
2649           {
2650             DECL_INITIAL (object) = ctor;
2651             TREE_STATIC (object) = 1;
2652             if (!DECL_NAME (object))
2653               DECL_NAME (object) = create_tmp_var_name ("C");
2654             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
2655
2656             /* ??? C++ doesn't automatically append a .<number> to the
2657                assembler name, and even when it does, it looks a FE private
2658                data structures to figure out what that number should be,
2659                which are not set for this variable.  I suppose this is
2660                important for local statics for inline functions, which aren't
2661                "local" in the object file sense.  So in order to get a unique
2662                TU-local symbol, we must invoke the lhd version now.  */
2663             lhd_set_decl_assembler_name (object);
2664
2665             *expr_p = NULL_TREE;
2666             break;
2667           }
2668
2669         /* If there are "lots" of initialized elements, even discounting
2670            those that are not address constants (and thus *must* be
2671            computed at runtime), then partition the constructor into
2672            constant and non-constant parts.  Block copy the constant
2673            parts in, then generate code for the non-constant parts.  */
2674         /* TODO.  There's code in cp/typeck.c to do this.  */
2675
2676         num_type_elements = count_type_elements (TREE_TYPE (ctor));
2677
2678         /* If there are "lots" of zeros, then block clear the object first.  */
2679         if (num_type_elements - num_nonzero_elements > CLEAR_RATIO
2680             && num_nonzero_elements < num_type_elements/4)
2681           cleared = true;
2682
2683         /* ??? This bit ought not be needed.  For any element not present
2684            in the initializer, we should simply set them to zero.  Except
2685            we'd need to *find* the elements that are not present, and that
2686            requires trickery to avoid quadratic compile-time behavior in
2687            large cases or excessive memory use in small cases.  */
2688         else if (num_ctor_elements < num_type_elements)
2689           cleared = true;
2690
2691         /* If there are "lots" of initialized elements, and all of them
2692            are valid address constants, then the entire initializer can
2693            be dropped to memory, and then memcpy'd out.  Don't do this
2694            for sparse arrays, though, as it's more efficient to follow
2695            the standard CONSTRUCTOR behavior of memset followed by
2696            individual element initialization.  */
2697         if (num_nonconstant_elements == 0 && !cleared)
2698           {
2699             HOST_WIDE_INT size = int_size_in_bytes (type);
2700             unsigned int align;
2701
2702             /* ??? We can still get unbounded array types, at least
2703                from the C++ front end.  This seems wrong, but attempt
2704                to work around it for now.  */
2705             if (size < 0)
2706               {
2707                 size = int_size_in_bytes (TREE_TYPE (object));
2708                 if (size >= 0)
2709                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
2710               }
2711
2712             /* Find the maximum alignment we can assume for the object.  */
2713             /* ??? Make use of DECL_OFFSET_ALIGN.  */
2714             if (DECL_P (object))
2715               align = DECL_ALIGN (object);
2716             else
2717               align = TYPE_ALIGN (type);
2718
2719             if (size > 0 && !can_move_by_pieces (size, align))
2720               {
2721                 tree new = create_tmp_var_raw (type, "C");
2722
2723                 gimple_add_tmp_var (new);
2724                 TREE_STATIC (new) = 1;
2725                 TREE_READONLY (new) = 1;
2726                 DECL_INITIAL (new) = ctor;
2727                 if (align > DECL_ALIGN (new))
2728                   {
2729                     DECL_ALIGN (new) = align;
2730                     DECL_USER_ALIGN (new) = 1;
2731                   }
2732                 walk_tree (&DECL_INITIAL (new), force_labels_r, NULL, NULL);
2733
2734                 TREE_OPERAND (*expr_p, 1) = new;
2735
2736                 /* This is no longer an assignment of a CONSTRUCTOR, but
2737                    we still may have processing to do on the LHS.  So
2738                    pretend we didn't do anything here to let that happen.  */
2739                 return GS_UNHANDLED;
2740               }
2741           }
2742
2743         if (cleared)
2744           {
2745             /* Zap the CONSTRUCTOR element list, which simplifies this case.
2746                Note that we still have to gimplify, in order to handle the
2747                case of variable sized types.  Avoid shared tree structures.  */
2748             CONSTRUCTOR_ELTS (ctor) = NULL_TREE;
2749             object = unshare_expr (object);
2750             gimplify_stmt (expr_p);
2751             append_to_statement_list (*expr_p, pre_p);
2752           }
2753
2754         /* If we have not block cleared the object, or if there are nonzero
2755            elements in the constructor, add assignments to the individual
2756            scalar fields of the object.  */
2757         if (!cleared || num_nonzero_elements > 0)
2758           {
2759             preeval_data.lhs_base_decl = get_base_address (object);
2760             if (!DECL_P (preeval_data.lhs_base_decl))
2761               preeval_data.lhs_base_decl = NULL;
2762             preeval_data.lhs_alias_set = get_alias_set (object);
2763
2764             gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
2765                                         pre_p, post_p, &preeval_data);
2766             gimplify_init_ctor_eval (object, elt_list, pre_p, cleared);
2767           }
2768
2769         *expr_p = NULL_TREE;
2770       }
2771       break;
2772
2773     case COMPLEX_TYPE:
2774       {
2775         tree r, i;
2776
2777         /* Extract the real and imaginary parts out of the ctor.  */
2778         r = i = NULL_TREE;
2779         if (elt_list)
2780           {
2781             r = TREE_VALUE (elt_list);
2782             elt_list = TREE_CHAIN (elt_list);
2783             if (elt_list)
2784               {
2785                 i = TREE_VALUE (elt_list);
2786                 gcc_assert (!TREE_CHAIN (elt_list));
2787               }
2788           }
2789         if (r == NULL || i == NULL)
2790           {
2791             tree zero = convert (TREE_TYPE (type), integer_zero_node);
2792             if (r == NULL)
2793               r = zero;
2794             if (i == NULL)
2795               i = zero;
2796           }
2797
2798         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
2799            represent creation of a complex value.  */
2800         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
2801           {
2802             ctor = build_complex (type, r, i);
2803             TREE_OPERAND (*expr_p, 1) = ctor;
2804           }
2805         else
2806           {
2807             ctor = build (COMPLEX_EXPR, type, r, i);
2808             TREE_OPERAND (*expr_p, 1) = ctor;
2809             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
2810                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
2811                                  fb_rvalue);
2812           }
2813       }
2814       break;
2815
2816     case VECTOR_TYPE:
2817       /* Go ahead and simplify constant constructors to VECTOR_CST.  */
2818       if (TREE_CONSTANT (ctor))
2819         {
2820           tree tem;
2821
2822           /* Even when ctor is constant, it might contain non-*_CST
2823              elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
2824              belong into VECTOR_CST nodes.  */
2825           for (tem = elt_list; tem; tem = TREE_CHAIN (tem))
2826             if (! CONSTANT_CLASS_P (TREE_VALUE (tem)))
2827               break;
2828
2829           if (! tem)
2830             {
2831               TREE_OPERAND (*expr_p, 1) = build_vector (type, elt_list);
2832               break;
2833             }
2834         }
2835
2836       /* Vector types use CONSTRUCTOR all the way through gimple
2837          compilation as a general initializer.  */
2838       for (; elt_list; elt_list = TREE_CHAIN (elt_list))
2839         {
2840           enum gimplify_status tret;
2841           tret = gimplify_expr (&TREE_VALUE (elt_list), pre_p, post_p,
2842                                 is_gimple_val, fb_rvalue);
2843           if (tret == GS_ERROR)
2844             ret = GS_ERROR;
2845         }
2846       break;
2847
2848     default:
2849       /* So how did we get a CONSTRUCTOR for a scalar type?  */
2850       gcc_unreachable ();
2851     }
2852
2853   if (ret == GS_ERROR)
2854     return GS_ERROR;
2855   else if (want_value)
2856     {
2857       append_to_statement_list (*expr_p, pre_p);
2858       *expr_p = object;
2859       return GS_OK;
2860     }
2861   else
2862     return GS_ALL_DONE;
2863 }
2864
2865 /* Given a pointer value OP0, return a simplified version of an
2866    indirection through OP0, or NULL_TREE if no simplification is
2867    possible.  This may only be applied to a rhs of an expression.
2868    Note that the resulting type may be different from the type pointed
2869    to in the sense that it is still compatible from the langhooks
2870    point of view. */
2871
2872 static tree
2873 fold_indirect_ref_rhs (tree t)
2874 {
2875   tree type = TREE_TYPE (TREE_TYPE (t));
2876   tree sub = t;
2877   tree subtype;
2878
2879   STRIP_NOPS (sub);
2880   subtype = TREE_TYPE (sub);
2881   if (!POINTER_TYPE_P (subtype))
2882     return NULL_TREE;
2883
2884   if (TREE_CODE (sub) == ADDR_EXPR)
2885     {
2886       tree op = TREE_OPERAND (sub, 0);
2887       tree optype = TREE_TYPE (op);
2888       /* *&p => p */
2889       if (lang_hooks.types_compatible_p (type, optype))
2890         return op;
2891       /* *(foo *)&fooarray => fooarray[0] */
2892       else if (TREE_CODE (optype) == ARRAY_TYPE
2893                && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
2894        {
2895          tree type_domain = TYPE_DOMAIN (optype);
2896          tree min_val = size_zero_node;
2897          if (type_domain && TYPE_MIN_VALUE (type_domain))
2898            min_val = TYPE_MIN_VALUE (type_domain);
2899          return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
2900        }
2901     }
2902
2903   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
2904   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
2905       && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
2906     {
2907       tree type_domain;
2908       tree min_val = size_zero_node;
2909       sub = fold_indirect_ref_rhs (sub);
2910       if (! sub)
2911         sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), sub);
2912       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
2913       if (type_domain && TYPE_MIN_VALUE (type_domain))
2914         min_val = TYPE_MIN_VALUE (type_domain);
2915       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
2916     }
2917
2918   return NULL_TREE;
2919 }
2920
2921 /* Subroutine of gimplify_modify_expr to do simplifications of MODIFY_EXPRs
2922    based on the code of the RHS.  We loop for as long as something changes.  */
2923
2924 static enum gimplify_status
2925 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
2926                           tree *post_p, bool want_value)
2927 {
2928   enum gimplify_status ret = GS_OK;
2929
2930   while (ret != GS_UNHANDLED)
2931     switch (TREE_CODE (*from_p))
2932       {
2933       case INDIRECT_REF:
2934         {
2935           /* If we have code like 
2936
2937                 *(const A*)(A*)&x
2938
2939              where the type of "x" is a (possibly cv-qualified variant
2940              of "A"), treat the entire expression as identical to "x".
2941              This kind of code arises in C++ when an object is bound
2942              to a const reference, and if "x" is a TARGET_EXPR we want
2943              to take advantage of the optimization below.  */
2944           tree t = fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
2945           if (t)
2946             {
2947               *from_p = t;
2948               ret = GS_OK;
2949             }
2950           else
2951             ret = GS_UNHANDLED;
2952           break;
2953         }
2954
2955       case TARGET_EXPR:
2956         {
2957           /* If we are initializing something from a TARGET_EXPR, strip the
2958              TARGET_EXPR and initialize it directly, if possible.  This can't
2959              be done if the initializer is void, since that implies that the
2960              temporary is set in some non-trivial way.
2961
2962              ??? What about code that pulls out the temp and uses it
2963              elsewhere? I think that such code never uses the TARGET_EXPR as
2964              an initializer.  If I'm wrong, we'll die because the temp won't
2965              have any RTL.  In that case, I guess we'll need to replace
2966              references somehow.  */
2967           tree init = TARGET_EXPR_INITIAL (*from_p);
2968
2969           if (!VOID_TYPE_P (TREE_TYPE (init)))
2970             {
2971               *from_p = init;
2972               ret = GS_OK;
2973             }
2974           else
2975             ret = GS_UNHANDLED;
2976         }
2977         break;
2978
2979       case COMPOUND_EXPR:
2980         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
2981            caught.  */
2982         gimplify_compound_expr (from_p, pre_p, true);
2983         ret = GS_OK;
2984         break;
2985
2986       case CONSTRUCTOR:
2987         /* If we're initializing from a CONSTRUCTOR, break this into
2988            individual MODIFY_EXPRs.  */
2989         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value);
2990
2991       case COND_EXPR:
2992         /* If we're assigning to a non-register type, push the assignment
2993            down into the branches.  This is mandatory for ADDRESSABLE types,
2994            since we cannot generate temporaries for such, but it saves a
2995            copy in other cases as well.  */
2996         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
2997           {
2998             *expr_p = *from_p;
2999             return gimplify_cond_expr (expr_p, pre_p, post_p, *to_p,
3000                                        fb_rvalue);
3001           }
3002         else
3003           ret = GS_UNHANDLED;
3004         break;
3005
3006       default:
3007         ret = GS_UNHANDLED;
3008         break;
3009       }
3010
3011   return ret;
3012 }
3013
3014 /* Gimplify the MODIFY_EXPR node pointed by EXPR_P.
3015
3016       modify_expr
3017               : varname '=' rhs
3018               | '*' ID '=' rhs
3019
3020     PRE_P points to the list where side effects that must happen before
3021         *EXPR_P should be stored.
3022
3023     POST_P points to the list where side effects that must happen after
3024         *EXPR_P should be stored.
3025
3026     WANT_VALUE is nonzero iff we want to use the value of this expression
3027         in another expression.  */
3028
3029 static enum gimplify_status
3030 gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
3031 {
3032   tree *from_p = &TREE_OPERAND (*expr_p, 1);
3033   tree *to_p = &TREE_OPERAND (*expr_p, 0);
3034   enum gimplify_status ret = GS_UNHANDLED;
3035
3036   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
3037               || TREE_CODE (*expr_p) == INIT_EXPR);
3038
3039   /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer useful.  */
3040   if (TREE_CODE (*expr_p) == INIT_EXPR)
3041     TREE_SET_CODE (*expr_p, MODIFY_EXPR);
3042
3043   /* See if any simplifications can be done based on what the RHS is.  */
3044   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3045                                   want_value);
3046   if (ret != GS_UNHANDLED)
3047     return ret;
3048
3049   /* If the value being copied is of variable width, compute the length
3050      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
3051      before gimplifying any of the operands so that we can resolve any
3052      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
3053      the size of the expression to be copied, not of the destination, so
3054      that is what we must here.  */
3055   maybe_with_size_expr (from_p);
3056
3057   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
3058   if (ret == GS_ERROR)
3059     return ret;
3060
3061   ret = gimplify_expr (from_p, pre_p, post_p,
3062                        rhs_predicate_for (*to_p), fb_rvalue);
3063   if (ret == GS_ERROR)
3064     return ret;
3065
3066   /* Now see if the above changed *from_p to something we handle specially.  */
3067   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3068                                   want_value);
3069   if (ret != GS_UNHANDLED)
3070     return ret;
3071
3072   /* If we've got a variable sized assignment between two lvalues (i.e. does
3073      not involve a call), then we can make things a bit more straightforward
3074      by converting the assignment to memcpy or memset.  */
3075   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
3076     {
3077       tree from = TREE_OPERAND (*from_p, 0);
3078       tree size = TREE_OPERAND (*from_p, 1);
3079
3080       if (TREE_CODE (from) == CONSTRUCTOR)
3081         return gimplify_modify_expr_to_memset (expr_p, size, want_value);
3082       if (is_gimple_addressable (from))
3083         {
3084           *from_p = from;
3085           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value);
3086         }
3087     }
3088
3089   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
3090     {
3091       /* If we've somehow already got an SSA_NAME on the LHS, then
3092          we're probably modified it twice.  Not good.  */
3093       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
3094       *to_p = make_ssa_name (*to_p, *expr_p);
3095     }
3096
3097   if (want_value)
3098     {
3099       append_to_statement_list (*expr_p, pre_p);
3100       *expr_p = *to_p;
3101       return GS_OK;
3102     }
3103
3104   return GS_ALL_DONE;
3105 }
3106
3107 /*  Gimplify a comparison between two variable-sized objects.  Do this
3108     with a call to BUILT_IN_MEMCMP.  */
3109
3110 static enum gimplify_status
3111 gimplify_variable_sized_compare (tree *expr_p)
3112 {
3113   tree op0 = TREE_OPERAND (*expr_p, 0);
3114   tree op1 = TREE_OPERAND (*expr_p, 1);
3115   tree args, t, dest;
3116
3117   t = TYPE_SIZE_UNIT (TREE_TYPE (op0));
3118   t = unshare_expr (t);
3119   t = SUBSTITUTE_PLACEHOLDER_IN_EXPR (t, op0);
3120   args = tree_cons (NULL, t, NULL);
3121   t = build_fold_addr_expr (op1);
3122   args = tree_cons (NULL, t, args);
3123   dest = build_fold_addr_expr (op0);
3124   args = tree_cons (NULL, dest, args);
3125   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
3126   t = build_function_call_expr (t, args);
3127   *expr_p
3128     = build (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
3129
3130   return GS_OK;
3131 }
3132
3133 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
3134     points to the expression to gimplify.
3135
3136     Expressions of the form 'a && b' are gimplified to:
3137
3138         a && b ? true : false
3139
3140     gimplify_cond_expr will do the rest.
3141
3142     PRE_P points to the list where side effects that must happen before
3143         *EXPR_P should be stored.  */
3144
3145 static enum gimplify_status
3146 gimplify_boolean_expr (tree *expr_p)
3147 {
3148   /* Preserve the original type of the expression.  */
3149   tree type = TREE_TYPE (*expr_p);
3150
3151   *expr_p = build (COND_EXPR, type, *expr_p,
3152                    convert (type, boolean_true_node),
3153                    convert (type, boolean_false_node));
3154
3155   return GS_OK;
3156 }
3157
3158 /* Gimplifies an expression sequence.  This function gimplifies each
3159    expression and re-writes the original expression with the last
3160    expression of the sequence in GIMPLE form.
3161
3162    PRE_P points to the list where the side effects for all the
3163        expressions in the sequence will be emitted.
3164
3165    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
3166 /* ??? Should rearrange to share the pre-queue with all the indirect
3167    invocations of gimplify_expr.  Would probably save on creations
3168    of statement_list nodes.  */
3169
3170 static enum gimplify_status
3171 gimplify_compound_expr (tree *expr_p, tree *pre_p, bool want_value)
3172 {
3173   tree t = *expr_p;
3174
3175   do
3176     {
3177       tree *sub_p = &TREE_OPERAND (t, 0);
3178
3179       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
3180         gimplify_compound_expr (sub_p, pre_p, false);
3181       else
3182         gimplify_stmt (sub_p);
3183       append_to_statement_list (*sub_p, pre_p);
3184
3185       t = TREE_OPERAND (t, 1);
3186     }
3187   while (TREE_CODE (t) == COMPOUND_EXPR);
3188
3189   *expr_p = t;
3190   if (want_value)
3191     return GS_OK;
3192   else
3193     {
3194       gimplify_stmt (expr_p);
3195       return GS_ALL_DONE;
3196     }
3197 }
3198
3199 /* Gimplifies a statement list.  These may be created either by an
3200    enlightened front-end, or by shortcut_cond_expr.  */
3201
3202 static enum gimplify_status
3203 gimplify_statement_list (tree *expr_p)
3204 {
3205   tree_stmt_iterator i = tsi_start (*expr_p);
3206
3207   while (!tsi_end_p (i))
3208     {
3209       tree t;
3210
3211       gimplify_stmt (tsi_stmt_ptr (i));
3212
3213       t = tsi_stmt (i);
3214       if (t == NULL)
3215         tsi_delink (&i);
3216       else if (TREE_CODE (t) == STATEMENT_LIST)
3217         {
3218           tsi_link_before (&i, t, TSI_SAME_STMT);
3219           tsi_delink (&i);
3220         }
3221       else
3222         tsi_next (&i);
3223     }
3224
3225   return GS_ALL_DONE;
3226 }
3227
3228 /*  Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
3229     gimplify.  After gimplification, EXPR_P will point to a new temporary
3230     that holds the original value of the SAVE_EXPR node.
3231
3232     PRE_P points to the list where side effects that must happen before
3233         *EXPR_P should be stored.  */
3234
3235 static enum gimplify_status
3236 gimplify_save_expr (tree *expr_p, tree *pre_p, tree *post_p)
3237 {
3238   enum gimplify_status ret = GS_ALL_DONE;
3239   tree val;
3240
3241   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
3242   val = TREE_OPERAND (*expr_p, 0);
3243
3244   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
3245   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
3246     {
3247       /* The operand may be a void-valued expression such as SAVE_EXPRs
3248          generated by the Java frontend for class initialization.  It is
3249          being executed only for its side-effects.  */
3250       if (TREE_TYPE (val) == void_type_node)
3251         {
3252           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3253                                is_gimple_stmt, fb_none);
3254           append_to_statement_list (TREE_OPERAND (*expr_p, 0), pre_p);
3255           val = NULL;
3256         }
3257       else
3258         val = get_initialized_tmp_var (val, pre_p, post_p);
3259
3260       TREE_OPERAND (*expr_p, 0) = val;
3261       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
3262     }
3263
3264   *expr_p = val;
3265
3266   return ret;
3267 }
3268
3269 /*  Re-write the ADDR_EXPR node pointed by EXPR_P
3270
3271       unary_expr
3272               : ...
3273               | '&' varname
3274               ...
3275
3276     PRE_P points to the list where side effects that must happen before
3277         *EXPR_P should be stored.
3278
3279     POST_P points to the list where side effects that must happen after
3280         *EXPR_P should be stored.  */
3281
3282 static enum gimplify_status
3283 gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
3284 {
3285   tree expr = *expr_p;
3286   tree op0 = TREE_OPERAND (expr, 0);
3287   enum gimplify_status ret;
3288
3289   switch (TREE_CODE (op0))
3290     {
3291     case INDIRECT_REF:
3292     case MISALIGNED_INDIRECT_REF:
3293     do_indirect_ref:
3294       /* Check if we are dealing with an expression of the form '&*ptr'.
3295          While the front end folds away '&*ptr' into 'ptr', these
3296          expressions may be generated internally by the compiler (e.g.,
3297          builtins like __builtin_va_end).  */
3298       /* Caution: the silent array decomposition semantics we allow for
3299          ADDR_EXPR means we can't always discard the pair.  */
3300       /* Gimplification of the ADDR_EXPR operand may drop
3301          cv-qualification conversions, so make sure we add them if
3302          needed.  */
3303       {
3304         tree op00 = TREE_OPERAND (op0, 0);
3305         tree t_expr = TREE_TYPE (expr);
3306         tree t_op00 = TREE_TYPE (op00);
3307
3308         if (!lang_hooks.types_compatible_p (t_expr, t_op00))
3309           {
3310 #ifdef ENABLE_CHECKING
3311             tree t_op0 = TREE_TYPE (op0);
3312             gcc_assert (POINTER_TYPE_P (t_expr)
3313                         && cpt_same_type (TREE_CODE (t_op0) == ARRAY_TYPE
3314                                           ? TREE_TYPE (t_op0) : t_op0,
3315                                           TREE_TYPE (t_expr))
3316                         && POINTER_TYPE_P (t_op00)
3317                         && cpt_same_type (t_op0, TREE_TYPE (t_op00)));
3318 #endif
3319             op00 = fold_convert (TREE_TYPE (expr), op00);
3320           }
3321         *expr_p = op00;
3322         ret = GS_OK;
3323       }
3324       break;
3325
3326     case VIEW_CONVERT_EXPR:
3327       /* Take the address of our operand and then convert it to the type of
3328          this ADDR_EXPR.
3329
3330          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
3331          all clear.  The impact of this transformation is even less clear.  */
3332
3333       /* If the operand is a useless conversion, look through it.  Doing so
3334          guarantees that the ADDR_EXPR and its operand will remain of the
3335          same type.  */
3336       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
3337         op0 = TREE_OPERAND (op0, 0);
3338
3339       *expr_p = fold_convert (TREE_TYPE (expr),
3340                               build_fold_addr_expr (TREE_OPERAND (op0, 0)));
3341       ret = GS_OK;
3342       break;
3343
3344     default:
3345       /* We use fb_either here because the C frontend sometimes takes
3346          the address of a call that returns a struct; see
3347          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
3348          the implied temporary explicit.  */
3349       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
3350                            is_gimple_addressable, fb_either);
3351       if (ret != GS_ERROR)
3352         {
3353           op0 = TREE_OPERAND (expr, 0);
3354
3355           /* For various reasons, the gimplification of the expression
3356              may have made a new INDIRECT_REF.  */
3357           if (TREE_CODE (op0) == INDIRECT_REF)
3358             goto do_indirect_ref;
3359
3360           /* Make sure TREE_INVARIANT, TREE_CONSTANT, and TREE_SIDE_EFFECTS
3361              is set properly.  */
3362           recompute_tree_invarant_for_addr_expr (expr);
3363
3364           /* Mark the RHS addressable.  */
3365           lang_hooks.mark_addressable (TREE_OPERAND (expr, 0));
3366         }
3367       break;
3368     }
3369
3370   return ret;
3371 }
3372
3373 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
3374    value; output operands should be a gimple lvalue.  */
3375
3376 static enum gimplify_status
3377 gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
3378 {
3379   tree expr = *expr_p;
3380   int noutputs = list_length (ASM_OUTPUTS (expr));
3381   const char **oconstraints
3382     = (const char **) alloca ((noutputs) * sizeof (const char *));
3383   int i;
3384   tree link;
3385   const char *constraint;
3386   bool allows_mem, allows_reg, is_inout;
3387   enum gimplify_status ret, tret;
3388
3389   ret = GS_ALL_DONE;
3390   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = TREE_CHAIN (link))
3391     {
3392       size_t constraint_len;
3393       oconstraints[i] = constraint
3394         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3395       constraint_len = strlen (constraint);
3396       if (constraint_len == 0)
3397         continue;
3398
3399       parse_output_constraint (&constraint, i, 0, 0,
3400                                &allows_mem, &allows_reg, &is_inout);
3401
3402       if (!allows_reg && allows_mem)
3403         lang_hooks.mark_addressable (TREE_VALUE (link));
3404
3405       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3406                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
3407                             fb_lvalue | fb_mayfail);
3408       if (tret == GS_ERROR)
3409         {
3410           error ("invalid lvalue in asm output %d", i);
3411           ret = tret;
3412         }
3413
3414       if (is_inout)
3415         {
3416           /* An input/output operand.  To give the optimizers more
3417              flexibility, split it into separate input and output
3418              operands.  */
3419           tree input;
3420           char buf[10];
3421
3422           /* Turn the in/out constraint into an output constraint.  */
3423           char *p = xstrdup (constraint);
3424           p[0] = '=';
3425           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
3426
3427           /* And add a matching input constraint.  */
3428           if (allows_reg)
3429             {
3430               sprintf (buf, "%d", i);
3431
3432               /* If there are multiple alternatives in the constraint,
3433                  handle each of them individually.  Those that allow register
3434                  will be replaced with operand number, the others will stay
3435                  unchanged.  */
3436               if (strchr (p, ',') != NULL)
3437                 {
3438                   size_t len = 0, buflen = strlen (buf);
3439                   char *beg, *end, *str, *dst;
3440
3441                   for (beg = p + 1;;)
3442                     {
3443                       end = strchr (beg, ',');
3444                       if (end == NULL)
3445                         end = strchr (beg, '\0');
3446                       if ((size_t) (end - beg) < buflen)
3447                         len += buflen + 1;
3448                       else
3449                         len += end - beg + 1;
3450                       if (*end)
3451                         beg = end + 1;
3452                       else
3453                         break;
3454                     }
3455
3456                   str = alloca (len);
3457                   for (beg = p + 1, dst = str;;)
3458                     {
3459                       const char *tem;
3460                       bool mem_p, reg_p, inout_p;
3461
3462                       end = strchr (beg, ',');
3463                       if (end)
3464                         *end = '\0';
3465                       beg[-1] = '=';
3466                       tem = beg - 1;
3467                       parse_output_constraint (&tem, i, 0, 0,
3468                                                &mem_p, &reg_p, &inout_p);
3469                       if (dst != str)
3470                         *dst++ = ',';
3471                       if (reg_p)
3472                         {
3473                           memcpy (dst, buf, buflen);
3474                           dst += buflen;
3475                         }
3476                       else
3477                         {
3478                           if (end)
3479                             len = end - beg;
3480                           else
3481                             len = strlen (beg);
3482                           memcpy (dst, beg, len);
3483                           dst += len;
3484                         }
3485                       if (end)
3486                         beg = end + 1;
3487                       else
3488                         break;
3489                     }
3490                   *dst = '\0';
3491                   input = build_string (dst - str, str);
3492                 }
3493               else
3494                 input = build_string (strlen (buf), buf);
3495             }
3496           else
3497             input = build_string (constraint_len - 1, constraint + 1);
3498
3499           free (p);
3500
3501           input = build_tree_list (build_tree_list (NULL_TREE, input),
3502                                    unshare_expr (TREE_VALUE (link)));
3503           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
3504         }
3505     }
3506
3507   for (link = ASM_INPUTS (expr); link; ++i, link = TREE_CHAIN (link))
3508     {
3509       constraint
3510         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3511       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
3512                               oconstraints, &allows_mem, &allows_reg);
3513
3514       /* If the operand is a memory input, it should be an lvalue.  */
3515       if (!allows_reg && allows_mem)
3516         {
3517           lang_hooks.mark_addressable (TREE_VALUE (link));
3518           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3519                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
3520           if (tret == GS_ERROR)
3521             {
3522               error ("memory input %d is not directly addressable", i);
3523               ret = tret;
3524             }
3525         }
3526       else
3527         {
3528           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
3529                                 is_gimple_asm_val, fb_rvalue);
3530           if (tret == GS_ERROR)
3531             ret = tret;
3532         }
3533     }
3534
3535   return ret;
3536 }
3537
3538 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
3539    WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
3540    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
3541    return to this function.
3542
3543    FIXME should we complexify the prequeue handling instead?  Or use flags
3544    for all the cleanups and let the optimizer tighten them up?  The current
3545    code seems pretty fragile; it will break on a cleanup within any
3546    non-conditional nesting.  But any such nesting would be broken, anyway;
3547    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
3548    and continues out of it.  We can do that at the RTL level, though, so
3549    having an optimizer to tighten up try/finally regions would be a Good
3550    Thing.  */
3551
3552 static enum gimplify_status
3553 gimplify_cleanup_point_expr (tree *expr_p, tree *pre_p)
3554 {
3555   tree_stmt_iterator iter;
3556   tree body;
3557
3558   tree temp = voidify_wrapper_expr (*expr_p, NULL);
3559
3560   /* We only care about the number of conditions between the innermost
3561      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count.  */
3562   int old_conds = gimplify_ctxp->conditions;
3563   gimplify_ctxp->conditions = 0;
3564
3565   body = TREE_OPERAND (*expr_p, 0);
3566   gimplify_to_stmt_list (&body);
3567
3568   gimplify_ctxp->conditions = old_conds;
3569
3570   for (iter = tsi_start (body); !tsi_end_p (iter); )
3571     {
3572       tree *wce_p = tsi_stmt_ptr (iter);
3573       tree wce = *wce_p;
3574
3575       if (TREE_CODE (wce) == WITH_CLEANUP_EXPR)
3576         {
3577           if (tsi_one_before_end_p (iter))
3578             {
3579               tsi_link_before (&iter, TREE_OPERAND (wce, 0), TSI_SAME_STMT);
3580               tsi_delink (&iter);
3581               break;
3582             }
3583           else
3584             {
3585               tree sl, tfe;
3586               enum tree_code code;
3587
3588               if (CLEANUP_EH_ONLY (wce))
3589                 code = TRY_CATCH_EXPR;
3590               else
3591                 code = TRY_FINALLY_EXPR;
3592
3593               sl = tsi_split_statement_list_after (&iter);
3594               tfe = build (code, void_type_node, sl, NULL_TREE);
3595               append_to_statement_list (TREE_OPERAND (wce, 0),
3596                                         &TREE_OPERAND (tfe, 1));
3597               *wce_p = tfe;
3598               iter = tsi_start (sl);
3599             }
3600         }
3601       else
3602         tsi_next (&iter);
3603     }
3604
3605   if (temp)
3606     {
3607       *expr_p = temp;
3608       append_to_statement_list (body, pre_p);
3609       return GS_OK;
3610     }
3611   else
3612     {
3613       *expr_p = body;
3614       return GS_ALL_DONE;
3615     }
3616 }
3617
3618 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
3619    is the cleanup action required.  */
3620
3621 static void
3622 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, tree *pre_p)
3623 {
3624   tree wce;
3625
3626   /* Errors can result in improperly nested cleanups.  Which results in
3627      confusion when trying to resolve the WITH_CLEANUP_EXPR.  */
3628   if (errorcount || sorrycount)
3629     return;
3630
3631   if (gimple_conditional_context ())
3632     {
3633       /* If we're in a conditional context, this is more complex.  We only
3634          want to run the cleanup if we actually ran the initialization that
3635          necessitates it, but we want to run it after the end of the
3636          conditional context.  So we wrap the try/finally around the
3637          condition and use a flag to determine whether or not to actually
3638          run the destructor.  Thus
3639
3640            test ? f(A()) : 0
3641
3642          becomes (approximately)
3643
3644            flag = 0;
3645            try {
3646              if (test) { A::A(temp); flag = 1; val = f(temp); }
3647              else { val = 0; }
3648            } finally {
3649              if (flag) A::~A(temp);
3650            }
3651            val
3652       */
3653
3654       tree flag = create_tmp_var (boolean_type_node, "cleanup");
3655       tree ffalse = build (MODIFY_EXPR, void_type_node, flag,
3656                            boolean_false_node);
3657       tree ftrue = build (MODIFY_EXPR, void_type_node, flag,
3658                           boolean_true_node);
3659       cleanup = build (COND_EXPR, void_type_node, flag, cleanup, NULL);
3660       wce = build (WITH_CLEANUP_EXPR, void_type_node, cleanup);
3661       append_to_statement_list (ffalse, &gimplify_ctxp->conditional_cleanups);
3662       append_to_statement_list (wce, &gimplify_ctxp->conditional_cleanups);
3663       append_to_statement_list (ftrue, pre_p);
3664
3665       /* Because of this manipulation, and the EH edges that jump
3666          threading cannot redirect, the temporary (VAR) will appear
3667          to be used uninitialized.  Don't warn.  */
3668       TREE_NO_WARNING (var) = 1;
3669     }
3670   else
3671     {
3672       wce = build (WITH_CLEANUP_EXPR, void_type_node, cleanup);
3673       CLEANUP_EH_ONLY (wce) = eh_only;
3674       append_to_statement_list (wce, pre_p);
3675     }
3676
3677   gimplify_stmt (&TREE_OPERAND (wce, 0));
3678 }
3679
3680 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
3681
3682 static enum gimplify_status
3683 gimplify_target_expr (tree *expr_p, tree *pre_p, tree *post_p)
3684 {
3685   tree targ = *expr_p;
3686   tree temp = TARGET_EXPR_SLOT (targ);
3687   tree init = TARGET_EXPR_INITIAL (targ);
3688   enum gimplify_status ret;
3689
3690   if (init)
3691     {
3692       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
3693          to the temps list.  */
3694       gimple_add_tmp_var (temp);
3695
3696       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
3697          expression is supposed to initialize the slot.  */
3698       if (VOID_TYPE_P (TREE_TYPE (init)))
3699         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
3700       else
3701         {
3702           /* Special handling for BIND_EXPR can result in fewer temps.  */
3703           ret = GS_OK;
3704           if (TREE_CODE (init) == BIND_EXPR)
3705             gimplify_bind_expr (&init, temp, pre_p);
3706           if (init != temp)
3707             {
3708               init = build (MODIFY_EXPR, void_type_node, temp, init);
3709               ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt,
3710                                    fb_none);
3711             }
3712         }
3713       if (ret == GS_ERROR)
3714         return GS_ERROR;
3715       append_to_statement_list (init, pre_p);
3716
3717       /* If needed, push the cleanup for the temp.  */
3718       if (TARGET_EXPR_CLEANUP (targ))
3719         {
3720           gimplify_stmt (&TARGET_EXPR_CLEANUP (targ));
3721           gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
3722                                CLEANUP_EH_ONLY (targ), pre_p);
3723         }
3724
3725       /* Only expand this once.  */
3726       TREE_OPERAND (targ, 3) = init;
3727       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
3728     }
3729   else
3730     /* We should have expanded this before.  */
3731     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
3732
3733   *expr_p = temp;
3734   return GS_OK;
3735 }
3736
3737 /* Gimplification of expression trees.  */
3738
3739 /* Gimplify an expression which appears at statement context; usually, this
3740    means replacing it with a suitably gimple STATEMENT_LIST.  */
3741
3742 void
3743 gimplify_stmt (tree *stmt_p)
3744 {
3745   gimplify_expr (stmt_p, NULL, NULL, is_gimple_stmt, fb_none);
3746 }
3747
3748 /* Similarly, but force the result to be a STATEMENT_LIST.  */
3749
3750 void
3751 gimplify_to_stmt_list (tree *stmt_p)
3752 {
3753   gimplify_stmt (stmt_p);
3754   if (!*stmt_p)
3755     *stmt_p = alloc_stmt_list ();
3756   else if (TREE_CODE (*stmt_p) != STATEMENT_LIST)
3757     {
3758       tree t = *stmt_p;
3759       *stmt_p = alloc_stmt_list ();
3760       append_to_statement_list (t, stmt_p);
3761     }
3762 }
3763
3764
3765 /*  Gimplifies the expression tree pointed by EXPR_P.  Return 0 if
3766     gimplification failed.
3767
3768     PRE_P points to the list where side effects that must happen before
3769         EXPR should be stored.
3770
3771     POST_P points to the list where side effects that must happen after
3772         EXPR should be stored, or NULL if there is no suitable list.  In
3773         that case, we copy the result to a temporary, emit the
3774         post-effects, and then return the temporary.
3775
3776     GIMPLE_TEST_F points to a function that takes a tree T and
3777         returns nonzero if T is in the GIMPLE form requested by the
3778         caller.  The GIMPLE predicates are in tree-gimple.c.
3779
3780         This test is used twice.  Before gimplification, the test is
3781         invoked to determine whether *EXPR_P is already gimple enough.  If
3782         that fails, *EXPR_P is gimplified according to its code and
3783         GIMPLE_TEST_F is called again.  If the test still fails, then a new
3784         temporary variable is created and assigned the value of the
3785         gimplified expression.
3786
3787     FALLBACK tells the function what sort of a temporary we want.  If the 1
3788         bit is set, an rvalue is OK.  If the 2 bit is set, an lvalue is OK.
3789         If both are set, either is OK, but an lvalue is preferable.
3790
3791     The return value is either GS_ERROR or GS_ALL_DONE, since this function
3792     iterates until solution.  */
3793
3794 enum gimplify_status
3795 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
3796                bool (* gimple_test_f) (tree), fallback_t fallback)
3797 {
3798   tree tmp;
3799   tree internal_pre = NULL_TREE;
3800   tree internal_post = NULL_TREE;
3801   tree save_expr;
3802   int is_statement = (pre_p == NULL);
3803   location_t saved_location;
3804   enum gimplify_status ret;
3805
3806   save_expr = *expr_p;
3807   if (save_expr == NULL_TREE)
3808     return GS_ALL_DONE;
3809
3810   /* We used to check the predicate here and return immediately if it
3811      succeeds.  This is wrong; the design is for gimplification to be
3812      idempotent, and for the predicates to only test for valid forms, not
3813      whether they are fully simplified.  */
3814
3815   /* Set up our internal queues if needed.  */
3816   if (pre_p == NULL)
3817     pre_p = &internal_pre;
3818   if (post_p == NULL)
3819     post_p = &internal_post;
3820
3821   saved_location = input_location;
3822   if (save_expr != error_mark_node
3823       && EXPR_HAS_LOCATION (*expr_p))
3824     input_location = EXPR_LOCATION (*expr_p);
3825
3826   /* Loop over the specific gimplifiers until the toplevel node
3827      remains the same.  */
3828   do
3829     {
3830       /* Strip away as many useless type conversions as possible
3831          at the toplevel.  */
3832       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
3833
3834       /* Remember the expr.  */
3835       save_expr = *expr_p;
3836
3837       /* Die, die, die, my darling.  */
3838       if (save_expr == error_mark_node
3839           || (TREE_TYPE (save_expr)
3840               && TREE_TYPE (save_expr) == error_mark_node))
3841         {
3842           ret = GS_ERROR;
3843           break;
3844         }
3845
3846       /* Do any language-specific gimplification.  */
3847       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
3848       if (ret == GS_OK)
3849         {
3850           if (*expr_p == NULL_TREE)
3851             break;
3852           if (*expr_p != save_expr)
3853             continue;
3854         }
3855       else if (ret != GS_UNHANDLED)
3856         break;
3857
3858       ret = GS_OK;
3859       switch (TREE_CODE (*expr_p))
3860         {
3861           /* First deal with the special cases.  */
3862
3863         case POSTINCREMENT_EXPR:
3864         case POSTDECREMENT_EXPR:
3865         case PREINCREMENT_EXPR:
3866         case PREDECREMENT_EXPR:
3867           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
3868                                         fallback != fb_none);
3869           break;
3870
3871         case ARRAY_REF:
3872         case ARRAY_RANGE_REF:
3873         case REALPART_EXPR:
3874         case IMAGPART_EXPR:
3875         case COMPONENT_REF:
3876         case VIEW_CONVERT_EXPR:
3877           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
3878                                         fallback ? fallback : fb_rvalue);
3879           break;
3880
3881         case COND_EXPR:
3882           ret = gimplify_cond_expr (expr_p, pre_p, post_p, NULL_TREE,
3883                                     fallback);
3884           /* C99 code may assign to an array in a structure value of a
3885              conditional expression, and this has undefined behavior
3886              only on execution, so create a temporary if an lvalue is
3887              required.  */
3888           if (fallback == fb_lvalue)
3889             {
3890               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
3891               lang_hooks.mark_addressable (*expr_p);
3892             }
3893           break;
3894
3895         case CALL_EXPR:
3896           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
3897           /* C99 code may assign to an array in a structure returned
3898              from a function, and this has undefined behavior only on
3899              execution, so create a temporary if an lvalue is
3900              required.  */
3901           if (fallback == fb_lvalue)
3902             {
3903               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
3904               lang_hooks.mark_addressable (*expr_p);
3905             }
3906           break;
3907
3908         case TREE_LIST:
3909           gcc_unreachable ();
3910
3911         case COMPOUND_EXPR:
3912           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
3913           break;
3914
3915         case MODIFY_EXPR:
3916         case INIT_EXPR:
3917           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
3918                                       fallback != fb_none);
3919           break;
3920
3921         case TRUTH_ANDIF_EXPR:
3922         case TRUTH_ORIF_EXPR:
3923           ret = gimplify_boolean_expr (expr_p);
3924           break;
3925
3926         case TRUTH_NOT_EXPR:
3927           TREE_OPERAND (*expr_p, 0)
3928             = gimple_boolify (TREE_OPERAND (*expr_p, 0));
3929           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3930                                is_gimple_val, fb_rvalue);
3931           recalculate_side_effects (*expr_p);
3932           break;
3933
3934         case ADDR_EXPR:
3935           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
3936           break;
3937
3938         case VA_ARG_EXPR:
3939           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
3940           break;
3941
3942         case CONVERT_EXPR:
3943         case NOP_EXPR:
3944           if (IS_EMPTY_STMT (*expr_p))
3945             {
3946               ret = GS_ALL_DONE;
3947               break;
3948             }
3949
3950           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
3951               || fallback == fb_none)
3952             {
3953               /* Just strip a conversion to void (or in void context) and
3954                  try again.  */
3955               *expr_p = TREE_OPERAND (*expr_p, 0);
3956               break;
3957             }
3958
3959           ret = gimplify_conversion (expr_p);
3960           if (ret == GS_ERROR)
3961             break;
3962           if (*expr_p != save_expr)
3963             break;
3964           /* FALLTHRU */
3965
3966         case FIX_TRUNC_EXPR:
3967         case FIX_CEIL_EXPR:
3968         case FIX_FLOOR_EXPR:
3969         case FIX_ROUND_EXPR:
3970           /* unary_expr: ... | '(' cast ')' val | ...  */
3971           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3972                                is_gimple_val, fb_rvalue);
3973           recalculate_side_effects (*expr_p);
3974           break;
3975
3976         case INDIRECT_REF:
3977           *expr_p = fold_indirect_ref (*expr_p);
3978           if (*expr_p != save_expr)
3979             break;
3980           /* else fall through.  */
3981         case ALIGN_INDIRECT_REF:
3982         case MISALIGNED_INDIRECT_REF:
3983           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3984                                is_gimple_reg, fb_rvalue);
3985           recalculate_side_effects (*expr_p);
3986           break;
3987
3988           /* Constants need not be gimplified.  */
3989         case INTEGER_CST:
3990         case REAL_CST:
3991         case STRING_CST:
3992         case COMPLEX_CST:
3993         case VECTOR_CST:
3994           ret = GS_ALL_DONE;
3995           break;
3996
3997         case CONST_DECL:
3998           /* If we require an lvalue, such as for ADDR_EXPR, retain the
3999              CONST_DECL node.  Otherwise the decl is replaceable by its
4000              value.  */
4001           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
4002           if (fallback & fb_lvalue)
4003             ret = GS_ALL_DONE;
4004           else
4005             *expr_p = DECL_INITIAL (*expr_p);
4006           break;
4007
4008         case DECL_EXPR:
4009           ret = gimplify_decl_expr (expr_p);
4010           break;
4011
4012         case EXC_PTR_EXPR:
4013           /* FIXME make this a decl.  */
4014           ret = GS_ALL_DONE;
4015           break;
4016
4017         case BIND_EXPR:
4018           ret = gimplify_bind_expr (expr_p, NULL, pre_p);
4019           break;
4020
4021         case LOOP_EXPR:
4022           ret = gimplify_loop_expr (expr_p, pre_p);
4023           break;
4024
4025         case SWITCH_EXPR:
4026           ret = gimplify_switch_expr (expr_p, pre_p);
4027           break;
4028
4029         case EXIT_EXPR:
4030           ret = gimplify_exit_expr (expr_p);
4031           break;
4032
4033         case GOTO_EXPR:
4034           /* If the target is not LABEL, then it is a computed jump
4035              and the target needs to be gimplified.  */
4036           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
4037             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
4038                                  NULL, is_gimple_val, fb_rvalue);
4039           break;
4040
4041         case LABEL_EXPR:
4042           ret = GS_ALL_DONE;
4043           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
4044                       == current_function_decl);
4045           break;
4046
4047         case CASE_LABEL_EXPR:
4048           ret = gimplify_case_label_expr (expr_p);
4049           break;
4050
4051         case RETURN_EXPR:
4052           ret = gimplify_return_expr (*expr_p, pre_p);
4053           break;
4054
4055         case CONSTRUCTOR:
4056           /* Don't reduce this in place; let gimplify_init_constructor work its
4057              magic.  Buf if we're just elaborating this for side effects, just
4058              gimplify any element that has side-effects.  */
4059           if (fallback == fb_none)
4060             {
4061               for (tmp = CONSTRUCTOR_ELTS (*expr_p); tmp;
4062                    tmp = TREE_CHAIN (tmp))
4063                 if (TREE_SIDE_EFFECTS (TREE_VALUE (tmp)))
4064                   gimplify_expr (&TREE_VALUE (tmp), pre_p, post_p,
4065                                  gimple_test_f, fallback);
4066
4067               *expr_p = NULL_TREE;
4068             }
4069
4070           ret = GS_ALL_DONE;
4071           break;
4072
4073           /* The following are special cases that are not handled by the
4074              original GIMPLE grammar.  */
4075
4076           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
4077              eliminated.  */
4078         case SAVE_EXPR:
4079           ret = gimplify_save_expr (expr_p, pre_p, post_p);
4080           break;
4081
4082         case BIT_FIELD_REF:
4083           {
4084             enum gimplify_status r0, r1, r2;
4085
4086             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4087                                 is_gimple_lvalue, fb_either);
4088             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
4089                                 is_gimple_val, fb_rvalue);
4090             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
4091                                 is_gimple_val, fb_rvalue);
4092             recalculate_side_effects (*expr_p);
4093
4094             ret = MIN (r0, MIN (r1, r2));
4095           }
4096           break;
4097
4098         case NON_LVALUE_EXPR:
4099           /* This should have been stripped above.  */
4100           gcc_unreachable ();
4101
4102         case ASM_EXPR:
4103           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
4104           break;
4105
4106         case TRY_FINALLY_EXPR:
4107         case TRY_CATCH_EXPR:
4108           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
4109           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
4110           ret = GS_ALL_DONE;
4111           break;
4112
4113         case CLEANUP_POINT_EXPR:
4114           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
4115           break;
4116
4117         case TARGET_EXPR:
4118           ret = gimplify_target_expr (expr_p, pre_p, post_p);
4119           break;
4120
4121         case CATCH_EXPR:
4122           gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
4123           ret = GS_ALL_DONE;
4124           break;
4125
4126         case EH_FILTER_EXPR:
4127           gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
4128           ret = GS_ALL_DONE;
4129           break;
4130
4131         case OBJ_TYPE_REF:
4132           {
4133             enum gimplify_status r0, r1;
4134             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
4135                                 is_gimple_val, fb_rvalue);
4136             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
4137                                 is_gimple_val, fb_rvalue);
4138             ret = MIN (r0, r1);
4139           }
4140           break;
4141
4142         case LABEL_DECL:
4143           /* We get here when taking the address of a label.  We mark
4144              the label as "forced"; meaning it can never be removed and
4145              it is a potential target for any computed goto.  */
4146           FORCED_LABEL (*expr_p) = 1;
4147           ret = GS_ALL_DONE;
4148           break;
4149
4150         case STATEMENT_LIST:
4151           ret = gimplify_statement_list (expr_p);
4152           break;
4153
4154         case WITH_SIZE_EXPR:
4155           {
4156             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
4157                            post_p == &internal_post ? NULL : post_p,
4158                            gimple_test_f, fallback);
4159             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
4160                            is_gimple_val, fb_rvalue);
4161           }
4162           break;
4163
4164         case VAR_DECL:
4165           /* ??? If this is a local variable, and it has not been seen in any
4166              outer BIND_EXPR, then it's probably the result of a duplicate
4167              declaration, for which we've already issued an error.  It would
4168              be really nice if the front end wouldn't leak these at all.
4169              Currently the only known culprit is C++ destructors, as seen
4170              in g++.old-deja/g++.jason/binding.C.  */
4171           tmp = *expr_p;
4172           if (!TREE_STATIC (tmp) && !DECL_EXTERNAL (tmp)
4173               && decl_function_context (tmp) == current_function_decl
4174               && !DECL_SEEN_IN_BIND_EXPR_P (tmp))
4175             {
4176               gcc_assert (errorcount || sorrycount);
4177               ret = GS_ERROR;
4178               break;
4179             }
4180           /* FALLTHRU */
4181
4182         case PARM_DECL:
4183           tmp = *expr_p;
4184
4185           /* If this is a local variable sized decl, it must be accessed
4186              indirectly.  Perform that substitution.  */
4187           if (DECL_HAS_VALUE_EXPR_P (tmp))
4188             {
4189               *expr_p = unshare_expr (DECL_VALUE_EXPR (tmp));
4190               ret = GS_OK;
4191               break;
4192             }
4193
4194           ret = GS_ALL_DONE;
4195           break;
4196
4197         case SSA_NAME:
4198           /* Allow callbacks into the gimplifier during optimization.  */
4199           ret = GS_ALL_DONE;
4200           break;
4201
4202         default:
4203           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
4204             {
4205             case tcc_comparison:
4206               /* If this is a comparison of objects of aggregate type,
4207                  handle it specially (by converting to a call to
4208                  memcmp).  It would be nice to only have to do this
4209                  for variable-sized objects, but then we'd have to
4210                  allow the same nest of reference nodes we allow for
4211                  MODIFY_EXPR and that's too complex.  */
4212               if (!AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 1))))
4213                 goto expr_2;
4214               ret = gimplify_variable_sized_compare (expr_p);
4215               break;
4216
4217             /* If *EXPR_P does not need to be special-cased, handle it
4218                according to its class.  */
4219             case tcc_unary:
4220               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
4221                                    post_p, is_gimple_val, fb_rvalue);
4222               break;
4223
4224             case tcc_binary:
4225             expr_2:
4226               {
4227                 enum gimplify_status r0, r1;
4228
4229                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
4230                                     post_p, is_gimple_val, fb_rvalue);
4231                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
4232                                     post_p, is_gimple_val, fb_rvalue);
4233
4234                 ret = MIN (r0, r1);
4235                 break;
4236               }
4237
4238             case tcc_declaration:
4239             case tcc_constant:
4240               ret = GS_ALL_DONE;
4241               goto dont_recalculate;
4242
4243             default:
4244               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
4245                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
4246                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
4247               goto expr_2;
4248             }
4249
4250           recalculate_side_effects (*expr_p);
4251         dont_recalculate:
4252           break;
4253         }
4254
4255       /* If we replaced *expr_p, gimplify again.  */
4256       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
4257         ret = GS_ALL_DONE;
4258     }
4259   while (ret == GS_OK);
4260
4261   /* If we encountered an error_mark somewhere nested inside, either
4262      stub out the statement or propagate the error back out.  */
4263   if (ret == GS_ERROR)
4264     {
4265       if (is_statement)
4266         *expr_p = NULL;
4267       goto out;
4268     }
4269
4270   /* This was only valid as a return value from the langhook, which
4271      we handled.  Make sure it doesn't escape from any other context.  */
4272   gcc_assert (ret != GS_UNHANDLED);
4273
4274   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
4275     {
4276       /* We aren't looking for a value, and we don't have a valid
4277          statement.  If it doesn't have side-effects, throw it away.  */
4278       if (!TREE_SIDE_EFFECTS (*expr_p))
4279         *expr_p = NULL;
4280       else if (!TREE_THIS_VOLATILE (*expr_p))
4281         {
4282           /* This is probably a _REF that contains something nested that
4283              has side effects.  Recurse through the operands to find it.  */
4284           enum tree_code code = TREE_CODE (*expr_p);
4285
4286           switch (code)
4287             {
4288             case COMPONENT_REF:
4289             case REALPART_EXPR: case IMAGPART_EXPR:
4290               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4291                              gimple_test_f, fallback);
4292               break;
4293
4294             case ARRAY_REF: case ARRAY_RANGE_REF:
4295               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4296                              gimple_test_f, fallback);
4297               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
4298                              gimple_test_f, fallback);
4299               break;
4300
4301             default:
4302                /* Anything else with side-effects must be converted to
4303                   a valid statement before we get here.  */
4304               gcc_unreachable ();
4305             }
4306
4307           *expr_p = NULL;
4308         }
4309       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p)))
4310         {
4311           /* Historically, the compiler has treated a bare
4312              reference to a volatile lvalue as forcing a load.  */
4313           tree tmp = create_tmp_var (TREE_TYPE (*expr_p), "vol");
4314           *expr_p = build (MODIFY_EXPR, TREE_TYPE (tmp), tmp, *expr_p);
4315         }
4316       else
4317         /* We can't do anything useful with a volatile reference to
4318            incomplete type, so just throw it away.  */
4319         *expr_p = NULL;
4320     }
4321
4322   /* If we are gimplifying at the statement level, we're done.  Tack
4323      everything together and replace the original statement with the
4324      gimplified form.  */
4325   if (fallback == fb_none || is_statement)
4326     {
4327       if (internal_pre || internal_post)
4328         {
4329           append_to_statement_list (*expr_p, &internal_pre);
4330           append_to_statement_list (internal_post, &internal_pre);
4331           annotate_all_with_locus (&internal_pre, input_location);
4332           *expr_p = internal_pre;
4333         }
4334       else if (!*expr_p)
4335         ;
4336       else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
4337         annotate_all_with_locus (expr_p, input_location);
4338       else
4339         annotate_one_with_locus (*expr_p, input_location);
4340       goto out;
4341     }
4342
4343   /* Otherwise we're gimplifying a subexpression, so the resulting value is
4344      interesting.  */
4345
4346   /* If it's sufficiently simple already, we're done.  Unless we are
4347      handling some post-effects internally; if that's the case, we need to
4348      copy into a temp before adding the post-effects to the tree.  */
4349   if (!internal_post && (*gimple_test_f) (*expr_p))
4350     goto out;
4351
4352   /* Otherwise, we need to create a new temporary for the gimplified
4353      expression.  */
4354
4355   /* We can't return an lvalue if we have an internal postqueue.  The
4356      object the lvalue refers to would (probably) be modified by the
4357      postqueue; we need to copy the value out first, which means an
4358      rvalue.  */
4359   if ((fallback & fb_lvalue) && !internal_post
4360       && is_gimple_addressable (*expr_p))
4361     {
4362       /* An lvalue will do.  Take the address of the expression, store it
4363          in a temporary, and replace the expression with an INDIRECT_REF of
4364          that temporary.  */
4365       tmp = build_fold_addr_expr (*expr_p);
4366       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
4367       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
4368     }
4369   else if ((fallback & fb_rvalue) && is_gimple_formal_tmp_rhs (*expr_p))
4370     {
4371       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
4372
4373       /* An rvalue will do.  Assign the gimplified expression into a new
4374          temporary TMP and replace the original expression with TMP.  */
4375
4376       if (internal_post || (fallback & fb_lvalue))
4377         /* The postqueue might change the value of the expression between
4378            the initialization and use of the temporary, so we can't use a
4379            formal temp.  FIXME do we care?  */
4380         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
4381       else
4382         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
4383
4384       if (TREE_CODE (*expr_p) != SSA_NAME)
4385         DECL_GIMPLE_FORMAL_TEMP_P (*expr_p) = 1;
4386     }
4387   else
4388     {
4389 #ifdef ENABLE_CHECKING
4390       if (!(fallback & fb_mayfail))
4391         {
4392           fprintf (stderr, "gimplification failed:\n");
4393           print_generic_expr (stderr, *expr_p, 0);
4394           debug_tree (*expr_p);
4395           internal_error ("gimplification failed");
4396         }
4397 #endif
4398       gcc_assert (fallback & fb_mayfail);
4399       /* If this is an asm statement, and the user asked for the
4400          impossible, don't die.  Fail and let gimplify_asm_expr
4401          issue an error.  */
4402       ret = GS_ERROR;
4403       goto out;
4404     }
4405
4406   /* Make sure the temporary matches our predicate.  */
4407   gcc_assert ((*gimple_test_f) (*expr_p));
4408
4409   if (internal_post)
4410     {
4411       annotate_all_with_locus (&internal_post, input_location);
4412       append_to_statement_list (internal_post, pre_p);
4413     }
4414
4415  out:
4416   input_location = saved_location;
4417   return ret;
4418 }
4419
4420 /* Look through TYPE for variable-sized objects and gimplify each such
4421    size that we find.  Add to LIST_P any statements generated.  */
4422
4423 void
4424 gimplify_type_sizes (tree type, tree *list_p)
4425 {
4426   tree field, t;
4427
4428   if (type == NULL)
4429     return;
4430
4431   /* We first do the main variant, then copy into any other variants.  */
4432   type = TYPE_MAIN_VARIANT (type);
4433
4434   /* Avoid infinite recursion.  */
4435   if (TYPE_SIZES_GIMPLIFIED (type)
4436       || type == error_mark_node)
4437     return;
4438
4439   TYPE_SIZES_GIMPLIFIED (type) = 1;
4440
4441   switch (TREE_CODE (type))
4442     {
4443     case INTEGER_TYPE:
4444     case ENUMERAL_TYPE:
4445     case BOOLEAN_TYPE:
4446     case CHAR_TYPE:
4447     case REAL_TYPE:
4448       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
4449       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
4450
4451       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
4452         {
4453           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
4454           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
4455         }
4456       break;
4457
4458     case ARRAY_TYPE:
4459       /* These types may not have declarations, so handle them here.  */
4460       gimplify_type_sizes (TREE_TYPE (type), list_p);
4461       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
4462       break;
4463
4464     case RECORD_TYPE:
4465     case UNION_TYPE:
4466     case QUAL_UNION_TYPE:
4467       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4468         if (TREE_CODE (field) == FIELD_DECL)
4469           {
4470             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
4471             gimplify_type_sizes (TREE_TYPE (field), list_p);
4472           }
4473       break;
4474
4475     case POINTER_TYPE:
4476     case REFERENCE_TYPE:
4477       gimplify_type_sizes (TREE_TYPE (type), list_p);
4478       break;
4479
4480     default:
4481       break;
4482     }
4483
4484   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
4485   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
4486
4487   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
4488     {
4489       TYPE_SIZE (t) = TYPE_SIZE (type);
4490       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
4491       TYPE_SIZES_GIMPLIFIED (t) = 1;
4492     }
4493 }
4494
4495 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
4496    a size or position, has had all of its SAVE_EXPRs evaluated.
4497    We add any required statements to STMT_P.  */
4498
4499 void
4500 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
4501 {
4502   /* We don't do anything if the value isn't there, is constant, or contains
4503      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
4504      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
4505      will want to replace it with a new variable, but that will cause problems
4506      if this type is from outside the function.  It's OK to have that here.  */
4507   if (*expr_p == NULL_TREE || TREE_CONSTANT (*expr_p)
4508       || TREE_CODE (*expr_p) == VAR_DECL
4509       || CONTAINS_PLACEHOLDER_P (*expr_p))
4510     return;
4511
4512   *expr_p = unshare_expr (*expr_p);
4513   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
4514 }
4515 \f
4516 #ifdef ENABLE_CHECKING
4517 /* Compare types A and B for a "close enough" match.  */
4518
4519 static bool
4520 cpt_same_type (tree a, tree b)
4521 {
4522   if (lang_hooks.types_compatible_p (a, b))
4523     return true;
4524
4525   /* ??? The C++ FE decomposes METHOD_TYPES to FUNCTION_TYPES and doesn't
4526      link them together.  This routine is intended to catch type errors
4527      that will affect the optimizers, and the optimizers don't add new
4528      dereferences of function pointers, so ignore it.  */
4529   if ((TREE_CODE (a) == FUNCTION_TYPE || TREE_CODE (a) == METHOD_TYPE)
4530       && (TREE_CODE (b) == FUNCTION_TYPE || TREE_CODE (b) == METHOD_TYPE))
4531     return true;
4532
4533   /* ??? The C FE pushes type qualifiers after the fact into the type of
4534      the element from the type of the array.  See build_unary_op's handling
4535      of ADDR_EXPR.  This seems wrong -- if we were going to do this, we
4536      should have done it when creating the variable in the first place.
4537      Alternately, why aren't the two array types made variants?  */
4538   if (TREE_CODE (a) == ARRAY_TYPE && TREE_CODE (b) == ARRAY_TYPE)
4539     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
4540
4541   /* And because of those, we have to recurse down through pointers.  */
4542   if (POINTER_TYPE_P (a) && POINTER_TYPE_P (b))
4543     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
4544
4545   return false;
4546 }
4547
4548 /* Check for some cases of the front end missing cast expressions.
4549    The type of a dereference should correspond to the pointer type;
4550    similarly the type of an address should match its object.  */
4551
4552 static tree
4553 check_pointer_types_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
4554                        void *data ATTRIBUTE_UNUSED)
4555 {
4556   tree t = *tp;
4557   tree ptype, otype, dtype;
4558
4559   switch (TREE_CODE (t))
4560     {
4561     case INDIRECT_REF:
4562     case ARRAY_REF:
4563       otype = TREE_TYPE (t);
4564       ptype = TREE_TYPE (TREE_OPERAND (t, 0));
4565       dtype = TREE_TYPE (ptype);
4566       gcc_assert (cpt_same_type (otype, dtype));
4567       break;
4568
4569     case ADDR_EXPR:
4570       ptype = TREE_TYPE (t);
4571       otype = TREE_TYPE (TREE_OPERAND (t, 0));
4572       dtype = TREE_TYPE (ptype);
4573       if (!cpt_same_type (otype, dtype))
4574         {
4575           /* &array is allowed to produce a pointer to the element, rather than
4576              a pointer to the array type.  We must allow this in order to
4577              properly represent assigning the address of an array in C into
4578              pointer to the element type.  */
4579           gcc_assert (TREE_CODE (otype) == ARRAY_TYPE
4580                       && POINTER_TYPE_P (ptype)
4581                       && cpt_same_type (TREE_TYPE (otype), dtype));
4582           break;
4583         }
4584       break;
4585
4586     default:
4587       return NULL_TREE;
4588     }
4589
4590
4591   return NULL_TREE;
4592 }
4593 #endif
4594
4595 /* Gimplify the body of statements pointed by BODY_P.  FNDECL is the
4596    function decl containing BODY.  */
4597
4598 void
4599 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
4600 {
4601   location_t saved_location = input_location;
4602   tree body, parm_stmts;
4603
4604   timevar_push (TV_TREE_GIMPLIFY);
4605   push_gimplify_context ();
4606
4607   /* Unshare most shared trees in the body and in that of any nested functions.
4608      It would seem we don't have to do this for nested functions because
4609      they are supposed to be output and then the outer function gimplified
4610      first, but the g++ front end doesn't always do it that way.  */
4611   unshare_body (body_p, fndecl);
4612   unvisit_body (body_p, fndecl);
4613
4614   /* Make sure input_location isn't set to something wierd.  */
4615   input_location = DECL_SOURCE_LOCATION (fndecl);
4616
4617   /* Resolve callee-copies.  This has to be done before processing
4618      the body so that DECL_VALUE_EXPR gets processed correctly.  */
4619   parm_stmts = do_parms ? gimplify_parameters () : NULL;
4620
4621   /* Gimplify the function's body.  */
4622   gimplify_stmt (body_p);
4623   body = *body_p;
4624
4625   if (!body)
4626     body = alloc_stmt_list ();
4627   else if (TREE_CODE (body) == STATEMENT_LIST)
4628     {
4629       tree t = expr_only (*body_p);
4630       if (t)
4631         body = t;
4632     }
4633
4634   /* If there isn't an outer BIND_EXPR, add one.  */
4635   if (TREE_CODE (body) != BIND_EXPR)
4636     {
4637       tree b = build (BIND_EXPR, void_type_node, NULL_TREE,
4638                       NULL_TREE, NULL_TREE);
4639       TREE_SIDE_EFFECTS (b) = 1;
4640       append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
4641       body = b;
4642     }
4643
4644   /* If we had callee-copies statements, insert them at the beginning
4645      of the function.  */
4646   if (parm_stmts)
4647     {
4648       append_to_statement_list_force (BIND_EXPR_BODY (body), &parm_stmts);
4649       BIND_EXPR_BODY (body) = parm_stmts;
4650     }
4651
4652   /* Unshare again, in case gimplification was sloppy.  */
4653   unshare_all_trees (body);
4654
4655   *body_p = body;
4656
4657   pop_gimplify_context (body);
4658
4659 #ifdef ENABLE_CHECKING
4660   walk_tree (body_p, check_pointer_types_r, NULL, NULL);
4661 #endif
4662
4663   timevar_pop (TV_TREE_GIMPLIFY);
4664   input_location = saved_location;
4665 }
4666
4667 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
4668    node for the function we want to gimplify.  */
4669
4670 void
4671 gimplify_function_tree (tree fndecl)
4672 {
4673   tree oldfn;
4674
4675   oldfn = current_function_decl;
4676   current_function_decl = fndecl;
4677   cfun = DECL_STRUCT_FUNCTION (fndecl);
4678   if (cfun == NULL)
4679     allocate_struct_function (fndecl);
4680
4681   gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
4682
4683   /* If we're instrumenting function entry/exit, then prepend the call to
4684      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
4685      catch the exit hook.  */
4686   /* ??? Add some way to ignore exceptions for this TFE.  */
4687   if (flag_instrument_function_entry_exit
4688       && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl))
4689     {
4690       tree tf, x, bind;
4691
4692       tf = build (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
4693       TREE_SIDE_EFFECTS (tf) = 1;
4694       x = DECL_SAVED_TREE (fndecl);
4695       append_to_statement_list (x, &TREE_OPERAND (tf, 0));
4696       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
4697       x = build_function_call_expr (x, NULL);
4698       append_to_statement_list (x, &TREE_OPERAND (tf, 1));
4699
4700       bind = build (BIND_EXPR, void_type_node, NULL, NULL, NULL);
4701       TREE_SIDE_EFFECTS (bind) = 1;
4702       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
4703       x = build_function_call_expr (x, NULL);
4704       append_to_statement_list (x, &BIND_EXPR_BODY (bind));
4705       append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
4706
4707       DECL_SAVED_TREE (fndecl) = bind;
4708     }
4709
4710   current_function_decl = oldfn;
4711   cfun = oldfn ? DECL_STRUCT_FUNCTION (oldfn) : NULL;
4712 }
4713
4714 \f
4715 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
4716    force the result to be either ssa_name or an invariant, otherwise
4717    just force it to be a rhs expression.  If VAR is not NULL, make the
4718    base variable of the final destination be VAR if suitable.  */
4719
4720 tree
4721 force_gimple_operand (tree expr, tree *stmts, bool simple, tree var)
4722 {
4723   tree t;
4724   enum gimplify_status ret;
4725   gimple_predicate gimple_test_f;
4726
4727   *stmts = NULL_TREE;
4728
4729   if (is_gimple_val (expr))
4730     return expr;
4731
4732   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
4733
4734   push_gimplify_context ();
4735   gimplify_ctxp->into_ssa = in_ssa_p;
4736
4737   if (var)
4738     expr = build (MODIFY_EXPR, TREE_TYPE (var), var, expr);
4739
4740   ret = gimplify_expr (&expr, stmts, NULL,
4741                        gimple_test_f, fb_rvalue);
4742   gcc_assert (ret != GS_ERROR);
4743
4744   if (referenced_vars)
4745     {
4746       for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
4747         add_referenced_tmp_var (t);
4748     }
4749
4750   pop_gimplify_context (NULL);
4751
4752   return expr;
4753 }
4754
4755 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
4756    some statements are produced, emits them before BSI.  */
4757
4758 tree
4759 force_gimple_operand_bsi (block_stmt_iterator *bsi, tree expr,
4760                           bool simple_p, tree var)
4761 {
4762   tree stmts;
4763
4764   expr = force_gimple_operand (expr, &stmts, simple_p, var);
4765   if (stmts)
4766     bsi_insert_before (bsi, stmts, BSI_SAME_STMT);
4767
4768   return expr;
4769 }
4770
4771 #include "gt-gimplify.h"