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