OSDN Git Service

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