OSDN Git Service

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