OSDN Git Service

PR fortran/30780
[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   if (TREE_TYPE (expr) != type)
1559     {
1560       tree old_type = TREE_TYPE (expr);
1561
1562       /* Set the type of the COMPONENT_REF to the underlying type.  */
1563       TREE_TYPE (expr) = type;
1564
1565       /* And wrap the whole thing inside a NOP_EXPR.  */
1566       expr = build1 (NOP_EXPR, old_type, expr);
1567
1568       *expr_p = expr;
1569     }
1570 }
1571
1572 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1573    to foo, embed that change in the ADDR_EXPR by converting
1574       T array[U];
1575       (T *)&array
1576    ==>
1577       &array[L]
1578    where L is the lower bound.  For simplicity, only do this for constant
1579    lower bound.
1580    The constraint is that the type of &array[L] is trivially convertible
1581    to T *.  */
1582
1583 static void
1584 canonicalize_addr_expr (tree *expr_p)
1585 {
1586   tree expr = *expr_p;
1587   tree addr_expr = TREE_OPERAND (expr, 0);
1588   tree datype, ddatype, pddatype;
1589
1590   /* We simplify only conversions from an ADDR_EXPR to a pointer type.  */
1591   if (!POINTER_TYPE_P (TREE_TYPE (expr))
1592       || TREE_CODE (addr_expr) != ADDR_EXPR)
1593     return;
1594
1595   /* The addr_expr type should be a pointer to an array.  */
1596   datype = TREE_TYPE (TREE_TYPE (addr_expr));
1597   if (TREE_CODE (datype) != ARRAY_TYPE)
1598     return;
1599
1600   /* The pointer to element type shall be trivially convertible to
1601      the expression pointer type.  */
1602   ddatype = TREE_TYPE (datype);
1603   pddatype = build_pointer_type (ddatype);
1604   if (!useless_type_conversion_p (pddatype, ddatype))
1605     return;
1606
1607   /* The lower bound and element sizes must be constant.  */
1608   if (!TYPE_SIZE_UNIT (ddatype)
1609       || TREE_CODE (TYPE_SIZE_UNIT (ddatype)) != INTEGER_CST
1610       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1611       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1612     return;
1613
1614   /* All checks succeeded.  Build a new node to merge the cast.  */
1615   *expr_p = build4 (ARRAY_REF, ddatype, TREE_OPERAND (addr_expr, 0),
1616                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1617                     NULL_TREE, NULL_TREE);
1618   *expr_p = build1 (ADDR_EXPR, pddatype, *expr_p);
1619 }
1620
1621 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR.  Remove it and/or other conversions
1622    underneath as appropriate.  */
1623
1624 static enum gimplify_status
1625 gimplify_conversion (tree *expr_p)
1626 {
1627   tree tem;
1628   gcc_assert (TREE_CODE (*expr_p) == NOP_EXPR
1629               || TREE_CODE (*expr_p) == CONVERT_EXPR);
1630   
1631   /* Then strip away all but the outermost conversion.  */
1632   STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1633
1634   /* And remove the outermost conversion if it's useless.  */
1635   if (tree_ssa_useless_type_conversion (*expr_p))
1636     *expr_p = TREE_OPERAND (*expr_p, 0);
1637
1638   /* Attempt to avoid NOP_EXPR by producing reference to a subtype.
1639      For example this fold (subclass *)&A into &A->subclass avoiding
1640      a need for statement.  */
1641   if (TREE_CODE (*expr_p) == NOP_EXPR
1642       && POINTER_TYPE_P (TREE_TYPE (*expr_p))
1643       && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 0)))
1644       && (tem = maybe_fold_offset_to_reference
1645                   (TREE_OPERAND (*expr_p, 0),
1646                    integer_zero_node, TREE_TYPE (TREE_TYPE (*expr_p)))))
1647     {
1648       tree ptr_type = build_pointer_type (TREE_TYPE (tem));
1649       if (useless_type_conversion_p (TREE_TYPE (*expr_p), ptr_type))
1650         *expr_p = build_fold_addr_expr_with_type (tem, ptr_type);
1651     }
1652
1653   /* If we still have a conversion at the toplevel,
1654      then canonicalize some constructs.  */
1655   if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1656     {
1657       tree sub = TREE_OPERAND (*expr_p, 0);
1658
1659       /* If a NOP conversion is changing the type of a COMPONENT_REF
1660          expression, then canonicalize its type now in order to expose more
1661          redundant conversions.  */
1662       if (TREE_CODE (sub) == COMPONENT_REF)
1663         canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1664
1665       /* If a NOP conversion is changing a pointer to array of foo
1666          to a pointer to foo, embed that change in the ADDR_EXPR.  */
1667       else if (TREE_CODE (sub) == ADDR_EXPR)
1668         canonicalize_addr_expr (expr_p);
1669     }
1670
1671   return GS_OK;
1672 }
1673
1674 /* Gimplify a VAR_DECL or PARM_DECL.  Returns GS_OK if we expanded a 
1675    DECL_VALUE_EXPR, and it's worth re-examining things.  */
1676
1677 static enum gimplify_status
1678 gimplify_var_or_parm_decl (tree *expr_p)
1679 {
1680   tree decl = *expr_p;
1681
1682   /* ??? If this is a local variable, and it has not been seen in any
1683      outer BIND_EXPR, then it's probably the result of a duplicate
1684      declaration, for which we've already issued an error.  It would
1685      be really nice if the front end wouldn't leak these at all.
1686      Currently the only known culprit is C++ destructors, as seen
1687      in g++.old-deja/g++.jason/binding.C.  */
1688   if (TREE_CODE (decl) == VAR_DECL
1689       && !DECL_SEEN_IN_BIND_EXPR_P (decl)
1690       && !TREE_STATIC (decl) && !DECL_EXTERNAL (decl)
1691       && decl_function_context (decl) == current_function_decl)
1692     {
1693       gcc_assert (errorcount || sorrycount);
1694       return GS_ERROR;
1695     }
1696
1697   /* When within an OpenMP context, notice uses of variables.  */
1698   if (gimplify_omp_ctxp && omp_notice_variable (gimplify_omp_ctxp, decl, true))
1699     return GS_ALL_DONE;
1700
1701   /* If the decl is an alias for another expression, substitute it now.  */
1702   if (DECL_HAS_VALUE_EXPR_P (decl))
1703     {
1704       *expr_p = unshare_expr (DECL_VALUE_EXPR (decl));
1705       return GS_OK;
1706     }
1707
1708   return GS_ALL_DONE;
1709 }
1710
1711
1712 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1713    node pointed to by EXPR_P.
1714
1715       compound_lval
1716               : min_lval '[' val ']'
1717               | min_lval '.' ID
1718               | compound_lval '[' val ']'
1719               | compound_lval '.' ID
1720
1721    This is not part of the original SIMPLE definition, which separates
1722    array and member references, but it seems reasonable to handle them
1723    together.  Also, this way we don't run into problems with union
1724    aliasing; gcc requires that for accesses through a union to alias, the
1725    union reference must be explicit, which was not always the case when we
1726    were splitting up array and member refs.
1727
1728    PRE_P points to the list where side effects that must happen before
1729      *EXPR_P should be stored.
1730
1731    POST_P points to the list where side effects that must happen after
1732      *EXPR_P should be stored.  */
1733
1734 static enum gimplify_status
1735 gimplify_compound_lval (tree *expr_p, tree *pre_p,
1736                         tree *post_p, fallback_t fallback)
1737 {
1738   tree *p;
1739   VEC(tree,heap) *stack;
1740   enum gimplify_status ret = GS_OK, tret;
1741   int i;
1742
1743   /* Create a stack of the subexpressions so later we can walk them in
1744      order from inner to outer.  */
1745   stack = VEC_alloc (tree, heap, 10);
1746
1747   /* We can handle anything that get_inner_reference can deal with.  */
1748   for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
1749     {
1750     restart:
1751       /* Fold INDIRECT_REFs now to turn them into ARRAY_REFs.  */
1752       if (TREE_CODE (*p) == INDIRECT_REF)
1753         *p = fold_indirect_ref (*p);
1754
1755       if (handled_component_p (*p))
1756         ;
1757       /* Expand DECL_VALUE_EXPR now.  In some cases that may expose
1758          additional COMPONENT_REFs.  */
1759       else if ((TREE_CODE (*p) == VAR_DECL || TREE_CODE (*p) == PARM_DECL)
1760                && gimplify_var_or_parm_decl (p) == GS_OK)
1761         goto restart;
1762       else
1763         break;
1764                
1765       VEC_safe_push (tree, heap, stack, *p);
1766     }
1767
1768   gcc_assert (VEC_length (tree, stack));
1769
1770   /* Now STACK is a stack of pointers to all the refs we've walked through
1771      and P points to the innermost expression.
1772
1773      Java requires that we elaborated nodes in source order.  That
1774      means we must gimplify the inner expression followed by each of
1775      the indices, in order.  But we can't gimplify the inner
1776      expression until we deal with any variable bounds, sizes, or
1777      positions in order to deal with PLACEHOLDER_EXPRs.
1778
1779      So we do this in three steps.  First we deal with the annotations
1780      for any variables in the components, then we gimplify the base,
1781      then we gimplify any indices, from left to right.  */
1782   for (i = VEC_length (tree, stack) - 1; i >= 0; i--)
1783     {
1784       tree t = VEC_index (tree, stack, i);
1785
1786       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1787         {
1788           /* Gimplify the low bound and element type size and put them into
1789              the ARRAY_REF.  If these values are set, they have already been
1790              gimplified.  */
1791           if (!TREE_OPERAND (t, 2))
1792             {
1793               tree low = unshare_expr (array_ref_low_bound (t));
1794               if (!is_gimple_min_invariant (low))
1795                 {
1796                   TREE_OPERAND (t, 2) = low;
1797                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1798                                         is_gimple_formal_tmp_reg, fb_rvalue);
1799                   ret = MIN (ret, tret);
1800                 }
1801             }
1802
1803           if (!TREE_OPERAND (t, 3))
1804             {
1805               tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
1806               tree elmt_size = unshare_expr (array_ref_element_size (t));
1807               tree factor = size_int (TYPE_ALIGN_UNIT (elmt_type));
1808
1809               /* Divide the element size by the alignment of the element
1810                  type (above).  */
1811               elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
1812
1813               if (!is_gimple_min_invariant (elmt_size))
1814                 {
1815                   TREE_OPERAND (t, 3) = elmt_size;
1816                   tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
1817                                         is_gimple_formal_tmp_reg, fb_rvalue);
1818                   ret = MIN (ret, tret);
1819                 }
1820             }
1821         }
1822       else if (TREE_CODE (t) == COMPONENT_REF)
1823         {
1824           /* Set the field offset into T and gimplify it.  */
1825           if (!TREE_OPERAND (t, 2))
1826             {
1827               tree offset = unshare_expr (component_ref_field_offset (t));
1828               tree field = TREE_OPERAND (t, 1);
1829               tree factor
1830                 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
1831
1832               /* Divide the offset by its alignment.  */
1833               offset = size_binop (EXACT_DIV_EXPR, offset, factor);
1834
1835               if (!is_gimple_min_invariant (offset))
1836                 {
1837                   TREE_OPERAND (t, 2) = offset;
1838                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1839                                         is_gimple_formal_tmp_reg, fb_rvalue);
1840                   ret = MIN (ret, tret);
1841                 }
1842             }
1843         }
1844     }
1845
1846   /* Step 2 is to gimplify the base expression.  Make sure lvalue is set
1847      so as to match the min_lval predicate.  Failure to do so may result
1848      in the creation of large aggregate temporaries.  */
1849   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval,
1850                         fallback | fb_lvalue);
1851   ret = MIN (ret, tret);
1852
1853   /* And finally, the indices and operands to BIT_FIELD_REF.  During this
1854      loop we also remove any useless conversions.  */
1855   for (; VEC_length (tree, stack) > 0; )
1856     {
1857       tree t = VEC_pop (tree, stack);
1858
1859       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1860         {
1861           /* Gimplify the dimension.
1862              Temporary fix for gcc.c-torture/execute/20040313-1.c.
1863              Gimplify non-constant array indices into a temporary
1864              variable.
1865              FIXME - The real fix is to gimplify post-modify
1866              expressions into a minimal gimple lvalue.  However, that
1867              exposes bugs in alias analysis.  The alias analyzer does
1868              not handle &PTR->FIELD very well.  Will fix after the
1869              branch is merged into mainline (dnovillo 2004-05-03).  */
1870           if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1871             {
1872               tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1873                                     is_gimple_formal_tmp_reg, fb_rvalue);
1874               ret = MIN (ret, tret);
1875             }
1876         }
1877       else if (TREE_CODE (t) == BIT_FIELD_REF)
1878         {
1879           tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1880                                 is_gimple_val, fb_rvalue);
1881           ret = MIN (ret, tret);
1882           tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1883                                 is_gimple_val, fb_rvalue);
1884           ret = MIN (ret, tret);
1885         }
1886
1887       STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
1888
1889       /* The innermost expression P may have originally had TREE_SIDE_EFFECTS
1890          set which would have caused all the outer expressions in EXPR_P
1891          leading to P to also have had TREE_SIDE_EFFECTS set.  */
1892       recalculate_side_effects (t);
1893     }
1894
1895   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1896   ret = MIN (ret, tret);
1897
1898   /* If the outermost expression is a COMPONENT_REF, canonicalize its type.  */
1899   if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
1900     {
1901       canonicalize_component_ref (expr_p);
1902       ret = MIN (ret, GS_OK);
1903     }
1904
1905   VEC_free (tree, heap, stack);
1906
1907   return ret;
1908 }
1909
1910 /*  Gimplify the self modifying expression pointed to by EXPR_P
1911     (++, --, +=, -=).
1912
1913     PRE_P points to the list where side effects that must happen before
1914         *EXPR_P should be stored.
1915
1916     POST_P points to the list where side effects that must happen after
1917         *EXPR_P should be stored.
1918
1919     WANT_VALUE is nonzero iff we want to use the value of this expression
1920         in another expression.  */
1921
1922 static enum gimplify_status
1923 gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
1924                         bool want_value)
1925 {
1926   enum tree_code code;
1927   tree lhs, lvalue, rhs, t1, post = NULL, *orig_post_p = post_p;
1928   bool postfix;
1929   enum tree_code arith_code;
1930   enum gimplify_status ret;
1931
1932   code = TREE_CODE (*expr_p);
1933
1934   gcc_assert (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR
1935               || code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR);
1936
1937   /* Prefix or postfix?  */
1938   if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1939     /* Faster to treat as prefix if result is not used.  */
1940     postfix = want_value;
1941   else
1942     postfix = false;
1943
1944   /* For postfix, make sure the inner expression's post side effects
1945      are executed after side effects from this expression.  */
1946   if (postfix)
1947     post_p = &post;
1948
1949   /* Add or subtract?  */
1950   if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
1951     arith_code = PLUS_EXPR;
1952   else
1953     arith_code = MINUS_EXPR;
1954
1955   /* Gimplify the LHS into a GIMPLE lvalue.  */
1956   lvalue = TREE_OPERAND (*expr_p, 0);
1957   ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
1958   if (ret == GS_ERROR)
1959     return ret;
1960
1961   /* Extract the operands to the arithmetic operation.  */
1962   lhs = lvalue;
1963   rhs = TREE_OPERAND (*expr_p, 1);
1964
1965   /* For postfix operator, we evaluate the LHS to an rvalue and then use
1966      that as the result value and in the postqueue operation.  */
1967   if (postfix)
1968     {
1969       ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
1970       if (ret == GS_ERROR)
1971         return ret;
1972     }
1973
1974   /* For POINTERs increment, use POINTER_PLUS_EXPR.  */
1975   if (POINTER_TYPE_P (TREE_TYPE (lhs)))
1976     {
1977       rhs = fold_convert (sizetype, rhs);
1978       if (arith_code == MINUS_EXPR)
1979         rhs = fold_build1 (NEGATE_EXPR, TREE_TYPE (rhs), rhs);
1980       arith_code = POINTER_PLUS_EXPR;
1981     }
1982
1983   t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
1984   t1 = build_gimple_modify_stmt (lvalue, t1);
1985
1986   if (postfix)
1987     {
1988       gimplify_and_add (t1, orig_post_p);
1989       append_to_statement_list (post, orig_post_p);
1990       *expr_p = lhs;
1991       return GS_ALL_DONE;
1992     }
1993   else
1994     {
1995       *expr_p = t1;
1996       return GS_OK;
1997     }
1998 }
1999
2000 /* If *EXPR_P has a variable sized type, wrap it in a WITH_SIZE_EXPR.  */
2001
2002 static void
2003 maybe_with_size_expr (tree *expr_p)
2004 {
2005   tree expr = *expr_p;
2006   tree type = TREE_TYPE (expr);
2007   tree size;
2008
2009   /* If we've already wrapped this or the type is error_mark_node, we can't do
2010      anything.  */
2011   if (TREE_CODE (expr) == WITH_SIZE_EXPR
2012       || type == error_mark_node)
2013     return;
2014
2015   /* If the size isn't known or is a constant, we have nothing to do.  */
2016   size = TYPE_SIZE_UNIT (type);
2017   if (!size || TREE_CODE (size) == INTEGER_CST)
2018     return;
2019
2020   /* Otherwise, make a WITH_SIZE_EXPR.  */
2021   size = unshare_expr (size);
2022   size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
2023   *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
2024 }
2025
2026 /* Subroutine of gimplify_call_expr:  Gimplify a single argument.  */
2027
2028 static enum gimplify_status
2029 gimplify_arg (tree *expr_p, tree *pre_p)
2030 {
2031   bool (*test) (tree);
2032   fallback_t fb;
2033
2034   /* In general, we allow lvalues for function arguments to avoid
2035      extra overhead of copying large aggregates out of even larger
2036      aggregates into temporaries only to copy the temporaries to
2037      the argument list.  Make optimizers happy by pulling out to
2038      temporaries those types that fit in registers.  */
2039   if (is_gimple_reg_type (TREE_TYPE (*expr_p)))
2040     test = is_gimple_val, fb = fb_rvalue;
2041   else
2042     test = is_gimple_lvalue, fb = fb_either;
2043
2044   /* If this is a variable sized type, we must remember the size.  */
2045   maybe_with_size_expr (expr_p);
2046
2047   /* There is a sequence point before a function call.  Side effects in
2048      the argument list must occur before the actual call. So, when
2049      gimplifying arguments, force gimplify_expr to use an internal
2050      post queue which is then appended to the end of PRE_P.  */
2051   return gimplify_expr (expr_p, pre_p, NULL, test, fb);
2052 }
2053
2054 /* Gimplify the CALL_EXPR node pointed to by EXPR_P.  PRE_P points to the
2055    list where side effects that must happen before *EXPR_P should be stored.
2056    WANT_VALUE is true if the result of the call is desired.  */
2057
2058 static enum gimplify_status
2059 gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
2060 {
2061   tree decl, parms, p;
2062   enum gimplify_status ret;
2063   int i, nargs;
2064
2065   gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
2066
2067   /* For reliable diagnostics during inlining, it is necessary that
2068      every call_expr be annotated with file and line.  */
2069   if (! EXPR_HAS_LOCATION (*expr_p))
2070     SET_EXPR_LOCATION (*expr_p, input_location);
2071
2072   /* This may be a call to a builtin function.
2073
2074      Builtin function calls may be transformed into different
2075      (and more efficient) builtin function calls under certain
2076      circumstances.  Unfortunately, gimplification can muck things
2077      up enough that the builtin expanders are not aware that certain
2078      transformations are still valid.
2079
2080      So we attempt transformation/gimplification of the call before
2081      we gimplify the CALL_EXPR.  At this time we do not manage to
2082      transform all calls in the same manner as the expanders do, but
2083      we do transform most of them.  */
2084   decl = get_callee_fndecl (*expr_p);
2085   if (decl && DECL_BUILT_IN (decl))
2086     {
2087       tree new = fold_call_expr (*expr_p, !want_value);
2088
2089       if (new && new != *expr_p)
2090         {
2091           /* There was a transformation of this call which computes the
2092              same value, but in a more efficient way.  Return and try
2093              again.  */
2094           *expr_p = new;
2095           return GS_OK;
2096         }
2097
2098       if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
2099           && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
2100         {
2101           if (call_expr_nargs (*expr_p) < 2)
2102             {
2103               error ("too few arguments to function %<va_start%>");
2104               *expr_p = build_empty_stmt ();
2105               return GS_OK;
2106             }
2107           
2108           if (fold_builtin_next_arg (*expr_p, true))
2109             {
2110               *expr_p = build_empty_stmt ();
2111               return GS_OK;
2112             }
2113           /* Avoid gimplifying the second argument to va_start, which needs
2114              to be the plain PARM_DECL.  */
2115           return gimplify_arg (&CALL_EXPR_ARG (*expr_p, 0), pre_p);
2116         }
2117     }
2118
2119   /* There is a sequence point before the call, so any side effects in
2120      the calling expression must occur before the actual call.  Force
2121      gimplify_expr to use an internal post queue.  */
2122   ret = gimplify_expr (&CALL_EXPR_FN (*expr_p), pre_p, NULL,
2123                        is_gimple_call_addr, fb_rvalue);
2124
2125   nargs = call_expr_nargs (*expr_p);
2126
2127   /* Get argument types for verification.  */
2128   decl = get_callee_fndecl (*expr_p);
2129   parms = NULL_TREE;
2130   if (decl)
2131     parms = TYPE_ARG_TYPES (TREE_TYPE (decl));
2132   else if (POINTER_TYPE_P (TREE_TYPE (CALL_EXPR_FN (*expr_p))))
2133     parms = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (*expr_p))));
2134
2135   /* Verify if the type of the argument matches that of the function
2136      declaration.  If we cannot verify this or there is a mismatch,
2137      mark the call expression so it doesn't get inlined later.  */
2138   if (decl && DECL_ARGUMENTS (decl))
2139     {
2140       for (i = 0, p = DECL_ARGUMENTS (decl); i < nargs;
2141            i++, p = TREE_CHAIN (p))
2142         {
2143           /* We cannot distinguish a varargs function from the case
2144              of excess parameters, still deferring the inlining decision
2145              to the callee is possible.  */
2146           if (!p)
2147             break;
2148           if (p == error_mark_node
2149               || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
2150               || !fold_convertible_p (DECL_ARG_TYPE (p),
2151                                       CALL_EXPR_ARG (*expr_p, i)))
2152             {
2153               CALL_CANNOT_INLINE_P (*expr_p) = 1;
2154               break;
2155             }
2156         }
2157     }
2158   else if (parms)
2159     {
2160       for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
2161         {
2162           /* If this is a varargs function defer inlining decision
2163              to callee.  */
2164           if (!p)
2165             break;
2166           if (TREE_VALUE (p) == error_mark_node
2167               || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
2168               || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
2169               || !fold_convertible_p (TREE_VALUE (p),
2170                                       CALL_EXPR_ARG (*expr_p, i)))
2171             {
2172               CALL_CANNOT_INLINE_P (*expr_p) = 1;
2173               break;
2174             }
2175         }
2176     }
2177   else
2178     {
2179       if (nargs != 0)
2180         CALL_CANNOT_INLINE_P (*expr_p) = 1;
2181       i = 0;
2182       p = NULL_TREE;
2183     }
2184
2185   /* If the last argument is __builtin_va_arg_pack () and it is not
2186      passed as a named argument, decrease the number of CALL_EXPR
2187      arguments and set instead the CALL_EXPR_VA_ARG_PACK flag.  */
2188   if (!p
2189       && i < nargs
2190       && TREE_CODE (CALL_EXPR_ARG (*expr_p, nargs - 1)) == CALL_EXPR)
2191     {
2192       tree last_arg = CALL_EXPR_ARG (*expr_p, nargs - 1);
2193       tree last_arg_fndecl = get_callee_fndecl (last_arg);
2194
2195       if (last_arg_fndecl
2196           && TREE_CODE (last_arg_fndecl) == FUNCTION_DECL
2197           && DECL_BUILT_IN_CLASS (last_arg_fndecl) == BUILT_IN_NORMAL
2198           && DECL_FUNCTION_CODE (last_arg_fndecl) == BUILT_IN_VA_ARG_PACK)
2199         {
2200           tree call = *expr_p;
2201
2202           --nargs;
2203           *expr_p = build_call_array (TREE_TYPE (call), CALL_EXPR_FN (call),
2204                                       nargs, CALL_EXPR_ARGP (call));
2205           /* Copy all CALL_EXPR flags, locus and block, except
2206              CALL_EXPR_VA_ARG_PACK flag.  */
2207           CALL_EXPR_STATIC_CHAIN (*expr_p) = CALL_EXPR_STATIC_CHAIN (call);
2208           CALL_EXPR_TAILCALL (*expr_p) = CALL_EXPR_TAILCALL (call);
2209           CALL_EXPR_RETURN_SLOT_OPT (*expr_p)
2210             = CALL_EXPR_RETURN_SLOT_OPT (call);
2211           CALL_FROM_THUNK_P (*expr_p) = CALL_FROM_THUNK_P (call);
2212           CALL_CANNOT_INLINE_P (*expr_p)
2213             = CALL_CANNOT_INLINE_P (call);
2214           TREE_NOTHROW (*expr_p) = TREE_NOTHROW (call);
2215           SET_EXPR_LOCUS (*expr_p, EXPR_LOCUS (call));
2216           TREE_BLOCK (*expr_p) = TREE_BLOCK (call);
2217           /* Set CALL_EXPR_VA_ARG_PACK.  */
2218           CALL_EXPR_VA_ARG_PACK (*expr_p) = 1;
2219         }
2220     }
2221
2222   /* Finally, gimplify the function arguments.  */
2223   for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
2224        PUSH_ARGS_REVERSED ? i >= 0 : i < nargs;
2225        PUSH_ARGS_REVERSED ? i-- : i++)
2226     {
2227       enum gimplify_status t;
2228
2229       t = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p);
2230
2231       if (t == GS_ERROR)
2232         ret = GS_ERROR;
2233     }
2234
2235   /* Try this again in case gimplification exposed something.  */
2236   if (ret != GS_ERROR)
2237     {
2238       tree new = fold_call_expr (*expr_p, !want_value);
2239
2240       if (new && new != *expr_p)
2241         {
2242           /* There was a transformation of this call which computes the
2243              same value, but in a more efficient way.  Return and try
2244              again.  */
2245           *expr_p = new;
2246           return GS_OK;
2247         }
2248     }
2249
2250   /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
2251      decl.  This allows us to eliminate redundant or useless
2252      calls to "const" functions.  */
2253   if (TREE_CODE (*expr_p) == CALL_EXPR
2254       && (call_expr_flags (*expr_p) & (ECF_CONST | ECF_PURE)))
2255     TREE_SIDE_EFFECTS (*expr_p) = 0;
2256
2257   return ret;
2258 }
2259
2260 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
2261    rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
2262
2263    TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
2264    condition is true or false, respectively.  If null, we should generate
2265    our own to skip over the evaluation of this specific expression.
2266
2267    This function is the tree equivalent of do_jump.
2268
2269    shortcut_cond_r should only be called by shortcut_cond_expr.  */
2270
2271 static tree
2272 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p)
2273 {
2274   tree local_label = NULL_TREE;
2275   tree t, expr = NULL;
2276
2277   /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
2278      retain the shortcut semantics.  Just insert the gotos here;
2279      shortcut_cond_expr will append the real blocks later.  */
2280   if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2281     {
2282       /* Turn if (a && b) into
2283
2284          if (a); else goto no;
2285          if (b) goto yes; else goto no;
2286          (no:) */
2287
2288       if (false_label_p == NULL)
2289         false_label_p = &local_label;
2290
2291       t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p);
2292       append_to_statement_list (t, &expr);
2293
2294       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2295                            false_label_p);
2296       append_to_statement_list (t, &expr);
2297     }
2298   else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2299     {
2300       /* Turn if (a || b) into
2301
2302          if (a) goto yes;
2303          if (b) goto yes; else goto no;
2304          (yes:) */
2305
2306       if (true_label_p == NULL)
2307         true_label_p = &local_label;
2308
2309       t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL);
2310       append_to_statement_list (t, &expr);
2311
2312       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2313                            false_label_p);
2314       append_to_statement_list (t, &expr);
2315     }
2316   else if (TREE_CODE (pred) == COND_EXPR)
2317     {
2318       /* As long as we're messing with gotos, turn if (a ? b : c) into
2319          if (a)
2320            if (b) goto yes; else goto no;
2321          else
2322            if (c) goto yes; else goto no;  */
2323       expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
2324                      shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2325                                       false_label_p),
2326                      shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
2327                                       false_label_p));
2328     }
2329   else
2330     {
2331       expr = build3 (COND_EXPR, void_type_node, pred,
2332                      build_and_jump (true_label_p),
2333                      build_and_jump (false_label_p));
2334     }
2335
2336   if (local_label)
2337     {
2338       t = build1 (LABEL_EXPR, void_type_node, local_label);
2339       append_to_statement_list (t, &expr);
2340     }
2341
2342   return expr;
2343 }
2344
2345 static tree
2346 shortcut_cond_expr (tree expr)
2347 {
2348   tree pred = TREE_OPERAND (expr, 0);
2349   tree then_ = TREE_OPERAND (expr, 1);
2350   tree else_ = TREE_OPERAND (expr, 2);
2351   tree true_label, false_label, end_label, t;
2352   tree *true_label_p;
2353   tree *false_label_p;
2354   bool emit_end, emit_false, jump_over_else;
2355   bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2356   bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2357
2358   /* First do simple transformations.  */
2359   if (!else_se)
2360     {
2361       /* If there is no 'else', turn (a && b) into if (a) if (b).  */
2362       while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2363         {
2364           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2365           then_ = shortcut_cond_expr (expr);
2366           then_se = then_ && TREE_SIDE_EFFECTS (then_);
2367           pred = TREE_OPERAND (pred, 0);
2368           expr = build3 (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2369         }
2370     }
2371   if (!then_se)
2372     {
2373       /* If there is no 'then', turn
2374            if (a || b); else d
2375          into
2376            if (a); else if (b); else d.  */
2377       while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2378         {
2379           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2380           else_ = shortcut_cond_expr (expr);
2381           else_se = else_ && TREE_SIDE_EFFECTS (else_);
2382           pred = TREE_OPERAND (pred, 0);
2383           expr = build3 (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2384         }
2385     }
2386
2387   /* If we're done, great.  */
2388   if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2389       && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2390     return expr;
2391
2392   /* Otherwise we need to mess with gotos.  Change
2393        if (a) c; else d;
2394      to
2395        if (a); else goto no;
2396        c; goto end;
2397        no: d; end:
2398      and recursively gimplify the condition.  */
2399
2400   true_label = false_label = end_label = NULL_TREE;
2401
2402   /* If our arms just jump somewhere, hijack those labels so we don't
2403      generate jumps to jumps.  */
2404
2405   if (then_
2406       && TREE_CODE (then_) == GOTO_EXPR
2407       && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2408     {
2409       true_label = GOTO_DESTINATION (then_);
2410       then_ = NULL;
2411       then_se = false;
2412     }
2413
2414   if (else_
2415       && TREE_CODE (else_) == GOTO_EXPR
2416       && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2417     {
2418       false_label = GOTO_DESTINATION (else_);
2419       else_ = NULL;
2420       else_se = false;
2421     }
2422
2423   /* If we aren't hijacking a label for the 'then' branch, it falls through.  */
2424   if (true_label)
2425     true_label_p = &true_label;
2426   else
2427     true_label_p = NULL;
2428
2429   /* The 'else' branch also needs a label if it contains interesting code.  */
2430   if (false_label || else_se)
2431     false_label_p = &false_label;
2432   else
2433     false_label_p = NULL;
2434
2435   /* If there was nothing else in our arms, just forward the label(s).  */
2436   if (!then_se && !else_se)
2437     return shortcut_cond_r (pred, true_label_p, false_label_p);
2438
2439   /* If our last subexpression already has a terminal label, reuse it.  */
2440   if (else_se)
2441     expr = expr_last (else_);
2442   else if (then_se)
2443     expr = expr_last (then_);
2444   else
2445     expr = NULL;
2446   if (expr && TREE_CODE (expr) == LABEL_EXPR)
2447     end_label = LABEL_EXPR_LABEL (expr);
2448
2449   /* If we don't care about jumping to the 'else' branch, jump to the end
2450      if the condition is false.  */
2451   if (!false_label_p)
2452     false_label_p = &end_label;
2453
2454   /* We only want to emit these labels if we aren't hijacking them.  */
2455   emit_end = (end_label == NULL_TREE);
2456   emit_false = (false_label == NULL_TREE);
2457
2458   /* We only emit the jump over the else clause if we have to--if the
2459      then clause may fall through.  Otherwise we can wind up with a
2460      useless jump and a useless label at the end of gimplified code,
2461      which will cause us to think that this conditional as a whole
2462      falls through even if it doesn't.  If we then inline a function
2463      which ends with such a condition, that can cause us to issue an
2464      inappropriate warning about control reaching the end of a
2465      non-void function.  */
2466   jump_over_else = block_may_fallthru (then_);
2467
2468   pred = shortcut_cond_r (pred, true_label_p, false_label_p);
2469
2470   expr = NULL;
2471   append_to_statement_list (pred, &expr);
2472
2473   append_to_statement_list (then_, &expr);
2474   if (else_se)
2475     {
2476       if (jump_over_else)
2477         {
2478           t = build_and_jump (&end_label);
2479           append_to_statement_list (t, &expr);
2480         }
2481       if (emit_false)
2482         {
2483           t = build1 (LABEL_EXPR, void_type_node, false_label);
2484           append_to_statement_list (t, &expr);
2485         }
2486       append_to_statement_list (else_, &expr);
2487     }
2488   if (emit_end && end_label)
2489     {
2490       t = build1 (LABEL_EXPR, void_type_node, end_label);
2491       append_to_statement_list (t, &expr);
2492     }
2493
2494   return expr;
2495 }
2496
2497 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE.  */
2498
2499 tree
2500 gimple_boolify (tree expr)
2501 {
2502   tree type = TREE_TYPE (expr);
2503
2504   if (TREE_CODE (type) == BOOLEAN_TYPE)
2505     return expr;
2506
2507   switch (TREE_CODE (expr))
2508     {
2509     case TRUTH_AND_EXPR:
2510     case TRUTH_OR_EXPR:
2511     case TRUTH_XOR_EXPR:
2512     case TRUTH_ANDIF_EXPR:
2513     case TRUTH_ORIF_EXPR:
2514       /* Also boolify the arguments of truth exprs.  */
2515       TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2516       /* FALLTHRU */
2517
2518     case TRUTH_NOT_EXPR:
2519       TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2520       /* FALLTHRU */
2521
2522     case EQ_EXPR: case NE_EXPR:
2523     case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2524       /* These expressions always produce boolean results.  */
2525       TREE_TYPE (expr) = boolean_type_node;
2526       return expr;
2527
2528     default:
2529       /* Other expressions that get here must have boolean values, but
2530          might need to be converted to the appropriate mode.  */
2531       return fold_convert (boolean_type_node, expr);
2532     }
2533 }
2534
2535 /*  Convert the conditional expression pointed to by EXPR_P '(p) ? a : b;'
2536     into
2537
2538     if (p)                      if (p)
2539       t1 = a;                     a;
2540     else                or      else
2541       t1 = b;                     b;
2542     t1;
2543
2544     The second form is used when *EXPR_P is of type void.
2545
2546     TARGET is the tree for T1 above.
2547
2548     PRE_P points to the list where side effects that must happen before
2549       *EXPR_P should be stored.  */
2550
2551 static enum gimplify_status
2552 gimplify_cond_expr (tree *expr_p, tree *pre_p, fallback_t fallback)
2553 {
2554   tree expr = *expr_p;
2555   tree tmp, tmp2, type;
2556   enum gimplify_status ret;
2557
2558   type = TREE_TYPE (expr);
2559
2560   /* If this COND_EXPR has a value, copy the values into a temporary within
2561      the arms.  */
2562   if (! VOID_TYPE_P (type))
2563     {
2564       tree result;
2565
2566       if ((fallback & fb_lvalue) == 0)
2567         {
2568           result = tmp2 = tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2569           ret = GS_ALL_DONE;
2570         }
2571       else
2572         {
2573           tree type = build_pointer_type (TREE_TYPE (expr));
2574
2575           if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2576             TREE_OPERAND (expr, 1) =
2577               build_fold_addr_expr (TREE_OPERAND (expr, 1));
2578
2579           if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2580             TREE_OPERAND (expr, 2) =
2581               build_fold_addr_expr (TREE_OPERAND (expr, 2));
2582           
2583           tmp2 = tmp = create_tmp_var (type, "iftmp");
2584
2585           expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (expr, 0),
2586                          TREE_OPERAND (expr, 1), TREE_OPERAND (expr, 2));
2587
2588           result = build_fold_indirect_ref (tmp);
2589           ret = GS_ALL_DONE;
2590         }
2591
2592       /* Build the then clause, 't1 = a;'.  But don't build an assignment
2593          if this branch is void; in C++ it can be, if it's a throw.  */
2594       if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2595         TREE_OPERAND (expr, 1)
2596           = build_gimple_modify_stmt (tmp, TREE_OPERAND (expr, 1));
2597
2598       /* Build the else clause, 't1 = b;'.  */
2599       if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2600         TREE_OPERAND (expr, 2)
2601           = build_gimple_modify_stmt (tmp2, TREE_OPERAND (expr, 2));
2602
2603       TREE_TYPE (expr) = void_type_node;
2604       recalculate_side_effects (expr);
2605
2606       /* Move the COND_EXPR to the prequeue.  */
2607       gimplify_and_add (expr, pre_p);
2608
2609       *expr_p = result;
2610       return ret;
2611     }
2612
2613   /* Make sure the condition has BOOLEAN_TYPE.  */
2614   TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2615
2616   /* Break apart && and || conditions.  */
2617   if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2618       || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2619     {
2620       expr = shortcut_cond_expr (expr);
2621
2622       if (expr != *expr_p)
2623         {
2624           *expr_p = expr;
2625
2626           /* We can't rely on gimplify_expr to re-gimplify the expanded
2627              form properly, as cleanups might cause the target labels to be
2628              wrapped in a TRY_FINALLY_EXPR.  To prevent that, we need to
2629              set up a conditional context.  */
2630           gimple_push_condition ();
2631           gimplify_stmt (expr_p);
2632           gimple_pop_condition (pre_p);
2633
2634           return GS_ALL_DONE;
2635         }
2636     }
2637
2638   /* Now do the normal gimplification.  */
2639   ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2640                        is_gimple_condexpr, fb_rvalue);
2641
2642   gimple_push_condition ();
2643
2644   gimplify_to_stmt_list (&TREE_OPERAND (expr, 1));
2645   gimplify_to_stmt_list (&TREE_OPERAND (expr, 2));
2646   recalculate_side_effects (expr);
2647
2648   gimple_pop_condition (pre_p);
2649
2650   if (ret == GS_ERROR)
2651     ;
2652   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2653     ret = GS_ALL_DONE;
2654   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 2)))
2655     /* Rewrite "if (a); else b" to "if (!a) b"  */
2656     {
2657       TREE_OPERAND (expr, 0) = invert_truthvalue (TREE_OPERAND (expr, 0));
2658       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2659                            is_gimple_condexpr, fb_rvalue);
2660
2661       tmp = TREE_OPERAND (expr, 1);
2662       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 2);
2663       TREE_OPERAND (expr, 2) = tmp;
2664     }
2665   else
2666     /* Both arms are empty; replace the COND_EXPR with its predicate.  */
2667     expr = TREE_OPERAND (expr, 0);
2668
2669   *expr_p = expr;
2670   return ret;
2671 }
2672
2673 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2674    a call to __builtin_memcpy.  */
2675
2676 static enum gimplify_status
2677 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value)
2678 {
2679   tree t, to, to_ptr, from, from_ptr;
2680
2681   to = GENERIC_TREE_OPERAND (*expr_p, 0);
2682   from = GENERIC_TREE_OPERAND (*expr_p, 1);
2683
2684   from_ptr = build_fold_addr_expr (from);
2685
2686   to_ptr = build_fold_addr_expr (to);
2687   t = implicit_built_in_decls[BUILT_IN_MEMCPY];
2688   t = build_call_expr (t, 3, to_ptr, from_ptr, size);
2689
2690   if (want_value)
2691     {
2692       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2693       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2694     }
2695
2696   *expr_p = t;
2697   return GS_OK;
2698 }
2699
2700 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2701    a call to __builtin_memset.  In this case we know that the RHS is
2702    a CONSTRUCTOR with an empty element list.  */
2703
2704 static enum gimplify_status
2705 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value)
2706 {
2707   tree t, to, to_ptr;
2708
2709   to = GENERIC_TREE_OPERAND (*expr_p, 0);
2710
2711   to_ptr = build_fold_addr_expr (to);
2712   t = implicit_built_in_decls[BUILT_IN_MEMSET];
2713   t = build_call_expr (t, 3, to_ptr, integer_zero_node, size);
2714
2715   if (want_value)
2716     {
2717       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2718       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2719     }
2720
2721   *expr_p = t;
2722   return GS_OK;
2723 }
2724
2725 /* A subroutine of gimplify_init_ctor_preeval.  Called via walk_tree,
2726    determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
2727    assignment.  Returns non-null if we detect a potential overlap.  */
2728
2729 struct gimplify_init_ctor_preeval_data
2730 {
2731   /* The base decl of the lhs object.  May be NULL, in which case we
2732      have to assume the lhs is indirect.  */
2733   tree lhs_base_decl;
2734
2735   /* The alias set of the lhs object.  */
2736   alias_set_type lhs_alias_set;
2737 };
2738
2739 static tree
2740 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
2741 {
2742   struct gimplify_init_ctor_preeval_data *data
2743     = (struct gimplify_init_ctor_preeval_data *) xdata;
2744   tree t = *tp;
2745
2746   /* If we find the base object, obviously we have overlap.  */
2747   if (data->lhs_base_decl == t)
2748     return t;
2749
2750   /* If the constructor component is indirect, determine if we have a
2751      potential overlap with the lhs.  The only bits of information we
2752      have to go on at this point are addressability and alias sets.  */
2753   if (TREE_CODE (t) == INDIRECT_REF
2754       && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2755       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
2756     return t;
2757
2758   /* If the constructor component is a call, determine if it can hide a
2759      potential overlap with the lhs through an INDIRECT_REF like above.  */
2760   if (TREE_CODE (t) == CALL_EXPR)
2761     {
2762       tree type, fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (t)));
2763
2764       for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
2765         if (POINTER_TYPE_P (TREE_VALUE (type))
2766             && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2767             && alias_sets_conflict_p (data->lhs_alias_set,
2768                                       get_alias_set
2769                                         (TREE_TYPE (TREE_VALUE (type)))))
2770           return t;
2771     }
2772
2773   if (IS_TYPE_OR_DECL_P (t))
2774     *walk_subtrees = 0;
2775   return NULL;
2776 }
2777
2778 /* A subroutine of gimplify_init_constructor.  Pre-evaluate *EXPR_P,
2779    force values that overlap with the lhs (as described by *DATA)
2780    into temporaries.  */
2781
2782 static void
2783 gimplify_init_ctor_preeval (tree *expr_p, tree *pre_p, tree *post_p,
2784                             struct gimplify_init_ctor_preeval_data *data)
2785 {
2786   enum gimplify_status one;
2787
2788   /* If the value is invariant, then there's nothing to pre-evaluate.
2789      But ensure it doesn't have any side-effects since a SAVE_EXPR is
2790      invariant but has side effects and might contain a reference to
2791      the object we're initializing.  */
2792   if (TREE_INVARIANT (*expr_p) && !TREE_SIDE_EFFECTS (*expr_p))
2793     return;
2794
2795   /* If the type has non-trivial constructors, we can't pre-evaluate.  */
2796   if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
2797     return;
2798
2799   /* Recurse for nested constructors.  */
2800   if (TREE_CODE (*expr_p) == CONSTRUCTOR)
2801     {
2802       unsigned HOST_WIDE_INT ix;
2803       constructor_elt *ce;
2804       VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
2805
2806       for (ix = 0; VEC_iterate (constructor_elt, v, ix, ce); ix++)
2807         gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
2808       return;
2809     }
2810
2811   /* If this is a variable sized type, we must remember the size.  */
2812   maybe_with_size_expr (expr_p);
2813
2814   /* Gimplify the constructor element to something appropriate for the rhs
2815      of a MODIFY_EXPR.  Given that we know the lhs is an aggregate, we know
2816      the gimplifier will consider this a store to memory.  Doing this
2817      gimplification now means that we won't have to deal with complicated
2818      language-specific trees, nor trees like SAVE_EXPR that can induce
2819      exponential search behavior.  */
2820   one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
2821   if (one == GS_ERROR)
2822     {
2823       *expr_p = NULL;
2824       return;
2825     }
2826
2827   /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
2828      with the lhs, since "a = { .x=a }" doesn't make sense.  This will
2829      always be true for all scalars, since is_gimple_mem_rhs insists on a
2830      temporary variable for them.  */
2831   if (DECL_P (*expr_p))
2832     return;
2833
2834   /* If this is of variable size, we have no choice but to assume it doesn't
2835      overlap since we can't make a temporary for it.  */
2836   if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
2837     return;
2838
2839   /* Otherwise, we must search for overlap ...  */
2840   if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
2841     return;
2842
2843   /* ... and if found, force the value into a temporary.  */
2844   *expr_p = get_formal_tmp_var (*expr_p, pre_p);
2845 }
2846
2847 /* A subroutine of gimplify_init_ctor_eval.  Create a loop for
2848    a RANGE_EXPR in a CONSTRUCTOR for an array.
2849
2850       var = lower;
2851     loop_entry:
2852       object[var] = value;
2853       if (var == upper)
2854         goto loop_exit;
2855       var = var + 1;
2856       goto loop_entry;
2857     loop_exit:
2858
2859    We increment var _after_ the loop exit check because we might otherwise
2860    fail if upper == TYPE_MAX_VALUE (type for upper).
2861
2862    Note that we never have to deal with SAVE_EXPRs here, because this has
2863    already been taken care of for us, in gimplify_init_ctor_preeval().  */
2864
2865 static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
2866                                      tree *, bool);
2867
2868 static void
2869 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
2870                                tree value, tree array_elt_type,
2871                                tree *pre_p, bool cleared)
2872 {
2873   tree loop_entry_label, loop_exit_label;
2874   tree var, var_type, cref, tmp;
2875
2876   loop_entry_label = create_artificial_label ();
2877   loop_exit_label = create_artificial_label ();
2878
2879   /* Create and initialize the index variable.  */
2880   var_type = TREE_TYPE (upper);
2881   var = create_tmp_var (var_type, NULL);
2882   append_to_statement_list (build_gimple_modify_stmt (var, lower), pre_p);
2883
2884   /* Add the loop entry label.  */
2885   append_to_statement_list (build1 (LABEL_EXPR,
2886                                     void_type_node,
2887                                     loop_entry_label),
2888                             pre_p);
2889
2890   /* Build the reference.  */
2891   cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
2892                  var, NULL_TREE, NULL_TREE);
2893
2894   /* If we are a constructor, just call gimplify_init_ctor_eval to do
2895      the store.  Otherwise just assign value to the reference.  */
2896
2897   if (TREE_CODE (value) == CONSTRUCTOR)
2898     /* NB we might have to call ourself recursively through
2899        gimplify_init_ctor_eval if the value is a constructor.  */
2900     gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2901                              pre_p, cleared);
2902   else
2903     append_to_statement_list (build_gimple_modify_stmt (cref, value), pre_p);
2904
2905   /* We exit the loop when the index var is equal to the upper bound.  */
2906   gimplify_and_add (build3 (COND_EXPR, void_type_node,
2907                             build2 (EQ_EXPR, boolean_type_node,
2908                                     var, upper),
2909                             build1 (GOTO_EXPR,
2910                                     void_type_node,
2911                                     loop_exit_label),
2912                             NULL_TREE),
2913                     pre_p);
2914
2915   /* Otherwise, increment the index var...  */
2916   tmp = build2 (PLUS_EXPR, var_type, var,
2917                 fold_convert (var_type, integer_one_node));
2918   append_to_statement_list (build_gimple_modify_stmt (var, tmp), pre_p);
2919
2920   /* ...and jump back to the loop entry.  */
2921   append_to_statement_list (build1 (GOTO_EXPR,
2922                                     void_type_node,
2923                                     loop_entry_label),
2924                             pre_p);
2925
2926   /* Add the loop exit label.  */
2927   append_to_statement_list (build1 (LABEL_EXPR,
2928                                     void_type_node,
2929                                     loop_exit_label),
2930                             pre_p);
2931 }
2932
2933 /* Return true if FDECL is accessing a field that is zero sized.  */
2934    
2935 static bool
2936 zero_sized_field_decl (const_tree fdecl)
2937 {
2938   if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl) 
2939       && integer_zerop (DECL_SIZE (fdecl)))
2940     return true;
2941   return false;
2942 }
2943
2944 /* Return true if TYPE is zero sized.  */
2945    
2946 static bool
2947 zero_sized_type (const_tree type)
2948 {
2949   if (AGGREGATE_TYPE_P (type) && TYPE_SIZE (type)
2950       && integer_zerop (TYPE_SIZE (type)))
2951     return true;
2952   return false;
2953 }
2954
2955 /* A subroutine of gimplify_init_constructor.  Generate individual
2956    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
2957    assignments should happen.  ELTS is the CONSTRUCTOR_ELTS of the
2958    CONSTRUCTOR.  CLEARED is true if the entire LHS object has been
2959    zeroed first.  */
2960
2961 static void
2962 gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
2963                          tree *pre_p, bool cleared)
2964 {
2965   tree array_elt_type = NULL;
2966   unsigned HOST_WIDE_INT ix;
2967   tree purpose, value;
2968
2969   if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
2970     array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
2971
2972   FOR_EACH_CONSTRUCTOR_ELT (elts, ix, purpose, value)
2973     {
2974       tree cref, init;
2975
2976       /* NULL values are created above for gimplification errors.  */
2977       if (value == NULL)
2978         continue;
2979
2980       if (cleared && initializer_zerop (value))
2981         continue;
2982
2983       /* ??? Here's to hoping the front end fills in all of the indices,
2984          so we don't have to figure out what's missing ourselves.  */
2985       gcc_assert (purpose);
2986
2987       /* Skip zero-sized fields, unless value has side-effects.  This can
2988          happen with calls to functions returning a zero-sized type, which
2989          we shouldn't discard.  As a number of downstream passes don't
2990          expect sets of zero-sized fields, we rely on the gimplification of
2991          the MODIFY_EXPR we make below to drop the assignment statement.  */
2992       if (! TREE_SIDE_EFFECTS (value) && zero_sized_field_decl (purpose))
2993         continue;
2994
2995       /* If we have a RANGE_EXPR, we have to build a loop to assign the
2996          whole range.  */
2997       if (TREE_CODE (purpose) == RANGE_EXPR)
2998         {
2999           tree lower = TREE_OPERAND (purpose, 0);
3000           tree upper = TREE_OPERAND (purpose, 1);
3001
3002           /* If the lower bound is equal to upper, just treat it as if
3003              upper was the index.  */
3004           if (simple_cst_equal (lower, upper))
3005             purpose = upper;
3006           else
3007             {
3008               gimplify_init_ctor_eval_range (object, lower, upper, value,
3009                                              array_elt_type, pre_p, cleared);
3010               continue;
3011             }
3012         }
3013
3014       if (array_elt_type)
3015         {
3016           cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3017                          purpose, NULL_TREE, NULL_TREE);
3018         }
3019       else
3020         {
3021           gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
3022           cref = build3 (COMPONENT_REF, TREE_TYPE (purpose),
3023                          unshare_expr (object), purpose, NULL_TREE);
3024         }
3025
3026       if (TREE_CODE (value) == CONSTRUCTOR
3027           && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
3028         gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3029                                  pre_p, cleared);
3030       else
3031         {
3032           init = build2 (INIT_EXPR, TREE_TYPE (cref), cref, value);
3033           gimplify_and_add (init, pre_p);
3034         }
3035     }
3036 }
3037
3038 /* A subroutine of gimplify_modify_expr.  Break out elements of a
3039    CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
3040
3041    Note that we still need to clear any elements that don't have explicit
3042    initializers, so if not all elements are initialized we keep the
3043    original MODIFY_EXPR, we just remove all of the constructor elements.  */
3044
3045 static enum gimplify_status
3046 gimplify_init_constructor (tree *expr_p, tree *pre_p,
3047                            tree *post_p, bool want_value)
3048 {
3049   tree object;
3050   tree ctor = GENERIC_TREE_OPERAND (*expr_p, 1);
3051   tree type = TREE_TYPE (ctor);
3052   enum gimplify_status ret;
3053   VEC(constructor_elt,gc) *elts;
3054
3055   if (TREE_CODE (ctor) != CONSTRUCTOR)
3056     return GS_UNHANDLED;
3057
3058   ret = gimplify_expr (&GENERIC_TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3059                        is_gimple_lvalue, fb_lvalue);
3060   if (ret == GS_ERROR)
3061     return ret;
3062   object = GENERIC_TREE_OPERAND (*expr_p, 0);
3063
3064   elts = CONSTRUCTOR_ELTS (ctor);
3065
3066   ret = GS_ALL_DONE;
3067   switch (TREE_CODE (type))
3068     {
3069     case RECORD_TYPE:
3070     case UNION_TYPE:
3071     case QUAL_UNION_TYPE:
3072     case ARRAY_TYPE:
3073       {
3074         struct gimplify_init_ctor_preeval_data preeval_data;
3075         HOST_WIDE_INT num_type_elements, num_ctor_elements;
3076         HOST_WIDE_INT num_nonzero_elements;
3077         bool cleared, valid_const_initializer;
3078
3079         /* Aggregate types must lower constructors to initialization of
3080            individual elements.  The exception is that a CONSTRUCTOR node
3081            with no elements indicates zero-initialization of the whole.  */
3082         if (VEC_empty (constructor_elt, elts))
3083           break;
3084
3085         /* Fetch information about the constructor to direct later processing.
3086            We might want to make static versions of it in various cases, and
3087            can only do so if it known to be a valid constant initializer.  */
3088         valid_const_initializer
3089           = categorize_ctor_elements (ctor, &num_nonzero_elements,
3090                                       &num_ctor_elements, &cleared);
3091
3092         /* If a const aggregate variable is being initialized, then it
3093            should never be a lose to promote the variable to be static.  */
3094         if (valid_const_initializer
3095             && num_nonzero_elements > 1
3096             && TREE_READONLY (object)
3097             && TREE_CODE (object) == VAR_DECL)
3098           {
3099             DECL_INITIAL (object) = ctor;
3100             TREE_STATIC (object) = 1;
3101             if (!DECL_NAME (object))
3102               DECL_NAME (object) = create_tmp_var_name ("C");
3103             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
3104
3105             /* ??? C++ doesn't automatically append a .<number> to the
3106                assembler name, and even when it does, it looks a FE private
3107                data structures to figure out what that number should be,
3108                which are not set for this variable.  I suppose this is
3109                important for local statics for inline functions, which aren't
3110                "local" in the object file sense.  So in order to get a unique
3111                TU-local symbol, we must invoke the lhd version now.  */
3112             lhd_set_decl_assembler_name (object);
3113
3114             *expr_p = NULL_TREE;
3115             break;
3116           }
3117
3118         /* If there are "lots" of initialized elements, even discounting
3119            those that are not address constants (and thus *must* be
3120            computed at runtime), then partition the constructor into
3121            constant and non-constant parts.  Block copy the constant
3122            parts in, then generate code for the non-constant parts.  */
3123         /* TODO.  There's code in cp/typeck.c to do this.  */
3124
3125         num_type_elements = count_type_elements (type, true);
3126
3127         /* If count_type_elements could not determine number of type elements
3128            for a constant-sized object, assume clearing is needed.
3129            Don't do this for variable-sized objects, as store_constructor
3130            will ignore the clearing of variable-sized objects.  */
3131         if (num_type_elements < 0 && int_size_in_bytes (type) >= 0)
3132           cleared = true;
3133         /* If there are "lots" of zeros, then block clear the object first.  */
3134         else if (num_type_elements - num_nonzero_elements > CLEAR_RATIO
3135                  && num_nonzero_elements < num_type_elements/4)
3136           cleared = true;
3137         /* ??? This bit ought not be needed.  For any element not present
3138            in the initializer, we should simply set them to zero.  Except
3139            we'd need to *find* the elements that are not present, and that
3140            requires trickery to avoid quadratic compile-time behavior in
3141            large cases or excessive memory use in small cases.  */
3142         else if (num_ctor_elements < num_type_elements)
3143           cleared = true;
3144
3145         /* If there are "lots" of initialized elements, and all of them
3146            are valid address constants, then the entire initializer can
3147            be dropped to memory, and then memcpy'd out.  Don't do this
3148            for sparse arrays, though, as it's more efficient to follow
3149            the standard CONSTRUCTOR behavior of memset followed by
3150            individual element initialization.  */
3151         if (valid_const_initializer && !cleared)
3152           {
3153             HOST_WIDE_INT size = int_size_in_bytes (type);
3154             unsigned int align;
3155
3156             /* ??? We can still get unbounded array types, at least
3157                from the C++ front end.  This seems wrong, but attempt
3158                to work around it for now.  */
3159             if (size < 0)
3160               {
3161                 size = int_size_in_bytes (TREE_TYPE (object));
3162                 if (size >= 0)
3163                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
3164               }
3165
3166             /* Find the maximum alignment we can assume for the object.  */
3167             /* ??? Make use of DECL_OFFSET_ALIGN.  */
3168             if (DECL_P (object))
3169               align = DECL_ALIGN (object);
3170             else
3171               align = TYPE_ALIGN (type);
3172
3173             if (size > 0 && !can_move_by_pieces (size, align))
3174               {
3175                 tree new = create_tmp_var_raw (type, "C");
3176
3177                 gimple_add_tmp_var (new);
3178                 TREE_STATIC (new) = 1;
3179                 TREE_READONLY (new) = 1;
3180                 DECL_INITIAL (new) = ctor;
3181                 if (align > DECL_ALIGN (new))
3182                   {
3183                     DECL_ALIGN (new) = align;
3184                     DECL_USER_ALIGN (new) = 1;
3185                   }
3186                 walk_tree (&DECL_INITIAL (new), force_labels_r, NULL, NULL);
3187
3188                 GENERIC_TREE_OPERAND (*expr_p, 1) = new;
3189
3190                 /* This is no longer an assignment of a CONSTRUCTOR, but
3191                    we still may have processing to do on the LHS.  So
3192                    pretend we didn't do anything here to let that happen.  */
3193                 return GS_UNHANDLED;
3194               }
3195           }
3196
3197         /* If there are nonzero elements, pre-evaluate to capture elements
3198            overlapping with the lhs into temporaries.  We must do this before
3199            clearing to fetch the values before they are zeroed-out.  */
3200         if (num_nonzero_elements > 0)
3201           {
3202             preeval_data.lhs_base_decl = get_base_address (object);
3203             if (!DECL_P (preeval_data.lhs_base_decl))
3204               preeval_data.lhs_base_decl = NULL;
3205             preeval_data.lhs_alias_set = get_alias_set (object);
3206
3207             gimplify_init_ctor_preeval (&GENERIC_TREE_OPERAND (*expr_p, 1),
3208                                         pre_p, post_p, &preeval_data);
3209           }
3210
3211         if (cleared)
3212           {
3213             /* Zap the CONSTRUCTOR element list, which simplifies this case.
3214                Note that we still have to gimplify, in order to handle the
3215                case of variable sized types.  Avoid shared tree structures.  */
3216             CONSTRUCTOR_ELTS (ctor) = NULL;
3217             object = unshare_expr (object);
3218             gimplify_stmt (expr_p);
3219             append_to_statement_list (*expr_p, pre_p);
3220           }
3221
3222         /* If we have not block cleared the object, or if there are nonzero
3223            elements in the constructor, add assignments to the individual
3224            scalar fields of the object.  */
3225         if (!cleared || num_nonzero_elements > 0)
3226           gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3227
3228         *expr_p = NULL_TREE;
3229       }
3230       break;
3231
3232     case COMPLEX_TYPE:
3233       {
3234         tree r, i;
3235
3236         /* Extract the real and imaginary parts out of the ctor.  */
3237         gcc_assert (VEC_length (constructor_elt, elts) == 2);
3238         r = VEC_index (constructor_elt, elts, 0)->value;
3239         i = VEC_index (constructor_elt, elts, 1)->value;
3240         if (r == NULL || i == NULL)
3241           {
3242             tree zero = fold_convert (TREE_TYPE (type), integer_zero_node);
3243             if (r == NULL)
3244               r = zero;
3245             if (i == NULL)
3246               i = zero;
3247           }
3248
3249         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3250            represent creation of a complex value.  */
3251         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3252           {
3253             ctor = build_complex (type, r, i);
3254             TREE_OPERAND (*expr_p, 1) = ctor;
3255           }
3256         else
3257           {
3258             ctor = build2 (COMPLEX_EXPR, type, r, i);
3259             TREE_OPERAND (*expr_p, 1) = ctor;
3260             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3261                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3262                                  fb_rvalue);
3263           }
3264       }
3265       break;
3266
3267     case VECTOR_TYPE:
3268       {
3269         unsigned HOST_WIDE_INT ix;
3270         constructor_elt *ce;
3271
3272         /* Go ahead and simplify constant constructors to VECTOR_CST.  */
3273         if (TREE_CONSTANT (ctor))
3274           {
3275             bool constant_p = true;
3276             tree value;
3277
3278             /* Even when ctor is constant, it might contain non-*_CST
3279               elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
3280               belong into VECTOR_CST nodes.  */
3281             FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
3282               if (!CONSTANT_CLASS_P (value))
3283                 {
3284                   constant_p = false;
3285                   break;
3286                 }
3287
3288             if (constant_p)
3289               {
3290                 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
3291                 break;
3292               }
3293
3294             /* Don't reduce a TREE_CONSTANT vector ctor even if we can't
3295                make a VECTOR_CST.  It won't do anything for us, and it'll
3296                prevent us from representing it as a single constant.  */
3297             break;
3298           }
3299
3300         /* Vector types use CONSTRUCTOR all the way through gimple
3301           compilation as a general initializer.  */
3302         for (ix = 0; VEC_iterate (constructor_elt, elts, ix, ce); ix++)
3303           {
3304             enum gimplify_status tret;
3305             tret = gimplify_expr (&ce->value, pre_p, post_p,
3306                                   is_gimple_val, fb_rvalue);
3307             if (tret == GS_ERROR)
3308               ret = GS_ERROR;
3309           }
3310         if (!is_gimple_reg (GENERIC_TREE_OPERAND (*expr_p, 0)))
3311           GENERIC_TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
3312       }
3313       break;
3314
3315     default:
3316       /* So how did we get a CONSTRUCTOR for a scalar type?  */
3317       gcc_unreachable ();
3318     }
3319
3320   if (ret == GS_ERROR)
3321     return GS_ERROR;
3322   else if (want_value)
3323     {
3324       append_to_statement_list (*expr_p, pre_p);
3325       *expr_p = object;
3326       return GS_OK;
3327     }
3328   else
3329     return GS_ALL_DONE;
3330 }
3331
3332 /* Given a pointer value OP0, return a simplified version of an
3333    indirection through OP0, or NULL_TREE if no simplification is
3334    possible.  This may only be applied to a rhs of an expression.
3335    Note that the resulting type may be different from the type pointed
3336    to in the sense that it is still compatible from the langhooks
3337    point of view. */
3338
3339 static tree
3340 fold_indirect_ref_rhs (tree t)
3341 {
3342   tree type = TREE_TYPE (TREE_TYPE (t));
3343   tree sub = t;
3344   tree subtype;
3345
3346   STRIP_USELESS_TYPE_CONVERSION (sub);
3347   subtype = TREE_TYPE (sub);
3348   if (!POINTER_TYPE_P (subtype))
3349     return NULL_TREE;
3350
3351   if (TREE_CODE (sub) == ADDR_EXPR)
3352     {
3353       tree op = TREE_OPERAND (sub, 0);
3354       tree optype = TREE_TYPE (op);
3355       /* *&p => p */
3356       if (useless_type_conversion_p (type, optype))
3357         return op;
3358       /* *(foo *)&fooarray => fooarray[0] */
3359       else if (TREE_CODE (optype) == ARRAY_TYPE
3360                && useless_type_conversion_p (type, TREE_TYPE (optype)))
3361        {
3362          tree type_domain = TYPE_DOMAIN (optype);
3363          tree min_val = size_zero_node;
3364          if (type_domain && TYPE_MIN_VALUE (type_domain))
3365            min_val = TYPE_MIN_VALUE (type_domain);
3366          return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
3367        }
3368     }
3369
3370   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
3371   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
3372       && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
3373     {
3374       tree type_domain;
3375       tree min_val = size_zero_node;
3376       tree osub = sub;
3377       sub = fold_indirect_ref_rhs (sub);
3378       if (! sub)
3379         sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
3380       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
3381       if (type_domain && TYPE_MIN_VALUE (type_domain))
3382         min_val = TYPE_MIN_VALUE (type_domain);
3383       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
3384     }
3385
3386   return NULL_TREE;
3387 }
3388
3389 /* Subroutine of gimplify_modify_expr to do simplifications of MODIFY_EXPRs
3390    based on the code of the RHS.  We loop for as long as something changes.  */
3391
3392 static enum gimplify_status
3393 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
3394                           tree *post_p, bool want_value)
3395 {
3396   enum gimplify_status ret = GS_OK;
3397
3398   while (ret != GS_UNHANDLED)
3399     switch (TREE_CODE (*from_p))
3400       {
3401       case INDIRECT_REF:
3402         {
3403           /* If we have code like 
3404
3405                 *(const A*)(A*)&x
3406
3407              where the type of "x" is a (possibly cv-qualified variant
3408              of "A"), treat the entire expression as identical to "x".
3409              This kind of code arises in C++ when an object is bound
3410              to a const reference, and if "x" is a TARGET_EXPR we want
3411              to take advantage of the optimization below.  */
3412           tree t = fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
3413           if (t)
3414             {
3415               *from_p = t;
3416               ret = GS_OK;
3417             }
3418           else
3419             ret = GS_UNHANDLED;
3420           break;
3421         }
3422
3423       case TARGET_EXPR:
3424         {
3425           /* If we are initializing something from a TARGET_EXPR, strip the
3426              TARGET_EXPR and initialize it directly, if possible.  This can't
3427              be done if the initializer is void, since that implies that the
3428              temporary is set in some non-trivial way.
3429
3430              ??? What about code that pulls out the temp and uses it
3431              elsewhere? I think that such code never uses the TARGET_EXPR as
3432              an initializer.  If I'm wrong, we'll die because the temp won't
3433              have any RTL.  In that case, I guess we'll need to replace
3434              references somehow.  */
3435           tree init = TARGET_EXPR_INITIAL (*from_p);
3436
3437           if (!VOID_TYPE_P (TREE_TYPE (init)))
3438             {
3439               *from_p = init;
3440               ret = GS_OK;
3441             }
3442           else
3443             ret = GS_UNHANDLED;
3444         }
3445         break;
3446
3447       case COMPOUND_EXPR:
3448         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
3449            caught.  */
3450         gimplify_compound_expr (from_p, pre_p, true);
3451         ret = GS_OK;
3452         break;
3453
3454       case CONSTRUCTOR:
3455         /* If we're initializing from a CONSTRUCTOR, break this into
3456            individual MODIFY_EXPRs.  */
3457         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value);
3458
3459       case COND_EXPR:
3460         /* If we're assigning to a non-register type, push the assignment
3461            down into the branches.  This is mandatory for ADDRESSABLE types,
3462            since we cannot generate temporaries for such, but it saves a
3463            copy in other cases as well.  */
3464         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
3465           {
3466             /* This code should mirror the code in gimplify_cond_expr. */
3467             enum tree_code code = TREE_CODE (*expr_p);
3468             tree cond = *from_p;
3469             tree result = *to_p;
3470
3471             ret = gimplify_expr (&result, pre_p, post_p,
3472                                  is_gimple_min_lval, fb_lvalue);
3473             if (ret != GS_ERROR)
3474               ret = GS_OK;
3475
3476             if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
3477               TREE_OPERAND (cond, 1)
3478                 = build2 (code, void_type_node, result,
3479                           TREE_OPERAND (cond, 1));
3480             if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
3481               TREE_OPERAND (cond, 2)
3482                 = build2 (code, void_type_node, unshare_expr (result),
3483                           TREE_OPERAND (cond, 2));
3484
3485             TREE_TYPE (cond) = void_type_node;
3486             recalculate_side_effects (cond);
3487
3488             if (want_value)
3489               {
3490                 gimplify_and_add (cond, pre_p);
3491                 *expr_p = unshare_expr (result);
3492               }
3493             else
3494               *expr_p = cond;
3495             return ret;
3496           }
3497         else
3498           ret = GS_UNHANDLED;
3499         break;
3500
3501       case CALL_EXPR:
3502         /* For calls that return in memory, give *to_p as the CALL_EXPR's
3503            return slot so that we don't generate a temporary.  */
3504         if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
3505             && aggregate_value_p (*from_p, *from_p))
3506           {
3507             bool use_target;
3508
3509             if (!(rhs_predicate_for (*to_p))(*from_p))
3510               /* If we need a temporary, *to_p isn't accurate.  */
3511               use_target = false;
3512             else if (TREE_CODE (*to_p) == RESULT_DECL
3513                      && DECL_NAME (*to_p) == NULL_TREE
3514                      && needs_to_live_in_memory (*to_p))
3515               /* It's OK to use the return slot directly unless it's an NRV. */
3516               use_target = true;
3517             else if (is_gimple_reg_type (TREE_TYPE (*to_p))
3518                      || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
3519               /* Don't force regs into memory.  */
3520               use_target = false;
3521             else if (TREE_CODE (*to_p) == VAR_DECL
3522                      && DECL_GIMPLE_FORMAL_TEMP_P (*to_p))
3523               /* Don't use the original target if it's a formal temp; we
3524                  don't want to take their addresses.  */
3525               use_target = false;
3526             else if (TREE_CODE (*expr_p) == INIT_EXPR)
3527               /* It's OK to use the target directly if it's being
3528                  initialized. */
3529               use_target = true;
3530             else if (!is_gimple_non_addressable (*to_p))
3531               /* Don't use the original target if it's already addressable;
3532                  if its address escapes, and the called function uses the
3533                  NRV optimization, a conforming program could see *to_p
3534                  change before the called function returns; see c++/19317.
3535                  When optimizing, the return_slot pass marks more functions
3536                  as safe after we have escape info.  */
3537               use_target = false;
3538             else
3539               use_target = true;
3540
3541             if (use_target)
3542               {
3543                 CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
3544                 mark_addressable (*to_p);
3545               }
3546           }
3547
3548         ret = GS_UNHANDLED;
3549         break;
3550
3551         /* If we're initializing from a container, push the initialization
3552            inside it.  */
3553       case CLEANUP_POINT_EXPR:
3554       case BIND_EXPR:
3555       case STATEMENT_LIST:
3556         {
3557           tree wrap = *from_p;
3558           tree t;
3559
3560           ret = gimplify_expr (to_p, pre_p, post_p,
3561                                is_gimple_min_lval, fb_lvalue);
3562           if (ret != GS_ERROR)
3563             ret = GS_OK;
3564
3565           t = voidify_wrapper_expr (wrap, *expr_p);
3566           gcc_assert (t == *expr_p);
3567
3568           if (want_value)
3569             {
3570               gimplify_and_add (wrap, pre_p);
3571               *expr_p = unshare_expr (*to_p);
3572             }
3573           else
3574             *expr_p = wrap;
3575           return GS_OK;
3576         }
3577         
3578       default:
3579         ret = GS_UNHANDLED;
3580         break;
3581       }
3582
3583   return ret;
3584 }
3585
3586 /* Destructively convert the TREE pointer in TP into a gimple tuple if
3587    appropriate.  */
3588
3589 static void
3590 tree_to_gimple_tuple (tree *tp)
3591 {
3592
3593   switch (TREE_CODE (*tp))
3594     {
3595     case GIMPLE_MODIFY_STMT:
3596       return;
3597     case MODIFY_EXPR:
3598       {
3599         struct gimple_stmt *gs;
3600         tree lhs = TREE_OPERAND (*tp, 0);
3601         bool def_stmt_self_p = false;
3602
3603         if (TREE_CODE (lhs) == SSA_NAME)
3604           {
3605             if (SSA_NAME_DEF_STMT (lhs) == *tp)
3606               def_stmt_self_p = true;
3607           }
3608
3609         gs = &make_node (GIMPLE_MODIFY_STMT)->gstmt;
3610         gs->base = (*tp)->base;
3611         /* The set to base above overwrites the CODE.  */
3612         TREE_SET_CODE ((tree) gs, GIMPLE_MODIFY_STMT);
3613
3614         SET_EXPR_LOCUS ((tree) gs, EXPR_LOCUS (*tp));
3615         gs->operands[0] = TREE_OPERAND (*tp, 0);
3616         gs->operands[1] = TREE_OPERAND (*tp, 1);
3617         gs->block = TREE_BLOCK (*tp);
3618         *tp = (tree)gs;
3619
3620         /* If we re-gimplify a set to an SSA_NAME, we must change the
3621            SSA name's DEF_STMT link.  */
3622         if (def_stmt_self_p)
3623           SSA_NAME_DEF_STMT (GIMPLE_STMT_OPERAND (*tp, 0)) = *tp;
3624
3625         return;
3626       }
3627     default:
3628       break;
3629     }
3630 }
3631
3632 /* Promote partial stores to COMPLEX variables to total stores.  *EXPR_P is
3633    a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
3634    DECL_GIMPLE_REG_P set.  */
3635
3636 static enum gimplify_status
3637 gimplify_modify_expr_complex_part (tree *expr_p, tree *pre_p, bool want_value)
3638 {
3639   enum tree_code code, ocode;
3640   tree lhs, rhs, new_rhs, other, realpart, imagpart;
3641
3642   lhs = GENERIC_TREE_OPERAND (*expr_p, 0);
3643   rhs = GENERIC_TREE_OPERAND (*expr_p, 1);
3644   code = TREE_CODE (lhs);
3645   lhs = TREE_OPERAND (lhs, 0);
3646
3647   ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
3648   other = build1 (ocode, TREE_TYPE (rhs), lhs);
3649   other = get_formal_tmp_var (other, pre_p);
3650
3651   realpart = code == REALPART_EXPR ? rhs : other;
3652   imagpart = code == REALPART_EXPR ? other : rhs;
3653
3654   if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
3655     new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
3656   else
3657     new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
3658
3659   GENERIC_TREE_OPERAND (*expr_p, 0) = lhs;
3660   GENERIC_TREE_OPERAND (*expr_p, 1) = new_rhs;
3661
3662   if (want_value)
3663     {
3664       tree_to_gimple_tuple (expr_p);
3665
3666       append_to_statement_list (*expr_p, pre_p);
3667       *expr_p = rhs;
3668     }
3669
3670   return GS_ALL_DONE;
3671 }
3672
3673 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
3674
3675       modify_expr
3676               : varname '=' rhs
3677               | '*' ID '=' rhs
3678
3679     PRE_P points to the list where side effects that must happen before
3680         *EXPR_P should be stored.
3681
3682     POST_P points to the list where side effects that must happen after
3683         *EXPR_P should be stored.
3684
3685     WANT_VALUE is nonzero iff we want to use the value of this expression
3686         in another expression.  */
3687
3688 static enum gimplify_status
3689 gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
3690 {
3691   tree *from_p = &GENERIC_TREE_OPERAND (*expr_p, 1);
3692   tree *to_p = &GENERIC_TREE_OPERAND (*expr_p, 0);
3693   enum gimplify_status ret = GS_UNHANDLED;
3694
3695   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
3696               || TREE_CODE (*expr_p) == GIMPLE_MODIFY_STMT
3697               || TREE_CODE (*expr_p) == INIT_EXPR);
3698
3699   /* See if any simplifications can be done based on what the RHS is.  */
3700   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3701                                   want_value);
3702   if (ret != GS_UNHANDLED)
3703     return ret;
3704
3705   /* For zero sized types only gimplify the left hand side and right hand
3706      side as statements and throw away the assignment.  Do this after
3707      gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
3708      types properly.  */
3709   if (zero_sized_type (TREE_TYPE (*from_p)))
3710     {
3711       gimplify_stmt (from_p);
3712       gimplify_stmt (to_p);
3713       append_to_statement_list (*from_p, pre_p);
3714       append_to_statement_list (*to_p, pre_p);
3715       *expr_p = NULL_TREE;
3716       return GS_ALL_DONE;
3717     }
3718
3719   /* If the value being copied is of variable width, compute the length
3720      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
3721      before gimplifying any of the operands so that we can resolve any
3722      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
3723      the size of the expression to be copied, not of the destination, so
3724      that is what we must here.  */
3725   maybe_with_size_expr (from_p);
3726
3727   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
3728   if (ret == GS_ERROR)
3729     return ret;
3730
3731   ret = gimplify_expr (from_p, pre_p, post_p,
3732                        rhs_predicate_for (*to_p), fb_rvalue);
3733   if (ret == GS_ERROR)
3734     return ret;
3735
3736   /* Now see if the above changed *from_p to something we handle specially.  */
3737   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3738                                   want_value);
3739   if (ret != GS_UNHANDLED)
3740     return ret;
3741
3742   /* If we've got a variable sized assignment between two lvalues (i.e. does
3743      not involve a call), then we can make things a bit more straightforward
3744      by converting the assignment to memcpy or memset.  */
3745   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
3746     {
3747       tree from = TREE_OPERAND (*from_p, 0);
3748       tree size = TREE_OPERAND (*from_p, 1);
3749
3750       if (TREE_CODE (from) == CONSTRUCTOR)
3751         return gimplify_modify_expr_to_memset (expr_p, size, want_value);
3752       if (is_gimple_addressable (from))
3753         {
3754           *from_p = from;
3755           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value);
3756         }
3757     }
3758
3759   /* Transform partial stores to non-addressable complex variables into
3760      total stores.  This allows us to use real instead of virtual operands
3761      for these variables, which improves optimization.  */
3762   if ((TREE_CODE (*to_p) == REALPART_EXPR
3763        || TREE_CODE (*to_p) == IMAGPART_EXPR)
3764       && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
3765     return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
3766
3767   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
3768     {
3769       /* If we've somehow already got an SSA_NAME on the LHS, then
3770          we're probably modified it twice.  Not good.  */
3771       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
3772       *to_p = make_ssa_name (*to_p, *expr_p);
3773     }
3774
3775   /* Try to alleviate the effects of the gimplification creating artificial
3776      temporaries (see for example is_gimple_reg_rhs) on the debug info.  */
3777   if (!gimplify_ctxp->into_ssa
3778       && DECL_P (*from_p) && DECL_IGNORED_P (*from_p)
3779       && DECL_P (*to_p) && !DECL_IGNORED_P (*to_p))
3780     {
3781       if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
3782         DECL_NAME (*from_p)
3783           = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
3784       DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
3785       SET_DECL_DEBUG_EXPR (*from_p, *to_p);
3786     }
3787
3788   if (want_value)
3789     {
3790       tree_to_gimple_tuple (expr_p);
3791
3792       append_to_statement_list (*expr_p, pre_p);
3793       *expr_p = *to_p;
3794       return GS_OK;
3795     }
3796
3797   return GS_ALL_DONE;
3798 }
3799
3800 /*  Gimplify a comparison between two variable-sized objects.  Do this
3801     with a call to BUILT_IN_MEMCMP.  */
3802
3803 static enum gimplify_status
3804 gimplify_variable_sized_compare (tree *expr_p)
3805 {
3806   tree op0 = TREE_OPERAND (*expr_p, 0);
3807   tree op1 = TREE_OPERAND (*expr_p, 1);
3808   tree t, arg, dest, src;
3809
3810   arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
3811   arg = unshare_expr (arg);
3812   arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
3813   src = build_fold_addr_expr (op1);
3814   dest = build_fold_addr_expr (op0);
3815   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
3816   t = build_call_expr (t, 3, dest, src, arg);
3817   *expr_p
3818     = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
3819
3820   return GS_OK;
3821 }
3822
3823 /*  Gimplify a comparison between two aggregate objects of integral scalar
3824     mode as a comparison between the bitwise equivalent scalar values.  */
3825
3826 static enum gimplify_status
3827 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
3828 {
3829   tree op0 = TREE_OPERAND (*expr_p, 0);
3830   tree op1 = TREE_OPERAND (*expr_p, 1);
3831
3832   tree type = TREE_TYPE (op0);
3833   tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
3834
3835   op0 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op0);
3836   op1 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op1);
3837
3838   *expr_p
3839     = fold_build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
3840
3841   return GS_OK;
3842 }
3843
3844 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
3845     points to the expression to gimplify.
3846
3847     Expressions of the form 'a && b' are gimplified to:
3848
3849         a && b ? true : false
3850
3851     gimplify_cond_expr will do the rest.
3852
3853     PRE_P points to the list where side effects that must happen before
3854         *EXPR_P should be stored.  */
3855
3856 static enum gimplify_status
3857 gimplify_boolean_expr (tree *expr_p)
3858 {
3859   /* Preserve the original type of the expression.  */
3860   tree type = TREE_TYPE (*expr_p);
3861
3862   *expr_p = build3 (COND_EXPR, type, *expr_p,
3863                     fold_convert (type, boolean_true_node),
3864                     fold_convert (type, boolean_false_node));
3865
3866   return GS_OK;
3867 }
3868
3869 /* Gimplifies an expression sequence.  This function gimplifies each
3870    expression and re-writes the original expression with the last
3871    expression of the sequence in GIMPLE form.
3872
3873    PRE_P points to the list where the side effects for all the
3874        expressions in the sequence will be emitted.
3875
3876    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
3877 /* ??? Should rearrange to share the pre-queue with all the indirect
3878    invocations of gimplify_expr.  Would probably save on creations
3879    of statement_list nodes.  */
3880
3881 static enum gimplify_status
3882 gimplify_compound_expr (tree *expr_p, tree *pre_p, bool want_value)
3883 {
3884   tree t = *expr_p;
3885
3886   do
3887     {
3888       tree *sub_p = &TREE_OPERAND (t, 0);
3889
3890       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
3891         gimplify_compound_expr (sub_p, pre_p, false);
3892       else
3893         gimplify_stmt (sub_p);
3894       append_to_statement_list (*sub_p, pre_p);
3895
3896       t = TREE_OPERAND (t, 1);
3897     }
3898   while (TREE_CODE (t) == COMPOUND_EXPR);
3899
3900   *expr_p = t;
3901   if (want_value)
3902     return GS_OK;
3903   else
3904     {
3905       gimplify_stmt (expr_p);
3906       return GS_ALL_DONE;
3907     }
3908 }
3909
3910 /* Gimplifies a statement list.  These may be created either by an
3911    enlightened front-end, or by shortcut_cond_expr.  */
3912
3913 static enum gimplify_status
3914 gimplify_statement_list (tree *expr_p, tree *pre_p)
3915 {
3916   tree temp = voidify_wrapper_expr (*expr_p, NULL);
3917
3918   tree_stmt_iterator i = tsi_start (*expr_p);
3919
3920   while (!tsi_end_p (i))
3921     {
3922       tree t;
3923
3924       gimplify_stmt (tsi_stmt_ptr (i));
3925
3926       t = tsi_stmt (i);
3927       if (t == NULL)
3928         tsi_delink (&i);
3929       else if (TREE_CODE (t) == STATEMENT_LIST)
3930         {
3931           tsi_link_before (&i, t, TSI_SAME_STMT);
3932           tsi_delink (&i);
3933         }
3934       else
3935         tsi_next (&i);
3936     }
3937
3938   if (temp)
3939     {
3940       append_to_statement_list (*expr_p, pre_p);
3941       *expr_p = temp;
3942       return GS_OK;
3943     }
3944
3945   return GS_ALL_DONE;
3946 }
3947
3948 /*  Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
3949     gimplify.  After gimplification, EXPR_P will point to a new temporary
3950     that holds the original value of the SAVE_EXPR node.
3951
3952     PRE_P points to the list where side effects that must happen before
3953         *EXPR_P should be stored.  */
3954
3955 static enum gimplify_status
3956 gimplify_save_expr (tree *expr_p, tree *pre_p, tree *post_p)
3957 {
3958   enum gimplify_status ret = GS_ALL_DONE;
3959   tree val;
3960
3961   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
3962   val = TREE_OPERAND (*expr_p, 0);
3963
3964   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
3965   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
3966     {
3967       /* The operand may be a void-valued expression such as SAVE_EXPRs
3968          generated by the Java frontend for class initialization.  It is
3969          being executed only for its side-effects.  */
3970       if (TREE_TYPE (val) == void_type_node)
3971         {
3972           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3973                                is_gimple_stmt, fb_none);
3974           append_to_statement_list (TREE_OPERAND (*expr_p, 0), pre_p);
3975           val = NULL;
3976         }
3977       else
3978         val = get_initialized_tmp_var (val, pre_p, post_p);
3979
3980       TREE_OPERAND (*expr_p, 0) = val;
3981       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
3982     }
3983
3984   *expr_p = val;
3985
3986   return ret;
3987 }
3988
3989 /*  Re-write the ADDR_EXPR node pointed to by EXPR_P
3990
3991       unary_expr
3992               : ...
3993               | '&' varname
3994               ...
3995
3996     PRE_P points to the list where side effects that must happen before
3997         *EXPR_P should be stored.
3998
3999     POST_P points to the list where side effects that must happen after
4000         *EXPR_P should be stored.  */
4001
4002 static enum gimplify_status
4003 gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
4004 {
4005   tree expr = *expr_p;
4006   tree op0 = TREE_OPERAND (expr, 0);
4007   enum gimplify_status ret;
4008
4009   switch (TREE_CODE (op0))
4010     {
4011     case INDIRECT_REF:
4012     case MISALIGNED_INDIRECT_REF:
4013     do_indirect_ref:
4014       /* Check if we are dealing with an expression of the form '&*ptr'.
4015          While the front end folds away '&*ptr' into 'ptr', these
4016          expressions may be generated internally by the compiler (e.g.,
4017          builtins like __builtin_va_end).  */
4018       /* Caution: the silent array decomposition semantics we allow for
4019          ADDR_EXPR means we can't always discard the pair.  */
4020       /* Gimplification of the ADDR_EXPR operand may drop
4021          cv-qualification conversions, so make sure we add them if
4022          needed.  */
4023       {
4024         tree op00 = TREE_OPERAND (op0, 0);
4025         tree t_expr = TREE_TYPE (expr);
4026         tree t_op00 = TREE_TYPE (op00);
4027
4028         if (!useless_type_conversion_p (t_expr, t_op00))
4029           op00 = fold_convert (TREE_TYPE (expr), op00);
4030         *expr_p = op00;
4031         ret = GS_OK;
4032       }
4033       break;
4034
4035     case VIEW_CONVERT_EXPR:
4036       /* Take the address of our operand and then convert it to the type of
4037          this ADDR_EXPR.
4038
4039          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4040          all clear.  The impact of this transformation is even less clear.  */
4041
4042       /* If the operand is a useless conversion, look through it.  Doing so
4043          guarantees that the ADDR_EXPR and its operand will remain of the
4044          same type.  */
4045       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4046         op0 = TREE_OPERAND (op0, 0);
4047
4048       *expr_p = fold_convert (TREE_TYPE (expr),
4049                               build_fold_addr_expr (TREE_OPERAND (op0, 0)));
4050       ret = GS_OK;
4051       break;
4052
4053     default:
4054       /* We use fb_either here because the C frontend sometimes takes
4055          the address of a call that returns a struct; see
4056          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
4057          the implied temporary explicit.  */
4058
4059       /* Mark the RHS addressable.  */
4060       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4061                            is_gimple_addressable, fb_either);
4062       if (ret != GS_ERROR)
4063         {
4064           op0 = TREE_OPERAND (expr, 0);
4065
4066           /* For various reasons, the gimplification of the expression
4067              may have made a new INDIRECT_REF.  */
4068           if (TREE_CODE (op0) == INDIRECT_REF)
4069             goto do_indirect_ref;
4070
4071           /* Make sure TREE_INVARIANT, TREE_CONSTANT, and TREE_SIDE_EFFECTS
4072              is set properly.  */
4073           recompute_tree_invariant_for_addr_expr (expr);
4074
4075           mark_addressable (TREE_OPERAND (expr, 0));
4076         }
4077       break;
4078     }
4079
4080   return ret;
4081 }
4082
4083 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
4084    value; output operands should be a gimple lvalue.  */
4085
4086 static enum gimplify_status
4087 gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
4088 {
4089   tree expr = *expr_p;
4090   int noutputs = list_length (ASM_OUTPUTS (expr));
4091   const char **oconstraints
4092     = (const char **) alloca ((noutputs) * sizeof (const char *));
4093   int i;
4094   tree link;
4095   const char *constraint;
4096   bool allows_mem, allows_reg, is_inout;
4097   enum gimplify_status ret, tret;
4098
4099   ret = GS_ALL_DONE;
4100   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = TREE_CHAIN (link))
4101     {
4102       size_t constraint_len;
4103       oconstraints[i] = constraint
4104         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4105       constraint_len = strlen (constraint);
4106       if (constraint_len == 0)
4107         continue;
4108
4109       parse_output_constraint (&constraint, i, 0, 0,
4110                                &allows_mem, &allows_reg, &is_inout);
4111
4112       if (!allows_reg && allows_mem)
4113         mark_addressable (TREE_VALUE (link));
4114
4115       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4116                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4117                             fb_lvalue | fb_mayfail);
4118       if (tret == GS_ERROR)
4119         {
4120           error ("invalid lvalue in asm output %d", i);
4121           ret = tret;
4122         }
4123
4124       if (is_inout)
4125         {
4126           /* An input/output operand.  To give the optimizers more
4127              flexibility, split it into separate input and output
4128              operands.  */
4129           tree input;
4130           char buf[10];
4131
4132           /* Turn the in/out constraint into an output constraint.  */
4133           char *p = xstrdup (constraint);
4134           p[0] = '=';
4135           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4136
4137           /* And add a matching input constraint.  */
4138           if (allows_reg)
4139             {
4140               sprintf (buf, "%d", i);
4141
4142               /* If there are multiple alternatives in the constraint,
4143                  handle each of them individually.  Those that allow register
4144                  will be replaced with operand number, the others will stay
4145                  unchanged.  */
4146               if (strchr (p, ',') != NULL)
4147                 {
4148                   size_t len = 0, buflen = strlen (buf);
4149                   char *beg, *end, *str, *dst;
4150
4151                   for (beg = p + 1;;)
4152                     {
4153                       end = strchr (beg, ',');
4154                       if (end == NULL)
4155                         end = strchr (beg, '\0');
4156                       if ((size_t) (end - beg) < buflen)
4157                         len += buflen + 1;
4158                       else
4159                         len += end - beg + 1;
4160                       if (*end)
4161                         beg = end + 1;
4162                       else
4163                         break;
4164                     }
4165
4166                   str = (char *) alloca (len);
4167                   for (beg = p + 1, dst = str;;)
4168                     {
4169                       const char *tem;
4170                       bool mem_p, reg_p, inout_p;
4171
4172                       end = strchr (beg, ',');
4173                       if (end)
4174                         *end = '\0';
4175                       beg[-1] = '=';
4176                       tem = beg - 1;
4177                       parse_output_constraint (&tem, i, 0, 0,
4178                                                &mem_p, &reg_p, &inout_p);
4179                       if (dst != str)
4180                         *dst++ = ',';
4181                       if (reg_p)
4182                         {
4183                           memcpy (dst, buf, buflen);
4184                           dst += buflen;
4185                         }
4186                       else
4187                         {
4188                           if (end)
4189                             len = end - beg;
4190                           else
4191                             len = strlen (beg);
4192                           memcpy (dst, beg, len);
4193                           dst += len;
4194                         }
4195                       if (end)
4196                         beg = end + 1;
4197                       else
4198                         break;
4199                     }
4200                   *dst = '\0';
4201                   input = build_string (dst - str, str);
4202                 }
4203               else
4204                 input = build_string (strlen (buf), buf);
4205             }
4206           else
4207             input = build_string (constraint_len - 1, constraint + 1);
4208
4209           free (p);
4210
4211           input = build_tree_list (build_tree_list (NULL_TREE, input),
4212                                    unshare_expr (TREE_VALUE (link)));
4213           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
4214         }
4215     }
4216
4217   for (link = ASM_INPUTS (expr); link; ++i, link = TREE_CHAIN (link))
4218     {
4219       constraint
4220         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4221       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
4222                               oconstraints, &allows_mem, &allows_reg);
4223
4224       /* If we can't make copies, we can only accept memory.  */
4225       if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
4226         {
4227           if (allows_mem)
4228             allows_reg = 0;
4229           else
4230             {
4231               error ("impossible constraint in %<asm%>");
4232               error ("non-memory input %d must stay in memory", i);
4233               return GS_ERROR;
4234             }
4235         }
4236
4237       /* If the operand is a memory input, it should be an lvalue.  */
4238       if (!allows_reg && allows_mem)
4239         {
4240           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4241                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
4242           mark_addressable (TREE_VALUE (link));
4243           if (tret == GS_ERROR)
4244             {
4245               error ("memory input %d is not directly addressable", i);
4246               ret = tret;
4247             }
4248         }
4249       else
4250         {
4251           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4252                                 is_gimple_asm_val, fb_rvalue);
4253           if (tret == GS_ERROR)
4254             ret = tret;
4255         }
4256     }
4257
4258   return ret;
4259 }
4260
4261 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
4262    WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
4263    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
4264    return to this function.
4265
4266    FIXME should we complexify the prequeue handling instead?  Or use flags
4267    for all the cleanups and let the optimizer tighten them up?  The current
4268    code seems pretty fragile; it will break on a cleanup within any
4269    non-conditional nesting.  But any such nesting would be broken, anyway;
4270    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
4271    and continues out of it.  We can do that at the RTL level, though, so
4272    having an optimizer to tighten up try/finally regions would be a Good
4273    Thing.  */
4274
4275 static enum gimplify_status
4276 gimplify_cleanup_point_expr (tree *expr_p, tree *pre_p)
4277 {
4278   tree_stmt_iterator iter;
4279   tree body;
4280
4281   tree temp = voidify_wrapper_expr (*expr_p, NULL);
4282
4283   /* We only care about the number of conditions between the innermost
4284      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count and
4285      any cleanups collected outside the CLEANUP_POINT_EXPR.  */
4286   int old_conds = gimplify_ctxp->conditions;
4287   tree old_cleanups = gimplify_ctxp->conditional_cleanups;
4288   gimplify_ctxp->conditions = 0;
4289   gimplify_ctxp->conditional_cleanups = NULL_TREE;
4290
4291   body = TREE_OPERAND (*expr_p, 0);
4292   gimplify_to_stmt_list (&body);
4293
4294   gimplify_ctxp->conditions = old_conds;
4295   gimplify_ctxp->conditional_cleanups = old_cleanups;
4296
4297   for (iter = tsi_start (body); !tsi_end_p (iter); )
4298     {
4299       tree *wce_p = tsi_stmt_ptr (iter);
4300       tree wce = *wce_p;
4301
4302       if (TREE_CODE (wce) == WITH_CLEANUP_EXPR)
4303         {
4304           if (tsi_one_before_end_p (iter))
4305             {
4306               tsi_link_before (&iter, TREE_OPERAND (wce, 0), TSI_SAME_STMT);
4307               tsi_delink (&iter);
4308               break;
4309             }
4310           else
4311             {
4312               tree sl, tfe;
4313               enum tree_code code;
4314
4315               if (CLEANUP_EH_ONLY (wce))
4316                 code = TRY_CATCH_EXPR;
4317               else
4318                 code = TRY_FINALLY_EXPR;
4319
4320               sl = tsi_split_statement_list_after (&iter);
4321               tfe = build2 (code, void_type_node, sl, NULL_TREE);
4322               append_to_statement_list (TREE_OPERAND (wce, 0),
4323                                         &TREE_OPERAND (tfe, 1));
4324               *wce_p = tfe;
4325               iter = tsi_start (sl);
4326             }
4327         }
4328       else
4329         tsi_next (&iter);
4330     }
4331
4332   if (temp)
4333     {
4334       *expr_p = temp;
4335       append_to_statement_list (body, pre_p);
4336       return GS_OK;
4337     }
4338   else
4339     {
4340       *expr_p = body;
4341       return GS_ALL_DONE;
4342     }
4343 }
4344
4345 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
4346    is the cleanup action required.  */
4347
4348 static void
4349 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, tree *pre_p)
4350 {
4351   tree wce;
4352
4353   /* Errors can result in improperly nested cleanups.  Which results in
4354      confusion when trying to resolve the WITH_CLEANUP_EXPR.  */
4355   if (errorcount || sorrycount)
4356     return;
4357
4358   if (gimple_conditional_context ())
4359     {
4360       /* If we're in a conditional context, this is more complex.  We only
4361          want to run the cleanup if we actually ran the initialization that
4362          necessitates it, but we want to run it after the end of the
4363          conditional context.  So we wrap the try/finally around the
4364          condition and use a flag to determine whether or not to actually
4365          run the destructor.  Thus
4366
4367            test ? f(A()) : 0
4368
4369          becomes (approximately)
4370
4371            flag = 0;
4372            try {
4373              if (test) { A::A(temp); flag = 1; val = f(temp); }
4374              else { val = 0; }
4375            } finally {
4376              if (flag) A::~A(temp);
4377            }
4378            val
4379       */
4380
4381       tree flag = create_tmp_var (boolean_type_node, "cleanup");
4382       tree ffalse = build_gimple_modify_stmt (flag, boolean_false_node);
4383       tree ftrue = build_gimple_modify_stmt (flag, boolean_true_node);
4384       cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
4385       wce = build1 (WITH_CLEANUP_EXPR, void_type_node, cleanup);
4386       append_to_statement_list (ffalse, &gimplify_ctxp->conditional_cleanups);
4387       append_to_statement_list (wce, &gimplify_ctxp->conditional_cleanups);
4388       append_to_statement_list (ftrue, pre_p);
4389
4390       /* Because of this manipulation, and the EH edges that jump
4391          threading cannot redirect, the temporary (VAR) will appear
4392          to be used uninitialized.  Don't warn.  */
4393       TREE_NO_WARNING (var) = 1;
4394     }
4395   else
4396     {
4397       wce = build1 (WITH_CLEANUP_EXPR, void_type_node, cleanup);
4398       CLEANUP_EH_ONLY (wce) = eh_only;
4399       append_to_statement_list (wce, pre_p);
4400     }
4401
4402   gimplify_stmt (&TREE_OPERAND (wce, 0));
4403 }
4404
4405 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
4406
4407 static enum gimplify_status
4408 gimplify_target_expr (tree *expr_p, tree *pre_p, tree *post_p)
4409 {
4410   tree targ = *expr_p;
4411   tree temp = TARGET_EXPR_SLOT (targ);
4412   tree init = TARGET_EXPR_INITIAL (targ);
4413   enum gimplify_status ret;
4414
4415   if (init)
4416     {
4417       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
4418          to the temps list.  Handle also variable length TARGET_EXPRs.  */
4419       if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
4420         {
4421           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
4422             gimplify_type_sizes (TREE_TYPE (temp), pre_p);
4423           gimplify_vla_decl (temp, pre_p);
4424         }
4425       else
4426         gimple_add_tmp_var (temp);
4427
4428       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
4429          expression is supposed to initialize the slot.  */
4430       if (VOID_TYPE_P (TREE_TYPE (init)))
4431         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
4432       else
4433         {
4434           init = build2 (INIT_EXPR, void_type_node, temp, init);
4435           ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt,
4436                                fb_none);
4437         }
4438       if (ret == GS_ERROR)
4439         {
4440           /* PR c++/28266 Make sure this is expanded only once. */
4441           TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4442           return GS_ERROR;
4443         }
4444       append_to_statement_list (init, pre_p);
4445
4446       /* If needed, push the cleanup for the temp.  */
4447       if (TARGET_EXPR_CLEANUP (targ))
4448         {
4449           gimplify_stmt (&TARGET_EXPR_CLEANUP (targ));
4450           gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
4451                                CLEANUP_EH_ONLY (targ), pre_p);
4452         }
4453
4454       /* Only expand this once.  */
4455       TREE_OPERAND (targ, 3) = init;
4456       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4457     }
4458   else
4459     /* We should have expanded this before.  */
4460     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
4461
4462   *expr_p = temp;
4463   return GS_OK;
4464 }
4465
4466 /* Gimplification of expression trees.  */
4467
4468 /* Gimplify an expression which appears at statement context; usually, this
4469    means replacing it with a suitably gimple STATEMENT_LIST.  */
4470
4471 void
4472 gimplify_stmt (tree *stmt_p)
4473 {
4474   gimplify_expr (stmt_p, NULL, NULL, is_gimple_stmt, fb_none);
4475 }
4476
4477 /* Similarly, but force the result to be a STATEMENT_LIST.  */
4478
4479 void
4480 gimplify_to_stmt_list (tree *stmt_p)
4481 {
4482   gimplify_stmt (stmt_p);
4483   if (!*stmt_p)
4484     *stmt_p = alloc_stmt_list ();
4485   else if (TREE_CODE (*stmt_p) != STATEMENT_LIST)
4486     {
4487       tree t = *stmt_p;
4488       *stmt_p = alloc_stmt_list ();
4489       append_to_statement_list (t, stmt_p);
4490     }
4491 }
4492
4493
4494 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
4495    to CTX.  If entries already exist, force them to be some flavor of private.
4496    If there is no enclosing parallel, do nothing.  */
4497
4498 void
4499 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
4500 {
4501   splay_tree_node n;
4502
4503   if (decl == NULL || !DECL_P (decl))
4504     return;
4505
4506   do
4507     {
4508       n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4509       if (n != NULL)
4510         {
4511           if (n->value & GOVD_SHARED)
4512             n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
4513           else
4514             return;
4515         }
4516       else if (ctx->is_parallel)
4517         omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
4518
4519       ctx = ctx->outer_context;
4520     }
4521   while (ctx);
4522 }
4523
4524 /* Similarly for each of the type sizes of TYPE.  */
4525
4526 static void
4527 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
4528 {
4529   if (type == NULL || type == error_mark_node)
4530     return;
4531   type = TYPE_MAIN_VARIANT (type);
4532
4533   if (pointer_set_insert (ctx->privatized_types, type))
4534     return;
4535
4536   switch (TREE_CODE (type))
4537     {
4538     case INTEGER_TYPE:
4539     case ENUMERAL_TYPE:
4540     case BOOLEAN_TYPE:
4541     case REAL_TYPE:
4542     case FIXED_POINT_TYPE:
4543       omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
4544       omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
4545       break;
4546
4547     case ARRAY_TYPE:
4548       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
4549       omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
4550       break;
4551
4552     case RECORD_TYPE:
4553     case UNION_TYPE:
4554     case QUAL_UNION_TYPE:
4555       {
4556         tree field;
4557         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4558           if (TREE_CODE (field) == FIELD_DECL)
4559             {
4560               omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
4561               omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
4562             }
4563       }
4564       break;
4565
4566     case POINTER_TYPE:
4567     case REFERENCE_TYPE:
4568       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
4569       break;
4570
4571     default:
4572       break;
4573     }
4574
4575   omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
4576   omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
4577   lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
4578 }
4579
4580 /* Add an entry for DECL in the OpenMP context CTX with FLAGS.  */
4581
4582 static void
4583 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
4584 {
4585   splay_tree_node n;
4586   unsigned int nflags;
4587   tree t;
4588
4589   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4590     return;
4591
4592   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
4593      there are constructors involved somewhere.  */
4594   if (TREE_ADDRESSABLE (TREE_TYPE (decl))
4595       || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
4596     flags |= GOVD_SEEN;
4597
4598   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4599   if (n != NULL)
4600     {
4601       /* We shouldn't be re-adding the decl with the same data
4602          sharing class.  */
4603       gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
4604       /* The only combination of data sharing classes we should see is
4605          FIRSTPRIVATE and LASTPRIVATE.  */
4606       nflags = n->value | flags;
4607       gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
4608                   == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
4609       n->value = nflags;
4610       return;
4611     }
4612
4613   /* When adding a variable-sized variable, we have to handle all sorts
4614      of additional bits of data: the pointer replacement variable, and 
4615      the parameters of the type.  */
4616   if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
4617     {
4618       /* Add the pointer replacement variable as PRIVATE if the variable
4619          replacement is private, else FIRSTPRIVATE since we'll need the
4620          address of the original variable either for SHARED, or for the
4621          copy into or out of the context.  */
4622       if (!(flags & GOVD_LOCAL))
4623         {
4624           nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
4625           nflags |= flags & GOVD_SEEN;
4626           t = DECL_VALUE_EXPR (decl);
4627           gcc_assert (TREE_CODE (t) == INDIRECT_REF);
4628           t = TREE_OPERAND (t, 0);
4629           gcc_assert (DECL_P (t));
4630           omp_add_variable (ctx, t, nflags);
4631         }
4632
4633       /* Add all of the variable and type parameters (which should have
4634          been gimplified to a formal temporary) as FIRSTPRIVATE.  */
4635       omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
4636       omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
4637       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
4638
4639       /* The variable-sized variable itself is never SHARED, only some form
4640          of PRIVATE.  The sharing would take place via the pointer variable
4641          which we remapped above.  */
4642       if (flags & GOVD_SHARED)
4643         flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
4644                 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
4645
4646       /* We're going to make use of the TYPE_SIZE_UNIT at least in the 
4647          alloca statement we generate for the variable, so make sure it
4648          is available.  This isn't automatically needed for the SHARED
4649          case, since we won't be allocating local storage then.
4650          For local variables TYPE_SIZE_UNIT might not be gimplified yet,
4651          in this case omp_notice_variable will be called later
4652          on when it is gimplified.  */
4653       else if (! (flags & GOVD_LOCAL))
4654         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
4655     }
4656   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
4657     {
4658       gcc_assert ((flags & GOVD_LOCAL) == 0);
4659       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
4660
4661       /* Similar to the direct variable sized case above, we'll need the
4662          size of references being privatized.  */
4663       if ((flags & GOVD_SHARED) == 0)
4664         {
4665           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
4666           if (TREE_CODE (t) != INTEGER_CST)
4667             omp_notice_variable (ctx, t, true);
4668         }
4669     }
4670
4671   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
4672 }
4673
4674 /* Record the fact that DECL was used within the OpenMP context CTX.
4675    IN_CODE is true when real code uses DECL, and false when we should
4676    merely emit default(none) errors.  Return true if DECL is going to
4677    be remapped and thus DECL shouldn't be gimplified into its
4678    DECL_VALUE_EXPR (if any).  */
4679
4680 static bool
4681 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
4682 {
4683   splay_tree_node n;
4684   unsigned flags = in_code ? GOVD_SEEN : 0;
4685   bool ret = false, shared;
4686
4687   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4688     return false;
4689
4690   /* Threadprivate variables are predetermined.  */
4691   if (is_global_var (decl))
4692     {
4693       if (DECL_THREAD_LOCAL_P (decl))
4694         return false;
4695
4696       if (DECL_HAS_VALUE_EXPR_P (decl))
4697         {
4698           tree value = get_base_address (DECL_VALUE_EXPR (decl));
4699
4700           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
4701             return false;
4702         }
4703     }
4704
4705   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4706   if (n == NULL)
4707     {
4708       enum omp_clause_default_kind default_kind, kind;
4709
4710       if (!ctx->is_parallel)
4711         goto do_outer;
4712
4713       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
4714          remapped firstprivate instead of shared.  To some extent this is
4715          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
4716       default_kind = ctx->default_kind;
4717       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
4718       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
4719         default_kind = kind;
4720
4721       switch (default_kind)
4722         {
4723         case OMP_CLAUSE_DEFAULT_NONE:
4724           error ("%qs not specified in enclosing parallel",
4725                  IDENTIFIER_POINTER (DECL_NAME (decl)));
4726           error ("%Henclosing parallel", &ctx->location);
4727           /* FALLTHRU */
4728         case OMP_CLAUSE_DEFAULT_SHARED:
4729           flags |= GOVD_SHARED;
4730           break;
4731         case OMP_CLAUSE_DEFAULT_PRIVATE:
4732           flags |= GOVD_PRIVATE;
4733           break;
4734         default:
4735           gcc_unreachable ();
4736         }
4737
4738       omp_add_variable (ctx, decl, flags);
4739
4740       shared = (flags & GOVD_SHARED) != 0;
4741       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
4742       goto do_outer;
4743     }
4744
4745   shared = ((flags | n->value) & GOVD_SHARED) != 0;
4746   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
4747
4748   /* If nothing changed, there's nothing left to do.  */
4749   if ((n->value & flags) == flags)
4750     return ret;
4751   flags |= n->value;
4752   n->value = flags;
4753
4754  do_outer:
4755   /* If the variable is private in the current context, then we don't
4756      need to propagate anything to an outer context.  */
4757   if (flags & GOVD_PRIVATE)
4758     return ret;
4759   if (ctx->outer_context
4760       && omp_notice_variable (ctx->outer_context, decl, in_code))
4761     return true;
4762   return ret;
4763 }
4764
4765 /* Verify that DECL is private within CTX.  If there's specific information
4766    to the contrary in the innermost scope, generate an error.  */
4767
4768 static bool
4769 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
4770 {
4771   splay_tree_node n;
4772
4773   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4774   if (n != NULL)
4775     {
4776       if (n->value & GOVD_SHARED)
4777         {
4778           if (ctx == gimplify_omp_ctxp)
4779             {
4780               error ("iteration variable %qs should be private",
4781                      IDENTIFIER_POINTER (DECL_NAME (decl)));
4782               n->value = GOVD_PRIVATE;
4783               return true;
4784             }
4785           else
4786             return false;
4787         }
4788       else if ((n->value & GOVD_EXPLICIT) != 0
4789                && (ctx == gimplify_omp_ctxp
4790                    || (ctx->is_combined_parallel
4791                        && gimplify_omp_ctxp->outer_context == ctx)))
4792         {
4793           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
4794             error ("iteration variable %qs should not be firstprivate",
4795                    IDENTIFIER_POINTER (DECL_NAME (decl)));
4796           else if ((n->value & GOVD_REDUCTION) != 0)
4797             error ("iteration variable %qs should not be reduction",
4798                    IDENTIFIER_POINTER (DECL_NAME (decl)));
4799         }
4800       return true;
4801     }
4802
4803   if (ctx->is_parallel)
4804     return false;
4805   else if (ctx->outer_context)
4806     return omp_is_private (ctx->outer_context, decl);
4807   else
4808     return !is_global_var (decl);
4809 }
4810
4811 /* Return true if DECL is private within a parallel region
4812    that binds to the current construct's context or in parallel
4813    region's REDUCTION clause.  */
4814
4815 static bool
4816 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
4817 {
4818   splay_tree_node n;
4819
4820   do
4821     {
4822       ctx = ctx->outer_context;
4823       if (ctx == NULL)
4824         return !(is_global_var (decl)
4825                  /* References might be private, but might be shared too.  */
4826                  || lang_hooks.decls.omp_privatize_by_reference (decl));
4827
4828       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4829       if (n != NULL)
4830         return (n->value & GOVD_SHARED) == 0;
4831     }
4832   while (!ctx->is_parallel);
4833   return false;
4834 }
4835
4836 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
4837    and previous omp contexts.  */
4838
4839 static void
4840 gimplify_scan_omp_clauses (tree *list_p, tree *pre_p, bool in_parallel,
4841                            bool in_combined_parallel)
4842 {
4843   struct gimplify_omp_ctx *ctx, *outer_ctx;
4844   tree c;
4845
4846   ctx = new_omp_context (in_parallel, in_combined_parallel);
4847   outer_ctx = ctx->outer_context;
4848
4849   while ((c = *list_p) != NULL)
4850     {
4851       enum gimplify_status gs;
4852       bool remove = false;
4853       bool notice_outer = true;
4854       const char *check_non_private = NULL;
4855       unsigned int flags;
4856       tree decl;
4857
4858       switch (OMP_CLAUSE_CODE (c))
4859         {
4860         case OMP_CLAUSE_PRIVATE:
4861           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
4862           notice_outer = false;
4863           goto do_add;
4864         case OMP_CLAUSE_SHARED:
4865           flags = GOVD_SHARED | GOVD_EXPLICIT;
4866           goto do_add;
4867         case OMP_CLAUSE_FIRSTPRIVATE:
4868           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
4869           check_non_private = "firstprivate";
4870           goto do_add;
4871         case OMP_CLAUSE_LASTPRIVATE:
4872           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
4873           check_non_private = "lastprivate";
4874           goto do_add;
4875         case OMP_CLAUSE_REDUCTION:
4876           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
4877           check_non_private = "reduction";
4878           goto do_add;
4879
4880         do_add:
4881           decl = OMP_CLAUSE_DECL (c);
4882           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4883             {
4884               remove = true;
4885               break;
4886             }
4887           omp_add_variable (ctx, decl, flags);
4888           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
4889               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
4890             {
4891               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
4892                                 GOVD_LOCAL | GOVD_SEEN);
4893               gimplify_omp_ctxp = ctx;
4894               push_gimplify_context ();
4895               gimplify_stmt (&OMP_CLAUSE_REDUCTION_INIT (c));
4896               pop_gimplify_context (OMP_CLAUSE_REDUCTION_INIT (c));
4897               push_gimplify_context ();
4898               gimplify_stmt (&OMP_CLAUSE_REDUCTION_MERGE (c));
4899               pop_gimplify_context (OMP_CLAUSE_REDUCTION_MERGE (c));
4900               gimplify_omp_ctxp = outer_ctx;
4901             }
4902           if (notice_outer)
4903             goto do_notice;
4904           break;
4905
4906         case OMP_CLAUSE_COPYIN:
4907         case OMP_CLAUSE_COPYPRIVATE:
4908           decl = OMP_CLAUSE_DECL (c);
4909           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4910             {
4911               remove = true;
4912               break;
4913             }
4914         do_notice:
4915           if (outer_ctx)
4916             omp_notice_variable (outer_ctx, decl, true);
4917           if (check_non_private
4918               && !in_parallel
4919               && omp_check_private (ctx, decl))
4920             {
4921               error ("%s variable %qs is private in outer context",
4922                      check_non_private, IDENTIFIER_POINTER (DECL_NAME (decl)));
4923               remove = true;
4924             }
4925           break;
4926
4927         case OMP_CLAUSE_IF:
4928           OMP_CLAUSE_OPERAND (c, 0)
4929             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
4930           /* Fall through.  */
4931
4932         case OMP_CLAUSE_SCHEDULE:
4933         case OMP_CLAUSE_NUM_THREADS:
4934           gs = gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
4935                               is_gimple_val, fb_rvalue);
4936           if (gs == GS_ERROR)
4937             remove = true;
4938           break;
4939
4940         case OMP_CLAUSE_NOWAIT:
4941         case OMP_CLAUSE_ORDERED:
4942           break;
4943
4944         case OMP_CLAUSE_DEFAULT:
4945           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
4946           break;
4947
4948         default:
4949           gcc_unreachable ();
4950         }
4951
4952       if (remove)
4953         *list_p = OMP_CLAUSE_CHAIN (c);
4954       else
4955         list_p = &OMP_CLAUSE_CHAIN (c);
4956     }
4957
4958   gimplify_omp_ctxp = ctx;
4959 }
4960
4961 /* For all variables that were not actually used within the context,
4962    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
4963
4964 static int
4965 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
4966 {
4967   tree *list_p = (tree *) data;
4968   tree decl = (tree) n->key;
4969   unsigned flags = n->value;
4970   enum omp_clause_code code;
4971   tree clause;
4972   bool private_debug;
4973
4974   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
4975     return 0;
4976   if ((flags & GOVD_SEEN) == 0)
4977     return 0;
4978   if (flags & GOVD_DEBUG_PRIVATE)
4979     {
4980       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
4981       private_debug = true;
4982     }
4983   else
4984     private_debug
4985       = lang_hooks.decls.omp_private_debug_clause (decl,
4986                                                    !!(flags & GOVD_SHARED));
4987   if (private_debug)
4988     code = OMP_CLAUSE_PRIVATE;
4989   else if (flags & GOVD_SHARED)
4990     {
4991       if (is_global_var (decl))
4992         {
4993           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
4994           while (ctx != NULL)
4995             {
4996               splay_tree_node on
4997                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4998               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
4999                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5000                 break;
5001               ctx = ctx->outer_context;
5002             }
5003           if (ctx == NULL)
5004             return 0;
5005         }
5006       code = OMP_CLAUSE_SHARED;
5007     }
5008   else if (flags & GOVD_PRIVATE)
5009     code = OMP_CLAUSE_PRIVATE;
5010   else if (flags & GOVD_FIRSTPRIVATE)
5011     code = OMP_CLAUSE_FIRSTPRIVATE;
5012   else
5013     gcc_unreachable ();
5014
5015   clause = build_omp_clause (code);
5016   OMP_CLAUSE_DECL (clause) = decl;
5017   OMP_CLAUSE_CHAIN (clause) = *list_p;
5018   if (private_debug)
5019     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
5020   *list_p = clause;
5021
5022   return 0;
5023 }
5024
5025 static void
5026 gimplify_adjust_omp_clauses (tree *list_p)
5027 {
5028   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
5029   tree c, decl;
5030
5031   while ((c = *list_p) != NULL)
5032     {
5033       splay_tree_node n;
5034       bool remove = false;
5035
5036       switch (OMP_CLAUSE_CODE (c))
5037         {
5038         case OMP_CLAUSE_PRIVATE:
5039         case OMP_CLAUSE_SHARED:
5040         case OMP_CLAUSE_FIRSTPRIVATE:
5041           decl = OMP_CLAUSE_DECL (c);
5042           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5043           remove = !(n->value & GOVD_SEEN);
5044           if (! remove)
5045             {
5046               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
5047               if ((n->value & GOVD_DEBUG_PRIVATE)
5048                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
5049                 {
5050                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
5051                               || ((n->value & GOVD_DATA_SHARE_CLASS)
5052                                   == GOVD_PRIVATE));
5053                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
5054                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
5055                 }
5056             }
5057           break;
5058
5059         case OMP_CLAUSE_LASTPRIVATE:
5060           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
5061              accurately reflect the presence of a FIRSTPRIVATE clause.  */
5062           decl = OMP_CLAUSE_DECL (c);
5063           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5064           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
5065             = (n->value & GOVD_FIRSTPRIVATE) != 0;
5066           break;
5067           
5068         case OMP_CLAUSE_REDUCTION:
5069         case OMP_CLAUSE_COPYIN:
5070         case OMP_CLAUSE_COPYPRIVATE:
5071         case OMP_CLAUSE_IF:
5072         case OMP_CLAUSE_NUM_THREADS:
5073         case OMP_CLAUSE_SCHEDULE:
5074         case OMP_CLAUSE_NOWAIT:
5075         case OMP_CLAUSE_ORDERED:
5076         case OMP_CLAUSE_DEFAULT:
5077           break;
5078
5079         default:
5080           gcc_unreachable ();
5081         }
5082
5083       if (remove)
5084         *list_p = OMP_CLAUSE_CHAIN (c);
5085       else
5086         list_p = &OMP_CLAUSE_CHAIN (c);
5087     }
5088
5089   /* Add in any implicit data sharing.  */
5090   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
5091   
5092   gimplify_omp_ctxp = ctx->outer_context;
5093   delete_omp_context (ctx);
5094 }
5095
5096 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
5097    gimplification of the body, as well as scanning the body for used
5098    variables.  We need to do this scan now, because variable-sized
5099    decls will be decomposed during gimplification.  */
5100
5101 static enum gimplify_status
5102 gimplify_omp_parallel (tree *expr_p, tree *pre_p)
5103 {
5104   tree expr = *expr_p;
5105
5106   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p, true,
5107                              OMP_PARALLEL_COMBINED (expr));
5108
5109   push_gimplify_context ();
5110
5111   gimplify_stmt (&OMP_PARALLEL_BODY (expr));
5112
5113   if (TREE_CODE (OMP_PARALLEL_BODY (expr)) == BIND_EXPR)
5114     pop_gimplify_context (OMP_PARALLEL_BODY (expr));
5115   else
5116     pop_gimplify_context (NULL_TREE);
5117
5118   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
5119
5120   return GS_ALL_DONE;
5121 }
5122
5123 /* Gimplify the gross structure of an OMP_FOR statement.  */
5124
5125 static enum gimplify_status
5126 gimplify_omp_for (tree *expr_p, tree *pre_p)
5127 {
5128   tree for_stmt, decl, var, t;
5129   enum gimplify_status ret = GS_OK;
5130   tree body, init_decl = NULL_TREE;
5131
5132   for_stmt = *expr_p;
5133
5134   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, false, false);
5135
5136   t = OMP_FOR_INIT (for_stmt);
5137   gcc_assert (TREE_CODE (t) == MODIFY_EXPR
5138               || TREE_CODE (t) == GIMPLE_MODIFY_STMT);
5139   decl = GENERIC_TREE_OPERAND (t, 0);
5140   gcc_assert (DECL_P (decl));
5141   gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl)));
5142
5143   /* Make sure the iteration variable is private.  */
5144   if (omp_is_private (gimplify_omp_ctxp, decl))
5145     omp_notice_variable (gimplify_omp_ctxp, decl, true);
5146   else
5147     omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
5148
5149   /* If DECL is not a gimple register, create a temporary variable to act as an
5150      iteration counter.  This is valid, since DECL cannot be modified in the
5151      body of the loop.  */
5152   if (!is_gimple_reg (decl))
5153     {
5154       var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
5155       GENERIC_TREE_OPERAND (t, 0) = var;
5156
5157       init_decl = build_gimple_modify_stmt (decl, var);
5158       omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
5159     }
5160   else
5161     var = decl;
5162
5163   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5164                         &OMP_FOR_PRE_BODY (for_stmt),
5165                         NULL, is_gimple_val, fb_rvalue);
5166
5167   tree_to_gimple_tuple (&OMP_FOR_INIT (for_stmt));
5168
5169   t = OMP_FOR_COND (for_stmt);
5170   gcc_assert (COMPARISON_CLASS_P (t));
5171   gcc_assert (GENERIC_TREE_OPERAND (t, 0) == decl);
5172   TREE_OPERAND (t, 0) = var;
5173
5174   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5175                         &OMP_FOR_PRE_BODY (for_stmt),
5176                         NULL, is_gimple_val, fb_rvalue);
5177
5178   tree_to_gimple_tuple (&OMP_FOR_INCR (for_stmt));
5179   t = OMP_FOR_INCR (for_stmt);
5180   switch (TREE_CODE (t))
5181     {
5182     case PREINCREMENT_EXPR:
5183     case POSTINCREMENT_EXPR:
5184       t = build_int_cst (TREE_TYPE (decl), 1);
5185       t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
5186       t = build_gimple_modify_stmt (var, t);
5187       OMP_FOR_INCR (for_stmt) = t;
5188       break;
5189
5190     case PREDECREMENT_EXPR:
5191     case POSTDECREMENT_EXPR:
5192       t = build_int_cst (TREE_TYPE (decl), -1);
5193       t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
5194       t = build_gimple_modify_stmt (var, t);
5195       OMP_FOR_INCR (for_stmt) = t;
5196       break;
5197       
5198     case GIMPLE_MODIFY_STMT:
5199       gcc_assert (GIMPLE_STMT_OPERAND (t, 0) == decl);
5200       GIMPLE_STMT_OPERAND (t, 0) = var;
5201
5202       t = GIMPLE_STMT_OPERAND (t, 1);
5203       switch (TREE_CODE (t))
5204         {
5205         case PLUS_EXPR:
5206           if (TREE_OPERAND (t, 1) == decl)
5207             {
5208               TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
5209               TREE_OPERAND (t, 0) = var;
5210               break;
5211             }
5212
5213           /* Fallthru.  */
5214         case MINUS_EXPR:
5215           gcc_assert (TREE_OPERAND (t, 0) == decl);
5216           TREE_OPERAND (t, 0) = var;
5217           break;
5218         default:
5219           gcc_unreachable ();
5220         }
5221
5222       ret |= gimplify_expr (&TREE_OPERAND (t, 1), &OMP_FOR_PRE_BODY (for_stmt),
5223                             NULL, is_gimple_val, fb_rvalue);
5224       break;
5225
5226     default:
5227       gcc_unreachable ();
5228     }
5229
5230   body = OMP_FOR_BODY (for_stmt);
5231   gimplify_to_stmt_list (&body);
5232   t = alloc_stmt_list ();
5233   if (init_decl)
5234     append_to_statement_list (init_decl, &t);
5235   append_to_statement_list (body, &t);
5236   OMP_FOR_BODY (for_stmt) = t;
5237   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
5238
5239   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
5240 }
5241
5242 /* Gimplify the gross structure of other OpenMP worksharing constructs.
5243    In particular, OMP_SECTIONS and OMP_SINGLE.  */
5244
5245 static enum gimplify_status
5246 gimplify_omp_workshare (tree *expr_p, tree *pre_p)
5247 {
5248   tree stmt = *expr_p;
5249
5250   gimplify_scan_omp_clauses (&OMP_CLAUSES (stmt), pre_p, false, false);
5251   gimplify_to_stmt_list (&OMP_BODY (stmt));
5252   gimplify_adjust_omp_clauses (&OMP_CLAUSES (stmt));
5253
5254   return GS_ALL_DONE;
5255 }
5256
5257 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
5258    stabilized the lhs of the atomic operation as *ADDR.  Return true if 
5259    EXPR is this stabilized form.  */
5260
5261 static bool
5262 goa_lhs_expr_p (const_tree expr, const_tree addr)
5263 {
5264   /* Also include casts to other type variants.  The C front end is fond
5265      of adding these for e.g. volatile variables.  This is like 
5266      STRIP_TYPE_NOPS but includes the main variant lookup.  */
5267   while ((TREE_CODE (expr) == NOP_EXPR
5268           || TREE_CODE (expr) == CONVERT_EXPR
5269           || TREE_CODE (expr) == NON_LVALUE_EXPR)
5270          && TREE_OPERAND (expr, 0) != error_mark_node
5271          && (TYPE_MAIN_VARIANT (TREE_TYPE (expr))
5272              == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
5273     expr = TREE_OPERAND (expr, 0);
5274
5275   if (TREE_CODE (expr) == INDIRECT_REF && TREE_OPERAND (expr, 0) == addr)
5276     return true;
5277   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
5278     return true;
5279   return false;
5280 }
5281
5282 /* A subroutine of gimplify_omp_atomic.  Attempt to implement the atomic
5283    operation as a __sync_fetch_and_op builtin.  INDEX is log2 of the
5284    size of the data type, and thus usable to find the index of the builtin
5285    decl.  Returns GS_UNHANDLED if the expression is not of the proper form.  */
5286
5287 static enum gimplify_status
5288 gimplify_omp_atomic_fetch_op (tree *expr_p, tree addr, tree rhs, int index)
5289 {
5290   enum built_in_function base;
5291   tree decl, itype;
5292   enum insn_code *optab;
5293
5294   /* Check for one of the supported fetch-op operations.  */
5295   switch (TREE_CODE (rhs))
5296     {
5297     case POINTER_PLUS_EXPR:
5298     case PLUS_EXPR:
5299       base = BUILT_IN_FETCH_AND_ADD_N;
5300       optab = sync_add_optab;
5301       break;
5302     case MINUS_EXPR:
5303       base = BUILT_IN_FETCH_AND_SUB_N;
5304       optab = sync_add_optab;
5305       break;
5306     case BIT_AND_EXPR:
5307       base = BUILT_IN_FETCH_AND_AND_N;
5308       optab = sync_and_optab;
5309       break;
5310     case BIT_IOR_EXPR:
5311       base = BUILT_IN_FETCH_AND_OR_N;
5312       optab = sync_ior_optab;
5313       break;
5314     case BIT_XOR_EXPR:
5315       base = BUILT_IN_FETCH_AND_XOR_N;
5316       optab = sync_xor_optab;
5317       break;
5318     default:
5319       return GS_UNHANDLED;
5320     }
5321
5322   /* Make sure the expression is of the proper form.  */
5323   if (goa_lhs_expr_p (TREE_OPERAND (rhs, 0), addr))
5324     rhs = TREE_OPERAND (rhs, 1);
5325   else if (commutative_tree_code (TREE_CODE (rhs))
5326            && goa_lhs_expr_p (TREE_OPERAND (rhs, 1), addr))
5327     rhs = TREE_OPERAND (rhs, 0);
5328   else
5329     return GS_UNHANDLED;
5330
5331   decl = built_in_decls[base + index + 1];
5332   itype = TREE_TYPE (TREE_TYPE (decl));
5333
5334   if (optab[TYPE_MODE (itype)] == CODE_FOR_nothing)
5335     return GS_UNHANDLED;
5336
5337   *expr_p = build_call_expr (decl, 2, addr, fold_convert (itype, rhs));
5338   return GS_OK;
5339 }
5340
5341 /* A subroutine of gimplify_omp_atomic_pipeline.  Walk *EXPR_P and replace
5342    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
5343    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
5344    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
5345
5346 static int
5347 goa_stabilize_expr (tree *expr_p, tree *pre_p, tree lhs_addr, tree lhs_var)
5348 {
5349   tree expr = *expr_p;
5350   int saw_lhs;
5351
5352   if (goa_lhs_expr_p (expr, lhs_addr))
5353     {
5354       *expr_p = lhs_var;
5355       return 1;
5356     }
5357   if (is_gimple_val (expr))
5358     return 0;
5359  
5360   saw_lhs = 0;
5361   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
5362     {
5363     case tcc_binary:
5364       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
5365                                      lhs_addr, lhs_var);
5366     case tcc_unary:
5367       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
5368                                      lhs_addr, lhs_var);
5369       break;
5370     default:
5371       break;
5372     }
5373
5374   if (saw_lhs == 0)
5375     {
5376       enum gimplify_status gs;
5377       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
5378       if (gs != GS_ALL_DONE)
5379         saw_lhs = -1;
5380     }
5381
5382   return saw_lhs;
5383 }
5384
5385 /* A subroutine of gimplify_omp_atomic.  Implement the atomic operation as:
5386
5387         oldval = *addr;
5388       repeat:
5389         newval = rhs;   // with oldval replacing *addr in rhs
5390         oldval = __sync_val_compare_and_swap (addr, oldval, newval);
5391         if (oldval != newval)
5392           goto repeat;
5393
5394    INDEX is log2 of the size of the data type, and thus usable to find the
5395    index of the builtin decl.  */
5396
5397 static enum gimplify_status
5398 gimplify_omp_atomic_pipeline (tree *expr_p, tree *pre_p, tree addr,
5399                               tree rhs, int index)
5400 {
5401   tree oldval, oldival, oldival2, newval, newival, label;
5402   tree type, itype, cmpxchg, x, iaddr;
5403
5404   cmpxchg = built_in_decls[BUILT_IN_VAL_COMPARE_AND_SWAP_N + index + 1];
5405   type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
5406   itype = TREE_TYPE (TREE_TYPE (cmpxchg));
5407
5408   if (sync_compare_and_swap[TYPE_MODE (itype)] == CODE_FOR_nothing)
5409     return GS_UNHANDLED;
5410
5411   oldval = create_tmp_var (type, NULL);
5412   newval = create_tmp_var (type, NULL);
5413
5414   /* Precompute as much of RHS as possible.  In the same walk, replace
5415      occurrences of the lhs value with our temporary.  */
5416   if (goa_stabilize_expr (&rhs, pre_p, addr, oldval) < 0)
5417     return GS_ERROR;
5418
5419   x = build_fold_indirect_ref (addr);
5420   x = build_gimple_modify_stmt (oldval, x);
5421   gimplify_and_add (x, pre_p);
5422
5423   /* For floating-point values, we'll need to view-convert them to integers
5424      so that we can perform the atomic compare and swap.  Simplify the 
5425      following code by always setting up the "i"ntegral variables.  */
5426   if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
5427     {
5428       oldival = oldval;
5429       newival = newval;
5430       iaddr = addr;
5431     }
5432   else
5433     {
5434       oldival = create_tmp_var (itype, NULL);
5435       newival = create_tmp_var (itype, NULL);
5436
5437       x = build1 (VIEW_CONVERT_EXPR, itype, oldval);
5438       x = build_gimple_modify_stmt (oldival, x);
5439       gimplify_and_add (x, pre_p);
5440       iaddr = fold_convert (build_pointer_type (itype), addr);
5441     }
5442
5443   oldival2 = create_tmp_var (itype, NULL);
5444
5445   label = create_artificial_label ();
5446   x = build1 (LABEL_EXPR, void_type_node, label);
5447   gimplify_and_add (x, pre_p);
5448
5449   x = build_gimple_modify_stmt (newval, rhs);
5450   gimplify_and_add (x, pre_p);
5451
5452   if (newval != newival)
5453     {
5454       x = build1 (VIEW_CONVERT_EXPR, itype, newval);
5455       x = build_gimple_modify_stmt (newival, x);
5456       gimplify_and_add (x, pre_p);
5457     }
5458
5459   x = build_gimple_modify_stmt (oldival2, fold_convert (itype, oldival));
5460   gimplify_and_add (x, pre_p);
5461
5462   x = build_call_expr (cmpxchg, 3, iaddr, fold_convert (itype, oldival),
5463                        fold_convert (itype, newival));
5464   if (oldval == oldival)
5465     x = fold_convert (type, x);
5466   x = build_gimple_modify_stmt (oldival, x);
5467   gimplify_and_add (x, pre_p);
5468
5469   /* For floating point, be prepared for the loop backedge.  */
5470   if (oldval != oldival)
5471     {
5472       x = build1 (VIEW_CONVERT_EXPR, type, oldival);
5473       x = build_gimple_modify_stmt (oldval, x);
5474       gimplify_and_add (x, pre_p);
5475     }
5476
5477   /* Note that we always perform the comparison as an integer, even for
5478      floating point.  This allows the atomic operation to properly 
5479      succeed even with NaNs and -0.0.  */
5480   x = build3 (COND_EXPR, void_type_node,
5481               build2 (NE_EXPR, boolean_type_node,
5482                       fold_convert (itype, oldival), oldival2),
5483               build1 (GOTO_EXPR, void_type_node, label), NULL);
5484   gimplify_and_add (x, pre_p);
5485
5486   *expr_p = NULL;
5487   return GS_ALL_DONE;
5488 }
5489
5490 /* A subroutine of gimplify_omp_atomic.  Implement the atomic operation as:
5491
5492         GOMP_atomic_start ();
5493         *addr = rhs;
5494         GOMP_atomic_end ();
5495
5496    The result is not globally atomic, but works so long as all parallel
5497    references are within #pragma omp atomic directives.  According to
5498    responses received from omp@openmp.org, appears to be within spec.
5499    Which makes sense, since that's how several other compilers handle
5500    this situation as well.  */
5501
5502 static enum gimplify_status
5503 gimplify_omp_atomic_mutex (tree *expr_p, tree *pre_p, tree addr, tree rhs)
5504 {
5505   tree t;
5506
5507   t = built_in_decls[BUILT_IN_GOMP_ATOMIC_START];
5508   t = build_call_expr (t, 0);
5509   gimplify_and_add (t, pre_p);
5510
5511   t = build_fold_indirect_ref (addr);
5512   t = build_gimple_modify_stmt (t, rhs);
5513   gimplify_and_add (t, pre_p);
5514   
5515   t = built_in_decls[BUILT_IN_GOMP_ATOMIC_END];
5516   t = build_call_expr (t, 0);
5517   gimplify_and_add (t, pre_p);
5518
5519   *expr_p = NULL;
5520   return GS_ALL_DONE;
5521 }
5522
5523 /* Gimplify an OMP_ATOMIC statement.  */
5524
5525 static enum gimplify_status
5526 gimplify_omp_atomic (tree *expr_p, tree *pre_p)
5527 {
5528   tree addr = TREE_OPERAND (*expr_p, 0);
5529   tree rhs = TREE_OPERAND (*expr_p, 1);
5530   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
5531   HOST_WIDE_INT index;
5532
5533   /* Make sure the type is one of the supported sizes.  */
5534   index = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5535   index = exact_log2 (index);
5536   if (index >= 0 && index <= 4)
5537     {
5538       enum gimplify_status gs;
5539       unsigned int align;
5540
5541       if (DECL_P (TREE_OPERAND (addr, 0)))
5542         align = DECL_ALIGN_UNIT (TREE_OPERAND (addr, 0));
5543       else if (TREE_CODE (TREE_OPERAND (addr, 0)) == COMPONENT_REF
5544                && TREE_CODE (TREE_OPERAND (TREE_OPERAND (addr, 0), 1))
5545                   == FIELD_DECL)
5546         align = DECL_ALIGN_UNIT (TREE_OPERAND (TREE_OPERAND (addr, 0), 1));
5547       else
5548         align = TYPE_ALIGN_UNIT (type);
5549
5550       /* __sync builtins require strict data alignment.  */
5551       if (exact_log2 (align) >= index)
5552         {
5553           /* When possible, use specialized atomic update functions.  */
5554           if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
5555             {
5556               gs = gimplify_omp_atomic_fetch_op (expr_p, addr, rhs, index);
5557               if (gs != GS_UNHANDLED)
5558                 return gs;
5559             }
5560
5561           /* If we don't have specialized __sync builtins, try and implement
5562              as a compare and swap loop.  */
5563           gs = gimplify_omp_atomic_pipeline (expr_p, pre_p, addr, rhs, index);
5564           if (gs != GS_UNHANDLED)
5565             return gs;
5566         }
5567     }
5568
5569   /* The ultimate fallback is wrapping the operation in a mutex.  */
5570   return gimplify_omp_atomic_mutex (expr_p, pre_p, addr, rhs);
5571 }
5572
5573 /*  Gimplifies the expression tree pointed to by EXPR_P.  Return 0 if
5574     gimplification failed.
5575
5576     PRE_P points to the list where side effects that must happen before
5577         EXPR should be stored.
5578
5579     POST_P points to the list where side effects that must happen after
5580         EXPR should be stored, or NULL if there is no suitable list.  In
5581         that case, we copy the result to a temporary, emit the
5582         post-effects, and then return the temporary.
5583
5584     GIMPLE_TEST_F points to a function that takes a tree T and
5585         returns nonzero if T is in the GIMPLE form requested by the
5586         caller.  The GIMPLE predicates are in tree-gimple.c.
5587
5588         This test is used twice.  Before gimplification, the test is
5589         invoked to determine whether *EXPR_P is already gimple enough.  If
5590         that fails, *EXPR_P is gimplified according to its code and
5591         GIMPLE_TEST_F is called again.  If the test still fails, then a new
5592         temporary variable is created and assigned the value of the
5593         gimplified expression.
5594
5595     FALLBACK tells the function what sort of a temporary we want.  If the 1
5596         bit is set, an rvalue is OK.  If the 2 bit is set, an lvalue is OK.
5597         If both are set, either is OK, but an lvalue is preferable.
5598
5599     The return value is either GS_ERROR or GS_ALL_DONE, since this function
5600     iterates until solution.  */
5601
5602 enum gimplify_status
5603 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
5604                bool (* gimple_test_f) (tree), fallback_t fallback)
5605 {
5606   tree tmp;
5607   tree internal_pre = NULL_TREE;
5608   tree internal_post = NULL_TREE;
5609   tree save_expr;
5610   int is_statement = (pre_p == NULL);
5611   location_t saved_location;
5612   enum gimplify_status ret;
5613
5614   save_expr = *expr_p;
5615   if (save_expr == NULL_TREE)
5616     return GS_ALL_DONE;
5617
5618   /* We used to check the predicate here and return immediately if it
5619      succeeds.  This is wrong; the design is for gimplification to be
5620      idempotent, and for the predicates to only test for valid forms, not
5621      whether they are fully simplified.  */
5622
5623   /* Set up our internal queues if needed.  */
5624   if (pre_p == NULL)
5625     pre_p = &internal_pre;
5626   if (post_p == NULL)
5627     post_p = &internal_post;
5628
5629   saved_location = input_location;
5630   if (save_expr != error_mark_node
5631       && EXPR_HAS_LOCATION (*expr_p))
5632     input_location = EXPR_LOCATION (*expr_p);
5633
5634   /* Loop over the specific gimplifiers until the toplevel node
5635      remains the same.  */
5636   do
5637     {
5638       /* Strip away as many useless type conversions as possible
5639          at the toplevel.  */
5640       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
5641
5642       /* Remember the expr.  */
5643       save_expr = *expr_p;
5644
5645       /* Die, die, die, my darling.  */
5646       if (save_expr == error_mark_node
5647           || (!GIMPLE_STMT_P (save_expr)
5648               && TREE_TYPE (save_expr)
5649               && TREE_TYPE (save_expr) == error_mark_node))
5650         {
5651           ret = GS_ERROR;
5652           break;
5653         }
5654
5655       /* Do any language-specific gimplification.  */
5656       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
5657       if (ret == GS_OK)
5658         {
5659           if (*expr_p == NULL_TREE)
5660             break;
5661           if (*expr_p != save_expr)
5662             continue;
5663         }
5664       else if (ret != GS_UNHANDLED)
5665         break;
5666
5667       ret = GS_OK;
5668       switch (TREE_CODE (*expr_p))
5669         {
5670           /* First deal with the special cases.  */
5671
5672         case POSTINCREMENT_EXPR:
5673         case POSTDECREMENT_EXPR:
5674         case PREINCREMENT_EXPR:
5675         case PREDECREMENT_EXPR:
5676           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
5677                                         fallback != fb_none);
5678           break;
5679
5680         case ARRAY_REF:
5681         case ARRAY_RANGE_REF:
5682         case REALPART_EXPR:
5683         case IMAGPART_EXPR:
5684         case COMPONENT_REF:
5685         case VIEW_CONVERT_EXPR:
5686           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
5687                                         fallback ? fallback : fb_rvalue);
5688           break;
5689
5690         case COND_EXPR:
5691           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
5692           /* C99 code may assign to an array in a structure value of a
5693              conditional expression, and this has undefined behavior
5694              only on execution, so create a temporary if an lvalue is
5695              required.  */
5696           if (fallback == fb_lvalue)
5697             {
5698               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5699               mark_addressable (*expr_p);
5700             }
5701           break;
5702
5703         case CALL_EXPR:
5704           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
5705           /* C99 code may assign to an array in a structure returned
5706              from a function, and this has undefined behavior only on
5707              execution, so create a temporary if an lvalue is
5708              required.  */
5709           if (fallback == fb_lvalue)
5710             {
5711               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5712               mark_addressable (*expr_p);
5713             }
5714           break;
5715
5716         case TREE_LIST:
5717           gcc_unreachable ();
5718
5719         case COMPOUND_EXPR:
5720           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
5721           break;
5722
5723         case MODIFY_EXPR:
5724         case GIMPLE_MODIFY_STMT:
5725         case INIT_EXPR:
5726           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
5727                                       fallback != fb_none);
5728
5729           if (*expr_p)
5730             {
5731               /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer
5732                  useful.  */
5733               if (TREE_CODE (*expr_p) == INIT_EXPR)
5734                 TREE_SET_CODE (*expr_p, MODIFY_EXPR);
5735
5736               /* Convert MODIFY_EXPR to GIMPLE_MODIFY_STMT.  */
5737               if (TREE_CODE (*expr_p) == MODIFY_EXPR)
5738                 tree_to_gimple_tuple (expr_p);
5739             }
5740
5741           break;
5742
5743         case TRUTH_ANDIF_EXPR:
5744         case TRUTH_ORIF_EXPR:
5745           ret = gimplify_boolean_expr (expr_p);
5746           break;
5747
5748         case TRUTH_NOT_EXPR:
5749           TREE_OPERAND (*expr_p, 0)
5750             = gimple_boolify (TREE_OPERAND (*expr_p, 0));
5751           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5752                                is_gimple_val, fb_rvalue);
5753           recalculate_side_effects (*expr_p);
5754           break;
5755
5756         case ADDR_EXPR:
5757           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
5758           break;
5759
5760         case VA_ARG_EXPR:
5761           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
5762           break;
5763
5764         case CONVERT_EXPR:
5765         case NOP_EXPR:
5766           if (IS_EMPTY_STMT (*expr_p))
5767             {
5768               ret = GS_ALL_DONE;
5769               break;
5770             }
5771
5772           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
5773               || fallback == fb_none)
5774             {
5775               /* Just strip a conversion to void (or in void context) and
5776                  try again.  */
5777               *expr_p = TREE_OPERAND (*expr_p, 0);
5778               break;
5779             }
5780
5781           ret = gimplify_conversion (expr_p);
5782           if (ret == GS_ERROR)
5783             break;
5784           if (*expr_p != save_expr)
5785             break;
5786           /* FALLTHRU */
5787
5788         case FIX_TRUNC_EXPR:
5789           /* unary_expr: ... | '(' cast ')' val | ...  */
5790           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5791                                is_gimple_val, fb_rvalue);
5792           recalculate_side_effects (*expr_p);
5793           break;
5794
5795         case INDIRECT_REF:
5796           *expr_p = fold_indirect_ref (*expr_p);
5797           if (*expr_p != save_expr)
5798             break;
5799           /* else fall through.  */
5800         case ALIGN_INDIRECT_REF:
5801         case MISALIGNED_INDIRECT_REF:
5802           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5803                                is_gimple_reg, fb_rvalue);
5804           recalculate_side_effects (*expr_p);
5805           break;
5806
5807           /* Constants need not be gimplified.  */
5808         case INTEGER_CST:
5809         case REAL_CST:
5810         case FIXED_CST:
5811         case STRING_CST:
5812         case COMPLEX_CST:
5813         case VECTOR_CST:
5814           ret = GS_ALL_DONE;
5815           break;
5816
5817         case CONST_DECL:
5818           /* If we require an lvalue, such as for ADDR_EXPR, retain the
5819              CONST_DECL node.  Otherwise the decl is replaceable by its
5820              value.  */
5821           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
5822           if (fallback & fb_lvalue)
5823             ret = GS_ALL_DONE;
5824           else
5825             *expr_p = DECL_INITIAL (*expr_p);
5826           break;
5827
5828         case DECL_EXPR:
5829           ret = gimplify_decl_expr (expr_p);
5830           break;
5831
5832         case EXC_PTR_EXPR:
5833           /* FIXME make this a decl.  */
5834           ret = GS_ALL_DONE;
5835           break;
5836
5837         case BIND_EXPR:
5838           ret = gimplify_bind_expr (expr_p, pre_p);
5839           break;
5840
5841         case LOOP_EXPR:
5842           ret = gimplify_loop_expr (expr_p, pre_p);
5843           break;
5844
5845         case SWITCH_EXPR:
5846           ret = gimplify_switch_expr (expr_p, pre_p);
5847           break;
5848
5849         case EXIT_EXPR:
5850           ret = gimplify_exit_expr (expr_p);
5851           break;
5852
5853         case GOTO_EXPR:
5854           /* If the target is not LABEL, then it is a computed jump
5855              and the target needs to be gimplified.  */
5856           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
5857             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
5858                                  NULL, is_gimple_val, fb_rvalue);
5859           break;
5860
5861         case LABEL_EXPR:
5862           ret = GS_ALL_DONE;
5863           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
5864                       == current_function_decl);
5865           break;
5866
5867         case CASE_LABEL_EXPR:
5868           ret = gimplify_case_label_expr (expr_p);
5869           break;
5870
5871         case RETURN_EXPR:
5872           ret = gimplify_return_expr (*expr_p, pre_p);
5873           break;
5874
5875         case CONSTRUCTOR:
5876           /* Don't reduce this in place; let gimplify_init_constructor work its
5877              magic.  Buf if we're just elaborating this for side effects, just
5878              gimplify any element that has side-effects.  */
5879           if (fallback == fb_none)
5880             {
5881               unsigned HOST_WIDE_INT ix;
5882               constructor_elt *ce;
5883               tree temp = NULL_TREE;
5884               for (ix = 0;
5885                    VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
5886                                 ix, ce);
5887                    ix++)
5888                 if (TREE_SIDE_EFFECTS (ce->value))
5889                   append_to_statement_list (ce->value, &temp);
5890
5891               *expr_p = temp;
5892               ret = GS_OK;
5893             }
5894           /* C99 code may assign to an array in a constructed
5895              structure or union, and this has undefined behavior only
5896              on execution, so create a temporary if an lvalue is
5897              required.  */
5898           else if (fallback == fb_lvalue)
5899             {
5900               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5901               mark_addressable (*expr_p);
5902             }
5903           else
5904             ret = GS_ALL_DONE;
5905           break;
5906
5907           /* The following are special cases that are not handled by the
5908              original GIMPLE grammar.  */
5909
5910           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
5911              eliminated.  */
5912         case SAVE_EXPR:
5913           ret = gimplify_save_expr (expr_p, pre_p, post_p);
5914           break;
5915
5916         case BIT_FIELD_REF:
5917           {
5918             enum gimplify_status r0, r1, r2;
5919
5920             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5921                                 is_gimple_lvalue, fb_either);
5922             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5923                                 is_gimple_val, fb_rvalue);
5924             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
5925                                 is_gimple_val, fb_rvalue);
5926             recalculate_side_effects (*expr_p);
5927
5928             ret = MIN (r0, MIN (r1, r2));
5929           }
5930           break;
5931
5932         case NON_LVALUE_EXPR:
5933           /* This should have been stripped above.  */
5934           gcc_unreachable ();
5935
5936         case ASM_EXPR:
5937           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
5938           break;
5939
5940         case TRY_FINALLY_EXPR:
5941         case TRY_CATCH_EXPR:
5942           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
5943           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
5944           ret = GS_ALL_DONE;
5945           break;
5946
5947         case CLEANUP_POINT_EXPR:
5948           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
5949           break;
5950
5951         case TARGET_EXPR:
5952           ret = gimplify_target_expr (expr_p, pre_p, post_p);
5953           break;
5954
5955         case CATCH_EXPR:
5956           gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
5957           ret = GS_ALL_DONE;
5958           break;
5959
5960         case EH_FILTER_EXPR:
5961           gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
5962           ret = GS_ALL_DONE;
5963           break;
5964
5965         case CHANGE_DYNAMIC_TYPE_EXPR:
5966           ret = gimplify_expr (&CHANGE_DYNAMIC_TYPE_LOCATION (*expr_p),
5967                                pre_p, post_p, is_gimple_reg, fb_lvalue);
5968           break;
5969
5970         case OBJ_TYPE_REF:
5971           {
5972             enum gimplify_status r0, r1;
5973             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
5974                                 is_gimple_val, fb_rvalue);
5975             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
5976                                 is_gimple_val, fb_rvalue);
5977             ret = MIN (r0, r1);
5978           }
5979           break;
5980
5981         case LABEL_DECL:
5982           /* We get here when taking the address of a label.  We mark
5983              the label as "forced"; meaning it can never be removed and
5984              it is a potential target for any computed goto.  */
5985           FORCED_LABEL (*expr_p) = 1;
5986           ret = GS_ALL_DONE;
5987           break;
5988
5989         case STATEMENT_LIST:
5990           ret = gimplify_statement_list (expr_p, pre_p);
5991           break;
5992
5993         case WITH_SIZE_EXPR:
5994           {
5995             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5996                            post_p == &internal_post ? NULL : post_p,
5997                            gimple_test_f, fallback);
5998             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5999                            is_gimple_val, fb_rvalue);
6000           }
6001           break;
6002
6003         case VAR_DECL:
6004         case PARM_DECL:
6005           ret = gimplify_var_or_parm_decl (expr_p);
6006           break;
6007
6008         case RESULT_DECL:
6009           /* When within an OpenMP context, notice uses of variables.  */
6010           if (gimplify_omp_ctxp)
6011             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
6012           ret = GS_ALL_DONE;
6013           break;
6014
6015         case SSA_NAME:
6016           /* Allow callbacks into the gimplifier during optimization.  */
6017           ret = GS_ALL_DONE;
6018           break;
6019
6020         case OMP_PARALLEL:
6021           ret = gimplify_omp_parallel (expr_p, pre_p);
6022           break;
6023
6024         case OMP_FOR:
6025           ret = gimplify_omp_for (expr_p, pre_p);
6026           break;
6027
6028         case OMP_SECTIONS:
6029         case OMP_SINGLE:
6030           ret = gimplify_omp_workshare (expr_p, pre_p);
6031           break;
6032
6033         case OMP_SECTION:
6034         case OMP_MASTER:
6035         case OMP_ORDERED:
6036         case OMP_CRITICAL:
6037           gimplify_to_stmt_list (&OMP_BODY (*expr_p));
6038           break;
6039
6040         case OMP_ATOMIC:
6041           ret = gimplify_omp_atomic (expr_p, pre_p);
6042           break;
6043
6044         case OMP_RETURN:
6045         case OMP_CONTINUE:
6046           ret = GS_ALL_DONE;
6047           break;
6048
6049         case POINTER_PLUS_EXPR:
6050           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
6051              The second is gimple immediate saving a need for extra statement.
6052            */
6053           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6054               && (tmp = maybe_fold_offset_to_reference
6055                          (TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
6056                           TREE_TYPE (TREE_TYPE (*expr_p)))))
6057              {
6058                tree ptr_type = build_pointer_type (TREE_TYPE (tmp));
6059                if (useless_type_conversion_p (TREE_TYPE (*expr_p), ptr_type))
6060                  {
6061                    *expr_p = build_fold_addr_expr_with_type (tmp, ptr_type);
6062                    break;
6063                  }
6064              }
6065           /* Convert (void *)&a + 4 into (void *)&a[1].  */
6066           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
6067               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6068               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
6069                                                                         0),0)))
6070               && (tmp = maybe_fold_offset_to_reference
6071                          (TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
6072                           TREE_OPERAND (*expr_p, 1),
6073                           TREE_TYPE (TREE_TYPE
6074                                   (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
6075                                                  0))))))
6076              {
6077                tmp = build_fold_addr_expr (tmp);
6078                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
6079                break;
6080              }
6081           /* FALLTHRU */
6082         default:
6083           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
6084             {
6085             case tcc_comparison:
6086               /* Handle comparison of objects of non scalar mode aggregates
6087                  with a call to memcmp.  It would be nice to only have to do
6088                  this for variable-sized objects, but then we'd have to allow
6089                  the same nest of reference nodes we allow for MODIFY_EXPR and
6090                  that's too complex.
6091
6092                  Compare scalar mode aggregates as scalar mode values.  Using
6093                  memcmp for them would be very inefficient at best, and is
6094                  plain wrong if bitfields are involved.  */
6095
6096               {
6097                 tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
6098
6099                 if (!AGGREGATE_TYPE_P (type))
6100                   goto expr_2;
6101                 else if (TYPE_MODE (type) != BLKmode)
6102                   ret = gimplify_scalar_mode_aggregate_compare (expr_p);
6103                 else
6104                   ret = gimplify_variable_sized_compare (expr_p);
6105
6106                 break;
6107                 }
6108
6109             /* If *EXPR_P does not need to be special-cased, handle it
6110                according to its class.  */
6111             case tcc_unary:
6112               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6113                                    post_p, is_gimple_val, fb_rvalue);
6114               break;
6115
6116             case tcc_binary:
6117             expr_2:
6118               {
6119                 enum gimplify_status r0, r1;
6120
6121                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6122                                     post_p, is_gimple_val, fb_rvalue);
6123                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6124                                     post_p, is_gimple_val, fb_rvalue);
6125
6126                 ret = MIN (r0, r1);
6127                 break;
6128               }
6129
6130             case tcc_declaration:
6131             case tcc_constant:
6132               ret = GS_ALL_DONE;
6133               goto dont_recalculate;
6134
6135             default:
6136               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
6137                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
6138                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
6139               goto expr_2;
6140             }
6141
6142           recalculate_side_effects (*expr_p);
6143         dont_recalculate:
6144           break;
6145         }
6146
6147       /* If we replaced *expr_p, gimplify again.  */
6148       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
6149         ret = GS_ALL_DONE;
6150     }
6151   while (ret == GS_OK);
6152
6153   /* If we encountered an error_mark somewhere nested inside, either
6154      stub out the statement or propagate the error back out.  */
6155   if (ret == GS_ERROR)
6156     {
6157       if (is_statement)
6158         *expr_p = NULL;
6159       goto out;
6160     }
6161
6162   /* This was only valid as a return value from the langhook, which
6163      we handled.  Make sure it doesn't escape from any other context.  */
6164   gcc_assert (ret != GS_UNHANDLED);
6165
6166   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
6167     {
6168       /* We aren't looking for a value, and we don't have a valid
6169          statement.  If it doesn't have side-effects, throw it away.  */
6170       if (!TREE_SIDE_EFFECTS (*expr_p))
6171         *expr_p = NULL;
6172       else if (!TREE_THIS_VOLATILE (*expr_p))
6173         {
6174           /* This is probably a _REF that contains something nested that
6175              has side effects.  Recurse through the operands to find it.  */
6176           enum tree_code code = TREE_CODE (*expr_p);
6177
6178           switch (code)
6179             {
6180             case COMPONENT_REF:
6181             case REALPART_EXPR:
6182             case IMAGPART_EXPR:
6183             case VIEW_CONVERT_EXPR:
6184               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6185                              gimple_test_f, fallback);
6186               break;
6187
6188             case ARRAY_REF:
6189             case ARRAY_RANGE_REF:
6190               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6191                              gimple_test_f, fallback);
6192               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6193                              gimple_test_f, fallback);
6194               break;
6195
6196             default:
6197                /* Anything else with side-effects must be converted to
6198                   a valid statement before we get here.  */
6199               gcc_unreachable ();
6200             }
6201
6202           *expr_p = NULL;
6203         }
6204       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
6205                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
6206         {
6207           /* Historically, the compiler has treated a bare reference
6208              to a non-BLKmode volatile lvalue as forcing a load.  */
6209           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
6210           /* Normally, we do not want to create a temporary for a
6211              TREE_ADDRESSABLE type because such a type should not be
6212              copied by bitwise-assignment.  However, we make an
6213              exception here, as all we are doing here is ensuring that
6214              we read the bytes that make up the type.  We use
6215              create_tmp_var_raw because create_tmp_var will abort when
6216              given a TREE_ADDRESSABLE type.  */
6217           tree tmp = create_tmp_var_raw (type, "vol");
6218           gimple_add_tmp_var (tmp);
6219           *expr_p = build_gimple_modify_stmt (tmp, *expr_p);
6220         }
6221       else
6222         /* We can't do anything useful with a volatile reference to
6223            an incomplete type, so just throw it away.  Likewise for
6224            a BLKmode type, since any implicit inner load should
6225            already have been turned into an explicit one by the
6226            gimplification process.  */
6227         *expr_p = NULL;
6228     }
6229
6230   /* If we are gimplifying at the statement level, we're done.  Tack
6231      everything together and replace the original statement with the
6232      gimplified form.  */
6233   if (fallback == fb_none || is_statement)
6234     {
6235       if (internal_pre || internal_post)
6236         {
6237           append_to_statement_list (*expr_p, &internal_pre);
6238           append_to_statement_list (internal_post, &internal_pre);
6239           annotate_all_with_locus (&internal_pre, input_location);
6240           *expr_p = internal_pre;
6241         }
6242       else if (!*expr_p)
6243         ;
6244       else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
6245         annotate_all_with_locus (expr_p, input_location);
6246       else
6247         annotate_one_with_locus (*expr_p, input_location);
6248       goto out;
6249     }
6250
6251   /* Otherwise we're gimplifying a subexpression, so the resulting value is
6252      interesting.  */
6253
6254   /* If it's sufficiently simple already, we're done.  Unless we are
6255      handling some post-effects internally; if that's the case, we need to
6256      copy into a temp before adding the post-effects to the tree.  */
6257   if (!internal_post && (*gimple_test_f) (*expr_p))
6258     goto out;
6259
6260   /* Otherwise, we need to create a new temporary for the gimplified
6261      expression.  */
6262
6263   /* We can't return an lvalue if we have an internal postqueue.  The
6264      object the lvalue refers to would (probably) be modified by the
6265      postqueue; we need to copy the value out first, which means an
6266      rvalue.  */
6267   if ((fallback & fb_lvalue) && !internal_post
6268       && is_gimple_addressable (*expr_p))
6269     {
6270       /* An lvalue will do.  Take the address of the expression, store it
6271          in a temporary, and replace the expression with an INDIRECT_REF of
6272          that temporary.  */
6273       tmp = build_fold_addr_expr (*expr_p);
6274       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
6275       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
6276     }
6277   else if ((fallback & fb_rvalue) && is_gimple_formal_tmp_rhs (*expr_p))
6278     {
6279       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
6280
6281       /* An rvalue will do.  Assign the gimplified expression into a new
6282          temporary TMP and replace the original expression with TMP.  */
6283
6284       if (internal_post || (fallback & fb_lvalue))
6285         /* The postqueue might change the value of the expression between
6286            the initialization and use of the temporary, so we can't use a
6287            formal temp.  FIXME do we care?  */
6288         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6289       else
6290         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
6291
6292       if (TREE_CODE (*expr_p) != SSA_NAME)
6293         DECL_GIMPLE_FORMAL_TEMP_P (*expr_p) = 1;
6294     }
6295   else
6296     {
6297 #ifdef ENABLE_CHECKING
6298       if (!(fallback & fb_mayfail))
6299         {
6300           fprintf (stderr, "gimplification failed:\n");
6301           print_generic_expr (stderr, *expr_p, 0);
6302           debug_tree (*expr_p);
6303           internal_error ("gimplification failed");
6304         }
6305 #endif
6306       gcc_assert (fallback & fb_mayfail);
6307       /* If this is an asm statement, and the user asked for the
6308          impossible, don't die.  Fail and let gimplify_asm_expr
6309          issue an error.  */
6310       ret = GS_ERROR;
6311       goto out;
6312     }
6313
6314   /* Make sure the temporary matches our predicate.  */
6315   gcc_assert ((*gimple_test_f) (*expr_p));
6316
6317   if (internal_post)
6318     {
6319       annotate_all_with_locus (&internal_post, input_location);
6320       append_to_statement_list (internal_post, pre_p);
6321     }
6322
6323  out:
6324   input_location = saved_location;
6325   return ret;
6326 }
6327
6328 /* Look through TYPE for variable-sized objects and gimplify each such
6329    size that we find.  Add to LIST_P any statements generated.  */
6330
6331 void
6332 gimplify_type_sizes (tree type, tree *list_p)
6333 {
6334   tree field, t;
6335
6336   if (type == NULL || type == error_mark_node)
6337     return;
6338
6339   /* We first do the main variant, then copy into any other variants.  */
6340   type = TYPE_MAIN_VARIANT (type);
6341
6342   /* Avoid infinite recursion.  */
6343   if (TYPE_SIZES_GIMPLIFIED (type))
6344     return;
6345
6346   TYPE_SIZES_GIMPLIFIED (type) = 1;
6347
6348   switch (TREE_CODE (type))
6349     {
6350     case INTEGER_TYPE:
6351     case ENUMERAL_TYPE:
6352     case BOOLEAN_TYPE:
6353     case REAL_TYPE:
6354     case FIXED_POINT_TYPE:
6355       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
6356       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
6357
6358       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6359         {
6360           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
6361           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
6362         }
6363       break;
6364
6365     case ARRAY_TYPE:
6366       /* These types may not have declarations, so handle them here.  */
6367       gimplify_type_sizes (TREE_TYPE (type), list_p);
6368       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
6369       break;
6370
6371     case RECORD_TYPE:
6372     case UNION_TYPE:
6373     case QUAL_UNION_TYPE:
6374       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6375         if (TREE_CODE (field) == FIELD_DECL)
6376           {
6377             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
6378             gimplify_type_sizes (TREE_TYPE (field), list_p);
6379           }
6380       break;
6381
6382     case POINTER_TYPE:
6383     case REFERENCE_TYPE:
6384         /* We used to recurse on the pointed-to type here, which turned out to
6385            be incorrect because its definition might refer to variables not
6386            yet initialized at this point if a forward declaration is involved.
6387
6388            It was actually useful for anonymous pointed-to types to ensure
6389            that the sizes evaluation dominates every possible later use of the
6390            values.  Restricting to such types here would be safe since there
6391            is no possible forward declaration around, but would introduce an
6392            undesirable middle-end semantic to anonymity.  We then defer to
6393            front-ends the responsibility of ensuring that the sizes are
6394            evaluated both early and late enough, e.g. by attaching artificial
6395            type declarations to the tree.  */
6396       break;
6397
6398     default:
6399       break;
6400     }
6401
6402   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
6403   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
6404
6405   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6406     {
6407       TYPE_SIZE (t) = TYPE_SIZE (type);
6408       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
6409       TYPE_SIZES_GIMPLIFIED (t) = 1;
6410     }
6411 }
6412
6413 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
6414    a size or position, has had all of its SAVE_EXPRs evaluated.
6415    We add any required statements to STMT_P.  */
6416
6417 void
6418 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
6419 {
6420   tree type, expr = *expr_p;
6421
6422   /* We don't do anything if the value isn't there, is constant, or contains
6423      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
6424      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
6425      will want to replace it with a new variable, but that will cause problems
6426      if this type is from outside the function.  It's OK to have that here.  */
6427   if (expr == NULL_TREE || TREE_CONSTANT (expr)
6428       || TREE_CODE (expr) == VAR_DECL
6429       || CONTAINS_PLACEHOLDER_P (expr))
6430     return;
6431
6432   type = TREE_TYPE (expr);
6433   *expr_p = unshare_expr (expr);
6434
6435   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
6436   expr = *expr_p;
6437
6438   /* Verify that we've an exact type match with the original expression.
6439      In particular, we do not wish to drop a "sizetype" in favour of a
6440      type of similar dimensions.  We don't want to pollute the generic
6441      type-stripping code with this knowledge because it doesn't matter
6442      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
6443      and friends retain their "sizetype-ness".  */
6444   if (TREE_TYPE (expr) != type
6445       && TREE_CODE (type) == INTEGER_TYPE
6446       && TYPE_IS_SIZETYPE (type))
6447     {
6448       tree tmp;
6449
6450       *expr_p = create_tmp_var (type, NULL);
6451       tmp = build1 (NOP_EXPR, type, expr);
6452       tmp = build_gimple_modify_stmt (*expr_p, tmp);
6453       if (EXPR_HAS_LOCATION (expr))
6454         SET_EXPR_LOCUS (tmp, EXPR_LOCUS (expr));
6455       else
6456         SET_EXPR_LOCATION (tmp, input_location);
6457
6458       gimplify_and_add (tmp, stmt_p);
6459     }
6460 }
6461 \f
6462
6463 /* Gimplify the body of statements pointed to by BODY_P.  FNDECL is the
6464    function decl containing BODY.  */
6465
6466 void
6467 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
6468 {
6469   location_t saved_location = input_location;
6470   tree body, parm_stmts;
6471
6472   timevar_push (TV_TREE_GIMPLIFY);
6473
6474   gcc_assert (gimplify_ctxp == NULL);
6475   push_gimplify_context ();
6476
6477   /* Unshare most shared trees in the body and in that of any nested functions.
6478      It would seem we don't have to do this for nested functions because
6479      they are supposed to be output and then the outer function gimplified
6480      first, but the g++ front end doesn't always do it that way.  */
6481   unshare_body (body_p, fndecl);
6482   unvisit_body (body_p, fndecl);
6483
6484   /* Make sure input_location isn't set to something wierd.  */
6485   input_location = DECL_SOURCE_LOCATION (fndecl);
6486
6487   /* Resolve callee-copies.  This has to be done before processing
6488      the body so that DECL_VALUE_EXPR gets processed correctly.  */
6489   parm_stmts = do_parms ? gimplify_parameters () : NULL;
6490
6491   /* Gimplify the function's body.  */
6492   gimplify_stmt (body_p);
6493   body = *body_p;
6494
6495   if (!body)
6496     body = alloc_stmt_list ();
6497   else if (TREE_CODE (body) == STATEMENT_LIST)
6498     {
6499       tree t = expr_only (*body_p);
6500       if (t)
6501         body = t;
6502     }
6503
6504   /* If there isn't an outer BIND_EXPR, add one.  */
6505   if (TREE_CODE (body) != BIND_EXPR)
6506     {
6507       tree b = build3 (BIND_EXPR, void_type_node, NULL_TREE,
6508                        NULL_TREE, NULL_TREE);
6509       TREE_SIDE_EFFECTS (b) = 1;
6510       append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
6511       body = b;
6512     }
6513
6514   /* If we had callee-copies statements, insert them at the beginning
6515      of the function.  */
6516   if (parm_stmts)
6517     {
6518       append_to_statement_list_force (BIND_EXPR_BODY (body), &parm_stmts);
6519       BIND_EXPR_BODY (body) = parm_stmts;
6520     }
6521
6522   /* Unshare again, in case gimplification was sloppy.  */
6523   unshare_all_trees (body);
6524
6525   *body_p = body;
6526
6527   pop_gimplify_context (body);
6528   gcc_assert (gimplify_ctxp == NULL);
6529
6530 #ifdef ENABLE_TYPES_CHECKING
6531   if (!errorcount && !sorrycount)
6532     verify_gimple_1 (BIND_EXPR_BODY (*body_p));
6533 #endif
6534
6535   timevar_pop (TV_TREE_GIMPLIFY);
6536   input_location = saved_location;
6537 }
6538
6539 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
6540    node for the function we want to gimplify.  */
6541
6542 void
6543 gimplify_function_tree (tree fndecl)
6544 {
6545   tree oldfn, parm, ret;
6546
6547   oldfn = current_function_decl;
6548   current_function_decl = fndecl;
6549   if (DECL_STRUCT_FUNCTION (fndecl))
6550     push_cfun (DECL_STRUCT_FUNCTION (fndecl));
6551   else
6552     push_struct_function (fndecl);
6553
6554   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
6555     {
6556       /* Preliminarily mark non-addressed complex variables as eligible
6557          for promotion to gimple registers.  We'll transform their uses
6558          as we find them.  */
6559       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
6560            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
6561           && !TREE_THIS_VOLATILE (parm)
6562           && !needs_to_live_in_memory (parm))
6563         DECL_GIMPLE_REG_P (parm) = 1;
6564     }
6565
6566   ret = DECL_RESULT (fndecl);
6567   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
6568            || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
6569       && !needs_to_live_in_memory (ret))
6570     DECL_GIMPLE_REG_P (ret) = 1;
6571
6572   gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
6573
6574   /* If we're instrumenting function entry/exit, then prepend the call to
6575      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
6576      catch the exit hook.  */
6577   /* ??? Add some way to ignore exceptions for this TFE.  */
6578   if (flag_instrument_function_entry_exit
6579       && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
6580       && !flag_instrument_functions_exclude_p (fndecl))
6581     {
6582       tree tf, x, bind;
6583
6584       tf = build2 (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
6585       TREE_SIDE_EFFECTS (tf) = 1;
6586       x = DECL_SAVED_TREE (fndecl);
6587       append_to_statement_list (x, &TREE_OPERAND (tf, 0));
6588       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
6589       x = build_call_expr (x, 0);
6590       append_to_statement_list (x, &TREE_OPERAND (tf, 1));
6591
6592       bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);
6593       TREE_SIDE_EFFECTS (bind) = 1;
6594       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
6595       x = build_call_expr (x, 0);
6596       append_to_statement_list (x, &BIND_EXPR_BODY (bind));
6597       append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
6598
6599       DECL_SAVED_TREE (fndecl) = bind;
6600     }
6601
6602   cfun->gimplified = true;
6603   current_function_decl = oldfn;
6604   pop_cfun ();
6605 }
6606 \f
6607 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
6608    force the result to be either ssa_name or an invariant, otherwise
6609    just force it to be a rhs expression.  If VAR is not NULL, make the
6610    base variable of the final destination be VAR if suitable.  */
6611
6612 tree
6613 force_gimple_operand (tree expr, tree *stmts, bool simple, tree var)
6614 {
6615   tree t;
6616   enum gimplify_status ret;
6617   gimple_predicate gimple_test_f;
6618
6619   *stmts = NULL_TREE;
6620
6621   if (is_gimple_val (expr))
6622     return expr;
6623
6624   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
6625
6626   push_gimplify_context ();
6627   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
6628
6629   if (var)
6630     expr = build_gimple_modify_stmt (var, expr);
6631
6632   if (TREE_CODE (expr) != GIMPLE_MODIFY_STMT
6633       && TREE_TYPE (expr) == void_type_node)
6634     {
6635       gimplify_and_add (expr, stmts);
6636       expr = NULL_TREE;
6637     }
6638   else
6639     {
6640       ret = gimplify_expr (&expr, stmts, NULL,
6641                            gimple_test_f, fb_rvalue);
6642       gcc_assert (ret != GS_ERROR);
6643     }
6644
6645   if (gimple_referenced_vars (cfun))
6646     {
6647       for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
6648         add_referenced_var (t);
6649     }
6650
6651   pop_gimplify_context (NULL);
6652
6653   return expr;
6654 }
6655
6656 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
6657    some statements are produced, emits them at BSI.  If BEFORE is true.
6658    the statements are appended before BSI, otherwise they are appended after
6659    it.  M specifies the way BSI moves after insertion (BSI_SAME_STMT or
6660    BSI_CONTINUE_LINKING are the usual values).  */
6661
6662 tree
6663 force_gimple_operand_bsi (block_stmt_iterator *bsi, tree expr,
6664                           bool simple_p, tree var, bool before,
6665                           enum bsi_iterator_update m)
6666 {
6667   tree stmts;
6668
6669   expr = force_gimple_operand (expr, &stmts, simple_p, var);
6670   if (stmts)
6671     {
6672       if (gimple_in_ssa_p (cfun))
6673         {
6674           tree_stmt_iterator tsi;
6675
6676           for (tsi = tsi_start (stmts); !tsi_end_p (tsi); tsi_next (&tsi))
6677             mark_symbols_for_renaming (tsi_stmt (tsi));
6678         }
6679
6680       if (before)
6681         bsi_insert_before (bsi, stmts, m);
6682       else
6683         bsi_insert_after (bsi, stmts, m);
6684     }
6685
6686   return expr;
6687 }
6688
6689 #include "gt-gimplify.h"