OSDN Git Service

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