OSDN Git Service

PR preprocessor/30805:
[pf3gnuchains/gcc-fork.git] / gcc / gimplify.c
1 /* Tree lowering pass.  This pass converts the GENERIC functions-as-trees
2    tree representation into the GIMPLE form.
3    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
4    Free Software Foundation, Inc.
5    Major work done by Sebastian Pop <s.pop@laposte.net>,
6    Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
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 #include "optabs.h"
50 #include "pointer-set.h"
51 #include "splay-tree.h"
52
53
54 enum gimplify_omp_var_data
55 {
56   GOVD_SEEN = 1,
57   GOVD_EXPLICIT = 2,
58   GOVD_SHARED = 4,
59   GOVD_PRIVATE = 8,
60   GOVD_FIRSTPRIVATE = 16,
61   GOVD_LASTPRIVATE = 32,
62   GOVD_REDUCTION = 64,
63   GOVD_LOCAL = 128,
64   GOVD_DEBUG_PRIVATE = 256,
65   GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
66                            | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LOCAL)
67 };
68
69 struct gimplify_omp_ctx
70 {
71   struct gimplify_omp_ctx *outer_context;
72   splay_tree variables;
73   struct pointer_set_t *privatized_types;
74   location_t location;
75   enum omp_clause_default_kind default_kind;
76   bool is_parallel;
77   bool is_combined_parallel;
78 };
79
80 struct gimplify_ctx
81 {
82   struct gimplify_ctx *prev_context;
83
84   tree current_bind_expr;
85   tree temps;
86   tree conditional_cleanups;
87   tree exit_label;
88   tree return_temp;
89   
90   VEC(tree,heap) *case_labels;
91   /* The formal temporary table.  Should this be persistent?  */
92   htab_t temp_htab;
93
94   int conditions;
95   bool save_stack;
96   bool into_ssa;
97 };
98
99 static struct gimplify_ctx *gimplify_ctxp;
100 static struct gimplify_omp_ctx *gimplify_omp_ctxp;
101
102
103
104 /* Formal (expression) temporary table handling: Multiple occurrences of
105    the same scalar expression are evaluated into the same temporary.  */
106
107 typedef struct gimple_temp_hash_elt
108 {
109   tree val;   /* Key */
110   tree temp;  /* Value */
111 } elt_t;
112
113 /* Forward declarations.  */
114 static enum gimplify_status gimplify_compound_expr (tree *, tree *, bool);
115
116 /* Mark X addressable.  Unlike the langhook we expect X to be in gimple
117    form and we don't do any syntax checking.  */
118 static void
119 mark_addressable (tree x)
120 {
121   while (handled_component_p (x))
122     x = TREE_OPERAND (x, 0);
123   if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
124     return ;
125   TREE_ADDRESSABLE (x) = 1;
126 }
127
128 /* Return a hash value for a formal temporary table entry.  */
129
130 static hashval_t
131 gimple_tree_hash (const void *p)
132 {
133   tree t = ((const elt_t *) p)->val;
134   return iterative_hash_expr (t, 0);
135 }
136
137 /* Compare two formal temporary table entries.  */
138
139 static int
140 gimple_tree_eq (const void *p1, const void *p2)
141 {
142   tree t1 = ((const elt_t *) p1)->val;
143   tree t2 = ((const elt_t *) p2)->val;
144   enum tree_code code = TREE_CODE (t1);
145
146   if (TREE_CODE (t2) != code
147       || TREE_TYPE (t1) != TREE_TYPE (t2))
148     return 0;
149
150   if (!operand_equal_p (t1, t2, 0))
151     return 0;
152
153   /* Only allow them to compare equal if they also hash equal; otherwise
154      results are nondeterminate, and we fail bootstrap comparison.  */
155   gcc_assert (gimple_tree_hash (p1) == gimple_tree_hash (p2));
156
157   return 1;
158 }
159
160 /* Set up a context for the gimplifier.  */
161
162 void
163 push_gimplify_context (void)
164 {
165   struct gimplify_ctx *c;
166
167   c = (struct gimplify_ctx *) xcalloc (1, sizeof (struct gimplify_ctx));
168   c->prev_context = gimplify_ctxp;
169   if (optimize)
170     c->temp_htab = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
171
172   gimplify_ctxp = c;
173 }
174
175 /* Tear down a context for the gimplifier.  If BODY is non-null, then
176    put the temporaries into the outer BIND_EXPR.  Otherwise, put them
177    in the unexpanded_var_list.  */
178
179 void
180 pop_gimplify_context (tree body)
181 {
182   struct gimplify_ctx *c = gimplify_ctxp;
183   tree t;
184
185   gcc_assert (c && !c->current_bind_expr);
186   gimplify_ctxp = c->prev_context;
187
188   for (t = c->temps; t ; t = TREE_CHAIN (t))
189     DECL_GIMPLE_FORMAL_TEMP_P (t) = 0;
190
191   if (body)
192     declare_vars (c->temps, body, false);
193   else
194     record_vars (c->temps);
195
196   if (optimize)
197     htab_delete (c->temp_htab);
198   free (c);
199 }
200
201 static void
202 gimple_push_bind_expr (tree bind)
203 {
204   TREE_CHAIN (bind) = gimplify_ctxp->current_bind_expr;
205   gimplify_ctxp->current_bind_expr = bind;
206 }
207
208 static void
209 gimple_pop_bind_expr (void)
210 {
211   gimplify_ctxp->current_bind_expr
212     = TREE_CHAIN (gimplify_ctxp->current_bind_expr);
213 }
214
215 tree
216 gimple_current_bind_expr (void)
217 {
218   return gimplify_ctxp->current_bind_expr;
219 }
220
221 /* Returns true iff there is a COND_EXPR between us and the innermost
222    CLEANUP_POINT_EXPR.  This info is used by gimple_push_cleanup.  */
223
224 static bool
225 gimple_conditional_context (void)
226 {
227   return gimplify_ctxp->conditions > 0;
228 }
229
230 /* Note that we've entered a COND_EXPR.  */
231
232 static void
233 gimple_push_condition (void)
234 {
235 #ifdef ENABLE_CHECKING
236   if (gimplify_ctxp->conditions == 0)
237     gcc_assert (!gimplify_ctxp->conditional_cleanups);
238 #endif
239   ++(gimplify_ctxp->conditions);
240 }
241
242 /* Note that we've left a COND_EXPR.  If we're back at unconditional scope
243    now, add any conditional cleanups we've seen to the prequeue.  */
244
245 static void
246 gimple_pop_condition (tree *pre_p)
247 {
248   int conds = --(gimplify_ctxp->conditions);
249
250   gcc_assert (conds >= 0);
251   if (conds == 0)
252     {
253       append_to_statement_list (gimplify_ctxp->conditional_cleanups, pre_p);
254       gimplify_ctxp->conditional_cleanups = NULL_TREE;
255     }
256 }
257
258 /* A stable comparison routine for use with splay trees and DECLs.  */
259
260 static int
261 splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb)
262 {
263   tree a = (tree) xa;
264   tree b = (tree) xb;
265
266   return DECL_UID (a) - DECL_UID (b);
267 }
268
269 /* Create a new omp construct that deals with variable remapping.  */
270
271 static struct gimplify_omp_ctx *
272 new_omp_context (bool is_parallel, bool is_combined_parallel)
273 {
274   struct gimplify_omp_ctx *c;
275
276   c = XCNEW (struct gimplify_omp_ctx);
277   c->outer_context = gimplify_omp_ctxp;
278   c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
279   c->privatized_types = pointer_set_create ();
280   c->location = input_location;
281   c->is_parallel = is_parallel;
282   c->is_combined_parallel = is_combined_parallel;
283   c->default_kind = OMP_CLAUSE_DEFAULT_SHARED;
284
285   return c;
286 }
287
288 /* Destroy an omp construct that deals with variable remapping.  */
289
290 static void
291 delete_omp_context (struct gimplify_omp_ctx *c)
292 {
293   splay_tree_delete (c->variables);
294   pointer_set_destroy (c->privatized_types);
295   XDELETE (c);
296 }
297
298 static void omp_add_variable (struct gimplify_omp_ctx *, tree, unsigned int);
299 static bool omp_notice_variable (struct gimplify_omp_ctx *, tree, bool);
300
301 /* A subroutine of append_to_statement_list{,_force}.  T is not NULL.  */
302
303 static void
304 append_to_statement_list_1 (tree t, tree *list_p)
305 {
306   tree list = *list_p;
307   tree_stmt_iterator i;
308
309   if (!list)
310     {
311       if (t && TREE_CODE (t) == STATEMENT_LIST)
312         {
313           *list_p = t;
314           return;
315         }
316       *list_p = list = alloc_stmt_list ();
317     }
318
319   i = tsi_last (list);
320   tsi_link_after (&i, t, TSI_CONTINUE_LINKING);
321 }
322
323 /* Add T to the end of the list container pointed to by LIST_P.
324    If T is an expression with no effects, it is ignored.  */
325
326 void
327 append_to_statement_list (tree t, tree *list_p)
328 {
329   if (t && TREE_SIDE_EFFECTS (t))
330     append_to_statement_list_1 (t, list_p);
331 }
332
333 /* Similar, but the statement is always added, regardless of side effects.  */
334
335 void
336 append_to_statement_list_force (tree t, tree *list_p)
337 {
338   if (t != NULL_TREE)
339     append_to_statement_list_1 (t, list_p);
340 }
341
342 /* Both gimplify the statement T and append it to LIST_P.  */
343
344 void
345 gimplify_and_add (tree t, tree *list_p)
346 {
347   gimplify_stmt (&t);
348   append_to_statement_list (t, list_p);
349 }
350
351 /* Strip off a legitimate source ending from the input string NAME of
352    length LEN.  Rather than having to know the names used by all of
353    our front ends, we strip off an ending of a period followed by
354    up to five characters.  (Java uses ".class".)  */
355
356 static inline void
357 remove_suffix (char *name, int len)
358 {
359   int i;
360
361   for (i = 2;  i < 8 && len > i;  i++)
362     {
363       if (name[len - i] == '.')
364         {
365           name[len - i] = '\0';
366           break;
367         }
368     }
369 }
370
371 /* Create a nameless artificial label and put it in the current function
372    context.  Returns the newly created label.  */
373
374 tree
375 create_artificial_label (void)
376 {
377   tree lab = build_decl (LABEL_DECL, NULL_TREE, void_type_node);
378
379   DECL_ARTIFICIAL (lab) = 1;
380   DECL_IGNORED_P (lab) = 1;
381   DECL_CONTEXT (lab) = current_function_decl;
382   return lab;
383 }
384
385 /* Subroutine for find_single_pointer_decl.  */
386
387 static tree
388 find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
389                             void *data)
390 {
391   tree *pdecl = (tree *) data;
392
393   if (DECL_P (*tp) && POINTER_TYPE_P (TREE_TYPE (*tp)))
394     {
395       if (*pdecl)
396         {
397           /* We already found a pointer decl; return anything other
398              than NULL_TREE to unwind from walk_tree signalling that
399              we have a duplicate.  */
400           return *tp;
401         }
402       *pdecl = *tp;
403     }
404
405   return NULL_TREE;
406 }
407
408 /* Find the single DECL of pointer type in the tree T and return it.
409    If there are zero or more than one such DECLs, return NULL.  */
410
411 static tree
412 find_single_pointer_decl (tree t)
413 {
414   tree decl = NULL_TREE;
415
416   if (walk_tree (&t, find_single_pointer_decl_1, &decl, NULL))
417     {
418       /* find_single_pointer_decl_1 returns a nonzero value, causing
419          walk_tree to return a nonzero value, to indicate that it
420          found more than one pointer DECL.  */
421       return NULL_TREE;
422     }
423
424   return decl;
425 }
426
427 /* Create a new temporary name with PREFIX.  Returns an identifier.  */
428
429 static GTY(()) unsigned int tmp_var_id_num;
430
431 tree
432 create_tmp_var_name (const char *prefix)
433 {
434   char *tmp_name;
435
436   if (prefix)
437     {
438       char *preftmp = ASTRDUP (prefix);
439
440       remove_suffix (preftmp, strlen (preftmp));
441       prefix = preftmp;
442     }
443
444   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
445   return get_identifier (tmp_name);
446 }
447
448
449 /* Create a new temporary variable declaration of type TYPE.
450    Does NOT push it into the current binding.  */
451
452 tree
453 create_tmp_var_raw (tree type, const char *prefix)
454 {
455   tree tmp_var;
456   tree new_type;
457
458   /* Make the type of the variable writable.  */
459   new_type = build_type_variant (type, 0, 0);
460   TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
461
462   tmp_var = build_decl (VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
463                         type);
464
465   /* The variable was declared by the compiler.  */
466   DECL_ARTIFICIAL (tmp_var) = 1;
467   /* And we don't want debug info for it.  */
468   DECL_IGNORED_P (tmp_var) = 1;
469
470   /* Make the variable writable.  */
471   TREE_READONLY (tmp_var) = 0;
472
473   DECL_EXTERNAL (tmp_var) = 0;
474   TREE_STATIC (tmp_var) = 0;
475   TREE_USED (tmp_var) = 1;
476
477   return tmp_var;
478 }
479
480 /* Create a new temporary variable declaration of type TYPE.  DOES push the
481    variable into the current binding.  Further, assume that this is called
482    only from gimplification or optimization, at which point the creation of
483    certain types are bugs.  */
484
485 tree
486 create_tmp_var (tree type, const char *prefix)
487 {
488   tree tmp_var;
489
490   /* We don't allow types that are addressable (meaning we can't make copies),
491      or incomplete.  We also used to reject every variable size objects here,
492      but now support those for which a constant upper bound can be obtained.
493      The processing for variable sizes is performed in gimple_add_tmp_var,
494      point at which it really matters and possibly reached via paths not going
495      through this function, e.g. after direct calls to create_tmp_var_raw.  */
496   gcc_assert (!TREE_ADDRESSABLE (type) && COMPLETE_TYPE_P (type));
497
498   tmp_var = create_tmp_var_raw (type, prefix);
499   gimple_add_tmp_var (tmp_var);
500   return tmp_var;
501 }
502
503 /*  Given a tree, try to return a useful variable name that we can use
504     to prefix a temporary that is being assigned the value of the tree.
505     I.E. given  <temp> = &A, return A.  */
506
507 const char *
508 get_name (const_tree t)
509 {
510   const_tree stripped_decl;
511
512   stripped_decl = t;
513   STRIP_NOPS (stripped_decl);
514   if (DECL_P (stripped_decl) && DECL_NAME (stripped_decl))
515     return IDENTIFIER_POINTER (DECL_NAME (stripped_decl));
516   else
517     {
518       switch (TREE_CODE (stripped_decl))
519         {
520         case ADDR_EXPR:
521           return get_name (TREE_OPERAND (stripped_decl, 0));
522         default:
523           return NULL;
524         }
525     }
526 }
527
528 /* Create a temporary with a name derived from VAL.  Subroutine of
529    lookup_tmp_var; nobody else should call this function.  */
530
531 static inline tree
532 create_tmp_from_val (tree val)
533 {
534   return create_tmp_var (TYPE_MAIN_VARIANT (TREE_TYPE (val)), get_name (val));
535 }
536
537 /* Create a temporary to hold the value of VAL.  If IS_FORMAL, try to reuse
538    an existing expression temporary.  */
539
540 static tree
541 lookup_tmp_var (tree val, bool is_formal)
542 {
543   tree ret;
544
545   /* If not optimizing, never really reuse a temporary.  local-alloc
546      won't allocate any variable that is used in more than one basic
547      block, which means it will go into memory, causing much extra
548      work in reload and final and poorer code generation, outweighing
549      the extra memory allocation here.  */
550   if (!optimize || !is_formal || TREE_SIDE_EFFECTS (val))
551     ret = create_tmp_from_val (val);
552   else
553     {
554       elt_t elt, *elt_p;
555       void **slot;
556
557       elt.val = val;
558       slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
559       if (*slot == NULL)
560         {
561           elt_p = XNEW (elt_t);
562           elt_p->val = val;
563           elt_p->temp = ret = create_tmp_from_val (val);
564           *slot = (void *) elt_p;
565         }
566       else
567         {
568           elt_p = (elt_t *) *slot;
569           ret = elt_p->temp;
570         }
571     }
572
573   if (is_formal)
574     DECL_GIMPLE_FORMAL_TEMP_P (ret) = 1;
575
576   return ret;
577 }
578
579 /* Returns a formal temporary variable initialized with VAL.  PRE_P is as
580    in gimplify_expr.  Only use this function if:
581
582    1) The value of the unfactored expression represented by VAL will not
583       change between the initialization and use of the temporary, and
584    2) The temporary will not be otherwise modified.
585
586    For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
587    and #2 means it is inappropriate for && temps.
588
589    For other cases, use get_initialized_tmp_var instead.  */
590
591 static tree
592 internal_get_tmp_var (tree val, tree *pre_p, tree *post_p, bool is_formal)
593 {
594   tree t, mod;
595
596   gimplify_expr (&val, pre_p, post_p, is_gimple_formal_tmp_rhs, fb_rvalue);
597
598   t = lookup_tmp_var (val, is_formal);
599
600   if (is_formal)
601     {
602       tree u = find_single_pointer_decl (val);
603
604       if (u && TREE_CODE (u) == VAR_DECL && DECL_BASED_ON_RESTRICT_P (u))
605         u = DECL_GET_RESTRICT_BASE (u);
606       if (u && TYPE_RESTRICT (TREE_TYPE (u)))
607         {
608           if (DECL_BASED_ON_RESTRICT_P (t))
609             gcc_assert (u == DECL_GET_RESTRICT_BASE (t));
610           else
611             {
612               DECL_BASED_ON_RESTRICT_P (t) = 1;
613               SET_DECL_RESTRICT_BASE (t, u);
614             }
615         }
616     }
617
618   if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
619       || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
620     DECL_GIMPLE_REG_P (t) = 1;
621
622   mod = build2 (INIT_EXPR, TREE_TYPE (t), t, unshare_expr (val));
623
624   if (EXPR_HAS_LOCATION (val))
625     SET_EXPR_LOCUS (mod, EXPR_LOCUS (val));
626   else
627     SET_EXPR_LOCATION (mod, input_location);
628
629   /* gimplify_modify_expr might want to reduce this further.  */
630   gimplify_and_add (mod, pre_p);
631
632   /* If we're gimplifying into ssa, gimplify_modify_expr will have
633      given our temporary an ssa name.  Find and return it.  */
634   if (gimplify_ctxp->into_ssa)
635     t = TREE_OPERAND (mod, 0);
636
637   return t;
638 }
639
640 /* Returns a formal temporary variable initialized with VAL.  PRE_P
641    points to a statement list where side-effects needed to compute VAL
642    should be stored.  */
643
644 tree
645 get_formal_tmp_var (tree val, tree *pre_p)
646 {
647   return internal_get_tmp_var (val, pre_p, NULL, true);
648 }
649
650 /* Returns a temporary variable initialized with VAL.  PRE_P and POST_P
651    are as in gimplify_expr.  */
652
653 tree
654 get_initialized_tmp_var (tree val, tree *pre_p, tree *post_p)
655 {
656   return internal_get_tmp_var (val, pre_p, post_p, false);
657 }
658
659 /* Declares all the variables in VARS in SCOPE.  If DEBUG_INFO is
660    true, generate debug info for them; otherwise don't.  */
661
662 void
663 declare_vars (tree vars, tree scope, bool debug_info)
664 {
665   tree last = vars;
666   if (last)
667     {
668       tree temps, block;
669
670       /* C99 mode puts the default 'return 0;' for main outside the outer
671          braces.  So drill down until we find an actual scope.  */
672       while (TREE_CODE (scope) == COMPOUND_EXPR)
673         scope = TREE_OPERAND (scope, 0);
674
675       gcc_assert (TREE_CODE (scope) == BIND_EXPR);
676
677       temps = nreverse (last);
678
679       block = BIND_EXPR_BLOCK (scope);
680       if (!block || !debug_info)
681         {
682           TREE_CHAIN (last) = BIND_EXPR_VARS (scope);
683           BIND_EXPR_VARS (scope) = temps;
684         }
685       else
686         {
687           /* We need to attach the nodes both to the BIND_EXPR and to its
688              associated BLOCK for debugging purposes.  The key point here
689              is that the BLOCK_VARS of the BIND_EXPR_BLOCK of a BIND_EXPR
690              is a subchain of the BIND_EXPR_VARS of the BIND_EXPR.  */
691           if (BLOCK_VARS (block))
692             BLOCK_VARS (block) = chainon (BLOCK_VARS (block), temps);
693           else
694             {
695               BIND_EXPR_VARS (scope) = chainon (BIND_EXPR_VARS (scope), temps);
696               BLOCK_VARS (block) = temps;
697             }
698         }
699     }
700 }
701
702 /* For VAR a VAR_DECL of variable size, try to find a constant upper bound
703    for the size and adjust DECL_SIZE/DECL_SIZE_UNIT accordingly.  Abort if
704    no such upper bound can be obtained.  */
705
706 static void
707 force_constant_size (tree var)
708 {
709   /* The only attempt we make is by querying the maximum size of objects
710      of the variable's type.  */
711
712   HOST_WIDE_INT max_size;
713
714   gcc_assert (TREE_CODE (var) == VAR_DECL);
715
716   max_size = max_int_size_in_bytes (TREE_TYPE (var));
717
718   gcc_assert (max_size >= 0);
719
720   DECL_SIZE_UNIT (var)
721     = build_int_cst (TREE_TYPE (DECL_SIZE_UNIT (var)), max_size);
722   DECL_SIZE (var)
723     = build_int_cst (TREE_TYPE (DECL_SIZE (var)), max_size * BITS_PER_UNIT);
724 }
725
726 void
727 gimple_add_tmp_var (tree tmp)
728 {
729   gcc_assert (!TREE_CHAIN (tmp) && !DECL_SEEN_IN_BIND_EXPR_P (tmp));
730
731   /* Later processing assumes that the object size is constant, which might
732      not be true at this point.  Force the use of a constant upper bound in
733      this case.  */
734   if (!host_integerp (DECL_SIZE_UNIT (tmp), 1))
735     force_constant_size (tmp);
736
737   DECL_CONTEXT (tmp) = current_function_decl;
738   DECL_SEEN_IN_BIND_EXPR_P (tmp) = 1;
739
740   if (gimplify_ctxp)
741     {
742       TREE_CHAIN (tmp) = gimplify_ctxp->temps;
743       gimplify_ctxp->temps = tmp;
744
745       /* Mark temporaries local within the nearest enclosing parallel.  */
746       if (gimplify_omp_ctxp)
747         {
748           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
749           while (ctx && !ctx->is_parallel)
750             ctx = ctx->outer_context;
751           if (ctx)
752             omp_add_variable (ctx, tmp, GOVD_LOCAL | GOVD_SEEN);
753         }
754     }
755   else if (cfun)
756     record_vars (tmp);
757   else
758     declare_vars (tmp, DECL_SAVED_TREE (current_function_decl), false);
759 }
760
761 /* Determines whether to assign a locus to the statement STMT.  */
762
763 static bool
764 should_carry_locus_p (const_tree stmt)
765 {
766   /* Don't emit a line note for a label.  We particularly don't want to
767      emit one for the break label, since it doesn't actually correspond
768      to the beginning of the loop/switch.  */
769   if (TREE_CODE (stmt) == LABEL_EXPR)
770     return false;
771
772   /* Do not annotate empty statements, since it confuses gcov.  */
773   if (!TREE_SIDE_EFFECTS (stmt))
774     return false;
775
776   return true;
777 }
778
779 static void
780 annotate_one_with_locus (tree t, location_t locus)
781 {
782   if (CAN_HAVE_LOCATION_P (t)
783       && ! EXPR_HAS_LOCATION (t) && should_carry_locus_p (t))
784     SET_EXPR_LOCATION (t, locus);
785 }
786
787 void
788 annotate_all_with_locus (tree *stmt_p, location_t locus)
789 {
790   tree_stmt_iterator i;
791
792   if (!*stmt_p)
793     return;
794
795   for (i = tsi_start (*stmt_p); !tsi_end_p (i); tsi_next (&i))
796     {
797       tree t = tsi_stmt (i);
798
799       /* Assuming we've already been gimplified, we shouldn't
800           see nested chaining constructs anymore.  */
801       gcc_assert (TREE_CODE (t) != STATEMENT_LIST
802                   && TREE_CODE (t) != COMPOUND_EXPR);
803
804       annotate_one_with_locus (t, locus);
805     }
806 }
807
808 /* Similar to copy_tree_r() but do not copy SAVE_EXPR or TARGET_EXPR nodes.
809    These nodes model computations that should only be done once.  If we
810    were to unshare something like SAVE_EXPR(i++), the gimplification
811    process would create wrong code.  */
812
813 static tree
814 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
815 {
816   enum tree_code code = TREE_CODE (*tp);
817   /* Don't unshare types, decls, constants and SAVE_EXPR nodes.  */
818   if (TREE_CODE_CLASS (code) == tcc_type
819       || TREE_CODE_CLASS (code) == tcc_declaration
820       || TREE_CODE_CLASS (code) == tcc_constant
821       || code == SAVE_EXPR || code == TARGET_EXPR
822       /* We can't do anything sensible with a BLOCK used as an expression,
823          but we also can't just die when we see it because of non-expression
824          uses.  So just avert our eyes and cross our fingers.  Silly Java.  */
825       || code == BLOCK)
826     *walk_subtrees = 0;
827   else
828     {
829       gcc_assert (code != BIND_EXPR);
830       copy_tree_r (tp, walk_subtrees, data);
831     }
832
833   return NULL_TREE;
834 }
835
836 /* Callback for walk_tree to unshare most of the shared trees rooted at
837    *TP.  If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
838    then *TP is deep copied by calling copy_tree_r.
839
840    This unshares the same trees as copy_tree_r with the exception of
841    SAVE_EXPR nodes.  These nodes model computations that should only be
842    done once.  If we were to unshare something like SAVE_EXPR(i++), the
843    gimplification process would create wrong code.  */
844
845 static tree
846 copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
847                   void *data ATTRIBUTE_UNUSED)
848 {
849   tree t = *tp;
850   enum tree_code code = TREE_CODE (t);
851
852   /* Skip types, decls, and constants.  But we do want to look at their
853      types and the bounds of types.  Mark them as visited so we properly
854      unmark their subtrees on the unmark pass.  If we've already seen them,
855      don't look down further.  */
856   if (TREE_CODE_CLASS (code) == tcc_type
857       || TREE_CODE_CLASS (code) == tcc_declaration
858       || TREE_CODE_CLASS (code) == tcc_constant)
859     {
860       if (TREE_VISITED (t))
861         *walk_subtrees = 0;
862       else
863         TREE_VISITED (t) = 1;
864     }
865
866   /* If this node has been visited already, unshare it and don't look
867      any deeper.  */
868   else if (TREE_VISITED (t))
869     {
870       walk_tree (tp, mostly_copy_tree_r, NULL, NULL);
871       *walk_subtrees = 0;
872     }
873
874   /* Otherwise, mark the tree as visited and keep looking.  */
875   else
876     TREE_VISITED (t) = 1;
877
878   return NULL_TREE;
879 }
880
881 static tree
882 unmark_visited_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
883                   void *data ATTRIBUTE_UNUSED)
884 {
885   if (TREE_VISITED (*tp))
886     TREE_VISITED (*tp) = 0;
887   else
888     *walk_subtrees = 0;
889
890   return NULL_TREE;
891 }
892
893 /* Unshare all the trees in BODY_P, a pointer into the body of FNDECL, and the
894    bodies of any nested functions if we are unsharing the entire body of
895    FNDECL.  */
896
897 static void
898 unshare_body (tree *body_p, tree fndecl)
899 {
900   struct cgraph_node *cgn = cgraph_node (fndecl);
901
902   walk_tree (body_p, copy_if_shared_r, NULL, NULL);
903   if (body_p == &DECL_SAVED_TREE (fndecl))
904     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
905       unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
906 }
907
908 /* Likewise, but mark all trees as not visited.  */
909
910 static void
911 unvisit_body (tree *body_p, tree fndecl)
912 {
913   struct cgraph_node *cgn = cgraph_node (fndecl);
914
915   walk_tree (body_p, unmark_visited_r, NULL, NULL);
916   if (body_p == &DECL_SAVED_TREE (fndecl))
917     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
918       unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
919 }
920
921 /* Unshare T and all the trees reached from T via TREE_CHAIN.  */
922
923 static void
924 unshare_all_trees (tree t)
925 {
926   walk_tree (&t, copy_if_shared_r, NULL, NULL);
927   walk_tree (&t, unmark_visited_r, NULL, NULL);
928 }
929
930 /* Unconditionally make an unshared copy of EXPR.  This is used when using
931    stored expressions which span multiple functions, such as BINFO_VTABLE,
932    as the normal unsharing process can't tell that they're shared.  */
933
934 tree
935 unshare_expr (tree expr)
936 {
937   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
938   return expr;
939 }
940
941 /* A terser interface for building a representation of an exception
942    specification.  */
943
944 tree
945 gimple_build_eh_filter (tree body, tree allowed, tree failure)
946 {
947   tree t;
948
949   /* FIXME should the allowed types go in TREE_TYPE?  */
950   t = build2 (EH_FILTER_EXPR, void_type_node, allowed, NULL_TREE);
951   append_to_statement_list (failure, &EH_FILTER_FAILURE (t));
952
953   t = build2 (TRY_CATCH_EXPR, void_type_node, NULL_TREE, t);
954   append_to_statement_list (body, &TREE_OPERAND (t, 0));
955
956   return t;
957 }
958
959 \f
960 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
961    contain statements and have a value.  Assign its value to a temporary
962    and give it void_type_node.  Returns the temporary, or NULL_TREE if
963    WRAPPER was already void.  */
964
965 tree
966 voidify_wrapper_expr (tree wrapper, tree temp)
967 {
968   tree type = TREE_TYPE (wrapper);
969   if (type && !VOID_TYPE_P (type))
970     {
971       tree *p;
972
973       /* Set p to point to the body of the wrapper.  Loop until we find
974          something that isn't a wrapper.  */
975       for (p = &wrapper; p && *p; )
976         {
977           switch (TREE_CODE (*p))
978             {
979             case BIND_EXPR:
980               TREE_SIDE_EFFECTS (*p) = 1;
981               TREE_TYPE (*p) = void_type_node;
982               /* For a BIND_EXPR, the body is operand 1.  */
983               p = &BIND_EXPR_BODY (*p);
984               break;
985
986             case CLEANUP_POINT_EXPR:
987             case TRY_FINALLY_EXPR:
988             case TRY_CATCH_EXPR:
989               TREE_SIDE_EFFECTS (*p) = 1;
990               TREE_TYPE (*p) = void_type_node;
991               p = &TREE_OPERAND (*p, 0);
992               break;
993
994             case STATEMENT_LIST:
995               {
996                 tree_stmt_iterator i = tsi_last (*p);
997                 TREE_SIDE_EFFECTS (*p) = 1;
998                 TREE_TYPE (*p) = void_type_node;
999                 p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
1000               }
1001               break;
1002
1003             case COMPOUND_EXPR:
1004               /* Advance to the last statement.  Set all container types to void.  */
1005               for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
1006                 {
1007                   TREE_SIDE_EFFECTS (*p) = 1;
1008                   TREE_TYPE (*p) = void_type_node;
1009                 }
1010               break;
1011
1012             default:
1013               goto out;
1014             }
1015         }
1016
1017     out:
1018       if (p == NULL || IS_EMPTY_STMT (*p))
1019         temp = NULL_TREE;
1020       else if (temp)
1021         {
1022           /* The wrapper is on the RHS of an assignment that we're pushing
1023              down.  */
1024           gcc_assert (TREE_CODE (temp) == INIT_EXPR
1025                       || TREE_CODE (temp) == GIMPLE_MODIFY_STMT
1026                       || TREE_CODE (temp) == MODIFY_EXPR);
1027           GENERIC_TREE_OPERAND (temp, 1) = *p;
1028           *p = temp;
1029         }
1030       else
1031         {
1032           temp = create_tmp_var (type, "retval");
1033           *p = build2 (INIT_EXPR, type, temp, *p);
1034         }
1035
1036       return temp;
1037     }
1038
1039   return NULL_TREE;
1040 }
1041
1042 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
1043    a temporary through which they communicate.  */
1044
1045 static void
1046 build_stack_save_restore (tree *save, tree *restore)
1047 {
1048   tree save_call, tmp_var;
1049
1050   save_call =
1051     build_call_expr (implicit_built_in_decls[BUILT_IN_STACK_SAVE], 0);
1052   tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
1053
1054   *save = build_gimple_modify_stmt (tmp_var, save_call);
1055   *restore =
1056     build_call_expr (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
1057                      1, tmp_var);
1058 }
1059
1060 /* Gimplify a BIND_EXPR.  Just voidify and recurse.  */
1061
1062 static enum gimplify_status
1063 gimplify_bind_expr (tree *expr_p, tree *pre_p)
1064 {
1065   tree bind_expr = *expr_p;
1066   bool old_save_stack = gimplify_ctxp->save_stack;
1067   tree t;
1068
1069   tree temp = voidify_wrapper_expr (bind_expr, NULL);
1070
1071   /* Mark variables seen in this bind expr.  */
1072   for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
1073     {
1074       if (TREE_CODE (t) == VAR_DECL)
1075         {
1076           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
1077
1078           /* Mark variable as local.  */
1079           if (ctx && !is_global_var (t)
1080               && (! DECL_SEEN_IN_BIND_EXPR_P (t)
1081                   || splay_tree_lookup (ctx->variables,
1082                                         (splay_tree_key) t) == NULL))
1083             omp_add_variable (gimplify_omp_ctxp, t, GOVD_LOCAL | GOVD_SEEN);
1084
1085           DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
1086         }
1087
1088       /* Preliminarily mark non-addressed complex variables as eligible
1089          for promotion to gimple registers.  We'll transform their uses
1090          as we find them.  */
1091       if ((TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
1092            || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
1093           && !TREE_THIS_VOLATILE (t)
1094           && (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
1095           && !needs_to_live_in_memory (t))
1096         DECL_GIMPLE_REG_P (t) = 1;
1097     }
1098
1099   gimple_push_bind_expr (bind_expr);
1100   gimplify_ctxp->save_stack = false;
1101
1102   gimplify_to_stmt_list (&BIND_EXPR_BODY (bind_expr));
1103
1104   if (gimplify_ctxp->save_stack)
1105     {
1106       tree stack_save, stack_restore;
1107
1108       /* Save stack on entry and restore it on exit.  Add a try_finally
1109          block to achieve this.  Note that mudflap depends on the
1110          format of the emitted code: see mx_register_decls().  */
1111       build_stack_save_restore (&stack_save, &stack_restore);
1112
1113       t = build2 (TRY_FINALLY_EXPR, void_type_node,
1114                   BIND_EXPR_BODY (bind_expr), NULL_TREE);
1115       append_to_statement_list (stack_restore, &TREE_OPERAND (t, 1));
1116
1117       BIND_EXPR_BODY (bind_expr) = NULL_TREE;
1118       append_to_statement_list (stack_save, &BIND_EXPR_BODY (bind_expr));
1119       append_to_statement_list (t, &BIND_EXPR_BODY (bind_expr));
1120     }
1121
1122   gimplify_ctxp->save_stack = old_save_stack;
1123   gimple_pop_bind_expr ();
1124
1125   if (temp)
1126     {
1127       *expr_p = temp;
1128       append_to_statement_list (bind_expr, pre_p);
1129       return GS_OK;
1130     }
1131   else
1132     return GS_ALL_DONE;
1133 }
1134
1135 /* Gimplify a RETURN_EXPR.  If the expression to be returned is not a
1136    GIMPLE value, it is assigned to a new temporary and the statement is
1137    re-written to return the temporary.
1138
1139    PRE_P points to the list where side effects that must happen before
1140    STMT should be stored.  */
1141
1142 static enum gimplify_status
1143 gimplify_return_expr (tree stmt, tree *pre_p)
1144 {
1145   tree ret_expr = TREE_OPERAND (stmt, 0);
1146   tree result_decl, result;
1147
1148   if (!ret_expr || TREE_CODE (ret_expr) == RESULT_DECL
1149       || ret_expr == error_mark_node)
1150     return GS_ALL_DONE;
1151
1152   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
1153     result_decl = NULL_TREE;
1154   else
1155     {
1156       result_decl = GENERIC_TREE_OPERAND (ret_expr, 0);
1157       if (TREE_CODE (result_decl) == INDIRECT_REF)
1158         /* See through a return by reference.  */
1159         result_decl = TREE_OPERAND (result_decl, 0);
1160
1161       gcc_assert ((TREE_CODE (ret_expr) == MODIFY_EXPR
1162                    || TREE_CODE (ret_expr) == GIMPLE_MODIFY_STMT
1163                    || TREE_CODE (ret_expr) == INIT_EXPR)
1164                   && TREE_CODE (result_decl) == RESULT_DECL);
1165     }
1166
1167   /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
1168      Recall that aggregate_value_p is FALSE for any aggregate type that is
1169      returned in registers.  If we're returning values in registers, then
1170      we don't want to extend the lifetime of the RESULT_DECL, particularly
1171      across another call.  In addition, for those aggregates for which
1172      hard_function_value generates a PARALLEL, we'll die during normal
1173      expansion of structure assignments; there's special code in expand_return
1174      to handle this case that does not exist in expand_expr.  */
1175   if (!result_decl
1176       || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
1177     result = result_decl;
1178   else if (gimplify_ctxp->return_temp)
1179     result = gimplify_ctxp->return_temp;
1180   else
1181     {
1182       result = create_tmp_var (TREE_TYPE (result_decl), NULL);
1183       if (TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE
1184           || TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE)
1185         DECL_GIMPLE_REG_P (result) = 1;
1186
1187       /* ??? With complex control flow (usually involving abnormal edges),
1188          we can wind up warning about an uninitialized value for this.  Due
1189          to how this variable is constructed and initialized, this is never
1190          true.  Give up and never warn.  */
1191       TREE_NO_WARNING (result) = 1;
1192
1193       gimplify_ctxp->return_temp = result;
1194     }
1195
1196   /* Smash the lhs of the GIMPLE_MODIFY_STMT to the temporary we plan to use.
1197      Then gimplify the whole thing.  */
1198   if (result != result_decl)
1199     GENERIC_TREE_OPERAND (ret_expr, 0) = result;
1200
1201   gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
1202
1203   /* If we didn't use a temporary, then the result is just the result_decl.
1204      Otherwise we need a simple copy.  This should already be gimple.  */
1205   if (result == result_decl)
1206     ret_expr = result;
1207   else
1208     ret_expr = build_gimple_modify_stmt (result_decl, result);
1209   TREE_OPERAND (stmt, 0) = ret_expr;
1210
1211   return GS_ALL_DONE;
1212 }
1213
1214 static void
1215 gimplify_vla_decl (tree decl, tree *stmt_p)
1216 {
1217   /* This is a variable-sized decl.  Simplify its size and mark it
1218      for deferred expansion.  Note that mudflap depends on the format
1219      of the emitted code: see mx_register_decls().  */
1220   tree t, addr, ptr_type;
1221
1222   gimplify_one_sizepos (&DECL_SIZE (decl), stmt_p);
1223   gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), stmt_p);
1224
1225   /* All occurrences of this decl in final gimplified code will be
1226      replaced by indirection.  Setting DECL_VALUE_EXPR does two
1227      things: First, it lets the rest of the gimplifier know what
1228      replacement to use.  Second, it lets the debug info know
1229      where to find the value.  */
1230   ptr_type = build_pointer_type (TREE_TYPE (decl));
1231   addr = create_tmp_var (ptr_type, get_name (decl));
1232   DECL_IGNORED_P (addr) = 0;
1233   t = build_fold_indirect_ref (addr);
1234   SET_DECL_VALUE_EXPR (decl, t);
1235   DECL_HAS_VALUE_EXPR_P (decl) = 1;
1236
1237   t = built_in_decls[BUILT_IN_ALLOCA];
1238   t = build_call_expr (t, 1, DECL_SIZE_UNIT (decl));
1239   t = fold_convert (ptr_type, t);
1240   t = build_gimple_modify_stmt (addr, t);
1241
1242   gimplify_and_add (t, stmt_p);
1243
1244   /* Indicate that we need to restore the stack level when the
1245      enclosing BIND_EXPR is exited.  */
1246   gimplify_ctxp->save_stack = true;
1247 }
1248
1249 /* Gimplifies a DECL_EXPR node *STMT_P by making any necessary allocation
1250    and initialization explicit.  */
1251
1252 static enum gimplify_status
1253 gimplify_decl_expr (tree *stmt_p)
1254 {
1255   tree stmt = *stmt_p;
1256   tree decl = DECL_EXPR_DECL (stmt);
1257
1258   *stmt_p = NULL_TREE;
1259
1260   if (TREE_TYPE (decl) == error_mark_node)
1261     return GS_ERROR;
1262
1263   if ((TREE_CODE (decl) == TYPE_DECL
1264        || TREE_CODE (decl) == VAR_DECL)
1265       && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
1266     gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
1267
1268   if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
1269     {
1270       tree init = DECL_INITIAL (decl);
1271
1272       if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
1273         gimplify_vla_decl (decl, stmt_p);
1274
1275       if (init && init != error_mark_node)
1276         {
1277           if (!TREE_STATIC (decl))
1278             {
1279               DECL_INITIAL (decl) = NULL_TREE;
1280               init = build2 (INIT_EXPR, void_type_node, decl, init);
1281               gimplify_and_add (init, stmt_p);
1282             }
1283           else
1284             /* We must still examine initializers for static variables
1285                as they may contain a label address.  */
1286             walk_tree (&init, force_labels_r, NULL, NULL);
1287         }
1288
1289       /* Some front ends do not explicitly declare all anonymous
1290          artificial variables.  We compensate here by declaring the
1291          variables, though it would be better if the front ends would
1292          explicitly declare them.  */
1293       if (!DECL_SEEN_IN_BIND_EXPR_P (decl)
1294           && DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1295         gimple_add_tmp_var (decl);
1296     }
1297
1298   return GS_ALL_DONE;
1299 }
1300
1301 /* Gimplify a LOOP_EXPR.  Normally this just involves gimplifying the body
1302    and replacing the LOOP_EXPR with goto, but if the loop contains an
1303    EXIT_EXPR, we need to append a label for it to jump to.  */
1304
1305 static enum gimplify_status
1306 gimplify_loop_expr (tree *expr_p, tree *pre_p)
1307 {
1308   tree saved_label = gimplify_ctxp->exit_label;
1309   tree start_label = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
1310   tree jump_stmt = build_and_jump (&LABEL_EXPR_LABEL (start_label));
1311
1312   append_to_statement_list (start_label, pre_p);
1313
1314   gimplify_ctxp->exit_label = NULL_TREE;
1315
1316   gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1317
1318   if (gimplify_ctxp->exit_label)
1319     {
1320       append_to_statement_list (jump_stmt, pre_p);
1321       *expr_p = build1 (LABEL_EXPR, void_type_node, gimplify_ctxp->exit_label);
1322     }
1323   else
1324     *expr_p = jump_stmt;
1325
1326   gimplify_ctxp->exit_label = saved_label;
1327
1328   return GS_ALL_DONE;
1329 }
1330
1331 /* Compare two case labels.  Because the front end should already have
1332    made sure that case ranges do not overlap, it is enough to only compare
1333    the CASE_LOW values of each case label.  */
1334
1335 static int
1336 compare_case_labels (const void *p1, const void *p2)
1337 {
1338   const_tree const case1 = *(const_tree const*)p1;
1339   const_tree const case2 = *(const_tree const*)p2;
1340
1341   return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1342 }
1343
1344 /* Sort the case labels in LABEL_VEC in place in ascending order.  */
1345
1346 void
1347 sort_case_labels (tree label_vec)
1348 {
1349   size_t len = TREE_VEC_LENGTH (label_vec);
1350   tree default_case = TREE_VEC_ELT (label_vec, len - 1);
1351
1352   if (CASE_LOW (default_case))
1353     {
1354       size_t i;
1355
1356       /* The last label in the vector should be the default case
1357          but it is not.  */
1358       for (i = 0; i < len; ++i)
1359         {
1360           tree t = TREE_VEC_ELT (label_vec, i);
1361           if (!CASE_LOW (t))
1362             {
1363               default_case = t;
1364               TREE_VEC_ELT (label_vec, i) = TREE_VEC_ELT (label_vec, len - 1);
1365               TREE_VEC_ELT (label_vec, len - 1) = default_case;
1366               break;
1367             }
1368         }
1369     }
1370
1371   qsort (&TREE_VEC_ELT (label_vec, 0), len - 1, sizeof (tree),
1372          compare_case_labels);
1373 }
1374
1375 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1376    branch to.  */
1377
1378 static enum gimplify_status
1379 gimplify_switch_expr (tree *expr_p, tree *pre_p)
1380 {
1381   tree switch_expr = *expr_p;
1382   enum gimplify_status ret;
1383
1384   ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL,
1385                        is_gimple_val, fb_rvalue);
1386
1387   if (SWITCH_BODY (switch_expr))
1388     {
1389       VEC(tree,heap) *labels, *saved_labels;
1390       tree label_vec, default_case = NULL_TREE;
1391       size_t i, len;
1392
1393       /* If someone can be bothered to fill in the labels, they can
1394          be bothered to null out the body too.  */
1395       gcc_assert (!SWITCH_LABELS (switch_expr));
1396
1397       saved_labels = gimplify_ctxp->case_labels;
1398       gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
1399
1400       gimplify_to_stmt_list (&SWITCH_BODY (switch_expr));
1401
1402       labels = gimplify_ctxp->case_labels;
1403       gimplify_ctxp->case_labels = saved_labels;
1404
1405       i = 0;
1406       while (i < VEC_length (tree, labels))
1407         {
1408           tree elt = VEC_index (tree, labels, i);
1409           tree low = CASE_LOW (elt);
1410           bool remove_element = FALSE;
1411
1412           if (low)
1413             {
1414               /* Discard empty ranges.  */
1415               tree high = CASE_HIGH (elt);
1416               if (high && INT_CST_LT (high, low))
1417                 remove_element = TRUE;
1418             }
1419           else
1420             {
1421               /* The default case must be the last label in the list.  */
1422               gcc_assert (!default_case);
1423               default_case = elt;
1424               remove_element = TRUE;
1425             }
1426
1427           if (remove_element)
1428             VEC_ordered_remove (tree, labels, i);
1429           else
1430             i++;
1431         }
1432       len = i;
1433
1434       label_vec = make_tree_vec (len + 1);
1435       SWITCH_LABELS (*expr_p) = label_vec;
1436       append_to_statement_list (switch_expr, pre_p);
1437
1438       if (! default_case)
1439         {
1440           /* If the switch has no default label, add one, so that we jump
1441              around the switch body.  */
1442           default_case = build3 (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
1443                                  NULL_TREE, create_artificial_label ());
1444           append_to_statement_list (SWITCH_BODY (switch_expr), pre_p);
1445           *expr_p = build1 (LABEL_EXPR, void_type_node,
1446                             CASE_LABEL (default_case));
1447         }
1448       else
1449         *expr_p = SWITCH_BODY (switch_expr);
1450
1451       for (i = 0; i < len; ++i)
1452         TREE_VEC_ELT (label_vec, i) = VEC_index (tree, labels, i);
1453       TREE_VEC_ELT (label_vec, len) = default_case;
1454
1455       VEC_free (tree, heap, labels);
1456
1457       sort_case_labels (label_vec);
1458
1459       SWITCH_BODY (switch_expr) = NULL;
1460     }
1461   else
1462     gcc_assert (SWITCH_LABELS (switch_expr));
1463
1464   return ret;
1465 }
1466
1467 static enum gimplify_status
1468 gimplify_case_label_expr (tree *expr_p)
1469 {
1470   tree expr = *expr_p;
1471   struct gimplify_ctx *ctxp;
1472
1473   /* Invalid OpenMP programs can play Duff's Device type games with
1474      #pragma omp parallel.  At least in the C front end, we don't
1475      detect such invalid branches until after gimplification.  */
1476   for (ctxp = gimplify_ctxp; ; ctxp = ctxp->prev_context)
1477     if (ctxp->case_labels)
1478       break;
1479
1480   VEC_safe_push (tree, heap, ctxp->case_labels, expr);
1481   *expr_p = build1 (LABEL_EXPR, void_type_node, CASE_LABEL (expr));
1482   return GS_ALL_DONE;
1483 }
1484
1485 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1486    if necessary.  */
1487
1488 tree
1489 build_and_jump (tree *label_p)
1490 {
1491   if (label_p == NULL)
1492     /* If there's nowhere to jump, just fall through.  */
1493     return NULL_TREE;
1494
1495   if (*label_p == NULL_TREE)
1496     {
1497       tree label = create_artificial_label ();
1498       *label_p = label;
1499     }
1500
1501   return build1 (GOTO_EXPR, void_type_node, *label_p);
1502 }
1503
1504 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1505    This also involves building a label to jump to and communicating it to
1506    gimplify_loop_expr through gimplify_ctxp->exit_label.  */
1507
1508 static enum gimplify_status
1509 gimplify_exit_expr (tree *expr_p)
1510 {
1511   tree cond = TREE_OPERAND (*expr_p, 0);
1512   tree expr;
1513
1514   expr = build_and_jump (&gimplify_ctxp->exit_label);
1515   expr = build3 (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1516   *expr_p = expr;
1517
1518   return GS_OK;
1519 }
1520
1521 /* A helper function to be called via walk_tree.  Mark all labels under *TP
1522    as being forced.  To be called for DECL_INITIAL of static variables.  */
1523
1524 tree
1525 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1526 {
1527   if (TYPE_P (*tp))
1528     *walk_subtrees = 0;
1529   if (TREE_CODE (*tp) == LABEL_DECL)
1530     FORCED_LABEL (*tp) = 1;
1531
1532   return NULL_TREE;
1533 }
1534
1535 /* *EXPR_P is a COMPONENT_REF being used as an rvalue.  If its type is
1536    different from its canonical type, wrap the whole thing inside a
1537    NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1538    type.
1539
1540    The canonical type of a COMPONENT_REF is the type of the field being
1541    referenced--unless the field is a bit-field which can be read directly
1542    in a smaller mode, in which case the canonical type is the
1543    sign-appropriate type corresponding to that mode.  */
1544
1545 static void
1546 canonicalize_component_ref (tree *expr_p)
1547 {
1548   tree expr = *expr_p;
1549   tree type;
1550
1551   gcc_assert (TREE_CODE (expr) == COMPONENT_REF);
1552
1553   if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1554     type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1555   else
1556     type = TREE_TYPE (TREE_OPERAND (expr, 1));
1557
1558   /* One could argue that all the stuff below is not necessary for
1559      the non-bitfield case and declare it a FE error if type
1560      adjustment would be needed.  */
1561   if (TREE_TYPE (expr) != type)
1562     {
1563 #ifdef ENABLE_TYPES_CHECKING
1564       tree old_type = TREE_TYPE (expr);
1565 #endif
1566       int type_quals;
1567
1568       /* We need to preserve qualifiers and propagate them from
1569          operand 0.  */
1570       type_quals = TYPE_QUALS (type)
1571         | TYPE_QUALS (TREE_TYPE (TREE_OPERAND (expr, 0)));
1572       if (TYPE_QUALS (type) != type_quals)
1573         type = build_qualified_type (TYPE_MAIN_VARIANT (type), type_quals);
1574
1575       /* Set the type of the COMPONENT_REF to the underlying type.  */
1576       TREE_TYPE (expr) = type;
1577
1578 #ifdef ENABLE_TYPES_CHECKING
1579       /* It is now a FE error, if the conversion from the canonical
1580          type to the original expression type is not useless.  */
1581       gcc_assert (useless_type_conversion_p (old_type, type));
1582 #endif
1583     }
1584 }
1585
1586 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1587    to foo, embed that change in the ADDR_EXPR by converting
1588       T array[U];
1589       (T *)&array
1590    ==>
1591       &array[L]
1592    where L is the lower bound.  For simplicity, only do this for constant
1593    lower bound.
1594    The constraint is that the type of &array[L] is trivially convertible
1595    to T *.  */
1596
1597 static void
1598 canonicalize_addr_expr (tree *expr_p)
1599 {
1600   tree expr = *expr_p;
1601   tree addr_expr = TREE_OPERAND (expr, 0);
1602   tree datype, ddatype, pddatype;
1603
1604   /* We simplify only conversions from an ADDR_EXPR to a pointer type.  */
1605   if (!POINTER_TYPE_P (TREE_TYPE (expr))
1606       || TREE_CODE (addr_expr) != ADDR_EXPR)
1607     return;
1608
1609   /* The addr_expr type should be a pointer to an array.  */
1610   datype = TREE_TYPE (TREE_TYPE (addr_expr));
1611   if (TREE_CODE (datype) != ARRAY_TYPE)
1612     return;
1613
1614   /* The pointer to element type shall be trivially convertible to
1615      the expression pointer type.  */
1616   ddatype = TREE_TYPE (datype);
1617   pddatype = build_pointer_type (ddatype);
1618   if (!useless_type_conversion_p (pddatype, ddatype))
1619     return;
1620
1621   /* The lower bound and element sizes must be constant.  */
1622   if (!TYPE_SIZE_UNIT (ddatype)
1623       || TREE_CODE (TYPE_SIZE_UNIT (ddatype)) != INTEGER_CST
1624       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1625       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1626     return;
1627
1628   /* All checks succeeded.  Build a new node to merge the cast.  */
1629   *expr_p = build4 (ARRAY_REF, ddatype, TREE_OPERAND (addr_expr, 0),
1630                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1631                     NULL_TREE, NULL_TREE);
1632   *expr_p = build1 (ADDR_EXPR, pddatype, *expr_p);
1633 }
1634
1635 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR.  Remove it and/or other conversions
1636    underneath as appropriate.  */
1637
1638 static enum gimplify_status
1639 gimplify_conversion (tree *expr_p)
1640 {
1641   tree tem;
1642   gcc_assert (TREE_CODE (*expr_p) == NOP_EXPR
1643               || TREE_CODE (*expr_p) == CONVERT_EXPR);
1644   
1645   /* Then strip away all but the outermost conversion.  */
1646   STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1647
1648   /* And remove the outermost conversion if it's useless.  */
1649   if (tree_ssa_useless_type_conversion (*expr_p))
1650     *expr_p = TREE_OPERAND (*expr_p, 0);
1651
1652   /* Attempt to avoid NOP_EXPR by producing reference to a subtype.
1653      For example this fold (subclass *)&A into &A->subclass avoiding
1654      a need for statement.  */
1655   if (TREE_CODE (*expr_p) == NOP_EXPR
1656       && POINTER_TYPE_P (TREE_TYPE (*expr_p))
1657       && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 0)))
1658       && (tem = maybe_fold_offset_to_reference
1659                   (TREE_OPERAND (*expr_p, 0),
1660                    integer_zero_node, TREE_TYPE (TREE_TYPE (*expr_p)))))
1661     {
1662       tree ptr_type = build_pointer_type (TREE_TYPE (tem));
1663       if (useless_type_conversion_p (TREE_TYPE (*expr_p), ptr_type))
1664         *expr_p = build_fold_addr_expr_with_type (tem, ptr_type);
1665     }
1666
1667   /* If we still have a conversion at the toplevel,
1668      then canonicalize some constructs.  */
1669   if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1670     {
1671       tree sub = TREE_OPERAND (*expr_p, 0);
1672
1673       /* If a NOP conversion is changing the type of a COMPONENT_REF
1674          expression, then canonicalize its type now in order to expose more
1675          redundant conversions.  */
1676       if (TREE_CODE (sub) == COMPONENT_REF)
1677         canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1678
1679       /* If a NOP conversion is changing a pointer to array of foo
1680          to a pointer to foo, embed that change in the ADDR_EXPR.  */
1681       else if (TREE_CODE (sub) == ADDR_EXPR)
1682         canonicalize_addr_expr (expr_p);
1683     }
1684
1685   return GS_OK;
1686 }
1687
1688 /* Gimplify a VAR_DECL or PARM_DECL.  Returns GS_OK if we expanded a 
1689    DECL_VALUE_EXPR, and it's worth re-examining things.  */
1690
1691 static enum gimplify_status
1692 gimplify_var_or_parm_decl (tree *expr_p)
1693 {
1694   tree decl = *expr_p;
1695
1696   /* ??? If this is a local variable, and it has not been seen in any
1697      outer BIND_EXPR, then it's probably the result of a duplicate
1698      declaration, for which we've already issued an error.  It would
1699      be really nice if the front end wouldn't leak these at all.
1700      Currently the only known culprit is C++ destructors, as seen
1701      in g++.old-deja/g++.jason/binding.C.  */
1702   if (TREE_CODE (decl) == VAR_DECL
1703       && !DECL_SEEN_IN_BIND_EXPR_P (decl)
1704       && !TREE_STATIC (decl) && !DECL_EXTERNAL (decl)
1705       && decl_function_context (decl) == current_function_decl)
1706     {
1707       gcc_assert (errorcount || sorrycount);
1708       return GS_ERROR;
1709     }
1710
1711   /* When within an OpenMP context, notice uses of variables.  */
1712   if (gimplify_omp_ctxp && omp_notice_variable (gimplify_omp_ctxp, decl, true))
1713     return GS_ALL_DONE;
1714
1715   /* If the decl is an alias for another expression, substitute it now.  */
1716   if (DECL_HAS_VALUE_EXPR_P (decl))
1717     {
1718       *expr_p = unshare_expr (DECL_VALUE_EXPR (decl));
1719       return GS_OK;
1720     }
1721
1722   return GS_ALL_DONE;
1723 }
1724
1725
1726 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1727    node pointed to by EXPR_P.
1728
1729       compound_lval
1730               : min_lval '[' val ']'
1731               | min_lval '.' ID
1732               | compound_lval '[' val ']'
1733               | compound_lval '.' ID
1734
1735    This is not part of the original SIMPLE definition, which separates
1736    array and member references, but it seems reasonable to handle them
1737    together.  Also, this way we don't run into problems with union
1738    aliasing; gcc requires that for accesses through a union to alias, the
1739    union reference must be explicit, which was not always the case when we
1740    were splitting up array and member refs.
1741
1742    PRE_P points to the list where side effects that must happen before
1743      *EXPR_P should be stored.
1744
1745    POST_P points to the list where side effects that must happen after
1746      *EXPR_P should be stored.  */
1747
1748 static enum gimplify_status
1749 gimplify_compound_lval (tree *expr_p, tree *pre_p,
1750                         tree *post_p, fallback_t fallback)
1751 {
1752   tree *p;
1753   VEC(tree,heap) *stack;
1754   enum gimplify_status ret = GS_OK, tret;
1755   int i;
1756
1757   /* Create a stack of the subexpressions so later we can walk them in
1758      order from inner to outer.  */
1759   stack = VEC_alloc (tree, heap, 10);
1760
1761   /* We can handle anything that get_inner_reference can deal with.  */
1762   for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
1763     {
1764     restart:
1765       /* Fold INDIRECT_REFs now to turn them into ARRAY_REFs.  */
1766       if (TREE_CODE (*p) == INDIRECT_REF)
1767         *p = fold_indirect_ref (*p);
1768
1769       if (handled_component_p (*p))
1770         ;
1771       /* Expand DECL_VALUE_EXPR now.  In some cases that may expose
1772          additional COMPONENT_REFs.  */
1773       else if ((TREE_CODE (*p) == VAR_DECL || TREE_CODE (*p) == PARM_DECL)
1774                && gimplify_var_or_parm_decl (p) == GS_OK)
1775         goto restart;
1776       else
1777         break;
1778                
1779       VEC_safe_push (tree, heap, stack, *p);
1780     }
1781
1782   gcc_assert (VEC_length (tree, stack));
1783
1784   /* Now STACK is a stack of pointers to all the refs we've walked through
1785      and P points to the innermost expression.
1786
1787      Java requires that we elaborated nodes in source order.  That
1788      means we must gimplify the inner expression followed by each of
1789      the indices, in order.  But we can't gimplify the inner
1790      expression until we deal with any variable bounds, sizes, or
1791      positions in order to deal with PLACEHOLDER_EXPRs.
1792
1793      So we do this in three steps.  First we deal with the annotations
1794      for any variables in the components, then we gimplify the base,
1795      then we gimplify any indices, from left to right.  */
1796   for (i = VEC_length (tree, stack) - 1; i >= 0; i--)
1797     {
1798       tree t = VEC_index (tree, stack, i);
1799
1800       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1801         {
1802           /* Gimplify the low bound and element type size and put them into
1803              the ARRAY_REF.  If these values are set, they have already been
1804              gimplified.  */
1805           if (!TREE_OPERAND (t, 2))
1806             {
1807               tree low = unshare_expr (array_ref_low_bound (t));
1808               if (!is_gimple_min_invariant (low))
1809                 {
1810                   TREE_OPERAND (t, 2) = low;
1811                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1812                                         is_gimple_formal_tmp_reg, fb_rvalue);
1813                   ret = MIN (ret, tret);
1814                 }
1815             }
1816
1817           if (!TREE_OPERAND (t, 3))
1818             {
1819               tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
1820               tree elmt_size = unshare_expr (array_ref_element_size (t));
1821               tree factor = size_int (TYPE_ALIGN_UNIT (elmt_type));
1822
1823               /* Divide the element size by the alignment of the element
1824                  type (above).  */
1825               elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
1826
1827               if (!is_gimple_min_invariant (elmt_size))
1828                 {
1829                   TREE_OPERAND (t, 3) = elmt_size;
1830                   tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
1831                                         is_gimple_formal_tmp_reg, fb_rvalue);
1832                   ret = MIN (ret, tret);
1833                 }
1834             }
1835         }
1836       else if (TREE_CODE (t) == COMPONENT_REF)
1837         {
1838           /* Set the field offset into T and gimplify it.  */
1839           if (!TREE_OPERAND (t, 2))
1840             {
1841               tree offset = unshare_expr (component_ref_field_offset (t));
1842               tree field = TREE_OPERAND (t, 1);
1843               tree factor
1844                 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
1845
1846               /* Divide the offset by its alignment.  */
1847               offset = size_binop (EXACT_DIV_EXPR, offset, factor);
1848
1849               if (!is_gimple_min_invariant (offset))
1850                 {
1851                   TREE_OPERAND (t, 2) = offset;
1852                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1853                                         is_gimple_formal_tmp_reg, fb_rvalue);
1854                   ret = MIN (ret, tret);
1855                 }
1856             }
1857         }
1858     }
1859
1860   /* Step 2 is to gimplify the base expression.  Make sure lvalue is set
1861      so as to match the min_lval predicate.  Failure to do so may result
1862      in the creation of large aggregate temporaries.  */
1863   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval,
1864                         fallback | fb_lvalue);
1865   ret = MIN (ret, tret);
1866
1867   /* And finally, the indices and operands to BIT_FIELD_REF.  During this
1868      loop we also remove any useless conversions.  */
1869   for (; VEC_length (tree, stack) > 0; )
1870     {
1871       tree t = VEC_pop (tree, stack);
1872
1873       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1874         {
1875           /* Gimplify the dimension.
1876              Temporary fix for gcc.c-torture/execute/20040313-1.c.
1877              Gimplify non-constant array indices into a temporary
1878              variable.
1879              FIXME - The real fix is to gimplify post-modify
1880              expressions into a minimal gimple lvalue.  However, that
1881              exposes bugs in alias analysis.  The alias analyzer does
1882              not handle &PTR->FIELD very well.  Will fix after the
1883              branch is merged into mainline (dnovillo 2004-05-03).  */
1884           if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1885             {
1886               tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1887                                     is_gimple_formal_tmp_reg, fb_rvalue);
1888               ret = MIN (ret, tret);
1889             }
1890         }
1891       else if (TREE_CODE (t) == BIT_FIELD_REF)
1892         {
1893           tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1894                                 is_gimple_val, fb_rvalue);
1895           ret = MIN (ret, tret);
1896           tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1897                                 is_gimple_val, fb_rvalue);
1898           ret = MIN (ret, tret);
1899         }
1900
1901       STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
1902
1903       /* The innermost expression P may have originally had TREE_SIDE_EFFECTS
1904          set which would have caused all the outer expressions in EXPR_P
1905          leading to P to also have had TREE_SIDE_EFFECTS set.  */
1906       recalculate_side_effects (t);
1907     }
1908
1909   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1910   ret = MIN (ret, tret);
1911
1912   /* If the outermost expression is a COMPONENT_REF, canonicalize its type.  */
1913   if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
1914     {
1915       canonicalize_component_ref (expr_p);
1916       ret = MIN (ret, GS_OK);
1917     }
1918
1919   VEC_free (tree, heap, stack);
1920
1921   return ret;
1922 }
1923
1924 /*  Gimplify the self modifying expression pointed to by EXPR_P
1925     (++, --, +=, -=).
1926
1927     PRE_P points to the list where side effects that must happen before
1928         *EXPR_P should be stored.
1929
1930     POST_P points to the list where side effects that must happen after
1931         *EXPR_P should be stored.
1932
1933     WANT_VALUE is nonzero iff we want to use the value of this expression
1934         in another expression.  */
1935
1936 static enum gimplify_status
1937 gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
1938                         bool want_value)
1939 {
1940   enum tree_code code;
1941   tree lhs, lvalue, rhs, t1, post = NULL, *orig_post_p = post_p;
1942   bool postfix;
1943   enum tree_code arith_code;
1944   enum gimplify_status ret;
1945
1946   code = TREE_CODE (*expr_p);
1947
1948   gcc_assert (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR
1949               || code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR);
1950
1951   /* Prefix or postfix?  */
1952   if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1953     /* Faster to treat as prefix if result is not used.  */
1954     postfix = want_value;
1955   else
1956     postfix = false;
1957
1958   /* For postfix, make sure the inner expression's post side effects
1959      are executed after side effects from this expression.  */
1960   if (postfix)
1961     post_p = &post;
1962
1963   /* Add or subtract?  */
1964   if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
1965     arith_code = PLUS_EXPR;
1966   else
1967     arith_code = MINUS_EXPR;
1968
1969   /* Gimplify the LHS into a GIMPLE lvalue.  */
1970   lvalue = TREE_OPERAND (*expr_p, 0);
1971   ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
1972   if (ret == GS_ERROR)
1973     return ret;
1974
1975   /* Extract the operands to the arithmetic operation.  */
1976   lhs = lvalue;
1977   rhs = TREE_OPERAND (*expr_p, 1);
1978
1979   /* For postfix operator, we evaluate the LHS to an rvalue and then use
1980      that as the result value and in the postqueue operation.  */
1981   if (postfix)
1982     {
1983       ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
1984       if (ret == GS_ERROR)
1985         return ret;
1986     }
1987
1988   /* For POINTERs increment, use POINTER_PLUS_EXPR.  */
1989   if (POINTER_TYPE_P (TREE_TYPE (lhs)))
1990     {
1991       rhs = fold_convert (sizetype, rhs);
1992       if (arith_code == MINUS_EXPR)
1993         rhs = fold_build1 (NEGATE_EXPR, TREE_TYPE (rhs), rhs);
1994       arith_code = POINTER_PLUS_EXPR;
1995     }
1996
1997   t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
1998   t1 = build_gimple_modify_stmt (lvalue, t1);
1999
2000   if (postfix)
2001     {
2002       gimplify_and_add (t1, orig_post_p);
2003       append_to_statement_list (post, orig_post_p);
2004       *expr_p = lhs;
2005       return GS_ALL_DONE;
2006     }
2007   else
2008     {
2009       *expr_p = t1;
2010       return GS_OK;
2011     }
2012 }
2013
2014 /* If *EXPR_P has a variable sized type, wrap it in a WITH_SIZE_EXPR.  */
2015
2016 static void
2017 maybe_with_size_expr (tree *expr_p)
2018 {
2019   tree expr = *expr_p;
2020   tree type = TREE_TYPE (expr);
2021   tree size;
2022
2023   /* If we've already wrapped this or the type is error_mark_node, we can't do
2024      anything.  */
2025   if (TREE_CODE (expr) == WITH_SIZE_EXPR
2026       || type == error_mark_node)
2027     return;
2028
2029   /* If the size isn't known or is a constant, we have nothing to do.  */
2030   size = TYPE_SIZE_UNIT (type);
2031   if (!size || TREE_CODE (size) == INTEGER_CST)
2032     return;
2033
2034   /* Otherwise, make a WITH_SIZE_EXPR.  */
2035   size = unshare_expr (size);
2036   size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
2037   *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
2038 }
2039
2040 /* Subroutine of gimplify_call_expr:  Gimplify a single argument.  */
2041
2042 static enum gimplify_status
2043 gimplify_arg (tree *expr_p, tree *pre_p)
2044 {
2045   bool (*test) (tree);
2046   fallback_t fb;
2047
2048   /* In general, we allow lvalues for function arguments to avoid
2049      extra overhead of copying large aggregates out of even larger
2050      aggregates into temporaries only to copy the temporaries to
2051      the argument list.  Make optimizers happy by pulling out to
2052      temporaries those types that fit in registers.  */
2053   if (is_gimple_reg_type (TREE_TYPE (*expr_p)))
2054     test = is_gimple_val, fb = fb_rvalue;
2055   else
2056     test = is_gimple_lvalue, fb = fb_either;
2057
2058   /* If this is a variable sized type, we must remember the size.  */
2059   maybe_with_size_expr (expr_p);
2060
2061   /* There is a sequence point before a function call.  Side effects in
2062      the argument list must occur before the actual call. So, when
2063      gimplifying arguments, force gimplify_expr to use an internal
2064      post queue which is then appended to the end of PRE_P.  */
2065   return gimplify_expr (expr_p, pre_p, NULL, test, fb);
2066 }
2067
2068 /* Gimplify the CALL_EXPR node pointed to by EXPR_P.  PRE_P points to the
2069    list where side effects that must happen before *EXPR_P should be stored.
2070    WANT_VALUE is true if the result of the call is desired.  */
2071
2072 static enum gimplify_status
2073 gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
2074 {
2075   tree decl, parms, p;
2076   enum gimplify_status ret;
2077   int i, nargs;
2078
2079   gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
2080
2081   /* For reliable diagnostics during inlining, it is necessary that
2082      every call_expr be annotated with file and line.  */
2083   if (! EXPR_HAS_LOCATION (*expr_p))
2084     SET_EXPR_LOCATION (*expr_p, input_location);
2085
2086   /* This may be a call to a builtin function.
2087
2088      Builtin function calls may be transformed into different
2089      (and more efficient) builtin function calls under certain
2090      circumstances.  Unfortunately, gimplification can muck things
2091      up enough that the builtin expanders are not aware that certain
2092      transformations are still valid.
2093
2094      So we attempt transformation/gimplification of the call before
2095      we gimplify the CALL_EXPR.  At this time we do not manage to
2096      transform all calls in the same manner as the expanders do, but
2097      we do transform most of them.  */
2098   decl = get_callee_fndecl (*expr_p);
2099   if (decl && DECL_BUILT_IN (decl))
2100     {
2101       tree new = fold_call_expr (*expr_p, !want_value);
2102
2103       if (new && new != *expr_p)
2104         {
2105           /* There was a transformation of this call which computes the
2106              same value, but in a more efficient way.  Return and try
2107              again.  */
2108           *expr_p = new;
2109           return GS_OK;
2110         }
2111
2112       if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
2113           && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
2114         {
2115           if (call_expr_nargs (*expr_p) < 2)
2116             {
2117               error ("too few arguments to function %<va_start%>");
2118               *expr_p = build_empty_stmt ();
2119               return GS_OK;
2120             }
2121           
2122           if (fold_builtin_next_arg (*expr_p, true))
2123             {
2124               *expr_p = build_empty_stmt ();
2125               return GS_OK;
2126             }
2127           /* Avoid gimplifying the second argument to va_start, which needs
2128              to be the plain PARM_DECL.  */
2129           return gimplify_arg (&CALL_EXPR_ARG (*expr_p, 0), pre_p);
2130         }
2131     }
2132
2133   /* There is a sequence point before the call, so any side effects in
2134      the calling expression must occur before the actual call.  Force
2135      gimplify_expr to use an internal post queue.  */
2136   ret = gimplify_expr (&CALL_EXPR_FN (*expr_p), pre_p, NULL,
2137                        is_gimple_call_addr, fb_rvalue);
2138
2139   nargs = call_expr_nargs (*expr_p);
2140
2141   /* Get argument types for verification.  */
2142   decl = get_callee_fndecl (*expr_p);
2143   parms = NULL_TREE;
2144   if (decl)
2145     parms = TYPE_ARG_TYPES (TREE_TYPE (decl));
2146   else if (POINTER_TYPE_P (TREE_TYPE (CALL_EXPR_FN (*expr_p))))
2147     parms = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (*expr_p))));
2148
2149   /* Verify if the type of the argument matches that of the function
2150      declaration.  If we cannot verify this or there is a mismatch,
2151      mark the call expression so it doesn't get inlined later.  */
2152   if (decl && DECL_ARGUMENTS (decl))
2153     {
2154       for (i = 0, p = DECL_ARGUMENTS (decl); i < nargs;
2155            i++, p = TREE_CHAIN (p))
2156         {
2157           /* We cannot distinguish a varargs function from the case
2158              of excess parameters, still deferring the inlining decision
2159              to the callee is possible.  */
2160           if (!p)
2161             break;
2162           if (p == error_mark_node
2163               || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
2164               || !fold_convertible_p (DECL_ARG_TYPE (p),
2165                                       CALL_EXPR_ARG (*expr_p, i)))
2166             {
2167               CALL_CANNOT_INLINE_P (*expr_p) = 1;
2168               break;
2169             }
2170         }
2171     }
2172   else if (parms)
2173     {
2174       for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
2175         {
2176           /* If this is a varargs function defer inlining decision
2177              to callee.  */
2178           if (!p)
2179             break;
2180           if (TREE_VALUE (p) == error_mark_node
2181               || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
2182               || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
2183               || !fold_convertible_p (TREE_VALUE (p),
2184                                       CALL_EXPR_ARG (*expr_p, i)))
2185             {
2186               CALL_CANNOT_INLINE_P (*expr_p) = 1;
2187               break;
2188             }
2189         }
2190     }
2191   else
2192     {
2193       if (nargs != 0)
2194         CALL_CANNOT_INLINE_P (*expr_p) = 1;
2195       i = 0;
2196       p = NULL_TREE;
2197     }
2198
2199   /* If the last argument is __builtin_va_arg_pack () and it is not
2200      passed as a named argument, decrease the number of CALL_EXPR
2201      arguments and set instead the CALL_EXPR_VA_ARG_PACK flag.  */
2202   if (!p
2203       && i < nargs
2204       && TREE_CODE (CALL_EXPR_ARG (*expr_p, nargs - 1)) == CALL_EXPR)
2205     {
2206       tree last_arg = CALL_EXPR_ARG (*expr_p, nargs - 1);
2207       tree last_arg_fndecl = get_callee_fndecl (last_arg);
2208
2209       if (last_arg_fndecl
2210           && TREE_CODE (last_arg_fndecl) == FUNCTION_DECL
2211           && DECL_BUILT_IN_CLASS (last_arg_fndecl) == BUILT_IN_NORMAL
2212           && DECL_FUNCTION_CODE (last_arg_fndecl) == BUILT_IN_VA_ARG_PACK)
2213         {
2214           tree call = *expr_p;
2215
2216           --nargs;
2217           *expr_p = build_call_array (TREE_TYPE (call), CALL_EXPR_FN (call),
2218                                       nargs, CALL_EXPR_ARGP (call));
2219           /* Copy all CALL_EXPR flags, locus and block, except
2220              CALL_EXPR_VA_ARG_PACK flag.  */
2221           CALL_EXPR_STATIC_CHAIN (*expr_p) = CALL_EXPR_STATIC_CHAIN (call);
2222           CALL_EXPR_TAILCALL (*expr_p) = CALL_EXPR_TAILCALL (call);
2223           CALL_EXPR_RETURN_SLOT_OPT (*expr_p)
2224             = CALL_EXPR_RETURN_SLOT_OPT (call);
2225           CALL_FROM_THUNK_P (*expr_p) = CALL_FROM_THUNK_P (call);
2226           CALL_CANNOT_INLINE_P (*expr_p)
2227             = CALL_CANNOT_INLINE_P (call);
2228           TREE_NOTHROW (*expr_p) = TREE_NOTHROW (call);
2229           SET_EXPR_LOCUS (*expr_p, EXPR_LOCUS (call));
2230           TREE_BLOCK (*expr_p) = TREE_BLOCK (call);
2231           /* Set CALL_EXPR_VA_ARG_PACK.  */
2232           CALL_EXPR_VA_ARG_PACK (*expr_p) = 1;
2233         }
2234     }
2235
2236   /* Finally, gimplify the function arguments.  */
2237   for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
2238        PUSH_ARGS_REVERSED ? i >= 0 : i < nargs;
2239        PUSH_ARGS_REVERSED ? i-- : i++)
2240     {
2241       enum gimplify_status t;
2242
2243       t = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p);
2244
2245       if (t == GS_ERROR)
2246         ret = GS_ERROR;
2247     }
2248
2249   /* Try this again in case gimplification exposed something.  */
2250   if (ret != GS_ERROR)
2251     {
2252       tree new = fold_call_expr (*expr_p, !want_value);
2253
2254       if (new && new != *expr_p)
2255         {
2256           /* There was a transformation of this call which computes the
2257              same value, but in a more efficient way.  Return and try
2258              again.  */
2259           *expr_p = new;
2260           return GS_OK;
2261         }
2262     }
2263
2264   /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
2265      decl.  This allows us to eliminate redundant or useless
2266      calls to "const" functions.  */
2267   if (TREE_CODE (*expr_p) == CALL_EXPR
2268       && (call_expr_flags (*expr_p) & (ECF_CONST | ECF_PURE)))
2269     TREE_SIDE_EFFECTS (*expr_p) = 0;
2270
2271   return ret;
2272 }
2273
2274 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
2275    rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
2276
2277    TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
2278    condition is true or false, respectively.  If null, we should generate
2279    our own to skip over the evaluation of this specific expression.
2280
2281    This function is the tree equivalent of do_jump.
2282
2283    shortcut_cond_r should only be called by shortcut_cond_expr.  */
2284
2285 static tree
2286 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p)
2287 {
2288   tree local_label = NULL_TREE;
2289   tree t, expr = NULL;
2290
2291   /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
2292      retain the shortcut semantics.  Just insert the gotos here;
2293      shortcut_cond_expr will append the real blocks later.  */
2294   if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2295     {
2296       /* Turn if (a && b) into
2297
2298          if (a); else goto no;
2299          if (b) goto yes; else goto no;
2300          (no:) */
2301
2302       if (false_label_p == NULL)
2303         false_label_p = &local_label;
2304
2305       t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p);
2306       append_to_statement_list (t, &expr);
2307
2308       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2309                            false_label_p);
2310       append_to_statement_list (t, &expr);
2311     }
2312   else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2313     {
2314       /* Turn if (a || b) into
2315
2316          if (a) goto yes;
2317          if (b) goto yes; else goto no;
2318          (yes:) */
2319
2320       if (true_label_p == NULL)
2321         true_label_p = &local_label;
2322
2323       t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL);
2324       append_to_statement_list (t, &expr);
2325
2326       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2327                            false_label_p);
2328       append_to_statement_list (t, &expr);
2329     }
2330   else if (TREE_CODE (pred) == COND_EXPR)
2331     {
2332       /* As long as we're messing with gotos, turn if (a ? b : c) into
2333          if (a)
2334            if (b) goto yes; else goto no;
2335          else
2336            if (c) goto yes; else goto no;  */
2337       expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
2338                      shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2339                                       false_label_p),
2340                      shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
2341                                       false_label_p));
2342     }
2343   else
2344     {
2345       expr = build3 (COND_EXPR, void_type_node, pred,
2346                      build_and_jump (true_label_p),
2347                      build_and_jump (false_label_p));
2348     }
2349
2350   if (local_label)
2351     {
2352       t = build1 (LABEL_EXPR, void_type_node, local_label);
2353       append_to_statement_list (t, &expr);
2354     }
2355
2356   return expr;
2357 }
2358
2359 static tree
2360 shortcut_cond_expr (tree expr)
2361 {
2362   tree pred = TREE_OPERAND (expr, 0);
2363   tree then_ = TREE_OPERAND (expr, 1);
2364   tree else_ = TREE_OPERAND (expr, 2);
2365   tree true_label, false_label, end_label, t;
2366   tree *true_label_p;
2367   tree *false_label_p;
2368   bool emit_end, emit_false, jump_over_else;
2369   bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2370   bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2371
2372   /* First do simple transformations.  */
2373   if (!else_se)
2374     {
2375       /* If there is no 'else', turn (a && b) into if (a) if (b).  */
2376       while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2377         {
2378           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2379           then_ = shortcut_cond_expr (expr);
2380           then_se = then_ && TREE_SIDE_EFFECTS (then_);
2381           pred = TREE_OPERAND (pred, 0);
2382           expr = build3 (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2383         }
2384     }
2385   if (!then_se)
2386     {
2387       /* If there is no 'then', turn
2388            if (a || b); else d
2389          into
2390            if (a); else if (b); else d.  */
2391       while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2392         {
2393           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2394           else_ = shortcut_cond_expr (expr);
2395           else_se = else_ && TREE_SIDE_EFFECTS (else_);
2396           pred = TREE_OPERAND (pred, 0);
2397           expr = build3 (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2398         }
2399     }
2400
2401   /* If we're done, great.  */
2402   if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2403       && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2404     return expr;
2405
2406   /* Otherwise we need to mess with gotos.  Change
2407        if (a) c; else d;
2408      to
2409        if (a); else goto no;
2410        c; goto end;
2411        no: d; end:
2412      and recursively gimplify the condition.  */
2413
2414   true_label = false_label = end_label = NULL_TREE;
2415
2416   /* If our arms just jump somewhere, hijack those labels so we don't
2417      generate jumps to jumps.  */
2418
2419   if (then_
2420       && TREE_CODE (then_) == GOTO_EXPR
2421       && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2422     {
2423       true_label = GOTO_DESTINATION (then_);
2424       then_ = NULL;
2425       then_se = false;
2426     }
2427
2428   if (else_
2429       && TREE_CODE (else_) == GOTO_EXPR
2430       && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2431     {
2432       false_label = GOTO_DESTINATION (else_);
2433       else_ = NULL;
2434       else_se = false;
2435     }
2436
2437   /* If we aren't hijacking a label for the 'then' branch, it falls through.  */
2438   if (true_label)
2439     true_label_p = &true_label;
2440   else
2441     true_label_p = NULL;
2442
2443   /* The 'else' branch also needs a label if it contains interesting code.  */
2444   if (false_label || else_se)
2445     false_label_p = &false_label;
2446   else
2447     false_label_p = NULL;
2448
2449   /* If there was nothing else in our arms, just forward the label(s).  */
2450   if (!then_se && !else_se)
2451     return shortcut_cond_r (pred, true_label_p, false_label_p);
2452
2453   /* If our last subexpression already has a terminal label, reuse it.  */
2454   if (else_se)
2455     expr = expr_last (else_);
2456   else if (then_se)
2457     expr = expr_last (then_);
2458   else
2459     expr = NULL;
2460   if (expr && TREE_CODE (expr) == LABEL_EXPR)
2461     end_label = LABEL_EXPR_LABEL (expr);
2462
2463   /* If we don't care about jumping to the 'else' branch, jump to the end
2464      if the condition is false.  */
2465   if (!false_label_p)
2466     false_label_p = &end_label;
2467
2468   /* We only want to emit these labels if we aren't hijacking them.  */
2469   emit_end = (end_label == NULL_TREE);
2470   emit_false = (false_label == NULL_TREE);
2471
2472   /* We only emit the jump over the else clause if we have to--if the
2473      then clause may fall through.  Otherwise we can wind up with a
2474      useless jump and a useless label at the end of gimplified code,
2475      which will cause us to think that this conditional as a whole
2476      falls through even if it doesn't.  If we then inline a function
2477      which ends with such a condition, that can cause us to issue an
2478      inappropriate warning about control reaching the end of a
2479      non-void function.  */
2480   jump_over_else = block_may_fallthru (then_);
2481
2482   pred = shortcut_cond_r (pred, true_label_p, false_label_p);
2483
2484   expr = NULL;
2485   append_to_statement_list (pred, &expr);
2486
2487   append_to_statement_list (then_, &expr);
2488   if (else_se)
2489     {
2490       if (jump_over_else)
2491         {
2492           t = build_and_jump (&end_label);
2493           append_to_statement_list (t, &expr);
2494         }
2495       if (emit_false)
2496         {
2497           t = build1 (LABEL_EXPR, void_type_node, false_label);
2498           append_to_statement_list (t, &expr);
2499         }
2500       append_to_statement_list (else_, &expr);
2501     }
2502   if (emit_end && end_label)
2503     {
2504       t = build1 (LABEL_EXPR, void_type_node, end_label);
2505       append_to_statement_list (t, &expr);
2506     }
2507
2508   return expr;
2509 }
2510
2511 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE.  */
2512
2513 tree
2514 gimple_boolify (tree expr)
2515 {
2516   tree type = TREE_TYPE (expr);
2517
2518   if (TREE_CODE (type) == BOOLEAN_TYPE)
2519     return expr;
2520
2521   switch (TREE_CODE (expr))
2522     {
2523     case TRUTH_AND_EXPR:
2524     case TRUTH_OR_EXPR:
2525     case TRUTH_XOR_EXPR:
2526     case TRUTH_ANDIF_EXPR:
2527     case TRUTH_ORIF_EXPR:
2528       /* Also boolify the arguments of truth exprs.  */
2529       TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2530       /* FALLTHRU */
2531
2532     case TRUTH_NOT_EXPR:
2533       TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2534       /* FALLTHRU */
2535
2536     case EQ_EXPR: case NE_EXPR:
2537     case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2538       /* These expressions always produce boolean results.  */
2539       TREE_TYPE (expr) = boolean_type_node;
2540       return expr;
2541
2542     default:
2543       /* Other expressions that get here must have boolean values, but
2544          might need to be converted to the appropriate mode.  */
2545       return fold_convert (boolean_type_node, expr);
2546     }
2547 }
2548
2549 /*  Convert the conditional expression pointed to by EXPR_P '(p) ? a : b;'
2550     into
2551
2552     if (p)                      if (p)
2553       t1 = a;                     a;
2554     else                or      else
2555       t1 = b;                     b;
2556     t1;
2557
2558     The second form is used when *EXPR_P is of type void.
2559
2560     TARGET is the tree for T1 above.
2561
2562     PRE_P points to the list where side effects that must happen before
2563       *EXPR_P should be stored.  */
2564
2565 static enum gimplify_status
2566 gimplify_cond_expr (tree *expr_p, tree *pre_p, fallback_t fallback)
2567 {
2568   tree expr = *expr_p;
2569   tree tmp, tmp2, type;
2570   enum gimplify_status ret;
2571
2572   type = TREE_TYPE (expr);
2573
2574   /* If this COND_EXPR has a value, copy the values into a temporary within
2575      the arms.  */
2576   if (! VOID_TYPE_P (type))
2577     {
2578       tree result;
2579
2580       if ((fallback & fb_lvalue) == 0)
2581         {
2582           result = tmp2 = tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2583           ret = GS_ALL_DONE;
2584         }
2585       else
2586         {
2587           tree type = build_pointer_type (TREE_TYPE (expr));
2588
2589           if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2590             TREE_OPERAND (expr, 1) =
2591               build_fold_addr_expr (TREE_OPERAND (expr, 1));
2592
2593           if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2594             TREE_OPERAND (expr, 2) =
2595               build_fold_addr_expr (TREE_OPERAND (expr, 2));
2596           
2597           tmp2 = tmp = create_tmp_var (type, "iftmp");
2598
2599           expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (expr, 0),
2600                          TREE_OPERAND (expr, 1), TREE_OPERAND (expr, 2));
2601
2602           result = build_fold_indirect_ref (tmp);
2603           ret = GS_ALL_DONE;
2604         }
2605
2606       /* Build the then clause, 't1 = a;'.  But don't build an assignment
2607          if this branch is void; in C++ it can be, if it's a throw.  */
2608       if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2609         TREE_OPERAND (expr, 1)
2610           = build_gimple_modify_stmt (tmp, TREE_OPERAND (expr, 1));
2611
2612       /* Build the else clause, 't1 = b;'.  */
2613       if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2614         TREE_OPERAND (expr, 2)
2615           = build_gimple_modify_stmt (tmp2, TREE_OPERAND (expr, 2));
2616
2617       TREE_TYPE (expr) = void_type_node;
2618       recalculate_side_effects (expr);
2619
2620       /* Move the COND_EXPR to the prequeue.  */
2621       gimplify_and_add (expr, pre_p);
2622
2623       *expr_p = result;
2624       return ret;
2625     }
2626
2627   /* Make sure the condition has BOOLEAN_TYPE.  */
2628   TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2629
2630   /* Break apart && and || conditions.  */
2631   if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2632       || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2633     {
2634       expr = shortcut_cond_expr (expr);
2635
2636       if (expr != *expr_p)
2637         {
2638           *expr_p = expr;
2639
2640           /* We can't rely on gimplify_expr to re-gimplify the expanded
2641              form properly, as cleanups might cause the target labels to be
2642              wrapped in a TRY_FINALLY_EXPR.  To prevent that, we need to
2643              set up a conditional context.  */
2644           gimple_push_condition ();
2645           gimplify_stmt (expr_p);
2646           gimple_pop_condition (pre_p);
2647
2648           return GS_ALL_DONE;
2649         }
2650     }
2651
2652   /* Now do the normal gimplification.  */
2653   ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2654                        is_gimple_condexpr, fb_rvalue);
2655
2656   gimple_push_condition ();
2657
2658   gimplify_to_stmt_list (&TREE_OPERAND (expr, 1));
2659   gimplify_to_stmt_list (&TREE_OPERAND (expr, 2));
2660   recalculate_side_effects (expr);
2661
2662   gimple_pop_condition (pre_p);
2663
2664   if (ret == GS_ERROR)
2665     ;
2666   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2667     ret = GS_ALL_DONE;
2668   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 2)))
2669     /* Rewrite "if (a); else b" to "if (!a) b"  */
2670     {
2671       TREE_OPERAND (expr, 0) = invert_truthvalue (TREE_OPERAND (expr, 0));
2672       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2673                            is_gimple_condexpr, fb_rvalue);
2674
2675       tmp = TREE_OPERAND (expr, 1);
2676       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 2);
2677       TREE_OPERAND (expr, 2) = tmp;
2678     }
2679   else
2680     /* Both arms are empty; replace the COND_EXPR with its predicate.  */
2681     expr = TREE_OPERAND (expr, 0);
2682
2683   *expr_p = expr;
2684   return ret;
2685 }
2686
2687 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2688    a call to __builtin_memcpy.  */
2689
2690 static enum gimplify_status
2691 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value)
2692 {
2693   tree t, to, to_ptr, from, from_ptr;
2694
2695   to = GENERIC_TREE_OPERAND (*expr_p, 0);
2696   from = GENERIC_TREE_OPERAND (*expr_p, 1);
2697
2698   from_ptr = build_fold_addr_expr (from);
2699
2700   to_ptr = build_fold_addr_expr (to);
2701   t = implicit_built_in_decls[BUILT_IN_MEMCPY];
2702   t = build_call_expr (t, 3, to_ptr, from_ptr, size);
2703
2704   if (want_value)
2705     {
2706       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2707       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2708     }
2709
2710   *expr_p = t;
2711   return GS_OK;
2712 }
2713
2714 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2715    a call to __builtin_memset.  In this case we know that the RHS is
2716    a CONSTRUCTOR with an empty element list.  */
2717
2718 static enum gimplify_status
2719 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value)
2720 {
2721   tree t, to, to_ptr;
2722
2723   to = GENERIC_TREE_OPERAND (*expr_p, 0);
2724
2725   to_ptr = build_fold_addr_expr (to);
2726   t = implicit_built_in_decls[BUILT_IN_MEMSET];
2727   t = build_call_expr (t, 3, to_ptr, integer_zero_node, size);
2728
2729   if (want_value)
2730     {
2731       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2732       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2733     }
2734
2735   *expr_p = t;
2736   return GS_OK;
2737 }
2738
2739 /* A subroutine of gimplify_init_ctor_preeval.  Called via walk_tree,
2740    determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
2741    assignment.  Returns non-null if we detect a potential overlap.  */
2742
2743 struct gimplify_init_ctor_preeval_data
2744 {
2745   /* The base decl of the lhs object.  May be NULL, in which case we
2746      have to assume the lhs is indirect.  */
2747   tree lhs_base_decl;
2748
2749   /* The alias set of the lhs object.  */
2750   alias_set_type lhs_alias_set;
2751 };
2752
2753 static tree
2754 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
2755 {
2756   struct gimplify_init_ctor_preeval_data *data
2757     = (struct gimplify_init_ctor_preeval_data *) xdata;
2758   tree t = *tp;
2759
2760   /* If we find the base object, obviously we have overlap.  */
2761   if (data->lhs_base_decl == t)
2762     return t;
2763
2764   /* If the constructor component is indirect, determine if we have a
2765      potential overlap with the lhs.  The only bits of information we
2766      have to go on at this point are addressability and alias sets.  */
2767   if (TREE_CODE (t) == INDIRECT_REF
2768       && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2769       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
2770     return t;
2771
2772   /* If the constructor component is a call, determine if it can hide a
2773      potential overlap with the lhs through an INDIRECT_REF like above.  */
2774   if (TREE_CODE (t) == CALL_EXPR)
2775     {
2776       tree type, fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (t)));
2777
2778       for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
2779         if (POINTER_TYPE_P (TREE_VALUE (type))
2780             && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2781             && alias_sets_conflict_p (data->lhs_alias_set,
2782                                       get_alias_set
2783                                         (TREE_TYPE (TREE_VALUE (type)))))
2784           return t;
2785     }
2786
2787   if (IS_TYPE_OR_DECL_P (t))
2788     *walk_subtrees = 0;
2789   return NULL;
2790 }
2791
2792 /* A subroutine of gimplify_init_constructor.  Pre-evaluate *EXPR_P,
2793    force values that overlap with the lhs (as described by *DATA)
2794    into temporaries.  */
2795
2796 static void
2797 gimplify_init_ctor_preeval (tree *expr_p, tree *pre_p, tree *post_p,
2798                             struct gimplify_init_ctor_preeval_data *data)
2799 {
2800   enum gimplify_status one;
2801
2802   /* If the value is invariant, then there's nothing to pre-evaluate.
2803      But ensure it doesn't have any side-effects since a SAVE_EXPR is
2804      invariant but has side effects and might contain a reference to
2805      the object we're initializing.  */
2806   if (TREE_INVARIANT (*expr_p) && !TREE_SIDE_EFFECTS (*expr_p))
2807     return;
2808
2809   /* If the type has non-trivial constructors, we can't pre-evaluate.  */
2810   if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
2811     return;
2812
2813   /* Recurse for nested constructors.  */
2814   if (TREE_CODE (*expr_p) == CONSTRUCTOR)
2815     {
2816       unsigned HOST_WIDE_INT ix;
2817       constructor_elt *ce;
2818       VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
2819
2820       for (ix = 0; VEC_iterate (constructor_elt, v, ix, ce); ix++)
2821         gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
2822       return;
2823     }
2824
2825   /* If this is a variable sized type, we must remember the size.  */
2826   maybe_with_size_expr (expr_p);
2827
2828   /* Gimplify the constructor element to something appropriate for the rhs
2829      of a MODIFY_EXPR.  Given that we know the lhs is an aggregate, we know
2830      the gimplifier will consider this a store to memory.  Doing this
2831      gimplification now means that we won't have to deal with complicated
2832      language-specific trees, nor trees like SAVE_EXPR that can induce
2833      exponential search behavior.  */
2834   one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
2835   if (one == GS_ERROR)
2836     {
2837       *expr_p = NULL;
2838       return;
2839     }
2840
2841   /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
2842      with the lhs, since "a = { .x=a }" doesn't make sense.  This will
2843      always be true for all scalars, since is_gimple_mem_rhs insists on a
2844      temporary variable for them.  */
2845   if (DECL_P (*expr_p))
2846     return;
2847
2848   /* If this is of variable size, we have no choice but to assume it doesn't
2849      overlap since we can't make a temporary for it.  */
2850   if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
2851     return;
2852
2853   /* Otherwise, we must search for overlap ...  */
2854   if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
2855     return;
2856
2857   /* ... and if found, force the value into a temporary.  */
2858   *expr_p = get_formal_tmp_var (*expr_p, pre_p);
2859 }
2860
2861 /* A subroutine of gimplify_init_ctor_eval.  Create a loop for
2862    a RANGE_EXPR in a CONSTRUCTOR for an array.
2863
2864       var = lower;
2865     loop_entry:
2866       object[var] = value;
2867       if (var == upper)
2868         goto loop_exit;
2869       var = var + 1;
2870       goto loop_entry;
2871     loop_exit:
2872
2873    We increment var _after_ the loop exit check because we might otherwise
2874    fail if upper == TYPE_MAX_VALUE (type for upper).
2875
2876    Note that we never have to deal with SAVE_EXPRs here, because this has
2877    already been taken care of for us, in gimplify_init_ctor_preeval().  */
2878
2879 static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
2880                                      tree *, bool);
2881
2882 static void
2883 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
2884                                tree value, tree array_elt_type,
2885                                tree *pre_p, bool cleared)
2886 {
2887   tree loop_entry_label, loop_exit_label;
2888   tree var, var_type, cref, tmp;
2889
2890   loop_entry_label = create_artificial_label ();
2891   loop_exit_label = create_artificial_label ();
2892
2893   /* Create and initialize the index variable.  */
2894   var_type = TREE_TYPE (upper);
2895   var = create_tmp_var (var_type, NULL);
2896   append_to_statement_list (build_gimple_modify_stmt (var, lower), pre_p);
2897
2898   /* Add the loop entry label.  */
2899   append_to_statement_list (build1 (LABEL_EXPR,
2900                                     void_type_node,
2901                                     loop_entry_label),
2902                             pre_p);
2903
2904   /* Build the reference.  */
2905   cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
2906                  var, NULL_TREE, NULL_TREE);
2907
2908   /* If we are a constructor, just call gimplify_init_ctor_eval to do
2909      the store.  Otherwise just assign value to the reference.  */
2910
2911   if (TREE_CODE (value) == CONSTRUCTOR)
2912     /* NB we might have to call ourself recursively through
2913        gimplify_init_ctor_eval if the value is a constructor.  */
2914     gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2915                              pre_p, cleared);
2916   else
2917     append_to_statement_list (build_gimple_modify_stmt (cref, value), pre_p);
2918
2919   /* We exit the loop when the index var is equal to the upper bound.  */
2920   gimplify_and_add (build3 (COND_EXPR, void_type_node,
2921                             build2 (EQ_EXPR, boolean_type_node,
2922                                     var, upper),
2923                             build1 (GOTO_EXPR,
2924                                     void_type_node,
2925                                     loop_exit_label),
2926                             NULL_TREE),
2927                     pre_p);
2928
2929   /* Otherwise, increment the index var...  */
2930   tmp = build2 (PLUS_EXPR, var_type, var,
2931                 fold_convert (var_type, integer_one_node));
2932   append_to_statement_list (build_gimple_modify_stmt (var, tmp), pre_p);
2933
2934   /* ...and jump back to the loop entry.  */
2935   append_to_statement_list (build1 (GOTO_EXPR,
2936                                     void_type_node,
2937                                     loop_entry_label),
2938                             pre_p);
2939
2940   /* Add the loop exit label.  */
2941   append_to_statement_list (build1 (LABEL_EXPR,
2942                                     void_type_node,
2943                                     loop_exit_label),
2944                             pre_p);
2945 }
2946
2947 /* Return true if FDECL is accessing a field that is zero sized.  */
2948    
2949 static bool
2950 zero_sized_field_decl (const_tree fdecl)
2951 {
2952   if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl) 
2953       && integer_zerop (DECL_SIZE (fdecl)))
2954     return true;
2955   return false;
2956 }
2957
2958 /* Return true if TYPE is zero sized.  */
2959    
2960 static bool
2961 zero_sized_type (const_tree type)
2962 {
2963   if (AGGREGATE_TYPE_P (type) && TYPE_SIZE (type)
2964       && integer_zerop (TYPE_SIZE (type)))
2965     return true;
2966   return false;
2967 }
2968
2969 /* A subroutine of gimplify_init_constructor.  Generate individual
2970    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
2971    assignments should happen.  ELTS is the CONSTRUCTOR_ELTS of the
2972    CONSTRUCTOR.  CLEARED is true if the entire LHS object has been
2973    zeroed first.  */
2974
2975 static void
2976 gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
2977                          tree *pre_p, bool cleared)
2978 {
2979   tree array_elt_type = NULL;
2980   unsigned HOST_WIDE_INT ix;
2981   tree purpose, value;
2982
2983   if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
2984     array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
2985
2986   FOR_EACH_CONSTRUCTOR_ELT (elts, ix, purpose, value)
2987     {
2988       tree cref, init;
2989
2990       /* NULL values are created above for gimplification errors.  */
2991       if (value == NULL)
2992         continue;
2993
2994       if (cleared && initializer_zerop (value))
2995         continue;
2996
2997       /* ??? Here's to hoping the front end fills in all of the indices,
2998          so we don't have to figure out what's missing ourselves.  */
2999       gcc_assert (purpose);
3000
3001       /* Skip zero-sized fields, unless value has side-effects.  This can
3002          happen with calls to functions returning a zero-sized type, which
3003          we shouldn't discard.  As a number of downstream passes don't
3004          expect sets of zero-sized fields, we rely on the gimplification of
3005          the MODIFY_EXPR we make below to drop the assignment statement.  */
3006       if (! TREE_SIDE_EFFECTS (value) && zero_sized_field_decl (purpose))
3007         continue;
3008
3009       /* If we have a RANGE_EXPR, we have to build a loop to assign the
3010          whole range.  */
3011       if (TREE_CODE (purpose) == RANGE_EXPR)
3012         {
3013           tree lower = TREE_OPERAND (purpose, 0);
3014           tree upper = TREE_OPERAND (purpose, 1);
3015
3016           /* If the lower bound is equal to upper, just treat it as if
3017              upper was the index.  */
3018           if (simple_cst_equal (lower, upper))
3019             purpose = upper;
3020           else
3021             {
3022               gimplify_init_ctor_eval_range (object, lower, upper, value,
3023                                              array_elt_type, pre_p, cleared);
3024               continue;
3025             }
3026         }
3027
3028       if (array_elt_type)
3029         {
3030           cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3031                          purpose, NULL_TREE, NULL_TREE);
3032         }
3033       else
3034         {
3035           gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
3036           cref = build3 (COMPONENT_REF, TREE_TYPE (purpose),
3037                          unshare_expr (object), purpose, NULL_TREE);
3038         }
3039
3040       if (TREE_CODE (value) == CONSTRUCTOR
3041           && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
3042         gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3043                                  pre_p, cleared);
3044       else
3045         {
3046           init = build2 (INIT_EXPR, TREE_TYPE (cref), cref, value);
3047           gimplify_and_add (init, pre_p);
3048         }
3049     }
3050 }
3051
3052 /* A subroutine of gimplify_modify_expr.  Break out elements of a
3053    CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
3054
3055    Note that we still need to clear any elements that don't have explicit
3056    initializers, so if not all elements are initialized we keep the
3057    original MODIFY_EXPR, we just remove all of the constructor elements.  */
3058
3059 static enum gimplify_status
3060 gimplify_init_constructor (tree *expr_p, tree *pre_p,
3061                            tree *post_p, bool want_value)
3062 {
3063   tree object;
3064   tree ctor = GENERIC_TREE_OPERAND (*expr_p, 1);
3065   tree type = TREE_TYPE (ctor);
3066   enum gimplify_status ret;
3067   VEC(constructor_elt,gc) *elts;
3068
3069   if (TREE_CODE (ctor) != CONSTRUCTOR)
3070     return GS_UNHANDLED;
3071
3072   ret = gimplify_expr (&GENERIC_TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3073                        is_gimple_lvalue, fb_lvalue);
3074   if (ret == GS_ERROR)
3075     return ret;
3076   object = GENERIC_TREE_OPERAND (*expr_p, 0);
3077
3078   elts = CONSTRUCTOR_ELTS (ctor);
3079
3080   ret = GS_ALL_DONE;
3081   switch (TREE_CODE (type))
3082     {
3083     case RECORD_TYPE:
3084     case UNION_TYPE:
3085     case QUAL_UNION_TYPE:
3086     case ARRAY_TYPE:
3087       {
3088         struct gimplify_init_ctor_preeval_data preeval_data;
3089         HOST_WIDE_INT num_type_elements, num_ctor_elements;
3090         HOST_WIDE_INT num_nonzero_elements;
3091         bool cleared, valid_const_initializer;
3092
3093         /* Aggregate types must lower constructors to initialization of
3094            individual elements.  The exception is that a CONSTRUCTOR node
3095            with no elements indicates zero-initialization of the whole.  */
3096         if (VEC_empty (constructor_elt, elts))
3097           break;
3098
3099         /* Fetch information about the constructor to direct later processing.
3100            We might want to make static versions of it in various cases, and
3101            can only do so if it known to be a valid constant initializer.  */
3102         valid_const_initializer
3103           = categorize_ctor_elements (ctor, &num_nonzero_elements,
3104                                       &num_ctor_elements, &cleared);
3105
3106         /* If a const aggregate variable is being initialized, then it
3107            should never be a lose to promote the variable to be static.  */
3108         if (valid_const_initializer
3109             && num_nonzero_elements > 1
3110             && TREE_READONLY (object)
3111             && TREE_CODE (object) == VAR_DECL)
3112           {
3113             DECL_INITIAL (object) = ctor;
3114             TREE_STATIC (object) = 1;
3115             if (!DECL_NAME (object))
3116               DECL_NAME (object) = create_tmp_var_name ("C");
3117             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
3118
3119             /* ??? C++ doesn't automatically append a .<number> to the
3120                assembler name, and even when it does, it looks a FE private
3121                data structures to figure out what that number should be,
3122                which are not set for this variable.  I suppose this is
3123                important for local statics for inline functions, which aren't
3124                "local" in the object file sense.  So in order to get a unique
3125                TU-local symbol, we must invoke the lhd version now.  */
3126             lhd_set_decl_assembler_name (object);
3127
3128             *expr_p = NULL_TREE;
3129             break;
3130           }
3131
3132         /* If there are "lots" of initialized elements, even discounting
3133            those that are not address constants (and thus *must* be
3134            computed at runtime), then partition the constructor into
3135            constant and non-constant parts.  Block copy the constant
3136            parts in, then generate code for the non-constant parts.  */
3137         /* TODO.  There's code in cp/typeck.c to do this.  */
3138
3139         num_type_elements = count_type_elements (type, true);
3140
3141         /* If count_type_elements could not determine number of type elements
3142            for a constant-sized object, assume clearing is needed.
3143            Don't do this for variable-sized objects, as store_constructor
3144            will ignore the clearing of variable-sized objects.  */
3145         if (num_type_elements < 0 && int_size_in_bytes (type) >= 0)
3146           cleared = true;
3147         /* If there are "lots" of zeros, then block clear the object first.  */
3148         else if (num_type_elements - num_nonzero_elements > CLEAR_RATIO
3149                  && num_nonzero_elements < num_type_elements/4)
3150           cleared = true;
3151         /* ??? This bit ought not be needed.  For any element not present
3152            in the initializer, we should simply set them to zero.  Except
3153            we'd need to *find* the elements that are not present, and that
3154            requires trickery to avoid quadratic compile-time behavior in
3155            large cases or excessive memory use in small cases.  */
3156         else if (num_ctor_elements < num_type_elements)
3157           cleared = true;
3158
3159         /* If there are "lots" of initialized elements, and all of them
3160            are valid address constants, then the entire initializer can
3161            be dropped to memory, and then memcpy'd out.  Don't do this
3162            for sparse arrays, though, as it's more efficient to follow
3163            the standard CONSTRUCTOR behavior of memset followed by
3164            individual element initialization.  */
3165         if (valid_const_initializer && !cleared)
3166           {
3167             HOST_WIDE_INT size = int_size_in_bytes (type);
3168             unsigned int align;
3169
3170             /* ??? We can still get unbounded array types, at least
3171                from the C++ front end.  This seems wrong, but attempt
3172                to work around it for now.  */
3173             if (size < 0)
3174               {
3175                 size = int_size_in_bytes (TREE_TYPE (object));
3176                 if (size >= 0)
3177                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
3178               }
3179
3180             /* Find the maximum alignment we can assume for the object.  */
3181             /* ??? Make use of DECL_OFFSET_ALIGN.  */
3182             if (DECL_P (object))
3183               align = DECL_ALIGN (object);
3184             else
3185               align = TYPE_ALIGN (type);
3186
3187             if (size > 0 && !can_move_by_pieces (size, align))
3188               {
3189                 tree new = create_tmp_var_raw (type, "C");
3190
3191                 gimple_add_tmp_var (new);
3192                 TREE_STATIC (new) = 1;
3193                 TREE_READONLY (new) = 1;
3194                 DECL_INITIAL (new) = ctor;
3195                 if (align > DECL_ALIGN (new))
3196                   {
3197                     DECL_ALIGN (new) = align;
3198                     DECL_USER_ALIGN (new) = 1;
3199                   }
3200                 walk_tree (&DECL_INITIAL (new), force_labels_r, NULL, NULL);
3201
3202                 GENERIC_TREE_OPERAND (*expr_p, 1) = new;
3203
3204                 /* This is no longer an assignment of a CONSTRUCTOR, but
3205                    we still may have processing to do on the LHS.  So
3206                    pretend we didn't do anything here to let that happen.  */
3207                 return GS_UNHANDLED;
3208               }
3209           }
3210
3211         /* If there are nonzero elements, pre-evaluate to capture elements
3212            overlapping with the lhs into temporaries.  We must do this before
3213            clearing to fetch the values before they are zeroed-out.  */
3214         if (num_nonzero_elements > 0)
3215           {
3216             preeval_data.lhs_base_decl = get_base_address (object);
3217             if (!DECL_P (preeval_data.lhs_base_decl))
3218               preeval_data.lhs_base_decl = NULL;
3219             preeval_data.lhs_alias_set = get_alias_set (object);
3220
3221             gimplify_init_ctor_preeval (&GENERIC_TREE_OPERAND (*expr_p, 1),
3222                                         pre_p, post_p, &preeval_data);
3223           }
3224
3225         if (cleared)
3226           {
3227             /* Zap the CONSTRUCTOR element list, which simplifies this case.
3228                Note that we still have to gimplify, in order to handle the
3229                case of variable sized types.  Avoid shared tree structures.  */
3230             CONSTRUCTOR_ELTS (ctor) = NULL;
3231             object = unshare_expr (object);
3232             gimplify_stmt (expr_p);
3233             append_to_statement_list (*expr_p, pre_p);
3234           }
3235
3236         /* If we have not block cleared the object, or if there are nonzero
3237            elements in the constructor, add assignments to the individual
3238            scalar fields of the object.  */
3239         if (!cleared || num_nonzero_elements > 0)
3240           gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3241
3242         *expr_p = NULL_TREE;
3243       }
3244       break;
3245
3246     case COMPLEX_TYPE:
3247       {
3248         tree r, i;
3249
3250         /* Extract the real and imaginary parts out of the ctor.  */
3251         gcc_assert (VEC_length (constructor_elt, elts) == 2);
3252         r = VEC_index (constructor_elt, elts, 0)->value;
3253         i = VEC_index (constructor_elt, elts, 1)->value;
3254         if (r == NULL || i == NULL)
3255           {
3256             tree zero = fold_convert (TREE_TYPE (type), integer_zero_node);
3257             if (r == NULL)
3258               r = zero;
3259             if (i == NULL)
3260               i = zero;
3261           }
3262
3263         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3264            represent creation of a complex value.  */
3265         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3266           {
3267             ctor = build_complex (type, r, i);
3268             TREE_OPERAND (*expr_p, 1) = ctor;
3269           }
3270         else
3271           {
3272             ctor = build2 (COMPLEX_EXPR, type, r, i);
3273             TREE_OPERAND (*expr_p, 1) = ctor;
3274             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3275                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3276                                  fb_rvalue);
3277           }
3278       }
3279       break;
3280
3281     case VECTOR_TYPE:
3282       {
3283         unsigned HOST_WIDE_INT ix;
3284         constructor_elt *ce;
3285
3286         /* Go ahead and simplify constant constructors to VECTOR_CST.  */
3287         if (TREE_CONSTANT (ctor))
3288           {
3289             bool constant_p = true;
3290             tree value;
3291
3292             /* Even when ctor is constant, it might contain non-*_CST
3293                elements, such as addresses or trapping values like
3294                1.0/0.0 - 1.0/0.0.  Such expressions don't belong
3295                in VECTOR_CST nodes.  */
3296             FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
3297               if (!CONSTANT_CLASS_P (value))
3298                 {
3299                   constant_p = false;
3300                   break;
3301                 }
3302
3303             if (constant_p)
3304               {
3305                 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
3306                 break;
3307               }
3308
3309             /* Don't reduce an initializer constant even if we can't
3310                make a VECTOR_CST.  It won't do anything for us, and it'll
3311                prevent us from representing it as a single constant.  */
3312             if (initializer_constant_valid_p (ctor, type))
3313               break;
3314
3315             TREE_CONSTANT (ctor) = 0;
3316             TREE_INVARIANT (ctor) = 0;
3317           }
3318
3319         /* Vector types use CONSTRUCTOR all the way through gimple
3320           compilation as a general initializer.  */
3321         for (ix = 0; VEC_iterate (constructor_elt, elts, ix, ce); ix++)
3322           {
3323             enum gimplify_status tret;
3324             tret = gimplify_expr (&ce->value, pre_p, post_p,
3325                                   is_gimple_val, fb_rvalue);
3326             if (tret == GS_ERROR)
3327               ret = GS_ERROR;
3328           }
3329         if (!is_gimple_reg (GENERIC_TREE_OPERAND (*expr_p, 0)))
3330           GENERIC_TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
3331       }
3332       break;
3333
3334     default:
3335       /* So how did we get a CONSTRUCTOR for a scalar type?  */
3336       gcc_unreachable ();
3337     }
3338
3339   if (ret == GS_ERROR)
3340     return GS_ERROR;
3341   else if (want_value)
3342     {
3343       append_to_statement_list (*expr_p, pre_p);
3344       *expr_p = object;
3345       return GS_OK;
3346     }
3347   else
3348     return GS_ALL_DONE;
3349 }
3350
3351 /* Given a pointer value OP0, return a simplified version of an
3352    indirection through OP0, or NULL_TREE if no simplification is
3353    possible.  This may only be applied to a rhs of an expression.
3354    Note that the resulting type may be different from the type pointed
3355    to in the sense that it is still compatible from the langhooks
3356    point of view. */
3357
3358 static tree
3359 fold_indirect_ref_rhs (tree t)
3360 {
3361   tree type = TREE_TYPE (TREE_TYPE (t));
3362   tree sub = t;
3363   tree subtype;
3364
3365   STRIP_USELESS_TYPE_CONVERSION (sub);
3366   subtype = TREE_TYPE (sub);
3367   if (!POINTER_TYPE_P (subtype))
3368     return NULL_TREE;
3369
3370   if (TREE_CODE (sub) == ADDR_EXPR)
3371     {
3372       tree op = TREE_OPERAND (sub, 0);
3373       tree optype = TREE_TYPE (op);
3374       /* *&p => p */
3375       if (useless_type_conversion_p (type, optype))
3376         return op;
3377       /* *(foo *)&fooarray => fooarray[0] */
3378       else if (TREE_CODE (optype) == ARRAY_TYPE
3379                && useless_type_conversion_p (type, TREE_TYPE (optype)))
3380        {
3381          tree type_domain = TYPE_DOMAIN (optype);
3382          tree min_val = size_zero_node;
3383          if (type_domain && TYPE_MIN_VALUE (type_domain))
3384            min_val = TYPE_MIN_VALUE (type_domain);
3385          return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
3386        }
3387     }
3388
3389   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
3390   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
3391       && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
3392     {
3393       tree type_domain;
3394       tree min_val = size_zero_node;
3395       tree osub = sub;
3396       sub = fold_indirect_ref_rhs (sub);
3397       if (! sub)
3398         sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
3399       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
3400       if (type_domain && TYPE_MIN_VALUE (type_domain))
3401         min_val = TYPE_MIN_VALUE (type_domain);
3402       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
3403     }
3404
3405   return NULL_TREE;
3406 }
3407
3408 /* Subroutine of gimplify_modify_expr to do simplifications of MODIFY_EXPRs
3409    based on the code of the RHS.  We loop for as long as something changes.  */
3410
3411 static enum gimplify_status
3412 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
3413                           tree *post_p, bool want_value)
3414 {
3415   enum gimplify_status ret = GS_OK;
3416
3417   while (ret != GS_UNHANDLED)
3418     switch (TREE_CODE (*from_p))
3419       {
3420       case INDIRECT_REF:
3421         {
3422           /* If we have code like 
3423
3424                 *(const A*)(A*)&x
3425
3426              where the type of "x" is a (possibly cv-qualified variant
3427              of "A"), treat the entire expression as identical to "x".
3428              This kind of code arises in C++ when an object is bound
3429              to a const reference, and if "x" is a TARGET_EXPR we want
3430              to take advantage of the optimization below.  */
3431           tree t = fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
3432           if (t)
3433             {
3434               *from_p = t;
3435               ret = GS_OK;
3436             }
3437           else
3438             ret = GS_UNHANDLED;
3439           break;
3440         }
3441
3442       case TARGET_EXPR:
3443         {
3444           /* If we are initializing something from a TARGET_EXPR, strip the
3445              TARGET_EXPR and initialize it directly, if possible.  This can't
3446              be done if the initializer is void, since that implies that the
3447              temporary is set in some non-trivial way.
3448
3449              ??? What about code that pulls out the temp and uses it
3450              elsewhere? I think that such code never uses the TARGET_EXPR as
3451              an initializer.  If I'm wrong, we'll die because the temp won't
3452              have any RTL.  In that case, I guess we'll need to replace
3453              references somehow.  */
3454           tree init = TARGET_EXPR_INITIAL (*from_p);
3455
3456           if (!VOID_TYPE_P (TREE_TYPE (init)))
3457             {
3458               *from_p = init;
3459               ret = GS_OK;
3460             }
3461           else
3462             ret = GS_UNHANDLED;
3463         }
3464         break;
3465
3466       case COMPOUND_EXPR:
3467         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
3468            caught.  */
3469         gimplify_compound_expr (from_p, pre_p, true);
3470         ret = GS_OK;
3471         break;
3472
3473       case CONSTRUCTOR:
3474         /* If we're initializing from a CONSTRUCTOR, break this into
3475            individual MODIFY_EXPRs.  */
3476         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value);
3477
3478       case COND_EXPR:
3479         /* If we're assigning to a non-register type, push the assignment
3480            down into the branches.  This is mandatory for ADDRESSABLE types,
3481            since we cannot generate temporaries for such, but it saves a
3482            copy in other cases as well.  */
3483         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
3484           {
3485             /* This code should mirror the code in gimplify_cond_expr. */
3486             enum tree_code code = TREE_CODE (*expr_p);
3487             tree cond = *from_p;
3488             tree result = *to_p;
3489
3490             ret = gimplify_expr (&result, pre_p, post_p,
3491                                  is_gimple_min_lval, fb_lvalue);
3492             if (ret != GS_ERROR)
3493               ret = GS_OK;
3494
3495             if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
3496               TREE_OPERAND (cond, 1)
3497                 = build2 (code, void_type_node, result,
3498                           TREE_OPERAND (cond, 1));
3499             if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
3500               TREE_OPERAND (cond, 2)
3501                 = build2 (code, void_type_node, unshare_expr (result),
3502                           TREE_OPERAND (cond, 2));
3503
3504             TREE_TYPE (cond) = void_type_node;
3505             recalculate_side_effects (cond);
3506
3507             if (want_value)
3508               {
3509                 gimplify_and_add (cond, pre_p);
3510                 *expr_p = unshare_expr (result);
3511               }
3512             else
3513               *expr_p = cond;
3514             return ret;
3515           }
3516         else
3517           ret = GS_UNHANDLED;
3518         break;
3519
3520       case CALL_EXPR:
3521         /* For calls that return in memory, give *to_p as the CALL_EXPR's
3522            return slot so that we don't generate a temporary.  */
3523         if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
3524             && aggregate_value_p (*from_p, *from_p))
3525           {
3526             bool use_target;
3527
3528             if (!(rhs_predicate_for (*to_p))(*from_p))
3529               /* If we need a temporary, *to_p isn't accurate.  */
3530               use_target = false;
3531             else if (TREE_CODE (*to_p) == RESULT_DECL
3532                      && DECL_NAME (*to_p) == NULL_TREE
3533                      && needs_to_live_in_memory (*to_p))
3534               /* It's OK to use the return slot directly unless it's an NRV. */
3535               use_target = true;
3536             else if (is_gimple_reg_type (TREE_TYPE (*to_p))
3537                      || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
3538               /* Don't force regs into memory.  */
3539               use_target = false;
3540             else if (TREE_CODE (*to_p) == VAR_DECL
3541                      && DECL_GIMPLE_FORMAL_TEMP_P (*to_p))
3542               /* Don't use the original target if it's a formal temp; we
3543                  don't want to take their addresses.  */
3544               use_target = false;
3545             else if (TREE_CODE (*expr_p) == INIT_EXPR)
3546               /* It's OK to use the target directly if it's being
3547                  initialized. */
3548               use_target = true;
3549             else if (!is_gimple_non_addressable (*to_p))
3550               /* Don't use the original target if it's already addressable;
3551                  if its address escapes, and the called function uses the
3552                  NRV optimization, a conforming program could see *to_p
3553                  change before the called function returns; see c++/19317.
3554                  When optimizing, the return_slot pass marks more functions
3555                  as safe after we have escape info.  */
3556               use_target = false;
3557             else
3558               use_target = true;
3559
3560             if (use_target)
3561               {
3562                 CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
3563                 mark_addressable (*to_p);
3564               }
3565           }
3566
3567         ret = GS_UNHANDLED;
3568         break;
3569
3570         /* If we're initializing from a container, push the initialization
3571            inside it.  */
3572       case CLEANUP_POINT_EXPR:
3573       case BIND_EXPR:
3574       case STATEMENT_LIST:
3575         {
3576           tree wrap = *from_p;
3577           tree t;
3578
3579           ret = gimplify_expr (to_p, pre_p, post_p,
3580                                is_gimple_min_lval, fb_lvalue);
3581           if (ret != GS_ERROR)
3582             ret = GS_OK;
3583
3584           t = voidify_wrapper_expr (wrap, *expr_p);
3585           gcc_assert (t == *expr_p);
3586
3587           if (want_value)
3588             {
3589               gimplify_and_add (wrap, pre_p);
3590               *expr_p = unshare_expr (*to_p);
3591             }
3592           else
3593             *expr_p = wrap;
3594           return GS_OK;
3595         }
3596         
3597       default:
3598         ret = GS_UNHANDLED;
3599         break;
3600       }
3601
3602   return ret;
3603 }
3604
3605 /* Destructively convert the TREE pointer in TP into a gimple tuple if
3606    appropriate.  */
3607
3608 static void
3609 tree_to_gimple_tuple (tree *tp)
3610 {
3611
3612   switch (TREE_CODE (*tp))
3613     {
3614     case GIMPLE_MODIFY_STMT:
3615       return;
3616     case MODIFY_EXPR:
3617       {
3618         struct gimple_stmt *gs;
3619         tree lhs = TREE_OPERAND (*tp, 0);
3620         bool def_stmt_self_p = false;
3621
3622         if (TREE_CODE (lhs) == SSA_NAME)
3623           {
3624             if (SSA_NAME_DEF_STMT (lhs) == *tp)
3625               def_stmt_self_p = true;
3626           }
3627
3628         gs = &make_node (GIMPLE_MODIFY_STMT)->gstmt;
3629         gs->base = (*tp)->base;
3630         /* The set to base above overwrites the CODE.  */
3631         TREE_SET_CODE ((tree) gs, GIMPLE_MODIFY_STMT);
3632
3633         SET_EXPR_LOCUS ((tree) gs, EXPR_LOCUS (*tp));
3634         gs->operands[0] = TREE_OPERAND (*tp, 0);
3635         gs->operands[1] = TREE_OPERAND (*tp, 1);
3636         gs->block = TREE_BLOCK (*tp);
3637         *tp = (tree)gs;
3638
3639         /* If we re-gimplify a set to an SSA_NAME, we must change the
3640            SSA name's DEF_STMT link.  */
3641         if (def_stmt_self_p)
3642           SSA_NAME_DEF_STMT (GIMPLE_STMT_OPERAND (*tp, 0)) = *tp;
3643
3644         return;
3645       }
3646     default:
3647       break;
3648     }
3649 }
3650
3651 /* Promote partial stores to COMPLEX variables to total stores.  *EXPR_P is
3652    a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
3653    DECL_GIMPLE_REG_P set.  */
3654
3655 static enum gimplify_status
3656 gimplify_modify_expr_complex_part (tree *expr_p, tree *pre_p, bool want_value)
3657 {
3658   enum tree_code code, ocode;
3659   tree lhs, rhs, new_rhs, other, realpart, imagpart;
3660
3661   lhs = GENERIC_TREE_OPERAND (*expr_p, 0);
3662   rhs = GENERIC_TREE_OPERAND (*expr_p, 1);
3663   code = TREE_CODE (lhs);
3664   lhs = TREE_OPERAND (lhs, 0);
3665
3666   ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
3667   other = build1 (ocode, TREE_TYPE (rhs), lhs);
3668   other = get_formal_tmp_var (other, pre_p);
3669
3670   realpart = code == REALPART_EXPR ? rhs : other;
3671   imagpart = code == REALPART_EXPR ? other : rhs;
3672
3673   if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
3674     new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
3675   else
3676     new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
3677
3678   GENERIC_TREE_OPERAND (*expr_p, 0) = lhs;
3679   GENERIC_TREE_OPERAND (*expr_p, 1) = new_rhs;
3680
3681   if (want_value)
3682     {
3683       tree_to_gimple_tuple (expr_p);
3684
3685       append_to_statement_list (*expr_p, pre_p);
3686       *expr_p = rhs;
3687     }
3688
3689   return GS_ALL_DONE;
3690 }
3691
3692 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
3693
3694       modify_expr
3695               : varname '=' rhs
3696               | '*' ID '=' rhs
3697
3698     PRE_P points to the list where side effects that must happen before
3699         *EXPR_P should be stored.
3700
3701     POST_P points to the list where side effects that must happen after
3702         *EXPR_P should be stored.
3703
3704     WANT_VALUE is nonzero iff we want to use the value of this expression
3705         in another expression.  */
3706
3707 static enum gimplify_status
3708 gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
3709 {
3710   tree *from_p = &GENERIC_TREE_OPERAND (*expr_p, 1);
3711   tree *to_p = &GENERIC_TREE_OPERAND (*expr_p, 0);
3712   enum gimplify_status ret = GS_UNHANDLED;
3713
3714   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
3715               || TREE_CODE (*expr_p) == GIMPLE_MODIFY_STMT
3716               || TREE_CODE (*expr_p) == INIT_EXPR);
3717
3718   /* See if any simplifications can be done based on what the RHS is.  */
3719   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3720                                   want_value);
3721   if (ret != GS_UNHANDLED)
3722     return ret;
3723
3724   /* For zero sized types only gimplify the left hand side and right hand
3725      side as statements and throw away the assignment.  Do this after
3726      gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
3727      types properly.  */
3728   if (zero_sized_type (TREE_TYPE (*from_p)))
3729     {
3730       gimplify_stmt (from_p);
3731       gimplify_stmt (to_p);
3732       append_to_statement_list (*from_p, pre_p);
3733       append_to_statement_list (*to_p, pre_p);
3734       *expr_p = NULL_TREE;
3735       return GS_ALL_DONE;
3736     }
3737
3738   /* If the value being copied is of variable width, compute the length
3739      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
3740      before gimplifying any of the operands so that we can resolve any
3741      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
3742      the size of the expression to be copied, not of the destination, so
3743      that is what we must here.  */
3744   maybe_with_size_expr (from_p);
3745
3746   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
3747   if (ret == GS_ERROR)
3748     return ret;
3749
3750   ret = gimplify_expr (from_p, pre_p, post_p,
3751                        rhs_predicate_for (*to_p), fb_rvalue);
3752   if (ret == GS_ERROR)
3753     return ret;
3754
3755   /* Now see if the above changed *from_p to something we handle specially.  */
3756   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3757                                   want_value);
3758   if (ret != GS_UNHANDLED)
3759     return ret;
3760
3761   /* If we've got a variable sized assignment between two lvalues (i.e. does
3762      not involve a call), then we can make things a bit more straightforward
3763      by converting the assignment to memcpy or memset.  */
3764   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
3765     {
3766       tree from = TREE_OPERAND (*from_p, 0);
3767       tree size = TREE_OPERAND (*from_p, 1);
3768
3769       if (TREE_CODE (from) == CONSTRUCTOR)
3770         return gimplify_modify_expr_to_memset (expr_p, size, want_value);
3771       if (is_gimple_addressable (from))
3772         {
3773           *from_p = from;
3774           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value);
3775         }
3776     }
3777
3778   /* Transform partial stores to non-addressable complex variables into
3779      total stores.  This allows us to use real instead of virtual operands
3780      for these variables, which improves optimization.  */
3781   if ((TREE_CODE (*to_p) == REALPART_EXPR
3782        || TREE_CODE (*to_p) == IMAGPART_EXPR)
3783       && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
3784     return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
3785
3786   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
3787     {
3788       /* If we've somehow already got an SSA_NAME on the LHS, then
3789          we're probably modified it twice.  Not good.  */
3790       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
3791       *to_p = make_ssa_name (*to_p, *expr_p);
3792     }
3793
3794   /* Try to alleviate the effects of the gimplification creating artificial
3795      temporaries (see for example is_gimple_reg_rhs) on the debug info.  */
3796   if (!gimplify_ctxp->into_ssa
3797       && DECL_P (*from_p) && DECL_IGNORED_P (*from_p)
3798       && DECL_P (*to_p) && !DECL_IGNORED_P (*to_p))
3799     {
3800       if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
3801         DECL_NAME (*from_p)
3802           = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
3803       DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
3804       SET_DECL_DEBUG_EXPR (*from_p, *to_p);
3805     }
3806
3807   if (want_value)
3808     {
3809       tree_to_gimple_tuple (expr_p);
3810
3811       append_to_statement_list (*expr_p, pre_p);
3812       *expr_p = *to_p;
3813       return GS_OK;
3814     }
3815
3816   return GS_ALL_DONE;
3817 }
3818
3819 /*  Gimplify a comparison between two variable-sized objects.  Do this
3820     with a call to BUILT_IN_MEMCMP.  */
3821
3822 static enum gimplify_status
3823 gimplify_variable_sized_compare (tree *expr_p)
3824 {
3825   tree op0 = TREE_OPERAND (*expr_p, 0);
3826   tree op1 = TREE_OPERAND (*expr_p, 1);
3827   tree t, arg, dest, src;
3828
3829   arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
3830   arg = unshare_expr (arg);
3831   arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
3832   src = build_fold_addr_expr (op1);
3833   dest = build_fold_addr_expr (op0);
3834   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
3835   t = build_call_expr (t, 3, dest, src, arg);
3836   *expr_p
3837     = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
3838
3839   return GS_OK;
3840 }
3841
3842 /*  Gimplify a comparison between two aggregate objects of integral scalar
3843     mode as a comparison between the bitwise equivalent scalar values.  */
3844
3845 static enum gimplify_status
3846 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
3847 {
3848   tree op0 = TREE_OPERAND (*expr_p, 0);
3849   tree op1 = TREE_OPERAND (*expr_p, 1);
3850
3851   tree type = TREE_TYPE (op0);
3852   tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
3853
3854   op0 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op0);
3855   op1 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op1);
3856
3857   *expr_p
3858     = fold_build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
3859
3860   return GS_OK;
3861 }
3862
3863 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
3864     points to the expression to gimplify.
3865
3866     Expressions of the form 'a && b' are gimplified to:
3867
3868         a && b ? true : false
3869
3870     gimplify_cond_expr will do the rest.
3871
3872     PRE_P points to the list where side effects that must happen before
3873         *EXPR_P should be stored.  */
3874
3875 static enum gimplify_status
3876 gimplify_boolean_expr (tree *expr_p)
3877 {
3878   /* Preserve the original type of the expression.  */
3879   tree type = TREE_TYPE (*expr_p);
3880
3881   *expr_p = build3 (COND_EXPR, type, *expr_p,
3882                     fold_convert (type, boolean_true_node),
3883                     fold_convert (type, boolean_false_node));
3884
3885   return GS_OK;
3886 }
3887
3888 /* Gimplifies an expression sequence.  This function gimplifies each
3889    expression and re-writes the original expression with the last
3890    expression of the sequence in GIMPLE form.
3891
3892    PRE_P points to the list where the side effects for all the
3893        expressions in the sequence will be emitted.
3894
3895    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
3896 /* ??? Should rearrange to share the pre-queue with all the indirect
3897    invocations of gimplify_expr.  Would probably save on creations
3898    of statement_list nodes.  */
3899
3900 static enum gimplify_status
3901 gimplify_compound_expr (tree *expr_p, tree *pre_p, bool want_value)
3902 {
3903   tree t = *expr_p;
3904
3905   do
3906     {
3907       tree *sub_p = &TREE_OPERAND (t, 0);
3908
3909       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
3910         gimplify_compound_expr (sub_p, pre_p, false);
3911       else
3912         gimplify_stmt (sub_p);
3913       append_to_statement_list (*sub_p, pre_p);
3914
3915       t = TREE_OPERAND (t, 1);
3916     }
3917   while (TREE_CODE (t) == COMPOUND_EXPR);
3918
3919   *expr_p = t;
3920   if (want_value)
3921     return GS_OK;
3922   else
3923     {
3924       gimplify_stmt (expr_p);
3925       return GS_ALL_DONE;
3926     }
3927 }
3928
3929 /* Gimplifies a statement list.  These may be created either by an
3930    enlightened front-end, or by shortcut_cond_expr.  */
3931
3932 static enum gimplify_status
3933 gimplify_statement_list (tree *expr_p, tree *pre_p)
3934 {
3935   tree temp = voidify_wrapper_expr (*expr_p, NULL);
3936
3937   tree_stmt_iterator i = tsi_start (*expr_p);
3938
3939   while (!tsi_end_p (i))
3940     {
3941       tree t;
3942
3943       gimplify_stmt (tsi_stmt_ptr (i));
3944
3945       t = tsi_stmt (i);
3946       if (t == NULL)
3947         tsi_delink (&i);
3948       else if (TREE_CODE (t) == STATEMENT_LIST)
3949         {
3950           tsi_link_before (&i, t, TSI_SAME_STMT);
3951           tsi_delink (&i);
3952         }
3953       else
3954         tsi_next (&i);
3955     }
3956
3957   if (temp)
3958     {
3959       append_to_statement_list (*expr_p, pre_p);
3960       *expr_p = temp;
3961       return GS_OK;
3962     }
3963
3964   return GS_ALL_DONE;
3965 }
3966
3967 /*  Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
3968     gimplify.  After gimplification, EXPR_P will point to a new temporary
3969     that holds the original value of the SAVE_EXPR node.
3970
3971     PRE_P points to the list where side effects that must happen before
3972         *EXPR_P should be stored.  */
3973
3974 static enum gimplify_status
3975 gimplify_save_expr (tree *expr_p, tree *pre_p, tree *post_p)
3976 {
3977   enum gimplify_status ret = GS_ALL_DONE;
3978   tree val;
3979
3980   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
3981   val = TREE_OPERAND (*expr_p, 0);
3982
3983   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
3984   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
3985     {
3986       /* The operand may be a void-valued expression such as SAVE_EXPRs
3987          generated by the Java frontend for class initialization.  It is
3988          being executed only for its side-effects.  */
3989       if (TREE_TYPE (val) == void_type_node)
3990         {
3991           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3992                                is_gimple_stmt, fb_none);
3993           append_to_statement_list (TREE_OPERAND (*expr_p, 0), pre_p);
3994           val = NULL;
3995         }
3996       else
3997         val = get_initialized_tmp_var (val, pre_p, post_p);
3998
3999       TREE_OPERAND (*expr_p, 0) = val;
4000       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
4001     }
4002
4003   *expr_p = val;
4004
4005   return ret;
4006 }
4007
4008 /*  Re-write the ADDR_EXPR node pointed to by EXPR_P
4009
4010       unary_expr
4011               : ...
4012               | '&' varname
4013               ...
4014
4015     PRE_P points to the list where side effects that must happen before
4016         *EXPR_P should be stored.
4017
4018     POST_P points to the list where side effects that must happen after
4019         *EXPR_P should be stored.  */
4020
4021 static enum gimplify_status
4022 gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
4023 {
4024   tree expr = *expr_p;
4025   tree op0 = TREE_OPERAND (expr, 0);
4026   enum gimplify_status ret;
4027
4028   switch (TREE_CODE (op0))
4029     {
4030     case INDIRECT_REF:
4031     case MISALIGNED_INDIRECT_REF:
4032     do_indirect_ref:
4033       /* Check if we are dealing with an expression of the form '&*ptr'.
4034          While the front end folds away '&*ptr' into 'ptr', these
4035          expressions may be generated internally by the compiler (e.g.,
4036          builtins like __builtin_va_end).  */
4037       /* Caution: the silent array decomposition semantics we allow for
4038          ADDR_EXPR means we can't always discard the pair.  */
4039       /* Gimplification of the ADDR_EXPR operand may drop
4040          cv-qualification conversions, so make sure we add them if
4041          needed.  */
4042       {
4043         tree op00 = TREE_OPERAND (op0, 0);
4044         tree t_expr = TREE_TYPE (expr);
4045         tree t_op00 = TREE_TYPE (op00);
4046
4047         if (!useless_type_conversion_p (t_expr, t_op00))
4048           op00 = fold_convert (TREE_TYPE (expr), op00);
4049         *expr_p = op00;
4050         ret = GS_OK;
4051       }
4052       break;
4053
4054     case VIEW_CONVERT_EXPR:
4055       /* Take the address of our operand and then convert it to the type of
4056          this ADDR_EXPR.
4057
4058          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4059          all clear.  The impact of this transformation is even less clear.  */
4060
4061       /* If the operand is a useless conversion, look through it.  Doing so
4062          guarantees that the ADDR_EXPR and its operand will remain of the
4063          same type.  */
4064       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4065         op0 = TREE_OPERAND (op0, 0);
4066
4067       *expr_p = fold_convert (TREE_TYPE (expr),
4068                               build_fold_addr_expr (TREE_OPERAND (op0, 0)));
4069       ret = GS_OK;
4070       break;
4071
4072     default:
4073       /* We use fb_either here because the C frontend sometimes takes
4074          the address of a call that returns a struct; see
4075          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
4076          the implied temporary explicit.  */
4077
4078       /* Mark the RHS addressable.  */
4079       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4080                            is_gimple_addressable, fb_either);
4081       if (ret != GS_ERROR)
4082         {
4083           op0 = TREE_OPERAND (expr, 0);
4084
4085           /* For various reasons, the gimplification of the expression
4086              may have made a new INDIRECT_REF.  */
4087           if (TREE_CODE (op0) == INDIRECT_REF)
4088             goto do_indirect_ref;
4089
4090           /* Make sure TREE_INVARIANT, TREE_CONSTANT, and TREE_SIDE_EFFECTS
4091              is set properly.  */
4092           recompute_tree_invariant_for_addr_expr (expr);
4093
4094           mark_addressable (TREE_OPERAND (expr, 0));
4095         }
4096       break;
4097     }
4098
4099   return ret;
4100 }
4101
4102 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
4103    value; output operands should be a gimple lvalue.  */
4104
4105 static enum gimplify_status
4106 gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
4107 {
4108   tree expr = *expr_p;
4109   int noutputs = list_length (ASM_OUTPUTS (expr));
4110   const char **oconstraints
4111     = (const char **) alloca ((noutputs) * sizeof (const char *));
4112   int i;
4113   tree link;
4114   const char *constraint;
4115   bool allows_mem, allows_reg, is_inout;
4116   enum gimplify_status ret, tret;
4117
4118   ret = GS_ALL_DONE;
4119   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = TREE_CHAIN (link))
4120     {
4121       size_t constraint_len;
4122       oconstraints[i] = constraint
4123         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4124       constraint_len = strlen (constraint);
4125       if (constraint_len == 0)
4126         continue;
4127
4128       parse_output_constraint (&constraint, i, 0, 0,
4129                                &allows_mem, &allows_reg, &is_inout);
4130
4131       if (!allows_reg && allows_mem)
4132         mark_addressable (TREE_VALUE (link));
4133
4134       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4135                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4136                             fb_lvalue | fb_mayfail);
4137       if (tret == GS_ERROR)
4138         {
4139           error ("invalid lvalue in asm output %d", i);
4140           ret = tret;
4141         }
4142
4143       if (is_inout)
4144         {
4145           /* An input/output operand.  To give the optimizers more
4146              flexibility, split it into separate input and output
4147              operands.  */
4148           tree input;
4149           char buf[10];
4150
4151           /* Turn the in/out constraint into an output constraint.  */
4152           char *p = xstrdup (constraint);
4153           p[0] = '=';
4154           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4155
4156           /* And add a matching input constraint.  */
4157           if (allows_reg)
4158             {
4159               sprintf (buf, "%d", i);
4160
4161               /* If there are multiple alternatives in the constraint,
4162                  handle each of them individually.  Those that allow register
4163                  will be replaced with operand number, the others will stay
4164                  unchanged.  */
4165               if (strchr (p, ',') != NULL)
4166                 {
4167                   size_t len = 0, buflen = strlen (buf);
4168                   char *beg, *end, *str, *dst;
4169
4170                   for (beg = p + 1;;)
4171                     {
4172                       end = strchr (beg, ',');
4173                       if (end == NULL)
4174                         end = strchr (beg, '\0');
4175                       if ((size_t) (end - beg) < buflen)
4176                         len += buflen + 1;
4177                       else
4178                         len += end - beg + 1;
4179                       if (*end)
4180                         beg = end + 1;
4181                       else
4182                         break;
4183                     }
4184
4185                   str = (char *) alloca (len);
4186                   for (beg = p + 1, dst = str;;)
4187                     {
4188                       const char *tem;
4189                       bool mem_p, reg_p, inout_p;
4190
4191                       end = strchr (beg, ',');
4192                       if (end)
4193                         *end = '\0';
4194                       beg[-1] = '=';
4195                       tem = beg - 1;
4196                       parse_output_constraint (&tem, i, 0, 0,
4197                                                &mem_p, &reg_p, &inout_p);
4198                       if (dst != str)
4199                         *dst++ = ',';
4200                       if (reg_p)
4201                         {
4202                           memcpy (dst, buf, buflen);
4203                           dst += buflen;
4204                         }
4205                       else
4206                         {
4207                           if (end)
4208                             len = end - beg;
4209                           else
4210                             len = strlen (beg);
4211                           memcpy (dst, beg, len);
4212                           dst += len;
4213                         }
4214                       if (end)
4215                         beg = end + 1;
4216                       else
4217                         break;
4218                     }
4219                   *dst = '\0';
4220                   input = build_string (dst - str, str);
4221                 }
4222               else
4223                 input = build_string (strlen (buf), buf);
4224             }
4225           else
4226             input = build_string (constraint_len - 1, constraint + 1);
4227
4228           free (p);
4229
4230           input = build_tree_list (build_tree_list (NULL_TREE, input),
4231                                    unshare_expr (TREE_VALUE (link)));
4232           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
4233         }
4234     }
4235
4236   for (link = ASM_INPUTS (expr); link; ++i, link = TREE_CHAIN (link))
4237     {
4238       constraint
4239         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4240       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
4241                               oconstraints, &allows_mem, &allows_reg);
4242
4243       /* If we can't make copies, we can only accept memory.  */
4244       if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
4245         {
4246           if (allows_mem)
4247             allows_reg = 0;
4248           else
4249             {
4250               error ("impossible constraint in %<asm%>");
4251               error ("non-memory input %d must stay in memory", i);
4252               return GS_ERROR;
4253             }
4254         }
4255
4256       /* If the operand is a memory input, it should be an lvalue.  */
4257       if (!allows_reg && allows_mem)
4258         {
4259           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4260                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
4261           mark_addressable (TREE_VALUE (link));
4262           if (tret == GS_ERROR)
4263             {
4264               error ("memory input %d is not directly addressable", i);
4265               ret = tret;
4266             }
4267         }
4268       else
4269         {
4270           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4271                                 is_gimple_asm_val, fb_rvalue);
4272           if (tret == GS_ERROR)
4273             ret = tret;
4274         }
4275     }
4276
4277   return ret;
4278 }
4279
4280 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
4281    WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
4282    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
4283    return to this function.
4284
4285    FIXME should we complexify the prequeue handling instead?  Or use flags
4286    for all the cleanups and let the optimizer tighten them up?  The current
4287    code seems pretty fragile; it will break on a cleanup within any
4288    non-conditional nesting.  But any such nesting would be broken, anyway;
4289    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
4290    and continues out of it.  We can do that at the RTL level, though, so
4291    having an optimizer to tighten up try/finally regions would be a Good
4292    Thing.  */
4293
4294 static enum gimplify_status
4295 gimplify_cleanup_point_expr (tree *expr_p, tree *pre_p)
4296 {
4297   tree_stmt_iterator iter;
4298   tree body;
4299
4300   tree temp = voidify_wrapper_expr (*expr_p, NULL);
4301
4302   /* We only care about the number of conditions between the innermost
4303      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count and
4304      any cleanups collected outside the CLEANUP_POINT_EXPR.  */
4305   int old_conds = gimplify_ctxp->conditions;
4306   tree old_cleanups = gimplify_ctxp->conditional_cleanups;
4307   gimplify_ctxp->conditions = 0;
4308   gimplify_ctxp->conditional_cleanups = NULL_TREE;
4309
4310   body = TREE_OPERAND (*expr_p, 0);
4311   gimplify_to_stmt_list (&body);
4312
4313   gimplify_ctxp->conditions = old_conds;
4314   gimplify_ctxp->conditional_cleanups = old_cleanups;
4315
4316   for (iter = tsi_start (body); !tsi_end_p (iter); )
4317     {
4318       tree *wce_p = tsi_stmt_ptr (iter);
4319       tree wce = *wce_p;
4320
4321       if (TREE_CODE (wce) == WITH_CLEANUP_EXPR)
4322         {
4323           if (tsi_one_before_end_p (iter))
4324             {
4325               tsi_link_before (&iter, TREE_OPERAND (wce, 0), TSI_SAME_STMT);
4326               tsi_delink (&iter);
4327               break;
4328             }
4329           else
4330             {
4331               tree sl, tfe;
4332               enum tree_code code;
4333
4334               if (CLEANUP_EH_ONLY (wce))
4335                 code = TRY_CATCH_EXPR;
4336               else
4337                 code = TRY_FINALLY_EXPR;
4338
4339               sl = tsi_split_statement_list_after (&iter);
4340               tfe = build2 (code, void_type_node, sl, NULL_TREE);
4341               append_to_statement_list (TREE_OPERAND (wce, 0),
4342                                         &TREE_OPERAND (tfe, 1));
4343               *wce_p = tfe;
4344               iter = tsi_start (sl);
4345             }
4346         }
4347       else
4348         tsi_next (&iter);
4349     }
4350
4351   if (temp)
4352     {
4353       *expr_p = temp;
4354       append_to_statement_list (body, pre_p);
4355       return GS_OK;
4356     }
4357   else
4358     {
4359       *expr_p = body;
4360       return GS_ALL_DONE;
4361     }
4362 }
4363
4364 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
4365    is the cleanup action required.  */
4366
4367 static void
4368 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, tree *pre_p)
4369 {
4370   tree wce;
4371
4372   /* Errors can result in improperly nested cleanups.  Which results in
4373      confusion when trying to resolve the WITH_CLEANUP_EXPR.  */
4374   if (errorcount || sorrycount)
4375     return;
4376
4377   if (gimple_conditional_context ())
4378     {
4379       /* If we're in a conditional context, this is more complex.  We only
4380          want to run the cleanup if we actually ran the initialization that
4381          necessitates it, but we want to run it after the end of the
4382          conditional context.  So we wrap the try/finally around the
4383          condition and use a flag to determine whether or not to actually
4384          run the destructor.  Thus
4385
4386            test ? f(A()) : 0
4387
4388          becomes (approximately)
4389
4390            flag = 0;
4391            try {
4392              if (test) { A::A(temp); flag = 1; val = f(temp); }
4393              else { val = 0; }
4394            } finally {
4395              if (flag) A::~A(temp);
4396            }
4397            val
4398       */
4399
4400       tree flag = create_tmp_var (boolean_type_node, "cleanup");
4401       tree ffalse = build_gimple_modify_stmt (flag, boolean_false_node);
4402       tree ftrue = build_gimple_modify_stmt (flag, boolean_true_node);
4403       cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
4404       wce = build1 (WITH_CLEANUP_EXPR, void_type_node, cleanup);
4405       append_to_statement_list (ffalse, &gimplify_ctxp->conditional_cleanups);
4406       append_to_statement_list (wce, &gimplify_ctxp->conditional_cleanups);
4407       append_to_statement_list (ftrue, pre_p);
4408
4409       /* Because of this manipulation, and the EH edges that jump
4410          threading cannot redirect, the temporary (VAR) will appear
4411          to be used uninitialized.  Don't warn.  */
4412       TREE_NO_WARNING (var) = 1;
4413     }
4414   else
4415     {
4416       wce = build1 (WITH_CLEANUP_EXPR, void_type_node, cleanup);
4417       CLEANUP_EH_ONLY (wce) = eh_only;
4418       append_to_statement_list (wce, pre_p);
4419     }
4420
4421   gimplify_stmt (&TREE_OPERAND (wce, 0));
4422 }
4423
4424 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
4425
4426 static enum gimplify_status
4427 gimplify_target_expr (tree *expr_p, tree *pre_p, tree *post_p)
4428 {
4429   tree targ = *expr_p;
4430   tree temp = TARGET_EXPR_SLOT (targ);
4431   tree init = TARGET_EXPR_INITIAL (targ);
4432   enum gimplify_status ret;
4433
4434   if (init)
4435     {
4436       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
4437          to the temps list.  Handle also variable length TARGET_EXPRs.  */
4438       if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
4439         {
4440           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
4441             gimplify_type_sizes (TREE_TYPE (temp), pre_p);
4442           gimplify_vla_decl (temp, pre_p);
4443         }
4444       else
4445         gimple_add_tmp_var (temp);
4446
4447       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
4448          expression is supposed to initialize the slot.  */
4449       if (VOID_TYPE_P (TREE_TYPE (init)))
4450         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
4451       else
4452         {
4453           init = build2 (INIT_EXPR, void_type_node, temp, init);
4454           ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt,
4455                                fb_none);
4456         }
4457       if (ret == GS_ERROR)
4458         {
4459           /* PR c++/28266 Make sure this is expanded only once. */
4460           TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4461           return GS_ERROR;
4462         }
4463       append_to_statement_list (init, pre_p);
4464
4465       /* If needed, push the cleanup for the temp.  */
4466       if (TARGET_EXPR_CLEANUP (targ))
4467         {
4468           gimplify_stmt (&TARGET_EXPR_CLEANUP (targ));
4469           gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
4470                                CLEANUP_EH_ONLY (targ), pre_p);
4471         }
4472
4473       /* Only expand this once.  */
4474       TREE_OPERAND (targ, 3) = init;
4475       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4476     }
4477   else
4478     /* We should have expanded this before.  */
4479     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
4480
4481   *expr_p = temp;
4482   return GS_OK;
4483 }
4484
4485 /* Gimplification of expression trees.  */
4486
4487 /* Gimplify an expression which appears at statement context; usually, this
4488    means replacing it with a suitably gimple STATEMENT_LIST.  */
4489
4490 void
4491 gimplify_stmt (tree *stmt_p)
4492 {
4493   gimplify_expr (stmt_p, NULL, NULL, is_gimple_stmt, fb_none);
4494 }
4495
4496 /* Similarly, but force the result to be a STATEMENT_LIST.  */
4497
4498 void
4499 gimplify_to_stmt_list (tree *stmt_p)
4500 {
4501   gimplify_stmt (stmt_p);
4502   if (!*stmt_p)
4503     *stmt_p = alloc_stmt_list ();
4504   else if (TREE_CODE (*stmt_p) != STATEMENT_LIST)
4505     {
4506       tree t = *stmt_p;
4507       *stmt_p = alloc_stmt_list ();
4508       append_to_statement_list (t, stmt_p);
4509     }
4510 }
4511
4512
4513 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
4514    to CTX.  If entries already exist, force them to be some flavor of private.
4515    If there is no enclosing parallel, do nothing.  */
4516
4517 void
4518 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
4519 {
4520   splay_tree_node n;
4521
4522   if (decl == NULL || !DECL_P (decl))
4523     return;
4524
4525   do
4526     {
4527       n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4528       if (n != NULL)
4529         {
4530           if (n->value & GOVD_SHARED)
4531             n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
4532           else
4533             return;
4534         }
4535       else if (ctx->is_parallel)
4536         omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
4537
4538       ctx = ctx->outer_context;
4539     }
4540   while (ctx);
4541 }
4542
4543 /* Similarly for each of the type sizes of TYPE.  */
4544
4545 static void
4546 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
4547 {
4548   if (type == NULL || type == error_mark_node)
4549     return;
4550   type = TYPE_MAIN_VARIANT (type);
4551
4552   if (pointer_set_insert (ctx->privatized_types, type))
4553     return;
4554
4555   switch (TREE_CODE (type))
4556     {
4557     case INTEGER_TYPE:
4558     case ENUMERAL_TYPE:
4559     case BOOLEAN_TYPE:
4560     case REAL_TYPE:
4561     case FIXED_POINT_TYPE:
4562       omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
4563       omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
4564       break;
4565
4566     case ARRAY_TYPE:
4567       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
4568       omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
4569       break;
4570
4571     case RECORD_TYPE:
4572     case UNION_TYPE:
4573     case QUAL_UNION_TYPE:
4574       {
4575         tree field;
4576         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4577           if (TREE_CODE (field) == FIELD_DECL)
4578             {
4579               omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
4580               omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
4581             }
4582       }
4583       break;
4584
4585     case POINTER_TYPE:
4586     case REFERENCE_TYPE:
4587       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
4588       break;
4589
4590     default:
4591       break;
4592     }
4593
4594   omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
4595   omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
4596   lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
4597 }
4598
4599 /* Add an entry for DECL in the OpenMP context CTX with FLAGS.  */
4600
4601 static void
4602 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
4603 {
4604   splay_tree_node n;
4605   unsigned int nflags;
4606   tree t;
4607
4608   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4609     return;
4610
4611   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
4612      there are constructors involved somewhere.  */
4613   if (TREE_ADDRESSABLE (TREE_TYPE (decl))
4614       || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
4615     flags |= GOVD_SEEN;
4616
4617   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4618   if (n != NULL)
4619     {
4620       /* We shouldn't be re-adding the decl with the same data
4621          sharing class.  */
4622       gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
4623       /* The only combination of data sharing classes we should see is
4624          FIRSTPRIVATE and LASTPRIVATE.  */
4625       nflags = n->value | flags;
4626       gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
4627                   == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
4628       n->value = nflags;
4629       return;
4630     }
4631
4632   /* When adding a variable-sized variable, we have to handle all sorts
4633      of additional bits of data: the pointer replacement variable, and 
4634      the parameters of the type.  */
4635   if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
4636     {
4637       /* Add the pointer replacement variable as PRIVATE if the variable
4638          replacement is private, else FIRSTPRIVATE since we'll need the
4639          address of the original variable either for SHARED, or for the
4640          copy into or out of the context.  */
4641       if (!(flags & GOVD_LOCAL))
4642         {
4643           nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
4644           nflags |= flags & GOVD_SEEN;
4645           t = DECL_VALUE_EXPR (decl);
4646           gcc_assert (TREE_CODE (t) == INDIRECT_REF);
4647           t = TREE_OPERAND (t, 0);
4648           gcc_assert (DECL_P (t));
4649           omp_add_variable (ctx, t, nflags);
4650         }
4651
4652       /* Add all of the variable and type parameters (which should have
4653          been gimplified to a formal temporary) as FIRSTPRIVATE.  */
4654       omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
4655       omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
4656       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
4657
4658       /* The variable-sized variable itself is never SHARED, only some form
4659          of PRIVATE.  The sharing would take place via the pointer variable
4660          which we remapped above.  */
4661       if (flags & GOVD_SHARED)
4662         flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
4663                 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
4664
4665       /* We're going to make use of the TYPE_SIZE_UNIT at least in the 
4666          alloca statement we generate for the variable, so make sure it
4667          is available.  This isn't automatically needed for the SHARED
4668          case, since we won't be allocating local storage then.
4669          For local variables TYPE_SIZE_UNIT might not be gimplified yet,
4670          in this case omp_notice_variable will be called later
4671          on when it is gimplified.  */
4672       else if (! (flags & GOVD_LOCAL))
4673         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
4674     }
4675   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
4676     {
4677       gcc_assert ((flags & GOVD_LOCAL) == 0);
4678       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
4679
4680       /* Similar to the direct variable sized case above, we'll need the
4681          size of references being privatized.  */
4682       if ((flags & GOVD_SHARED) == 0)
4683         {
4684           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
4685           if (TREE_CODE (t) != INTEGER_CST)
4686             omp_notice_variable (ctx, t, true);
4687         }
4688     }
4689
4690   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
4691 }
4692
4693 /* Record the fact that DECL was used within the OpenMP context CTX.
4694    IN_CODE is true when real code uses DECL, and false when we should
4695    merely emit default(none) errors.  Return true if DECL is going to
4696    be remapped and thus DECL shouldn't be gimplified into its
4697    DECL_VALUE_EXPR (if any).  */
4698
4699 static bool
4700 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
4701 {
4702   splay_tree_node n;
4703   unsigned flags = in_code ? GOVD_SEEN : 0;
4704   bool ret = false, shared;
4705
4706   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4707     return false;
4708
4709   /* Threadprivate variables are predetermined.  */
4710   if (is_global_var (decl))
4711     {
4712       if (DECL_THREAD_LOCAL_P (decl))
4713         return false;
4714
4715       if (DECL_HAS_VALUE_EXPR_P (decl))
4716         {
4717           tree value = get_base_address (DECL_VALUE_EXPR (decl));
4718
4719           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
4720             return false;
4721         }
4722     }
4723
4724   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4725   if (n == NULL)
4726     {
4727       enum omp_clause_default_kind default_kind, kind;
4728
4729       if (!ctx->is_parallel)
4730         goto do_outer;
4731
4732       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
4733          remapped firstprivate instead of shared.  To some extent this is
4734          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
4735       default_kind = ctx->default_kind;
4736       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
4737       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
4738         default_kind = kind;
4739
4740       switch (default_kind)
4741         {
4742         case OMP_CLAUSE_DEFAULT_NONE:
4743           error ("%qs not specified in enclosing parallel",
4744                  IDENTIFIER_POINTER (DECL_NAME (decl)));
4745           error ("%Henclosing parallel", &ctx->location);
4746           /* FALLTHRU */
4747         case OMP_CLAUSE_DEFAULT_SHARED:
4748           flags |= GOVD_SHARED;
4749           break;
4750         case OMP_CLAUSE_DEFAULT_PRIVATE:
4751           flags |= GOVD_PRIVATE;
4752           break;
4753         default:
4754           gcc_unreachable ();
4755         }
4756
4757       omp_add_variable (ctx, decl, flags);
4758
4759       shared = (flags & GOVD_SHARED) != 0;
4760       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
4761       goto do_outer;
4762     }
4763
4764   shared = ((flags | n->value) & GOVD_SHARED) != 0;
4765   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
4766
4767   /* If nothing changed, there's nothing left to do.  */
4768   if ((n->value & flags) == flags)
4769     return ret;
4770   flags |= n->value;
4771   n->value = flags;
4772
4773  do_outer:
4774   /* If the variable is private in the current context, then we don't
4775      need to propagate anything to an outer context.  */
4776   if (flags & GOVD_PRIVATE)
4777     return ret;
4778   if (ctx->outer_context
4779       && omp_notice_variable (ctx->outer_context, decl, in_code))
4780     return true;
4781   return ret;
4782 }
4783
4784 /* Verify that DECL is private within CTX.  If there's specific information
4785    to the contrary in the innermost scope, generate an error.  */
4786
4787 static bool
4788 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
4789 {
4790   splay_tree_node n;
4791
4792   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4793   if (n != NULL)
4794     {
4795       if (n->value & GOVD_SHARED)
4796         {
4797           if (ctx == gimplify_omp_ctxp)
4798             {
4799               error ("iteration variable %qs should be private",
4800                      IDENTIFIER_POINTER (DECL_NAME (decl)));
4801               n->value = GOVD_PRIVATE;
4802               return true;
4803             }
4804           else
4805             return false;
4806         }
4807       else if ((n->value & GOVD_EXPLICIT) != 0
4808                && (ctx == gimplify_omp_ctxp
4809                    || (ctx->is_combined_parallel
4810                        && gimplify_omp_ctxp->outer_context == ctx)))
4811         {
4812           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
4813             error ("iteration variable %qs should not be firstprivate",
4814                    IDENTIFIER_POINTER (DECL_NAME (decl)));
4815           else if ((n->value & GOVD_REDUCTION) != 0)
4816             error ("iteration variable %qs should not be reduction",
4817                    IDENTIFIER_POINTER (DECL_NAME (decl)));
4818         }
4819       return true;
4820     }
4821
4822   if (ctx->is_parallel)
4823     return false;
4824   else if (ctx->outer_context)
4825     return omp_is_private (ctx->outer_context, decl);
4826   else
4827     return !is_global_var (decl);
4828 }
4829
4830 /* Return true if DECL is private within a parallel region
4831    that binds to the current construct's context or in parallel
4832    region's REDUCTION clause.  */
4833
4834 static bool
4835 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
4836 {
4837   splay_tree_node n;
4838
4839   do
4840     {
4841       ctx = ctx->outer_context;
4842       if (ctx == NULL)
4843         return !(is_global_var (decl)
4844                  /* References might be private, but might be shared too.  */
4845                  || lang_hooks.decls.omp_privatize_by_reference (decl));
4846
4847       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4848       if (n != NULL)
4849         return (n->value & GOVD_SHARED) == 0;
4850     }
4851   while (!ctx->is_parallel);
4852   return false;
4853 }
4854
4855 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
4856    and previous omp contexts.  */
4857
4858 static void
4859 gimplify_scan_omp_clauses (tree *list_p, tree *pre_p, bool in_parallel,
4860                            bool in_combined_parallel)
4861 {
4862   struct gimplify_omp_ctx *ctx, *outer_ctx;
4863   tree c;
4864
4865   ctx = new_omp_context (in_parallel, in_combined_parallel);
4866   outer_ctx = ctx->outer_context;
4867
4868   while ((c = *list_p) != NULL)
4869     {
4870       enum gimplify_status gs;
4871       bool remove = false;
4872       bool notice_outer = true;
4873       const char *check_non_private = NULL;
4874       unsigned int flags;
4875       tree decl;
4876
4877       switch (OMP_CLAUSE_CODE (c))
4878         {
4879         case OMP_CLAUSE_PRIVATE:
4880           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
4881           notice_outer = false;
4882           goto do_add;
4883         case OMP_CLAUSE_SHARED:
4884           flags = GOVD_SHARED | GOVD_EXPLICIT;
4885           goto do_add;
4886         case OMP_CLAUSE_FIRSTPRIVATE:
4887           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
4888           check_non_private = "firstprivate";
4889           goto do_add;
4890         case OMP_CLAUSE_LASTPRIVATE:
4891           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
4892           check_non_private = "lastprivate";
4893           goto do_add;
4894         case OMP_CLAUSE_REDUCTION:
4895           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
4896           check_non_private = "reduction";
4897           goto do_add;
4898
4899         do_add:
4900           decl = OMP_CLAUSE_DECL (c);
4901           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4902             {
4903               remove = true;
4904               break;
4905             }
4906           omp_add_variable (ctx, decl, flags);
4907           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
4908               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
4909             {
4910               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
4911                                 GOVD_LOCAL | GOVD_SEEN);
4912               gimplify_omp_ctxp = ctx;
4913               push_gimplify_context ();
4914               gimplify_stmt (&OMP_CLAUSE_REDUCTION_INIT (c));
4915               pop_gimplify_context (OMP_CLAUSE_REDUCTION_INIT (c));
4916               push_gimplify_context ();
4917               gimplify_stmt (&OMP_CLAUSE_REDUCTION_MERGE (c));
4918               pop_gimplify_context (OMP_CLAUSE_REDUCTION_MERGE (c));
4919               gimplify_omp_ctxp = outer_ctx;
4920             }
4921           if (notice_outer)
4922             goto do_notice;
4923           break;
4924
4925         case OMP_CLAUSE_COPYIN:
4926         case OMP_CLAUSE_COPYPRIVATE:
4927           decl = OMP_CLAUSE_DECL (c);
4928           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4929             {
4930               remove = true;
4931               break;
4932             }
4933         do_notice:
4934           if (outer_ctx)
4935             omp_notice_variable (outer_ctx, decl, true);
4936           if (check_non_private
4937               && !in_parallel
4938               && omp_check_private (ctx, decl))
4939             {
4940               error ("%s variable %qs is private in outer context",
4941                      check_non_private, IDENTIFIER_POINTER (DECL_NAME (decl)));
4942               remove = true;
4943             }
4944           break;
4945
4946         case OMP_CLAUSE_IF:
4947           OMP_CLAUSE_OPERAND (c, 0)
4948             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
4949           /* Fall through.  */
4950
4951         case OMP_CLAUSE_SCHEDULE:
4952         case OMP_CLAUSE_NUM_THREADS:
4953           gs = gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
4954                               is_gimple_val, fb_rvalue);
4955           if (gs == GS_ERROR)
4956             remove = true;
4957           break;
4958
4959         case OMP_CLAUSE_NOWAIT:
4960         case OMP_CLAUSE_ORDERED:
4961           break;
4962
4963         case OMP_CLAUSE_DEFAULT:
4964           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
4965           break;
4966
4967         default:
4968           gcc_unreachable ();
4969         }
4970
4971       if (remove)
4972         *list_p = OMP_CLAUSE_CHAIN (c);
4973       else
4974         list_p = &OMP_CLAUSE_CHAIN (c);
4975     }
4976
4977   gimplify_omp_ctxp = ctx;
4978 }
4979
4980 /* For all variables that were not actually used within the context,
4981    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
4982
4983 static int
4984 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
4985 {
4986   tree *list_p = (tree *) data;
4987   tree decl = (tree) n->key;
4988   unsigned flags = n->value;
4989   enum omp_clause_code code;
4990   tree clause;
4991   bool private_debug;
4992
4993   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
4994     return 0;
4995   if ((flags & GOVD_SEEN) == 0)
4996     return 0;
4997   if (flags & GOVD_DEBUG_PRIVATE)
4998     {
4999       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
5000       private_debug = true;
5001     }
5002   else
5003     private_debug
5004       = lang_hooks.decls.omp_private_debug_clause (decl,
5005                                                    !!(flags & GOVD_SHARED));
5006   if (private_debug)
5007     code = OMP_CLAUSE_PRIVATE;
5008   else if (flags & GOVD_SHARED)
5009     {
5010       if (is_global_var (decl))
5011         {
5012           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
5013           while (ctx != NULL)
5014             {
5015               splay_tree_node on
5016                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5017               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
5018                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5019                 break;
5020               ctx = ctx->outer_context;
5021             }
5022           if (ctx == NULL)
5023             return 0;
5024         }
5025       code = OMP_CLAUSE_SHARED;
5026     }
5027   else if (flags & GOVD_PRIVATE)
5028     code = OMP_CLAUSE_PRIVATE;
5029   else if (flags & GOVD_FIRSTPRIVATE)
5030     code = OMP_CLAUSE_FIRSTPRIVATE;
5031   else
5032     gcc_unreachable ();
5033
5034   clause = build_omp_clause (code);
5035   OMP_CLAUSE_DECL (clause) = decl;
5036   OMP_CLAUSE_CHAIN (clause) = *list_p;
5037   if (private_debug)
5038     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
5039   *list_p = clause;
5040
5041   return 0;
5042 }
5043
5044 static void
5045 gimplify_adjust_omp_clauses (tree *list_p)
5046 {
5047   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
5048   tree c, decl;
5049
5050   while ((c = *list_p) != NULL)
5051     {
5052       splay_tree_node n;
5053       bool remove = false;
5054
5055       switch (OMP_CLAUSE_CODE (c))
5056         {
5057         case OMP_CLAUSE_PRIVATE:
5058         case OMP_CLAUSE_SHARED:
5059         case OMP_CLAUSE_FIRSTPRIVATE:
5060           decl = OMP_CLAUSE_DECL (c);
5061           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5062           remove = !(n->value & GOVD_SEEN);
5063           if (! remove)
5064             {
5065               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
5066               if ((n->value & GOVD_DEBUG_PRIVATE)
5067                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
5068                 {
5069                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
5070                               || ((n->value & GOVD_DATA_SHARE_CLASS)
5071                                   == GOVD_PRIVATE));
5072                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
5073                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
5074                 }
5075             }
5076           break;
5077
5078         case OMP_CLAUSE_LASTPRIVATE:
5079           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
5080              accurately reflect the presence of a FIRSTPRIVATE clause.  */
5081           decl = OMP_CLAUSE_DECL (c);
5082           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5083           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
5084             = (n->value & GOVD_FIRSTPRIVATE) != 0;
5085           break;
5086           
5087         case OMP_CLAUSE_REDUCTION:
5088         case OMP_CLAUSE_COPYIN:
5089         case OMP_CLAUSE_COPYPRIVATE:
5090         case OMP_CLAUSE_IF:
5091         case OMP_CLAUSE_NUM_THREADS:
5092         case OMP_CLAUSE_SCHEDULE:
5093         case OMP_CLAUSE_NOWAIT:
5094         case OMP_CLAUSE_ORDERED:
5095         case OMP_CLAUSE_DEFAULT:
5096           break;
5097
5098         default:
5099           gcc_unreachable ();
5100         }
5101
5102       if (remove)
5103         *list_p = OMP_CLAUSE_CHAIN (c);
5104       else
5105         list_p = &OMP_CLAUSE_CHAIN (c);
5106     }
5107
5108   /* Add in any implicit data sharing.  */
5109   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
5110   
5111   gimplify_omp_ctxp = ctx->outer_context;
5112   delete_omp_context (ctx);
5113 }
5114
5115 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
5116    gimplification of the body, as well as scanning the body for used
5117    variables.  We need to do this scan now, because variable-sized
5118    decls will be decomposed during gimplification.  */
5119
5120 static enum gimplify_status
5121 gimplify_omp_parallel (tree *expr_p, tree *pre_p)
5122 {
5123   tree expr = *expr_p;
5124
5125   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p, true,
5126                              OMP_PARALLEL_COMBINED (expr));
5127
5128   push_gimplify_context ();
5129
5130   gimplify_stmt (&OMP_PARALLEL_BODY (expr));
5131
5132   if (TREE_CODE (OMP_PARALLEL_BODY (expr)) == BIND_EXPR)
5133     pop_gimplify_context (OMP_PARALLEL_BODY (expr));
5134   else
5135     pop_gimplify_context (NULL_TREE);
5136
5137   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
5138
5139   return GS_ALL_DONE;
5140 }
5141
5142 /* Gimplify the gross structure of an OMP_FOR statement.  */
5143
5144 static enum gimplify_status
5145 gimplify_omp_for (tree *expr_p, tree *pre_p)
5146 {
5147   tree for_stmt, decl, var, t;
5148   enum gimplify_status ret = GS_OK;
5149   tree body, init_decl = NULL_TREE;
5150
5151   for_stmt = *expr_p;
5152
5153   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, false, false);
5154
5155   t = OMP_FOR_INIT (for_stmt);
5156   gcc_assert (TREE_CODE (t) == MODIFY_EXPR
5157               || TREE_CODE (t) == GIMPLE_MODIFY_STMT);
5158   decl = GENERIC_TREE_OPERAND (t, 0);
5159   gcc_assert (DECL_P (decl));
5160   gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl)));
5161
5162   /* Make sure the iteration variable is private.  */
5163   if (omp_is_private (gimplify_omp_ctxp, decl))
5164     omp_notice_variable (gimplify_omp_ctxp, decl, true);
5165   else
5166     omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
5167
5168   /* If DECL is not a gimple register, create a temporary variable to act as an
5169      iteration counter.  This is valid, since DECL cannot be modified in the
5170      body of the loop.  */
5171   if (!is_gimple_reg (decl))
5172     {
5173       var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
5174       GENERIC_TREE_OPERAND (t, 0) = var;
5175
5176       init_decl = build_gimple_modify_stmt (decl, var);
5177       omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
5178     }
5179   else
5180     var = decl;
5181
5182   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5183                         &OMP_FOR_PRE_BODY (for_stmt),
5184                         NULL, is_gimple_val, fb_rvalue);
5185
5186   tree_to_gimple_tuple (&OMP_FOR_INIT (for_stmt));
5187
5188   t = OMP_FOR_COND (for_stmt);
5189   gcc_assert (COMPARISON_CLASS_P (t));
5190   gcc_assert (GENERIC_TREE_OPERAND (t, 0) == decl);
5191   TREE_OPERAND (t, 0) = var;
5192
5193   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5194                         &OMP_FOR_PRE_BODY (for_stmt),
5195                         NULL, is_gimple_val, fb_rvalue);
5196
5197   tree_to_gimple_tuple (&OMP_FOR_INCR (for_stmt));
5198   t = OMP_FOR_INCR (for_stmt);
5199   switch (TREE_CODE (t))
5200     {
5201     case PREINCREMENT_EXPR:
5202     case POSTINCREMENT_EXPR:
5203       t = build_int_cst (TREE_TYPE (decl), 1);
5204       t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
5205       t = build_gimple_modify_stmt (var, t);
5206       OMP_FOR_INCR (for_stmt) = t;
5207       break;
5208
5209     case PREDECREMENT_EXPR:
5210     case POSTDECREMENT_EXPR:
5211       t = build_int_cst (TREE_TYPE (decl), -1);
5212       t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
5213       t = build_gimple_modify_stmt (var, t);
5214       OMP_FOR_INCR (for_stmt) = t;
5215       break;
5216       
5217     case GIMPLE_MODIFY_STMT:
5218       gcc_assert (GIMPLE_STMT_OPERAND (t, 0) == decl);
5219       GIMPLE_STMT_OPERAND (t, 0) = var;
5220
5221       t = GIMPLE_STMT_OPERAND (t, 1);
5222       switch (TREE_CODE (t))
5223         {
5224         case PLUS_EXPR:
5225           if (TREE_OPERAND (t, 1) == decl)
5226             {
5227               TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
5228               TREE_OPERAND (t, 0) = var;
5229               break;
5230             }
5231
5232           /* Fallthru.  */
5233         case MINUS_EXPR:
5234           gcc_assert (TREE_OPERAND (t, 0) == decl);
5235           TREE_OPERAND (t, 0) = var;
5236           break;
5237         default:
5238           gcc_unreachable ();
5239         }
5240
5241       ret |= gimplify_expr (&TREE_OPERAND (t, 1), &OMP_FOR_PRE_BODY (for_stmt),
5242                             NULL, is_gimple_val, fb_rvalue);
5243       break;
5244
5245     default:
5246       gcc_unreachable ();
5247     }
5248
5249   body = OMP_FOR_BODY (for_stmt);
5250   gimplify_to_stmt_list (&body);
5251   t = alloc_stmt_list ();
5252   if (init_decl)
5253     append_to_statement_list (init_decl, &t);
5254   append_to_statement_list (body, &t);
5255   OMP_FOR_BODY (for_stmt) = t;
5256   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
5257
5258   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
5259 }
5260
5261 /* Gimplify the gross structure of other OpenMP worksharing constructs.
5262    In particular, OMP_SECTIONS and OMP_SINGLE.  */
5263
5264 static enum gimplify_status
5265 gimplify_omp_workshare (tree *expr_p, tree *pre_p)
5266 {
5267   tree stmt = *expr_p;
5268
5269   gimplify_scan_omp_clauses (&OMP_CLAUSES (stmt), pre_p, false, false);
5270   gimplify_to_stmt_list (&OMP_BODY (stmt));
5271   gimplify_adjust_omp_clauses (&OMP_CLAUSES (stmt));
5272
5273   return GS_ALL_DONE;
5274 }
5275
5276 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
5277    stabilized the lhs of the atomic operation as *ADDR.  Return true if 
5278    EXPR is this stabilized form.  */
5279
5280 static bool
5281 goa_lhs_expr_p (tree expr, tree addr)
5282 {
5283   /* Also include casts to other type variants.  The C front end is fond
5284      of adding these for e.g. volatile variables.  This is like 
5285      STRIP_TYPE_NOPS but includes the main variant lookup.  */
5286   while ((TREE_CODE (expr) == NOP_EXPR
5287           || TREE_CODE (expr) == CONVERT_EXPR
5288           || TREE_CODE (expr) == NON_LVALUE_EXPR)
5289          && TREE_OPERAND (expr, 0) != error_mark_node
5290          && (TYPE_MAIN_VARIANT (TREE_TYPE (expr))
5291              == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
5292     expr = TREE_OPERAND (expr, 0);
5293
5294   if (TREE_CODE (expr) == INDIRECT_REF && TREE_OPERAND (expr, 0) == addr)
5295     return true;
5296   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
5297     return true;
5298   return false;
5299 }
5300
5301 /* Walk *EXPR_P and replace
5302    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
5303    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
5304    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
5305
5306 static int
5307 goa_stabilize_expr (tree *expr_p, tree *pre_p, tree lhs_addr, tree lhs_var)
5308 {
5309   tree expr = *expr_p;
5310   int saw_lhs;
5311
5312   if (goa_lhs_expr_p (expr, lhs_addr))
5313     {
5314       *expr_p = lhs_var;
5315       return 1;
5316     }
5317   if (is_gimple_val (expr))
5318     return 0;
5319  
5320   saw_lhs = 0;
5321   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
5322     {
5323     case tcc_binary:
5324       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
5325                                      lhs_addr, lhs_var);
5326     case tcc_unary:
5327       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
5328                                      lhs_addr, lhs_var);
5329       break;
5330     default:
5331       break;
5332     }
5333
5334   if (saw_lhs == 0)
5335     {
5336       enum gimplify_status gs;
5337       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
5338       if (gs != GS_ALL_DONE)
5339         saw_lhs = -1;
5340     }
5341
5342   return saw_lhs;
5343 }
5344
5345 /* Gimplify an OMP_ATOMIC statement.  */
5346
5347 static enum gimplify_status
5348 gimplify_omp_atomic (tree *expr_p, tree *pre_p)
5349 {
5350   tree addr = TREE_OPERAND (*expr_p, 0);
5351   tree rhs = TREE_OPERAND (*expr_p, 1);
5352   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
5353   tree tmp_load, load, store;
5354
5355    tmp_load = create_tmp_var (type, NULL);
5356    if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
5357      return GS_ERROR;
5358
5359    if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
5360        != GS_ALL_DONE)
5361      return GS_ERROR;
5362
5363    load = build2 (OMP_ATOMIC_LOAD, void_type_node, tmp_load, addr);
5364    append_to_statement_list (load, pre_p);
5365    if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
5366        != GS_ALL_DONE)
5367      return GS_ERROR;
5368    store = build1 (OMP_ATOMIC_STORE, void_type_node, rhs);
5369    *expr_p = store;
5370
5371    return GS_ALL_DONE;
5372
5373 }
5374
5375 /*  Gimplifies the expression tree pointed to by EXPR_P.  Return 0 if
5376     gimplification failed.
5377
5378     PRE_P points to the list where side effects that must happen before
5379         EXPR should be stored.
5380
5381     POST_P points to the list where side effects that must happen after
5382         EXPR should be stored, or NULL if there is no suitable list.  In
5383         that case, we copy the result to a temporary, emit the
5384         post-effects, and then return the temporary.
5385
5386     GIMPLE_TEST_F points to a function that takes a tree T and
5387         returns nonzero if T is in the GIMPLE form requested by the
5388         caller.  The GIMPLE predicates are in tree-gimple.c.
5389
5390         This test is used twice.  Before gimplification, the test is
5391         invoked to determine whether *EXPR_P is already gimple enough.  If
5392         that fails, *EXPR_P is gimplified according to its code and
5393         GIMPLE_TEST_F is called again.  If the test still fails, then a new
5394         temporary variable is created and assigned the value of the
5395         gimplified expression.
5396
5397     FALLBACK tells the function what sort of a temporary we want.  If the 1
5398         bit is set, an rvalue is OK.  If the 2 bit is set, an lvalue is OK.
5399         If both are set, either is OK, but an lvalue is preferable.
5400
5401     The return value is either GS_ERROR or GS_ALL_DONE, since this function
5402     iterates until solution.  */
5403
5404 enum gimplify_status
5405 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
5406                bool (* gimple_test_f) (tree), fallback_t fallback)
5407 {
5408   tree tmp;
5409   tree internal_pre = NULL_TREE;
5410   tree internal_post = NULL_TREE;
5411   tree save_expr;
5412   int is_statement = (pre_p == NULL);
5413   location_t saved_location;
5414   enum gimplify_status ret;
5415
5416   save_expr = *expr_p;
5417   if (save_expr == NULL_TREE)
5418     return GS_ALL_DONE;
5419
5420   /* We used to check the predicate here and return immediately if it
5421      succeeds.  This is wrong; the design is for gimplification to be
5422      idempotent, and for the predicates to only test for valid forms, not
5423      whether they are fully simplified.  */
5424
5425   /* Set up our internal queues if needed.  */
5426   if (pre_p == NULL)
5427     pre_p = &internal_pre;
5428   if (post_p == NULL)
5429     post_p = &internal_post;
5430
5431   saved_location = input_location;
5432   if (save_expr != error_mark_node
5433       && EXPR_HAS_LOCATION (*expr_p))
5434     input_location = EXPR_LOCATION (*expr_p);
5435
5436   /* Loop over the specific gimplifiers until the toplevel node
5437      remains the same.  */
5438   do
5439     {
5440       /* Strip away as many useless type conversions as possible
5441          at the toplevel.  */
5442       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
5443
5444       /* Remember the expr.  */
5445       save_expr = *expr_p;
5446
5447       /* Die, die, die, my darling.  */
5448       if (save_expr == error_mark_node
5449           || (!GIMPLE_STMT_P (save_expr)
5450               && TREE_TYPE (save_expr)
5451               && TREE_TYPE (save_expr) == error_mark_node))
5452         {
5453           ret = GS_ERROR;
5454           break;
5455         }
5456
5457       /* Do any language-specific gimplification.  */
5458       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
5459       if (ret == GS_OK)
5460         {
5461           if (*expr_p == NULL_TREE)
5462             break;
5463           if (*expr_p != save_expr)
5464             continue;
5465         }
5466       else if (ret != GS_UNHANDLED)
5467         break;
5468
5469       ret = GS_OK;
5470       switch (TREE_CODE (*expr_p))
5471         {
5472           /* First deal with the special cases.  */
5473
5474         case POSTINCREMENT_EXPR:
5475         case POSTDECREMENT_EXPR:
5476         case PREINCREMENT_EXPR:
5477         case PREDECREMENT_EXPR:
5478           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
5479                                         fallback != fb_none);
5480           break;
5481
5482         case ARRAY_REF:
5483         case ARRAY_RANGE_REF:
5484         case REALPART_EXPR:
5485         case IMAGPART_EXPR:
5486         case COMPONENT_REF:
5487         case VIEW_CONVERT_EXPR:
5488           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
5489                                         fallback ? fallback : fb_rvalue);
5490           break;
5491
5492         case COND_EXPR:
5493           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
5494           /* C99 code may assign to an array in a structure value of a
5495              conditional expression, and this has undefined behavior
5496              only on execution, so create a temporary if an lvalue is
5497              required.  */
5498           if (fallback == fb_lvalue)
5499             {
5500               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5501               mark_addressable (*expr_p);
5502             }
5503           break;
5504
5505         case CALL_EXPR:
5506           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
5507           /* C99 code may assign to an array in a structure returned
5508              from a function, and this has undefined behavior only on
5509              execution, so create a temporary if an lvalue is
5510              required.  */
5511           if (fallback == fb_lvalue)
5512             {
5513               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5514               mark_addressable (*expr_p);
5515             }
5516           break;
5517
5518         case TREE_LIST:
5519           gcc_unreachable ();
5520
5521         case COMPOUND_EXPR:
5522           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
5523           break;
5524
5525         case MODIFY_EXPR:
5526         case GIMPLE_MODIFY_STMT:
5527         case INIT_EXPR:
5528           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
5529                                       fallback != fb_none);
5530
5531           if (*expr_p)
5532             {
5533               /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer
5534                  useful.  */
5535               if (TREE_CODE (*expr_p) == INIT_EXPR)
5536                 TREE_SET_CODE (*expr_p, MODIFY_EXPR);
5537
5538               /* Convert MODIFY_EXPR to GIMPLE_MODIFY_STMT.  */
5539               if (TREE_CODE (*expr_p) == MODIFY_EXPR)
5540                 tree_to_gimple_tuple (expr_p);
5541             }
5542
5543           break;
5544
5545         case TRUTH_ANDIF_EXPR:
5546         case TRUTH_ORIF_EXPR:
5547           ret = gimplify_boolean_expr (expr_p);
5548           break;
5549
5550         case TRUTH_NOT_EXPR:
5551           TREE_OPERAND (*expr_p, 0)
5552             = gimple_boolify (TREE_OPERAND (*expr_p, 0));
5553           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5554                                is_gimple_val, fb_rvalue);
5555           recalculate_side_effects (*expr_p);
5556           break;
5557
5558         case ADDR_EXPR:
5559           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
5560           break;
5561
5562         case VA_ARG_EXPR:
5563           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
5564           break;
5565
5566         case CONVERT_EXPR:
5567         case NOP_EXPR:
5568           if (IS_EMPTY_STMT (*expr_p))
5569             {
5570               ret = GS_ALL_DONE;
5571               break;
5572             }
5573
5574           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
5575               || fallback == fb_none)
5576             {
5577               /* Just strip a conversion to void (or in void context) and
5578                  try again.  */
5579               *expr_p = TREE_OPERAND (*expr_p, 0);
5580               break;
5581             }
5582
5583           ret = gimplify_conversion (expr_p);
5584           if (ret == GS_ERROR)
5585             break;
5586           if (*expr_p != save_expr)
5587             break;
5588           /* FALLTHRU */
5589
5590         case FIX_TRUNC_EXPR:
5591           /* unary_expr: ... | '(' cast ')' val | ...  */
5592           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5593                                is_gimple_val, fb_rvalue);
5594           recalculate_side_effects (*expr_p);
5595           break;
5596
5597         case INDIRECT_REF:
5598           *expr_p = fold_indirect_ref (*expr_p);
5599           if (*expr_p != save_expr)
5600             break;
5601           /* else fall through.  */
5602         case ALIGN_INDIRECT_REF:
5603         case MISALIGNED_INDIRECT_REF:
5604           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5605                                is_gimple_reg, fb_rvalue);
5606           recalculate_side_effects (*expr_p);
5607           break;
5608
5609           /* Constants need not be gimplified.  */
5610         case INTEGER_CST:
5611         case REAL_CST:
5612         case FIXED_CST:
5613         case STRING_CST:
5614         case COMPLEX_CST:
5615         case VECTOR_CST:
5616           ret = GS_ALL_DONE;
5617           break;
5618
5619         case CONST_DECL:
5620           /* If we require an lvalue, such as for ADDR_EXPR, retain the
5621              CONST_DECL node.  Otherwise the decl is replaceable by its
5622              value.  */
5623           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
5624           if (fallback & fb_lvalue)
5625             ret = GS_ALL_DONE;
5626           else
5627             *expr_p = DECL_INITIAL (*expr_p);
5628           break;
5629
5630         case DECL_EXPR:
5631           ret = gimplify_decl_expr (expr_p);
5632           break;
5633
5634         case EXC_PTR_EXPR:
5635           /* FIXME make this a decl.  */
5636           ret = GS_ALL_DONE;
5637           break;
5638
5639         case BIND_EXPR:
5640           ret = gimplify_bind_expr (expr_p, pre_p);
5641           break;
5642
5643         case LOOP_EXPR:
5644           ret = gimplify_loop_expr (expr_p, pre_p);
5645           break;
5646
5647         case SWITCH_EXPR:
5648           ret = gimplify_switch_expr (expr_p, pre_p);
5649           break;
5650
5651         case EXIT_EXPR:
5652           ret = gimplify_exit_expr (expr_p);
5653           break;
5654
5655         case GOTO_EXPR:
5656           /* If the target is not LABEL, then it is a computed jump
5657              and the target needs to be gimplified.  */
5658           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
5659             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
5660                                  NULL, is_gimple_val, fb_rvalue);
5661           break;
5662
5663         case LABEL_EXPR:
5664           ret = GS_ALL_DONE;
5665           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
5666                       == current_function_decl);
5667           break;
5668
5669         case CASE_LABEL_EXPR:
5670           ret = gimplify_case_label_expr (expr_p);
5671           break;
5672
5673         case RETURN_EXPR:
5674           ret = gimplify_return_expr (*expr_p, pre_p);
5675           break;
5676
5677         case CONSTRUCTOR:
5678           /* Don't reduce this in place; let gimplify_init_constructor work its
5679              magic.  Buf if we're just elaborating this for side effects, just
5680              gimplify any element that has side-effects.  */
5681           if (fallback == fb_none)
5682             {
5683               unsigned HOST_WIDE_INT ix;
5684               constructor_elt *ce;
5685               tree temp = NULL_TREE;
5686               for (ix = 0;
5687                    VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
5688                                 ix, ce);
5689                    ix++)
5690                 if (TREE_SIDE_EFFECTS (ce->value))
5691                   append_to_statement_list (ce->value, &temp);
5692
5693               *expr_p = temp;
5694               ret = GS_OK;
5695             }
5696           /* C99 code may assign to an array in a constructed
5697              structure or union, and this has undefined behavior only
5698              on execution, so create a temporary if an lvalue is
5699              required.  */
5700           else if (fallback == fb_lvalue)
5701             {
5702               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5703               mark_addressable (*expr_p);
5704             }
5705           else
5706             ret = GS_ALL_DONE;
5707           break;
5708
5709           /* The following are special cases that are not handled by the
5710              original GIMPLE grammar.  */
5711
5712           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
5713              eliminated.  */
5714         case SAVE_EXPR:
5715           ret = gimplify_save_expr (expr_p, pre_p, post_p);
5716           break;
5717
5718         case BIT_FIELD_REF:
5719           {
5720             enum gimplify_status r0, r1, r2;
5721
5722             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5723                                 is_gimple_lvalue, fb_either);
5724             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5725                                 is_gimple_val, fb_rvalue);
5726             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
5727                                 is_gimple_val, fb_rvalue);
5728             recalculate_side_effects (*expr_p);
5729
5730             ret = MIN (r0, MIN (r1, r2));
5731           }
5732           break;
5733
5734         case NON_LVALUE_EXPR:
5735           /* This should have been stripped above.  */
5736           gcc_unreachable ();
5737
5738         case ASM_EXPR:
5739           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
5740           break;
5741
5742         case TRY_FINALLY_EXPR:
5743         case TRY_CATCH_EXPR:
5744           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
5745           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
5746           ret = GS_ALL_DONE;
5747           break;
5748
5749         case CLEANUP_POINT_EXPR:
5750           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
5751           break;
5752
5753         case TARGET_EXPR:
5754           ret = gimplify_target_expr (expr_p, pre_p, post_p);
5755           break;
5756
5757         case CATCH_EXPR:
5758           gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
5759           ret = GS_ALL_DONE;
5760           break;
5761
5762         case EH_FILTER_EXPR:
5763           gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
5764           ret = GS_ALL_DONE;
5765           break;
5766
5767         case CHANGE_DYNAMIC_TYPE_EXPR:
5768           ret = gimplify_expr (&CHANGE_DYNAMIC_TYPE_LOCATION (*expr_p),
5769                                pre_p, post_p, is_gimple_reg, fb_lvalue);
5770           break;
5771
5772         case OBJ_TYPE_REF:
5773           {
5774             enum gimplify_status r0, r1;
5775             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
5776                                 is_gimple_val, fb_rvalue);
5777             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
5778                                 is_gimple_val, fb_rvalue);
5779             ret = MIN (r0, r1);
5780           }
5781           break;
5782
5783         case LABEL_DECL:
5784           /* We get here when taking the address of a label.  We mark
5785              the label as "forced"; meaning it can never be removed and
5786              it is a potential target for any computed goto.  */
5787           FORCED_LABEL (*expr_p) = 1;
5788           ret = GS_ALL_DONE;
5789           break;
5790
5791         case STATEMENT_LIST:
5792           ret = gimplify_statement_list (expr_p, pre_p);
5793           break;
5794
5795         case WITH_SIZE_EXPR:
5796           {
5797             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5798                            post_p == &internal_post ? NULL : post_p,
5799                            gimple_test_f, fallback);
5800             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5801                            is_gimple_val, fb_rvalue);
5802           }
5803           break;
5804
5805         case VAR_DECL:
5806         case PARM_DECL:
5807           ret = gimplify_var_or_parm_decl (expr_p);
5808           break;
5809
5810         case RESULT_DECL:
5811           /* When within an OpenMP context, notice uses of variables.  */
5812           if (gimplify_omp_ctxp)
5813             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
5814           ret = GS_ALL_DONE;
5815           break;
5816
5817         case SSA_NAME:
5818           /* Allow callbacks into the gimplifier during optimization.  */
5819           ret = GS_ALL_DONE;
5820           break;
5821
5822         case OMP_PARALLEL:
5823           ret = gimplify_omp_parallel (expr_p, pre_p);
5824           break;
5825
5826         case OMP_FOR:
5827           ret = gimplify_omp_for (expr_p, pre_p);
5828           break;
5829
5830         case OMP_SECTIONS:
5831         case OMP_SINGLE:
5832           ret = gimplify_omp_workshare (expr_p, pre_p);
5833           break;
5834
5835         case OMP_SECTION:
5836         case OMP_MASTER:
5837         case OMP_ORDERED:
5838         case OMP_CRITICAL:
5839           gimplify_to_stmt_list (&OMP_BODY (*expr_p));
5840           break;
5841
5842         case OMP_ATOMIC:
5843           ret = gimplify_omp_atomic (expr_p, pre_p);
5844           break;
5845
5846         case OMP_RETURN:
5847         case OMP_CONTINUE:
5848         case OMP_ATOMIC_LOAD:
5849         case OMP_ATOMIC_STORE:
5850
5851           ret = GS_ALL_DONE;
5852           break;
5853
5854         case POINTER_PLUS_EXPR:
5855           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
5856              The second is gimple immediate saving a need for extra statement.
5857            */
5858           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
5859               && (tmp = maybe_fold_offset_to_reference
5860                          (TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
5861                           TREE_TYPE (TREE_TYPE (*expr_p)))))
5862              {
5863                tree ptr_type = build_pointer_type (TREE_TYPE (tmp));
5864                if (useless_type_conversion_p (TREE_TYPE (*expr_p), ptr_type))
5865                  {
5866                    *expr_p = build_fold_addr_expr_with_type (tmp, ptr_type);
5867                    break;
5868                  }
5869              }
5870           /* Convert (void *)&a + 4 into (void *)&a[1].  */
5871           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
5872               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
5873               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
5874                                                                         0),0)))
5875               && (tmp = maybe_fold_offset_to_reference
5876                          (TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
5877                           TREE_OPERAND (*expr_p, 1),
5878                           TREE_TYPE (TREE_TYPE
5879                                   (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
5880                                                  0))))))
5881              {
5882                tmp = build_fold_addr_expr (tmp);
5883                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
5884                break;
5885              }
5886           /* FALLTHRU */
5887         default:
5888           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
5889             {
5890             case tcc_comparison:
5891               /* Handle comparison of objects of non scalar mode aggregates
5892                  with a call to memcmp.  It would be nice to only have to do
5893                  this for variable-sized objects, but then we'd have to allow
5894                  the same nest of reference nodes we allow for MODIFY_EXPR and
5895                  that's too complex.
5896
5897                  Compare scalar mode aggregates as scalar mode values.  Using
5898                  memcmp for them would be very inefficient at best, and is
5899                  plain wrong if bitfields are involved.  */
5900
5901               {
5902                 tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
5903
5904                 if (!AGGREGATE_TYPE_P (type))
5905                   goto expr_2;
5906                 else if (TYPE_MODE (type) != BLKmode)
5907                   ret = gimplify_scalar_mode_aggregate_compare (expr_p);
5908                 else
5909                   ret = gimplify_variable_sized_compare (expr_p);
5910
5911                 break;
5912                 }
5913
5914             /* If *EXPR_P does not need to be special-cased, handle it
5915                according to its class.  */
5916             case tcc_unary:
5917               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5918                                    post_p, is_gimple_val, fb_rvalue);
5919               break;
5920
5921             case tcc_binary:
5922             expr_2:
5923               {
5924                 enum gimplify_status r0, r1;
5925
5926                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5927                                     post_p, is_gimple_val, fb_rvalue);
5928                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
5929                                     post_p, is_gimple_val, fb_rvalue);
5930
5931                 ret = MIN (r0, r1);
5932                 break;
5933               }
5934
5935             case tcc_declaration:
5936             case tcc_constant:
5937               ret = GS_ALL_DONE;
5938               goto dont_recalculate;
5939
5940             default:
5941               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
5942                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
5943                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
5944               goto expr_2;
5945             }
5946
5947           recalculate_side_effects (*expr_p);
5948         dont_recalculate:
5949           break;
5950         }
5951
5952       /* If we replaced *expr_p, gimplify again.  */
5953       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
5954         ret = GS_ALL_DONE;
5955     }
5956   while (ret == GS_OK);
5957
5958   /* If we encountered an error_mark somewhere nested inside, either
5959      stub out the statement or propagate the error back out.  */
5960   if (ret == GS_ERROR)
5961     {
5962       if (is_statement)
5963         *expr_p = NULL;
5964       goto out;
5965     }
5966
5967   /* This was only valid as a return value from the langhook, which
5968      we handled.  Make sure it doesn't escape from any other context.  */
5969   gcc_assert (ret != GS_UNHANDLED);
5970
5971   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
5972     {
5973       /* We aren't looking for a value, and we don't have a valid
5974          statement.  If it doesn't have side-effects, throw it away.  */
5975       if (!TREE_SIDE_EFFECTS (*expr_p))
5976         *expr_p = NULL;
5977       else if (!TREE_THIS_VOLATILE (*expr_p))
5978         {
5979           /* This is probably a _REF that contains something nested that
5980              has side effects.  Recurse through the operands to find it.  */
5981           enum tree_code code = TREE_CODE (*expr_p);
5982
5983           switch (code)
5984             {
5985             case COMPONENT_REF:
5986             case REALPART_EXPR:
5987             case IMAGPART_EXPR:
5988             case VIEW_CONVERT_EXPR:
5989               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5990                              gimple_test_f, fallback);
5991               break;
5992
5993             case ARRAY_REF:
5994             case ARRAY_RANGE_REF:
5995               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5996                              gimple_test_f, fallback);
5997               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5998                              gimple_test_f, fallback);
5999               break;
6000
6001             default:
6002                /* Anything else with side-effects must be converted to
6003                   a valid statement before we get here.  */
6004               gcc_unreachable ();
6005             }
6006
6007           *expr_p = NULL;
6008         }
6009       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
6010                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
6011         {
6012           /* Historically, the compiler has treated a bare reference
6013              to a non-BLKmode volatile lvalue as forcing a load.  */
6014           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
6015           /* Normally, we do not want to create a temporary for a
6016              TREE_ADDRESSABLE type because such a type should not be
6017              copied by bitwise-assignment.  However, we make an
6018              exception here, as all we are doing here is ensuring that
6019              we read the bytes that make up the type.  We use
6020              create_tmp_var_raw because create_tmp_var will abort when
6021              given a TREE_ADDRESSABLE type.  */
6022           tree tmp = create_tmp_var_raw (type, "vol");
6023           gimple_add_tmp_var (tmp);
6024           *expr_p = build_gimple_modify_stmt (tmp, *expr_p);
6025         }
6026       else
6027         /* We can't do anything useful with a volatile reference to
6028            an incomplete type, so just throw it away.  Likewise for
6029            a BLKmode type, since any implicit inner load should
6030            already have been turned into an explicit one by the
6031            gimplification process.  */
6032         *expr_p = NULL;
6033     }
6034
6035   /* If we are gimplifying at the statement level, we're done.  Tack
6036      everything together and replace the original statement with the
6037      gimplified form.  */
6038   if (fallback == fb_none || is_statement)
6039     {
6040       if (internal_pre || internal_post)
6041         {
6042           append_to_statement_list (*expr_p, &internal_pre);
6043           append_to_statement_list (internal_post, &internal_pre);
6044           annotate_all_with_locus (&internal_pre, input_location);
6045           *expr_p = internal_pre;
6046         }
6047       else if (!*expr_p)
6048         ;
6049       else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
6050         annotate_all_with_locus (expr_p, input_location);
6051       else
6052         annotate_one_with_locus (*expr_p, input_location);
6053       goto out;
6054     }
6055
6056   /* Otherwise we're gimplifying a subexpression, so the resulting value is
6057      interesting.  */
6058
6059   /* If it's sufficiently simple already, we're done.  Unless we are
6060      handling some post-effects internally; if that's the case, we need to
6061      copy into a temp before adding the post-effects to the tree.  */
6062   if (!internal_post && (*gimple_test_f) (*expr_p))
6063     goto out;
6064
6065   /* Otherwise, we need to create a new temporary for the gimplified
6066      expression.  */
6067
6068   /* We can't return an lvalue if we have an internal postqueue.  The
6069      object the lvalue refers to would (probably) be modified by the
6070      postqueue; we need to copy the value out first, which means an
6071      rvalue.  */
6072   if ((fallback & fb_lvalue) && !internal_post
6073       && is_gimple_addressable (*expr_p))
6074     {
6075       /* An lvalue will do.  Take the address of the expression, store it
6076          in a temporary, and replace the expression with an INDIRECT_REF of
6077          that temporary.  */
6078       tmp = build_fold_addr_expr (*expr_p);
6079       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
6080       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
6081     }
6082   else if ((fallback & fb_rvalue) && is_gimple_formal_tmp_rhs (*expr_p))
6083     {
6084       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
6085
6086       /* An rvalue will do.  Assign the gimplified expression into a new
6087          temporary TMP and replace the original expression with TMP.  */
6088
6089       if (internal_post || (fallback & fb_lvalue))
6090         /* The postqueue might change the value of the expression between
6091            the initialization and use of the temporary, so we can't use a
6092            formal temp.  FIXME do we care?  */
6093         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6094       else
6095         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
6096
6097       if (TREE_CODE (*expr_p) != SSA_NAME)
6098         DECL_GIMPLE_FORMAL_TEMP_P (*expr_p) = 1;
6099     }
6100   else
6101     {
6102 #ifdef ENABLE_CHECKING
6103       if (!(fallback & fb_mayfail))
6104         {
6105           fprintf (stderr, "gimplification failed:\n");
6106           print_generic_expr (stderr, *expr_p, 0);
6107           debug_tree (*expr_p);
6108           internal_error ("gimplification failed");
6109         }
6110 #endif
6111       gcc_assert (fallback & fb_mayfail);
6112       /* If this is an asm statement, and the user asked for the
6113          impossible, don't die.  Fail and let gimplify_asm_expr
6114          issue an error.  */
6115       ret = GS_ERROR;
6116       goto out;
6117     }
6118
6119   /* Make sure the temporary matches our predicate.  */
6120   gcc_assert ((*gimple_test_f) (*expr_p));
6121
6122   if (internal_post)
6123     {
6124       annotate_all_with_locus (&internal_post, input_location);
6125       append_to_statement_list (internal_post, pre_p);
6126     }
6127
6128  out:
6129   input_location = saved_location;
6130   return ret;
6131 }
6132
6133 /* Look through TYPE for variable-sized objects and gimplify each such
6134    size that we find.  Add to LIST_P any statements generated.  */
6135
6136 void
6137 gimplify_type_sizes (tree type, tree *list_p)
6138 {
6139   tree field, t;
6140
6141   if (type == NULL || type == error_mark_node)
6142     return;
6143
6144   /* We first do the main variant, then copy into any other variants.  */
6145   type = TYPE_MAIN_VARIANT (type);
6146
6147   /* Avoid infinite recursion.  */
6148   if (TYPE_SIZES_GIMPLIFIED (type))
6149     return;
6150
6151   TYPE_SIZES_GIMPLIFIED (type) = 1;
6152
6153   switch (TREE_CODE (type))
6154     {
6155     case INTEGER_TYPE:
6156     case ENUMERAL_TYPE:
6157     case BOOLEAN_TYPE:
6158     case REAL_TYPE:
6159     case FIXED_POINT_TYPE:
6160       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
6161       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
6162
6163       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6164         {
6165           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
6166           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
6167         }
6168       break;
6169
6170     case ARRAY_TYPE:
6171       /* These types may not have declarations, so handle them here.  */
6172       gimplify_type_sizes (TREE_TYPE (type), list_p);
6173       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
6174       break;
6175
6176     case RECORD_TYPE:
6177     case UNION_TYPE:
6178     case QUAL_UNION_TYPE:
6179       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6180         if (TREE_CODE (field) == FIELD_DECL)
6181           {
6182             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
6183             gimplify_type_sizes (TREE_TYPE (field), list_p);
6184           }
6185       break;
6186
6187     case POINTER_TYPE:
6188     case REFERENCE_TYPE:
6189         /* We used to recurse on the pointed-to type here, which turned out to
6190            be incorrect because its definition might refer to variables not
6191            yet initialized at this point if a forward declaration is involved.
6192
6193            It was actually useful for anonymous pointed-to types to ensure
6194            that the sizes evaluation dominates every possible later use of the
6195            values.  Restricting to such types here would be safe since there
6196            is no possible forward declaration around, but would introduce an
6197            undesirable middle-end semantic to anonymity.  We then defer to
6198            front-ends the responsibility of ensuring that the sizes are
6199            evaluated both early and late enough, e.g. by attaching artificial
6200            type declarations to the tree.  */
6201       break;
6202
6203     default:
6204       break;
6205     }
6206
6207   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
6208   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
6209
6210   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6211     {
6212       TYPE_SIZE (t) = TYPE_SIZE (type);
6213       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
6214       TYPE_SIZES_GIMPLIFIED (t) = 1;
6215     }
6216 }
6217
6218 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
6219    a size or position, has had all of its SAVE_EXPRs evaluated.
6220    We add any required statements to STMT_P.  */
6221
6222 void
6223 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
6224 {
6225   tree type, expr = *expr_p;
6226
6227   /* We don't do anything if the value isn't there, is constant, or contains
6228      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
6229      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
6230      will want to replace it with a new variable, but that will cause problems
6231      if this type is from outside the function.  It's OK to have that here.  */
6232   if (expr == NULL_TREE || TREE_CONSTANT (expr)
6233       || TREE_CODE (expr) == VAR_DECL
6234       || CONTAINS_PLACEHOLDER_P (expr))
6235     return;
6236
6237   type = TREE_TYPE (expr);
6238   *expr_p = unshare_expr (expr);
6239
6240   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
6241   expr = *expr_p;
6242
6243   /* Verify that we've an exact type match with the original expression.
6244      In particular, we do not wish to drop a "sizetype" in favour of a
6245      type of similar dimensions.  We don't want to pollute the generic
6246      type-stripping code with this knowledge because it doesn't matter
6247      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
6248      and friends retain their "sizetype-ness".  */
6249   if (TREE_TYPE (expr) != type
6250       && TREE_CODE (type) == INTEGER_TYPE
6251       && TYPE_IS_SIZETYPE (type))
6252     {
6253       tree tmp;
6254
6255       *expr_p = create_tmp_var (type, NULL);
6256       tmp = build1 (NOP_EXPR, type, expr);
6257       tmp = build_gimple_modify_stmt (*expr_p, tmp);
6258       if (EXPR_HAS_LOCATION (expr))
6259         SET_EXPR_LOCUS (tmp, EXPR_LOCUS (expr));
6260       else
6261         SET_EXPR_LOCATION (tmp, input_location);
6262
6263       gimplify_and_add (tmp, stmt_p);
6264     }
6265 }
6266 \f
6267
6268 /* Gimplify the body of statements pointed to by BODY_P.  FNDECL is the
6269    function decl containing BODY.  */
6270
6271 void
6272 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
6273 {
6274   location_t saved_location = input_location;
6275   tree body, parm_stmts;
6276
6277   timevar_push (TV_TREE_GIMPLIFY);
6278
6279   gcc_assert (gimplify_ctxp == NULL);
6280   push_gimplify_context ();
6281
6282   /* Unshare most shared trees in the body and in that of any nested functions.
6283      It would seem we don't have to do this for nested functions because
6284      they are supposed to be output and then the outer function gimplified
6285      first, but the g++ front end doesn't always do it that way.  */
6286   unshare_body (body_p, fndecl);
6287   unvisit_body (body_p, fndecl);
6288
6289   /* Make sure input_location isn't set to something wierd.  */
6290   input_location = DECL_SOURCE_LOCATION (fndecl);
6291
6292   /* Resolve callee-copies.  This has to be done before processing
6293      the body so that DECL_VALUE_EXPR gets processed correctly.  */
6294   parm_stmts = do_parms ? gimplify_parameters () : NULL;
6295
6296   /* Gimplify the function's body.  */
6297   gimplify_stmt (body_p);
6298   body = *body_p;
6299
6300   if (!body)
6301     body = alloc_stmt_list ();
6302   else if (TREE_CODE (body) == STATEMENT_LIST)
6303     {
6304       tree t = expr_only (*body_p);
6305       if (t)
6306         body = t;
6307     }
6308
6309   /* If there isn't an outer BIND_EXPR, add one.  */
6310   if (TREE_CODE (body) != BIND_EXPR)
6311     {
6312       tree b = build3 (BIND_EXPR, void_type_node, NULL_TREE,
6313                        NULL_TREE, NULL_TREE);
6314       TREE_SIDE_EFFECTS (b) = 1;
6315       append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
6316       body = b;
6317     }
6318
6319   /* If we had callee-copies statements, insert them at the beginning
6320      of the function.  */
6321   if (parm_stmts)
6322     {
6323       append_to_statement_list_force (BIND_EXPR_BODY (body), &parm_stmts);
6324       BIND_EXPR_BODY (body) = parm_stmts;
6325     }
6326
6327   /* Unshare again, in case gimplification was sloppy.  */
6328   unshare_all_trees (body);
6329
6330   *body_p = body;
6331
6332   pop_gimplify_context (body);
6333   gcc_assert (gimplify_ctxp == NULL);
6334
6335 #ifdef ENABLE_TYPES_CHECKING
6336   if (!errorcount && !sorrycount)
6337     verify_gimple_1 (BIND_EXPR_BODY (*body_p));
6338 #endif
6339
6340   timevar_pop (TV_TREE_GIMPLIFY);
6341   input_location = saved_location;
6342 }
6343
6344 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
6345    node for the function we want to gimplify.  */
6346
6347 void
6348 gimplify_function_tree (tree fndecl)
6349 {
6350   tree oldfn, parm, ret;
6351
6352   oldfn = current_function_decl;
6353   current_function_decl = fndecl;
6354   if (DECL_STRUCT_FUNCTION (fndecl))
6355     push_cfun (DECL_STRUCT_FUNCTION (fndecl));
6356   else
6357     push_struct_function (fndecl);
6358
6359   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
6360     {
6361       /* Preliminarily mark non-addressed complex variables as eligible
6362          for promotion to gimple registers.  We'll transform their uses
6363          as we find them.  */
6364       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
6365            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
6366           && !TREE_THIS_VOLATILE (parm)
6367           && !needs_to_live_in_memory (parm))
6368         DECL_GIMPLE_REG_P (parm) = 1;
6369     }
6370
6371   ret = DECL_RESULT (fndecl);
6372   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
6373            || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
6374       && !needs_to_live_in_memory (ret))
6375     DECL_GIMPLE_REG_P (ret) = 1;
6376
6377   gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
6378
6379   /* If we're instrumenting function entry/exit, then prepend the call to
6380      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
6381      catch the exit hook.  */
6382   /* ??? Add some way to ignore exceptions for this TFE.  */
6383   if (flag_instrument_function_entry_exit
6384       && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
6385       && !flag_instrument_functions_exclude_p (fndecl))
6386     {
6387       tree tf, x, bind;
6388
6389       tf = build2 (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
6390       TREE_SIDE_EFFECTS (tf) = 1;
6391       x = DECL_SAVED_TREE (fndecl);
6392       append_to_statement_list (x, &TREE_OPERAND (tf, 0));
6393       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
6394       x = build_call_expr (x, 0);
6395       append_to_statement_list (x, &TREE_OPERAND (tf, 1));
6396
6397       bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);
6398       TREE_SIDE_EFFECTS (bind) = 1;
6399       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
6400       x = build_call_expr (x, 0);
6401       append_to_statement_list (x, &BIND_EXPR_BODY (bind));
6402       append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
6403
6404       DECL_SAVED_TREE (fndecl) = bind;
6405     }
6406
6407   cfun->gimplified = true;
6408   current_function_decl = oldfn;
6409   pop_cfun ();
6410 }
6411 \f
6412 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
6413    force the result to be either ssa_name or an invariant, otherwise
6414    just force it to be a rhs expression.  If VAR is not NULL, make the
6415    base variable of the final destination be VAR if suitable.  */
6416
6417 tree
6418 force_gimple_operand (tree expr, tree *stmts, bool simple, tree var)
6419 {
6420   tree t;
6421   enum gimplify_status ret;
6422   gimple_predicate gimple_test_f;
6423
6424   *stmts = NULL_TREE;
6425
6426   if (is_gimple_val (expr))
6427     return expr;
6428
6429   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
6430
6431   push_gimplify_context ();
6432   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
6433
6434   if (var)
6435     expr = build_gimple_modify_stmt (var, expr);
6436
6437   if (TREE_CODE (expr) != GIMPLE_MODIFY_STMT
6438       && TREE_TYPE (expr) == void_type_node)
6439     {
6440       gimplify_and_add (expr, stmts);
6441       expr = NULL_TREE;
6442     }
6443   else
6444     {
6445       ret = gimplify_expr (&expr, stmts, NULL,
6446                            gimple_test_f, fb_rvalue);
6447       gcc_assert (ret != GS_ERROR);
6448     }
6449
6450   if (gimple_referenced_vars (cfun))
6451     {
6452       for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
6453         add_referenced_var (t);
6454     }
6455
6456   pop_gimplify_context (NULL);
6457
6458   return expr;
6459 }
6460
6461 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
6462    some statements are produced, emits them at BSI.  If BEFORE is true.
6463    the statements are appended before BSI, otherwise they are appended after
6464    it.  M specifies the way BSI moves after insertion (BSI_SAME_STMT or
6465    BSI_CONTINUE_LINKING are the usual values).  */
6466
6467 tree
6468 force_gimple_operand_bsi (block_stmt_iterator *bsi, tree expr,
6469                           bool simple_p, tree var, bool before,
6470                           enum bsi_iterator_update m)
6471 {
6472   tree stmts;
6473
6474   expr = force_gimple_operand (expr, &stmts, simple_p, var);
6475   if (stmts)
6476     {
6477       if (gimple_in_ssa_p (cfun))
6478         {
6479           tree_stmt_iterator tsi;
6480
6481           for (tsi = tsi_start (stmts); !tsi_end_p (tsi); tsi_next (&tsi))
6482             mark_symbols_for_renaming (tsi_stmt (tsi));
6483         }
6484
6485       if (before)
6486         bsi_insert_before (bsi, stmts, m);
6487       else
6488         bsi_insert_after (bsi, stmts, m);
6489     }
6490
6491   return expr;
6492 }
6493
6494 #include "gt-gimplify.h"