OSDN Git Service

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