OSDN Git Service

PR inline-asm/32109
[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         return 0;
4886       code = OMP_CLAUSE_SHARED;
4887     }
4888   else if (flags & GOVD_PRIVATE)
4889     code = OMP_CLAUSE_PRIVATE;
4890   else if (flags & GOVD_FIRSTPRIVATE)
4891     code = OMP_CLAUSE_FIRSTPRIVATE;
4892   else
4893     gcc_unreachable ();
4894
4895   clause = build_omp_clause (code);
4896   OMP_CLAUSE_DECL (clause) = decl;
4897   OMP_CLAUSE_CHAIN (clause) = *list_p;
4898   if (private_debug)
4899     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
4900   *list_p = clause;
4901
4902   return 0;
4903 }
4904
4905 static void
4906 gimplify_adjust_omp_clauses (tree *list_p)
4907 {
4908   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
4909   tree c, decl;
4910
4911   while ((c = *list_p) != NULL)
4912     {
4913       splay_tree_node n;
4914       bool remove = false;
4915
4916       switch (OMP_CLAUSE_CODE (c))
4917         {
4918         case OMP_CLAUSE_PRIVATE:
4919         case OMP_CLAUSE_SHARED:
4920         case OMP_CLAUSE_FIRSTPRIVATE:
4921           decl = OMP_CLAUSE_DECL (c);
4922           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4923           remove = !(n->value & GOVD_SEEN);
4924           if (! remove)
4925             {
4926               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
4927               if ((n->value & GOVD_DEBUG_PRIVATE)
4928                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
4929                 {
4930                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
4931                               || ((n->value & GOVD_DATA_SHARE_CLASS)
4932                                   == GOVD_PRIVATE));
4933                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
4934                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
4935                 }
4936             }
4937           break;
4938
4939         case OMP_CLAUSE_LASTPRIVATE:
4940           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
4941              accurately reflect the presence of a FIRSTPRIVATE clause.  */
4942           decl = OMP_CLAUSE_DECL (c);
4943           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4944           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
4945             = (n->value & GOVD_FIRSTPRIVATE) != 0;
4946           break;
4947           
4948         case OMP_CLAUSE_REDUCTION:
4949         case OMP_CLAUSE_COPYIN:
4950         case OMP_CLAUSE_COPYPRIVATE:
4951         case OMP_CLAUSE_IF:
4952         case OMP_CLAUSE_NUM_THREADS:
4953         case OMP_CLAUSE_SCHEDULE:
4954         case OMP_CLAUSE_NOWAIT:
4955         case OMP_CLAUSE_ORDERED:
4956         case OMP_CLAUSE_DEFAULT:
4957           break;
4958
4959         default:
4960           gcc_unreachable ();
4961         }
4962
4963       if (remove)
4964         *list_p = OMP_CLAUSE_CHAIN (c);
4965       else
4966         list_p = &OMP_CLAUSE_CHAIN (c);
4967     }
4968
4969   /* Add in any implicit data sharing.  */
4970   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
4971   
4972   gimplify_omp_ctxp = ctx->outer_context;
4973   delete_omp_context (ctx);
4974 }
4975
4976 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
4977    gimplification of the body, as well as scanning the body for used
4978    variables.  We need to do this scan now, because variable-sized
4979    decls will be decomposed during gimplification.  */
4980
4981 static enum gimplify_status
4982 gimplify_omp_parallel (tree *expr_p, tree *pre_p)
4983 {
4984   tree expr = *expr_p;
4985
4986   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p, true,
4987                              OMP_PARALLEL_COMBINED (expr));
4988
4989   push_gimplify_context ();
4990
4991   gimplify_stmt (&OMP_PARALLEL_BODY (expr));
4992
4993   if (TREE_CODE (OMP_PARALLEL_BODY (expr)) == BIND_EXPR)
4994     pop_gimplify_context (OMP_PARALLEL_BODY (expr));
4995   else
4996     pop_gimplify_context (NULL_TREE);
4997
4998   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
4999
5000   return GS_ALL_DONE;
5001 }
5002
5003 /* Gimplify the gross structure of an OMP_FOR statement.  */
5004
5005 static enum gimplify_status
5006 gimplify_omp_for (tree *expr_p, tree *pre_p)
5007 {
5008   tree for_stmt, decl, t;
5009   enum gimplify_status ret = GS_OK;
5010
5011   for_stmt = *expr_p;
5012
5013   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, false, false);
5014
5015   t = OMP_FOR_INIT (for_stmt);
5016   gcc_assert (TREE_CODE (t) == MODIFY_EXPR
5017               || TREE_CODE (t) == GIMPLE_MODIFY_STMT);
5018   decl = GENERIC_TREE_OPERAND (t, 0);
5019   gcc_assert (DECL_P (decl));
5020   gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl)));
5021
5022   /* Make sure the iteration variable is private.  */
5023   if (omp_is_private (gimplify_omp_ctxp, decl))
5024     omp_notice_variable (gimplify_omp_ctxp, decl, true);
5025   else
5026     omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
5027
5028   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5029                         &OMP_FOR_PRE_BODY (for_stmt),
5030                         NULL, is_gimple_val, fb_rvalue);
5031
5032   tree_to_gimple_tuple (&OMP_FOR_INIT (for_stmt));
5033
5034   t = OMP_FOR_COND (for_stmt);
5035   gcc_assert (COMPARISON_CLASS_P (t));
5036   gcc_assert (GENERIC_TREE_OPERAND (t, 0) == decl);
5037
5038   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5039                         &OMP_FOR_PRE_BODY (for_stmt),
5040                         NULL, is_gimple_val, fb_rvalue);
5041
5042   tree_to_gimple_tuple (&OMP_FOR_INCR (for_stmt));
5043   t = OMP_FOR_INCR (for_stmt);
5044   switch (TREE_CODE (t))
5045     {
5046     case PREINCREMENT_EXPR:
5047     case POSTINCREMENT_EXPR:
5048       t = build_int_cst (TREE_TYPE (decl), 1);
5049       t = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, t);
5050       t = build_gimple_modify_stmt (decl, t);
5051       OMP_FOR_INCR (for_stmt) = t;
5052       break;
5053
5054     case PREDECREMENT_EXPR:
5055     case POSTDECREMENT_EXPR:
5056       t = build_int_cst (TREE_TYPE (decl), -1);
5057       t = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, t);
5058       t = build_gimple_modify_stmt (decl, t);
5059       OMP_FOR_INCR (for_stmt) = t;
5060       break;
5061       
5062     case GIMPLE_MODIFY_STMT:
5063       gcc_assert (GIMPLE_STMT_OPERAND (t, 0) == decl);
5064       t = GIMPLE_STMT_OPERAND (t, 1);
5065       switch (TREE_CODE (t))
5066         {
5067         case PLUS_EXPR:
5068           if (TREE_OPERAND (t, 1) == decl)
5069             {
5070               TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
5071               TREE_OPERAND (t, 0) = decl;
5072               break;
5073             }
5074         case MINUS_EXPR:
5075           gcc_assert (TREE_OPERAND (t, 0) == decl);
5076           break;
5077         default:
5078           gcc_unreachable ();
5079         }
5080
5081       ret |= gimplify_expr (&TREE_OPERAND (t, 1), &OMP_FOR_PRE_BODY (for_stmt),
5082                             NULL, is_gimple_val, fb_rvalue);
5083       break;
5084
5085     default:
5086       gcc_unreachable ();
5087     }
5088
5089   gimplify_to_stmt_list (&OMP_FOR_BODY (for_stmt));
5090   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
5091
5092   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
5093 }
5094
5095 /* Gimplify the gross structure of other OpenMP worksharing constructs.
5096    In particular, OMP_SECTIONS and OMP_SINGLE.  */
5097
5098 static enum gimplify_status
5099 gimplify_omp_workshare (tree *expr_p, tree *pre_p)
5100 {
5101   tree stmt = *expr_p;
5102
5103   gimplify_scan_omp_clauses (&OMP_CLAUSES (stmt), pre_p, false, false);
5104   gimplify_to_stmt_list (&OMP_BODY (stmt));
5105   gimplify_adjust_omp_clauses (&OMP_CLAUSES (stmt));
5106
5107   return GS_ALL_DONE;
5108 }
5109
5110 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
5111    stabilized the lhs of the atomic operation as *ADDR.  Return true if 
5112    EXPR is this stabilized form.  */
5113
5114 static bool
5115 goa_lhs_expr_p (tree expr, tree addr)
5116 {
5117   /* Also include casts to other type variants.  The C front end is fond
5118      of adding these for e.g. volatile variables.  This is like 
5119      STRIP_TYPE_NOPS but includes the main variant lookup.  */
5120   while ((TREE_CODE (expr) == NOP_EXPR
5121           || TREE_CODE (expr) == CONVERT_EXPR
5122           || TREE_CODE (expr) == NON_LVALUE_EXPR)
5123          && TREE_OPERAND (expr, 0) != error_mark_node
5124          && (TYPE_MAIN_VARIANT (TREE_TYPE (expr))
5125              == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
5126     expr = TREE_OPERAND (expr, 0);
5127
5128   if (TREE_CODE (expr) == INDIRECT_REF && TREE_OPERAND (expr, 0) == addr)
5129     return true;
5130   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
5131     return true;
5132   return false;
5133 }
5134
5135 /* A subroutine of gimplify_omp_atomic.  Attempt to implement the atomic
5136    operation as a __sync_fetch_and_op builtin.  INDEX is log2 of the
5137    size of the data type, and thus usable to find the index of the builtin
5138    decl.  Returns GS_UNHANDLED if the expression is not of the proper form.  */
5139
5140 static enum gimplify_status
5141 gimplify_omp_atomic_fetch_op (tree *expr_p, tree addr, tree rhs, int index)
5142 {
5143   enum built_in_function base;
5144   tree decl, itype;
5145   enum insn_code *optab;
5146
5147   /* Check for one of the supported fetch-op operations.  */
5148   switch (TREE_CODE (rhs))
5149     {
5150     case POINTER_PLUS_EXPR:
5151     case PLUS_EXPR:
5152       base = BUILT_IN_FETCH_AND_ADD_N;
5153       optab = sync_add_optab;
5154       break;
5155     case MINUS_EXPR:
5156       base = BUILT_IN_FETCH_AND_SUB_N;
5157       optab = sync_add_optab;
5158       break;
5159     case BIT_AND_EXPR:
5160       base = BUILT_IN_FETCH_AND_AND_N;
5161       optab = sync_and_optab;
5162       break;
5163     case BIT_IOR_EXPR:
5164       base = BUILT_IN_FETCH_AND_OR_N;
5165       optab = sync_ior_optab;
5166       break;
5167     case BIT_XOR_EXPR:
5168       base = BUILT_IN_FETCH_AND_XOR_N;
5169       optab = sync_xor_optab;
5170       break;
5171     default:
5172       return GS_UNHANDLED;
5173     }
5174
5175   /* Make sure the expression is of the proper form.  */
5176   if (goa_lhs_expr_p (TREE_OPERAND (rhs, 0), addr))
5177     rhs = TREE_OPERAND (rhs, 1);
5178   else if (commutative_tree_code (TREE_CODE (rhs))
5179            && goa_lhs_expr_p (TREE_OPERAND (rhs, 1), addr))
5180     rhs = TREE_OPERAND (rhs, 0);
5181   else
5182     return GS_UNHANDLED;
5183
5184   decl = built_in_decls[base + index + 1];
5185   itype = TREE_TYPE (TREE_TYPE (decl));
5186
5187   if (optab[TYPE_MODE (itype)] == CODE_FOR_nothing)
5188     return GS_UNHANDLED;
5189
5190   *expr_p = build_call_expr (decl, 2, addr, fold_convert (itype, rhs));
5191   return GS_OK;
5192 }
5193
5194 /* A subroutine of gimplify_omp_atomic_pipeline.  Walk *EXPR_P and replace
5195    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
5196    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
5197    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
5198
5199 static int
5200 goa_stabilize_expr (tree *expr_p, tree *pre_p, tree lhs_addr, tree lhs_var)
5201 {
5202   tree expr = *expr_p;
5203   int saw_lhs;
5204
5205   if (goa_lhs_expr_p (expr, lhs_addr))
5206     {
5207       *expr_p = lhs_var;
5208       return 1;
5209     }
5210   if (is_gimple_val (expr))
5211     return 0;
5212  
5213   saw_lhs = 0;
5214   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
5215     {
5216     case tcc_binary:
5217       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
5218                                      lhs_addr, lhs_var);
5219     case tcc_unary:
5220       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
5221                                      lhs_addr, lhs_var);
5222       break;
5223     default:
5224       break;
5225     }
5226
5227   if (saw_lhs == 0)
5228     {
5229       enum gimplify_status gs;
5230       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
5231       if (gs != GS_ALL_DONE)
5232         saw_lhs = -1;
5233     }
5234
5235   return saw_lhs;
5236 }
5237
5238 /* A subroutine of gimplify_omp_atomic.  Implement the atomic operation as:
5239
5240         oldval = *addr;
5241       repeat:
5242         newval = rhs;   // with oldval replacing *addr in rhs
5243         oldval = __sync_val_compare_and_swap (addr, oldval, newval);
5244         if (oldval != newval)
5245           goto repeat;
5246
5247    INDEX is log2 of the size of the data type, and thus usable to find the
5248    index of the builtin decl.  */
5249
5250 static enum gimplify_status
5251 gimplify_omp_atomic_pipeline (tree *expr_p, tree *pre_p, tree addr,
5252                               tree rhs, int index)
5253 {
5254   tree oldval, oldival, oldival2, newval, newival, label;
5255   tree type, itype, cmpxchg, x, iaddr;
5256
5257   cmpxchg = built_in_decls[BUILT_IN_VAL_COMPARE_AND_SWAP_N + index + 1];
5258   type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
5259   itype = TREE_TYPE (TREE_TYPE (cmpxchg));
5260
5261   if (sync_compare_and_swap[TYPE_MODE (itype)] == CODE_FOR_nothing)
5262     return GS_UNHANDLED;
5263
5264   oldval = create_tmp_var (type, NULL);
5265   newval = create_tmp_var (type, NULL);
5266
5267   /* Precompute as much of RHS as possible.  In the same walk, replace
5268      occurrences of the lhs value with our temporary.  */
5269   if (goa_stabilize_expr (&rhs, pre_p, addr, oldval) < 0)
5270     return GS_ERROR;
5271
5272   x = build_fold_indirect_ref (addr);
5273   x = build_gimple_modify_stmt (oldval, x);
5274   gimplify_and_add (x, pre_p);
5275
5276   /* For floating-point values, we'll need to view-convert them to integers
5277      so that we can perform the atomic compare and swap.  Simplify the 
5278      following code by always setting up the "i"ntegral variables.  */
5279   if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
5280     {
5281       oldival = oldval;
5282       newival = newval;
5283       iaddr = addr;
5284     }
5285   else
5286     {
5287       oldival = create_tmp_var (itype, NULL);
5288       newival = create_tmp_var (itype, NULL);
5289
5290       x = build1 (VIEW_CONVERT_EXPR, itype, oldval);
5291       x = build_gimple_modify_stmt (oldival, x);
5292       gimplify_and_add (x, pre_p);
5293       iaddr = fold_convert (build_pointer_type (itype), addr);
5294     }
5295
5296   oldival2 = create_tmp_var (itype, NULL);
5297
5298   label = create_artificial_label ();
5299   x = build1 (LABEL_EXPR, void_type_node, label);
5300   gimplify_and_add (x, pre_p);
5301
5302   x = build_gimple_modify_stmt (newval, rhs);
5303   gimplify_and_add (x, pre_p);
5304
5305   if (newval != newival)
5306     {
5307       x = build1 (VIEW_CONVERT_EXPR, itype, newval);
5308       x = build_gimple_modify_stmt (newival, x);
5309       gimplify_and_add (x, pre_p);
5310     }
5311
5312   x = build_gimple_modify_stmt (oldival2, fold_convert (itype, oldival));
5313   gimplify_and_add (x, pre_p);
5314
5315   x = build_call_expr (cmpxchg, 3, iaddr, fold_convert (itype, oldival),
5316                        fold_convert (itype, newival));
5317   if (oldval == oldival)
5318     x = fold_convert (type, x);
5319   x = build_gimple_modify_stmt (oldival, x);
5320   gimplify_and_add (x, pre_p);
5321
5322   /* For floating point, be prepared for the loop backedge.  */
5323   if (oldval != oldival)
5324     {
5325       x = build1 (VIEW_CONVERT_EXPR, type, oldival);
5326       x = build_gimple_modify_stmt (oldval, x);
5327       gimplify_and_add (x, pre_p);
5328     }
5329
5330   /* Note that we always perform the comparison as an integer, even for
5331      floating point.  This allows the atomic operation to properly 
5332      succeed even with NaNs and -0.0.  */
5333   x = build3 (COND_EXPR, void_type_node,
5334               build2 (NE_EXPR, boolean_type_node,
5335                       fold_convert (itype, oldival), oldival2),
5336               build1 (GOTO_EXPR, void_type_node, label), NULL);
5337   gimplify_and_add (x, pre_p);
5338
5339   *expr_p = NULL;
5340   return GS_ALL_DONE;
5341 }
5342
5343 /* A subroutine of gimplify_omp_atomic.  Implement the atomic operation as:
5344
5345         GOMP_atomic_start ();
5346         *addr = rhs;
5347         GOMP_atomic_end ();
5348
5349    The result is not globally atomic, but works so long as all parallel
5350    references are within #pragma omp atomic directives.  According to
5351    responses received from omp@openmp.org, appears to be within spec.
5352    Which makes sense, since that's how several other compilers handle
5353    this situation as well.  */
5354
5355 static enum gimplify_status
5356 gimplify_omp_atomic_mutex (tree *expr_p, tree *pre_p, tree addr, tree rhs)
5357 {
5358   tree t;
5359
5360   t = built_in_decls[BUILT_IN_GOMP_ATOMIC_START];
5361   t = build_call_expr (t, 0);
5362   gimplify_and_add (t, pre_p);
5363
5364   t = build_fold_indirect_ref (addr);
5365   t = build_gimple_modify_stmt (t, rhs);
5366   gimplify_and_add (t, pre_p);
5367   
5368   t = built_in_decls[BUILT_IN_GOMP_ATOMIC_END];
5369   t = build_call_expr (t, 0);
5370   gimplify_and_add (t, pre_p);
5371
5372   *expr_p = NULL;
5373   return GS_ALL_DONE;
5374 }
5375
5376 /* Gimplify an OMP_ATOMIC statement.  */
5377
5378 static enum gimplify_status
5379 gimplify_omp_atomic (tree *expr_p, tree *pre_p)
5380 {
5381   tree addr = TREE_OPERAND (*expr_p, 0);
5382   tree rhs = TREE_OPERAND (*expr_p, 1);
5383   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
5384   HOST_WIDE_INT index;
5385
5386   /* Make sure the type is one of the supported sizes.  */
5387   index = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5388   index = exact_log2 (index);
5389   if (index >= 0 && index <= 4)
5390     {
5391       enum gimplify_status gs;
5392       unsigned int align;
5393
5394       if (DECL_P (TREE_OPERAND (addr, 0)))
5395         align = DECL_ALIGN_UNIT (TREE_OPERAND (addr, 0));
5396       else if (TREE_CODE (TREE_OPERAND (addr, 0)) == COMPONENT_REF
5397                && TREE_CODE (TREE_OPERAND (TREE_OPERAND (addr, 0), 1))
5398                   == FIELD_DECL)
5399         align = DECL_ALIGN_UNIT (TREE_OPERAND (TREE_OPERAND (addr, 0), 1));
5400       else
5401         align = TYPE_ALIGN_UNIT (type);
5402
5403       /* __sync builtins require strict data alignment.  */
5404       if (exact_log2 (align) >= index)
5405         {
5406           /* When possible, use specialized atomic update functions.  */
5407           if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
5408             {
5409               gs = gimplify_omp_atomic_fetch_op (expr_p, addr, rhs, index);
5410               if (gs != GS_UNHANDLED)
5411                 return gs;
5412             }
5413
5414           /* If we don't have specialized __sync builtins, try and implement
5415              as a compare and swap loop.  */
5416           gs = gimplify_omp_atomic_pipeline (expr_p, pre_p, addr, rhs, index);
5417           if (gs != GS_UNHANDLED)
5418             return gs;
5419         }
5420     }
5421
5422   /* The ultimate fallback is wrapping the operation in a mutex.  */
5423   return gimplify_omp_atomic_mutex (expr_p, pre_p, addr, rhs);
5424 }
5425
5426 /*  Gimplifies the expression tree pointed to by EXPR_P.  Return 0 if
5427     gimplification failed.
5428
5429     PRE_P points to the list where side effects that must happen before
5430         EXPR should be stored.
5431
5432     POST_P points to the list where side effects that must happen after
5433         EXPR should be stored, or NULL if there is no suitable list.  In
5434         that case, we copy the result to a temporary, emit the
5435         post-effects, and then return the temporary.
5436
5437     GIMPLE_TEST_F points to a function that takes a tree T and
5438         returns nonzero if T is in the GIMPLE form requested by the
5439         caller.  The GIMPLE predicates are in tree-gimple.c.
5440
5441         This test is used twice.  Before gimplification, the test is
5442         invoked to determine whether *EXPR_P is already gimple enough.  If
5443         that fails, *EXPR_P is gimplified according to its code and
5444         GIMPLE_TEST_F is called again.  If the test still fails, then a new
5445         temporary variable is created and assigned the value of the
5446         gimplified expression.
5447
5448     FALLBACK tells the function what sort of a temporary we want.  If the 1
5449         bit is set, an rvalue is OK.  If the 2 bit is set, an lvalue is OK.
5450         If both are set, either is OK, but an lvalue is preferable.
5451
5452     The return value is either GS_ERROR or GS_ALL_DONE, since this function
5453     iterates until solution.  */
5454
5455 enum gimplify_status
5456 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
5457                bool (* gimple_test_f) (tree), fallback_t fallback)
5458 {
5459   tree tmp;
5460   tree internal_pre = NULL_TREE;
5461   tree internal_post = NULL_TREE;
5462   tree save_expr;
5463   int is_statement = (pre_p == NULL);
5464   location_t saved_location;
5465   enum gimplify_status ret;
5466
5467   save_expr = *expr_p;
5468   if (save_expr == NULL_TREE)
5469     return GS_ALL_DONE;
5470
5471   /* We used to check the predicate here and return immediately if it
5472      succeeds.  This is wrong; the design is for gimplification to be
5473      idempotent, and for the predicates to only test for valid forms, not
5474      whether they are fully simplified.  */
5475
5476   /* Set up our internal queues if needed.  */
5477   if (pre_p == NULL)
5478     pre_p = &internal_pre;
5479   if (post_p == NULL)
5480     post_p = &internal_post;
5481
5482   saved_location = input_location;
5483   if (save_expr != error_mark_node
5484       && EXPR_HAS_LOCATION (*expr_p))
5485     input_location = EXPR_LOCATION (*expr_p);
5486
5487   /* Loop over the specific gimplifiers until the toplevel node
5488      remains the same.  */
5489   do
5490     {
5491       /* Strip away as many useless type conversions as possible
5492          at the toplevel.  */
5493       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
5494
5495       /* Remember the expr.  */
5496       save_expr = *expr_p;
5497
5498       /* Die, die, die, my darling.  */
5499       if (save_expr == error_mark_node
5500           || (!GIMPLE_STMT_P (save_expr)
5501               && TREE_TYPE (save_expr)
5502               && TREE_TYPE (save_expr) == error_mark_node))
5503         {
5504           ret = GS_ERROR;
5505           break;
5506         }
5507
5508       /* Do any language-specific gimplification.  */
5509       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
5510       if (ret == GS_OK)
5511         {
5512           if (*expr_p == NULL_TREE)
5513             break;
5514           if (*expr_p != save_expr)
5515             continue;
5516         }
5517       else if (ret != GS_UNHANDLED)
5518         break;
5519
5520       ret = GS_OK;
5521       switch (TREE_CODE (*expr_p))
5522         {
5523           /* First deal with the special cases.  */
5524
5525         case POSTINCREMENT_EXPR:
5526         case POSTDECREMENT_EXPR:
5527         case PREINCREMENT_EXPR:
5528         case PREDECREMENT_EXPR:
5529           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
5530                                         fallback != fb_none);
5531           break;
5532
5533         case ARRAY_REF:
5534         case ARRAY_RANGE_REF:
5535         case REALPART_EXPR:
5536         case IMAGPART_EXPR:
5537         case COMPONENT_REF:
5538         case VIEW_CONVERT_EXPR:
5539           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
5540                                         fallback ? fallback : fb_rvalue);
5541           break;
5542
5543         case COND_EXPR:
5544           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
5545           /* C99 code may assign to an array in a structure value of a
5546              conditional expression, and this has undefined behavior
5547              only on execution, so create a temporary if an lvalue is
5548              required.  */
5549           if (fallback == fb_lvalue)
5550             {
5551               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5552               lang_hooks.mark_addressable (*expr_p);
5553             }
5554           break;
5555
5556         case CALL_EXPR:
5557           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
5558           /* C99 code may assign to an array in a structure returned
5559              from a function, and this has undefined behavior only on
5560              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 TREE_LIST:
5570           gcc_unreachable ();
5571
5572         case COMPOUND_EXPR:
5573           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
5574           break;
5575
5576         case MODIFY_EXPR:
5577         case GIMPLE_MODIFY_STMT:
5578         case INIT_EXPR:
5579           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
5580                                       fallback != fb_none);
5581
5582           if (*expr_p)
5583             {
5584               /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer
5585                  useful.  */
5586               if (TREE_CODE (*expr_p) == INIT_EXPR)
5587                 TREE_SET_CODE (*expr_p, MODIFY_EXPR);
5588
5589               /* Convert MODIFY_EXPR to GIMPLE_MODIFY_STMT.  */
5590               if (TREE_CODE (*expr_p) == MODIFY_EXPR)
5591                 tree_to_gimple_tuple (expr_p);
5592             }
5593
5594           break;
5595
5596         case TRUTH_ANDIF_EXPR:
5597         case TRUTH_ORIF_EXPR:
5598           ret = gimplify_boolean_expr (expr_p);
5599           break;
5600
5601         case TRUTH_NOT_EXPR:
5602           TREE_OPERAND (*expr_p, 0)
5603             = gimple_boolify (TREE_OPERAND (*expr_p, 0));
5604           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5605                                is_gimple_val, fb_rvalue);
5606           recalculate_side_effects (*expr_p);
5607           break;
5608
5609         case ADDR_EXPR:
5610           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
5611           break;
5612
5613         case VA_ARG_EXPR:
5614           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
5615           break;
5616
5617         case CONVERT_EXPR:
5618         case NOP_EXPR:
5619           if (IS_EMPTY_STMT (*expr_p))
5620             {
5621               ret = GS_ALL_DONE;
5622               break;
5623             }
5624
5625           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
5626               || fallback == fb_none)
5627             {
5628               /* Just strip a conversion to void (or in void context) and
5629                  try again.  */
5630               *expr_p = TREE_OPERAND (*expr_p, 0);
5631               break;
5632             }
5633
5634           ret = gimplify_conversion (expr_p);
5635           if (ret == GS_ERROR)
5636             break;
5637           if (*expr_p != save_expr)
5638             break;
5639           /* FALLTHRU */
5640
5641         case FIX_TRUNC_EXPR:
5642           /* unary_expr: ... | '(' cast ')' val | ...  */
5643           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5644                                is_gimple_val, fb_rvalue);
5645           recalculate_side_effects (*expr_p);
5646           break;
5647
5648         case INDIRECT_REF:
5649           *expr_p = fold_indirect_ref (*expr_p);
5650           if (*expr_p != save_expr)
5651             break;
5652           /* else fall through.  */
5653         case ALIGN_INDIRECT_REF:
5654         case MISALIGNED_INDIRECT_REF:
5655           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5656                                is_gimple_reg, fb_rvalue);
5657           recalculate_side_effects (*expr_p);
5658           break;
5659
5660           /* Constants need not be gimplified.  */
5661         case INTEGER_CST:
5662         case REAL_CST:
5663         case STRING_CST:
5664         case COMPLEX_CST:
5665         case VECTOR_CST:
5666           ret = GS_ALL_DONE;
5667           break;
5668
5669         case CONST_DECL:
5670           /* If we require an lvalue, such as for ADDR_EXPR, retain the
5671              CONST_DECL node.  Otherwise the decl is replaceable by its
5672              value.  */
5673           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
5674           if (fallback & fb_lvalue)
5675             ret = GS_ALL_DONE;
5676           else
5677             *expr_p = DECL_INITIAL (*expr_p);
5678           break;
5679
5680         case DECL_EXPR:
5681           ret = gimplify_decl_expr (expr_p);
5682           break;
5683
5684         case EXC_PTR_EXPR:
5685           /* FIXME make this a decl.  */
5686           ret = GS_ALL_DONE;
5687           break;
5688
5689         case BIND_EXPR:
5690           ret = gimplify_bind_expr (expr_p, pre_p);
5691           break;
5692
5693         case LOOP_EXPR:
5694           ret = gimplify_loop_expr (expr_p, pre_p);
5695           break;
5696
5697         case SWITCH_EXPR:
5698           ret = gimplify_switch_expr (expr_p, pre_p);
5699           break;
5700
5701         case EXIT_EXPR:
5702           ret = gimplify_exit_expr (expr_p);
5703           break;
5704
5705         case GOTO_EXPR:
5706           /* If the target is not LABEL, then it is a computed jump
5707              and the target needs to be gimplified.  */
5708           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
5709             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
5710                                  NULL, is_gimple_val, fb_rvalue);
5711           break;
5712
5713         case LABEL_EXPR:
5714           ret = GS_ALL_DONE;
5715           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
5716                       == current_function_decl);
5717           break;
5718
5719         case CASE_LABEL_EXPR:
5720           ret = gimplify_case_label_expr (expr_p);
5721           break;
5722
5723         case RETURN_EXPR:
5724           ret = gimplify_return_expr (*expr_p, pre_p);
5725           break;
5726
5727         case CONSTRUCTOR:
5728           /* Don't reduce this in place; let gimplify_init_constructor work its
5729              magic.  Buf if we're just elaborating this for side effects, just
5730              gimplify any element that has side-effects.  */
5731           if (fallback == fb_none)
5732             {
5733               unsigned HOST_WIDE_INT ix;
5734               constructor_elt *ce;
5735               tree temp = NULL_TREE;
5736               for (ix = 0;
5737                    VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
5738                                 ix, ce);
5739                    ix++)
5740                 if (TREE_SIDE_EFFECTS (ce->value))
5741                   append_to_statement_list (ce->value, &temp);
5742
5743               *expr_p = temp;
5744               ret = GS_OK;
5745             }
5746           /* C99 code may assign to an array in a constructed
5747              structure or union, and this has undefined behavior only
5748              on execution, so create a temporary if an lvalue is
5749              required.  */
5750           else if (fallback == fb_lvalue)
5751             {
5752               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5753               lang_hooks.mark_addressable (*expr_p);
5754             }
5755           else
5756             ret = GS_ALL_DONE;
5757           break;
5758
5759           /* The following are special cases that are not handled by the
5760              original GIMPLE grammar.  */
5761
5762           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
5763              eliminated.  */
5764         case SAVE_EXPR:
5765           ret = gimplify_save_expr (expr_p, pre_p, post_p);
5766           break;
5767
5768         case BIT_FIELD_REF:
5769           {
5770             enum gimplify_status r0, r1, r2;
5771
5772             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5773                                 is_gimple_lvalue, fb_either);
5774             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5775                                 is_gimple_val, fb_rvalue);
5776             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
5777                                 is_gimple_val, fb_rvalue);
5778             recalculate_side_effects (*expr_p);
5779
5780             ret = MIN (r0, MIN (r1, r2));
5781           }
5782           break;
5783
5784         case NON_LVALUE_EXPR:
5785           /* This should have been stripped above.  */
5786           gcc_unreachable ();
5787
5788         case ASM_EXPR:
5789           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
5790           break;
5791
5792         case TRY_FINALLY_EXPR:
5793         case TRY_CATCH_EXPR:
5794           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
5795           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
5796           ret = GS_ALL_DONE;
5797           break;
5798
5799         case CLEANUP_POINT_EXPR:
5800           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
5801           break;
5802
5803         case TARGET_EXPR:
5804           ret = gimplify_target_expr (expr_p, pre_p, post_p);
5805           break;
5806
5807         case CATCH_EXPR:
5808           gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
5809           ret = GS_ALL_DONE;
5810           break;
5811
5812         case EH_FILTER_EXPR:
5813           gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
5814           ret = GS_ALL_DONE;
5815           break;
5816
5817         case CHANGE_DYNAMIC_TYPE_EXPR:
5818           ret = gimplify_expr (&CHANGE_DYNAMIC_TYPE_LOCATION (*expr_p),
5819                                pre_p, post_p, is_gimple_reg, fb_lvalue);
5820           break;
5821
5822         case OBJ_TYPE_REF:
5823           {
5824             enum gimplify_status r0, r1;
5825             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
5826                                 is_gimple_val, fb_rvalue);
5827             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
5828                                 is_gimple_val, fb_rvalue);
5829             ret = MIN (r0, r1);
5830           }
5831           break;
5832
5833         case LABEL_DECL:
5834           /* We get here when taking the address of a label.  We mark
5835              the label as "forced"; meaning it can never be removed and
5836              it is a potential target for any computed goto.  */
5837           FORCED_LABEL (*expr_p) = 1;
5838           ret = GS_ALL_DONE;
5839           break;
5840
5841         case STATEMENT_LIST:
5842           ret = gimplify_statement_list (expr_p, pre_p);
5843           break;
5844
5845         case WITH_SIZE_EXPR:
5846           {
5847             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5848                            post_p == &internal_post ? NULL : post_p,
5849                            gimple_test_f, fallback);
5850             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5851                            is_gimple_val, fb_rvalue);
5852           }
5853           break;
5854
5855         case VAR_DECL:
5856         case PARM_DECL:
5857           ret = gimplify_var_or_parm_decl (expr_p);
5858           break;
5859
5860         case RESULT_DECL:
5861           /* When within an OpenMP context, notice uses of variables.  */
5862           if (gimplify_omp_ctxp)
5863             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
5864           ret = GS_ALL_DONE;
5865           break;
5866
5867         case SSA_NAME:
5868           /* Allow callbacks into the gimplifier during optimization.  */
5869           ret = GS_ALL_DONE;
5870           break;
5871
5872         case OMP_PARALLEL:
5873           ret = gimplify_omp_parallel (expr_p, pre_p);
5874           break;
5875
5876         case OMP_FOR:
5877           ret = gimplify_omp_for (expr_p, pre_p);
5878           break;
5879
5880         case OMP_SECTIONS:
5881         case OMP_SINGLE:
5882           ret = gimplify_omp_workshare (expr_p, pre_p);
5883           break;
5884
5885         case OMP_SECTION:
5886         case OMP_MASTER:
5887         case OMP_ORDERED:
5888         case OMP_CRITICAL:
5889           gimplify_to_stmt_list (&OMP_BODY (*expr_p));
5890           break;
5891
5892         case OMP_ATOMIC:
5893           ret = gimplify_omp_atomic (expr_p, pre_p);
5894           break;
5895
5896         case OMP_RETURN:
5897         case OMP_CONTINUE:
5898           ret = GS_ALL_DONE;
5899           break;
5900
5901         case POINTER_PLUS_EXPR:
5902           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
5903              The second is gimple immediate saving a need for extra statement.
5904            */
5905           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
5906               && (tmp = maybe_fold_offset_to_reference
5907                          (TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
5908                           TREE_TYPE (TREE_TYPE (*expr_p)))))
5909              {
5910                *expr_p = build_fold_addr_expr_with_type (tmp,
5911                                                          TREE_TYPE (*expr_p));
5912                break;
5913              }
5914           /* Convert (void *)&a + 4 into (void *)&a[1].  */
5915           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
5916               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
5917               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
5918                                                                         0),0)))
5919               && (tmp = maybe_fold_offset_to_reference
5920                          (TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
5921                           TREE_OPERAND (*expr_p, 1),
5922                           TREE_TYPE (TREE_TYPE
5923                                   (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
5924                                                  0))))))
5925              {
5926                tmp = build_fold_addr_expr (tmp);
5927                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
5928                break;
5929              }
5930           /* FALLTHRU */
5931         default:
5932           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
5933             {
5934             case tcc_comparison:
5935               /* Handle comparison of objects of non scalar mode aggregates
5936                  with a call to memcmp.  It would be nice to only have to do
5937                  this for variable-sized objects, but then we'd have to allow
5938                  the same nest of reference nodes we allow for MODIFY_EXPR and
5939                  that's too complex.
5940
5941                  Compare scalar mode aggregates as scalar mode values.  Using
5942                  memcmp for them would be very inefficient at best, and is
5943                  plain wrong if bitfields are involved.  */
5944
5945               {
5946                 tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
5947
5948                 if (!AGGREGATE_TYPE_P (type))
5949                   goto expr_2;
5950                 else if (TYPE_MODE (type) != BLKmode)
5951                   ret = gimplify_scalar_mode_aggregate_compare (expr_p);
5952                 else
5953                   ret = gimplify_variable_sized_compare (expr_p);
5954
5955                 break;
5956                 }
5957
5958             /* If *EXPR_P does not need to be special-cased, handle it
5959                according to its class.  */
5960             case tcc_unary:
5961               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5962                                    post_p, is_gimple_val, fb_rvalue);
5963               break;
5964
5965             case tcc_binary:
5966             expr_2:
5967               {
5968                 enum gimplify_status r0, r1;
5969
5970                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5971                                     post_p, is_gimple_val, fb_rvalue);
5972                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
5973                                     post_p, is_gimple_val, fb_rvalue);
5974
5975                 ret = MIN (r0, r1);
5976                 break;
5977               }
5978
5979             case tcc_declaration:
5980             case tcc_constant:
5981               ret = GS_ALL_DONE;
5982               goto dont_recalculate;
5983
5984             default:
5985               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
5986                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
5987                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
5988               goto expr_2;
5989             }
5990
5991           recalculate_side_effects (*expr_p);
5992         dont_recalculate:
5993           break;
5994         }
5995
5996       /* If we replaced *expr_p, gimplify again.  */
5997       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
5998         ret = GS_ALL_DONE;
5999     }
6000   while (ret == GS_OK);
6001
6002   /* If we encountered an error_mark somewhere nested inside, either
6003      stub out the statement or propagate the error back out.  */
6004   if (ret == GS_ERROR)
6005     {
6006       if (is_statement)
6007         *expr_p = NULL;
6008       goto out;
6009     }
6010
6011   /* This was only valid as a return value from the langhook, which
6012      we handled.  Make sure it doesn't escape from any other context.  */
6013   gcc_assert (ret != GS_UNHANDLED);
6014
6015   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
6016     {
6017       /* We aren't looking for a value, and we don't have a valid
6018          statement.  If it doesn't have side-effects, throw it away.  */
6019       if (!TREE_SIDE_EFFECTS (*expr_p))
6020         *expr_p = NULL;
6021       else if (!TREE_THIS_VOLATILE (*expr_p))
6022         {
6023           /* This is probably a _REF that contains something nested that
6024              has side effects.  Recurse through the operands to find it.  */
6025           enum tree_code code = TREE_CODE (*expr_p);
6026
6027           switch (code)
6028             {
6029             case COMPONENT_REF:
6030             case REALPART_EXPR:
6031             case IMAGPART_EXPR:
6032             case VIEW_CONVERT_EXPR:
6033               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6034                              gimple_test_f, fallback);
6035               break;
6036
6037             case ARRAY_REF:
6038             case ARRAY_RANGE_REF:
6039               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6040                              gimple_test_f, fallback);
6041               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6042                              gimple_test_f, fallback);
6043               break;
6044
6045             default:
6046                /* Anything else with side-effects must be converted to
6047                   a valid statement before we get here.  */
6048               gcc_unreachable ();
6049             }
6050
6051           *expr_p = NULL;
6052         }
6053       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
6054                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
6055         {
6056           /* Historically, the compiler has treated a bare reference
6057              to a non-BLKmode volatile lvalue as forcing a load.  */
6058           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
6059           /* Normally, we do not want to create a temporary for a
6060              TREE_ADDRESSABLE type because such a type should not be
6061              copied by bitwise-assignment.  However, we make an
6062              exception here, as all we are doing here is ensuring that
6063              we read the bytes that make up the type.  We use
6064              create_tmp_var_raw because create_tmp_var will abort when
6065              given a TREE_ADDRESSABLE type.  */
6066           tree tmp = create_tmp_var_raw (type, "vol");
6067           gimple_add_tmp_var (tmp);
6068           *expr_p = build_gimple_modify_stmt (tmp, *expr_p);
6069         }
6070       else
6071         /* We can't do anything useful with a volatile reference to
6072            an incomplete type, so just throw it away.  Likewise for
6073            a BLKmode type, since any implicit inner load should
6074            already have been turned into an explicit one by the
6075            gimplification process.  */
6076         *expr_p = NULL;
6077     }
6078
6079   /* If we are gimplifying at the statement level, we're done.  Tack
6080      everything together and replace the original statement with the
6081      gimplified form.  */
6082   if (fallback == fb_none || is_statement)
6083     {
6084       if (internal_pre || internal_post)
6085         {
6086           append_to_statement_list (*expr_p, &internal_pre);
6087           append_to_statement_list (internal_post, &internal_pre);
6088           annotate_all_with_locus (&internal_pre, input_location);
6089           *expr_p = internal_pre;
6090         }
6091       else if (!*expr_p)
6092         ;
6093       else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
6094         annotate_all_with_locus (expr_p, input_location);
6095       else
6096         annotate_one_with_locus (*expr_p, input_location);
6097       goto out;
6098     }
6099
6100   /* Otherwise we're gimplifying a subexpression, so the resulting value is
6101      interesting.  */
6102
6103   /* If it's sufficiently simple already, we're done.  Unless we are
6104      handling some post-effects internally; if that's the case, we need to
6105      copy into a temp before adding the post-effects to the tree.  */
6106   if (!internal_post && (*gimple_test_f) (*expr_p))
6107     goto out;
6108
6109   /* Otherwise, we need to create a new temporary for the gimplified
6110      expression.  */
6111
6112   /* We can't return an lvalue if we have an internal postqueue.  The
6113      object the lvalue refers to would (probably) be modified by the
6114      postqueue; we need to copy the value out first, which means an
6115      rvalue.  */
6116   if ((fallback & fb_lvalue) && !internal_post
6117       && is_gimple_addressable (*expr_p))
6118     {
6119       /* An lvalue will do.  Take the address of the expression, store it
6120          in a temporary, and replace the expression with an INDIRECT_REF of
6121          that temporary.  */
6122       tmp = build_fold_addr_expr (*expr_p);
6123       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
6124       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
6125     }
6126   else if ((fallback & fb_rvalue) && is_gimple_formal_tmp_rhs (*expr_p))
6127     {
6128       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
6129
6130       /* An rvalue will do.  Assign the gimplified expression into a new
6131          temporary TMP and replace the original expression with TMP.  */
6132
6133       if (internal_post || (fallback & fb_lvalue))
6134         /* The postqueue might change the value of the expression between
6135            the initialization and use of the temporary, so we can't use a
6136            formal temp.  FIXME do we care?  */
6137         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6138       else
6139         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
6140
6141       if (TREE_CODE (*expr_p) != SSA_NAME)
6142         DECL_GIMPLE_FORMAL_TEMP_P (*expr_p) = 1;
6143     }
6144   else
6145     {
6146 #ifdef ENABLE_CHECKING
6147       if (!(fallback & fb_mayfail))
6148         {
6149           fprintf (stderr, "gimplification failed:\n");
6150           print_generic_expr (stderr, *expr_p, 0);
6151           debug_tree (*expr_p);
6152           internal_error ("gimplification failed");
6153         }
6154 #endif
6155       gcc_assert (fallback & fb_mayfail);
6156       /* If this is an asm statement, and the user asked for the
6157          impossible, don't die.  Fail and let gimplify_asm_expr
6158          issue an error.  */
6159       ret = GS_ERROR;
6160       goto out;
6161     }
6162
6163   /* Make sure the temporary matches our predicate.  */
6164   gcc_assert ((*gimple_test_f) (*expr_p));
6165
6166   if (internal_post)
6167     {
6168       annotate_all_with_locus (&internal_post, input_location);
6169       append_to_statement_list (internal_post, pre_p);
6170     }
6171
6172  out:
6173   input_location = saved_location;
6174   return ret;
6175 }
6176
6177 /* Look through TYPE for variable-sized objects and gimplify each such
6178    size that we find.  Add to LIST_P any statements generated.  */
6179
6180 void
6181 gimplify_type_sizes (tree type, tree *list_p)
6182 {
6183   tree field, t;
6184
6185   if (type == NULL || type == error_mark_node)
6186     return;
6187
6188   /* We first do the main variant, then copy into any other variants.  */
6189   type = TYPE_MAIN_VARIANT (type);
6190
6191   /* Avoid infinite recursion.  */
6192   if (TYPE_SIZES_GIMPLIFIED (type))
6193     return;
6194
6195   TYPE_SIZES_GIMPLIFIED (type) = 1;
6196
6197   switch (TREE_CODE (type))
6198     {
6199     case INTEGER_TYPE:
6200     case ENUMERAL_TYPE:
6201     case BOOLEAN_TYPE:
6202     case REAL_TYPE:
6203       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
6204       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
6205
6206       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6207         {
6208           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
6209           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
6210         }
6211       break;
6212
6213     case ARRAY_TYPE:
6214       /* These types may not have declarations, so handle them here.  */
6215       gimplify_type_sizes (TREE_TYPE (type), list_p);
6216       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
6217       break;
6218
6219     case RECORD_TYPE:
6220     case UNION_TYPE:
6221     case QUAL_UNION_TYPE:
6222       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6223         if (TREE_CODE (field) == FIELD_DECL)
6224           {
6225             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
6226             gimplify_type_sizes (TREE_TYPE (field), list_p);
6227           }
6228       break;
6229
6230     case POINTER_TYPE:
6231     case REFERENCE_TYPE:
6232         /* We used to recurse on the pointed-to type here, which turned out to
6233            be incorrect because its definition might refer to variables not
6234            yet initialized at this point if a forward declaration is involved.
6235
6236            It was actually useful for anonymous pointed-to types to ensure
6237            that the sizes evaluation dominates every possible later use of the
6238            values.  Restricting to such types here would be safe since there
6239            is no possible forward declaration around, but would introduce an
6240            undesirable middle-end semantic to anonymity.  We then defer to
6241            front-ends the responsibility of ensuring that the sizes are
6242            evaluated both early and late enough, e.g. by attaching artificial
6243            type declarations to the tree.  */
6244       break;
6245
6246     default:
6247       break;
6248     }
6249
6250   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
6251   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
6252
6253   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6254     {
6255       TYPE_SIZE (t) = TYPE_SIZE (type);
6256       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
6257       TYPE_SIZES_GIMPLIFIED (t) = 1;
6258     }
6259 }
6260
6261 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
6262    a size or position, has had all of its SAVE_EXPRs evaluated.
6263    We add any required statements to STMT_P.  */
6264
6265 void
6266 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
6267 {
6268   tree type, expr = *expr_p;
6269
6270   /* We don't do anything if the value isn't there, is constant, or contains
6271      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
6272      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
6273      will want to replace it with a new variable, but that will cause problems
6274      if this type is from outside the function.  It's OK to have that here.  */
6275   if (expr == NULL_TREE || TREE_CONSTANT (expr)
6276       || TREE_CODE (expr) == VAR_DECL
6277       || CONTAINS_PLACEHOLDER_P (expr))
6278     return;
6279
6280   type = TREE_TYPE (expr);
6281   *expr_p = unshare_expr (expr);
6282
6283   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
6284   expr = *expr_p;
6285
6286   /* Verify that we've an exact type match with the original expression.
6287      In particular, we do not wish to drop a "sizetype" in favour of a
6288      type of similar dimensions.  We don't want to pollute the generic
6289      type-stripping code with this knowledge because it doesn't matter
6290      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
6291      and friends retain their "sizetype-ness".  */
6292   if (TREE_TYPE (expr) != type
6293       && TREE_CODE (type) == INTEGER_TYPE
6294       && TYPE_IS_SIZETYPE (type))
6295     {
6296       tree tmp;
6297
6298       *expr_p = create_tmp_var (type, NULL);
6299       tmp = build1 (NOP_EXPR, type, expr);
6300       tmp = build_gimple_modify_stmt (*expr_p, tmp);
6301       if (EXPR_HAS_LOCATION (expr))
6302         SET_EXPR_LOCUS (tmp, EXPR_LOCUS (expr));
6303       else
6304         SET_EXPR_LOCATION (tmp, input_location);
6305
6306       gimplify_and_add (tmp, stmt_p);
6307     }
6308 }
6309 \f
6310 #ifdef ENABLE_CHECKING
6311 /* Compare types A and B for a "close enough" match.  */
6312
6313 static bool
6314 cpt_same_type (tree a, tree b)
6315 {
6316   if (lang_hooks.types_compatible_p (a, b))
6317     return true;
6318
6319   /* ??? The C++ FE decomposes METHOD_TYPES to FUNCTION_TYPES and doesn't
6320      link them together.  This routine is intended to catch type errors
6321      that will affect the optimizers, and the optimizers don't add new
6322      dereferences of function pointers, so ignore it.  */
6323   if ((TREE_CODE (a) == FUNCTION_TYPE || TREE_CODE (a) == METHOD_TYPE)
6324       && (TREE_CODE (b) == FUNCTION_TYPE || TREE_CODE (b) == METHOD_TYPE))
6325     return true;
6326
6327   /* ??? The C FE pushes type qualifiers after the fact into the type of
6328      the element from the type of the array.  See build_unary_op's handling
6329      of ADDR_EXPR.  This seems wrong -- if we were going to do this, we
6330      should have done it when creating the variable in the first place.
6331      Alternately, why aren't the two array types made variants?  */
6332   if (TREE_CODE (a) == ARRAY_TYPE && TREE_CODE (b) == ARRAY_TYPE)
6333     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
6334
6335   /* And because of those, we have to recurse down through pointers.  */
6336   if (POINTER_TYPE_P (a) && POINTER_TYPE_P (b))
6337     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
6338
6339   return false;
6340 }
6341
6342 /* Check for some cases of the front end missing cast expressions.
6343    The type of a dereference should correspond to the pointer type;
6344    similarly the type of an address should match its object.  */
6345
6346 static tree
6347 check_pointer_types_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
6348                        void *data ATTRIBUTE_UNUSED)
6349 {
6350   tree t = *tp;
6351   tree ptype, otype, dtype;
6352
6353   switch (TREE_CODE (t))
6354     {
6355     case INDIRECT_REF:
6356     case ARRAY_REF:
6357       otype = TREE_TYPE (t);
6358       ptype = TREE_TYPE (TREE_OPERAND (t, 0));
6359       dtype = TREE_TYPE (ptype);
6360       gcc_assert (cpt_same_type (otype, dtype));
6361       break;
6362
6363     case ADDR_EXPR:
6364       ptype = TREE_TYPE (t);
6365       otype = TREE_TYPE (TREE_OPERAND (t, 0));
6366       dtype = TREE_TYPE (ptype);
6367       if (!cpt_same_type (otype, dtype))
6368         {
6369           /* &array is allowed to produce a pointer to the element, rather than
6370              a pointer to the array type.  We must allow this in order to
6371              properly represent assigning the address of an array in C into
6372              pointer to the element type.  */
6373           gcc_assert (TREE_CODE (otype) == ARRAY_TYPE
6374                       && POINTER_TYPE_P (ptype)
6375                       && cpt_same_type (TREE_TYPE (otype), dtype));
6376           break;
6377         }
6378       break;
6379
6380     default:
6381       return NULL_TREE;
6382     }
6383
6384
6385   return NULL_TREE;
6386 }
6387 #endif
6388
6389 /* Gimplify the body of statements pointed to by BODY_P.  FNDECL is the
6390    function decl containing BODY.  */
6391
6392 void
6393 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
6394 {
6395   location_t saved_location = input_location;
6396   tree body, parm_stmts;
6397
6398   timevar_push (TV_TREE_GIMPLIFY);
6399
6400   gcc_assert (gimplify_ctxp == NULL);
6401   push_gimplify_context ();
6402
6403   /* Unshare most shared trees in the body and in that of any nested functions.
6404      It would seem we don't have to do this for nested functions because
6405      they are supposed to be output and then the outer function gimplified
6406      first, but the g++ front end doesn't always do it that way.  */
6407   unshare_body (body_p, fndecl);
6408   unvisit_body (body_p, fndecl);
6409
6410   /* Make sure input_location isn't set to something wierd.  */
6411   input_location = DECL_SOURCE_LOCATION (fndecl);
6412
6413   /* Resolve callee-copies.  This has to be done before processing
6414      the body so that DECL_VALUE_EXPR gets processed correctly.  */
6415   parm_stmts = do_parms ? gimplify_parameters () : NULL;
6416
6417   /* Gimplify the function's body.  */
6418   gimplify_stmt (body_p);
6419   body = *body_p;
6420
6421   if (!body)
6422     body = alloc_stmt_list ();
6423   else if (TREE_CODE (body) == STATEMENT_LIST)
6424     {
6425       tree t = expr_only (*body_p);
6426       if (t)
6427         body = t;
6428     }
6429
6430   /* If there isn't an outer BIND_EXPR, add one.  */
6431   if (TREE_CODE (body) != BIND_EXPR)
6432     {
6433       tree b = build3 (BIND_EXPR, void_type_node, NULL_TREE,
6434                        NULL_TREE, NULL_TREE);
6435       TREE_SIDE_EFFECTS (b) = 1;
6436       append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
6437       body = b;
6438     }
6439
6440   /* If we had callee-copies statements, insert them at the beginning
6441      of the function.  */
6442   if (parm_stmts)
6443     {
6444       append_to_statement_list_force (BIND_EXPR_BODY (body), &parm_stmts);
6445       BIND_EXPR_BODY (body) = parm_stmts;
6446     }
6447
6448   /* Unshare again, in case gimplification was sloppy.  */
6449   unshare_all_trees (body);
6450
6451   *body_p = body;
6452
6453   pop_gimplify_context (body);
6454   gcc_assert (gimplify_ctxp == NULL);
6455
6456 #ifdef ENABLE_CHECKING
6457   walk_tree (body_p, check_pointer_types_r, NULL, NULL);
6458 #endif
6459
6460   timevar_pop (TV_TREE_GIMPLIFY);
6461   input_location = saved_location;
6462 }
6463
6464 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
6465    node for the function we want to gimplify.  */
6466
6467 void
6468 gimplify_function_tree (tree fndecl)
6469 {
6470   tree oldfn, parm, ret;
6471
6472   oldfn = current_function_decl;
6473   current_function_decl = fndecl;
6474   cfun = DECL_STRUCT_FUNCTION (fndecl);
6475   if (cfun == NULL)
6476     allocate_struct_function (fndecl);
6477
6478   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
6479     {
6480       /* Preliminarily mark non-addressed complex variables as eligible
6481          for promotion to gimple registers.  We'll transform their uses
6482          as we find them.  */
6483       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
6484            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
6485           && !TREE_THIS_VOLATILE (parm)
6486           && !needs_to_live_in_memory (parm))
6487         DECL_GIMPLE_REG_P (parm) = 1;
6488     }
6489
6490   ret = DECL_RESULT (fndecl);
6491   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
6492            || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
6493       && !needs_to_live_in_memory (ret))
6494     DECL_GIMPLE_REG_P (ret) = 1;
6495
6496   gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
6497
6498   /* If we're instrumenting function entry/exit, then prepend the call to
6499      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
6500      catch the exit hook.  */
6501   /* ??? Add some way to ignore exceptions for this TFE.  */
6502   if (flag_instrument_function_entry_exit
6503       && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl))
6504     {
6505       tree tf, x, bind;
6506
6507       tf = build2 (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
6508       TREE_SIDE_EFFECTS (tf) = 1;
6509       x = DECL_SAVED_TREE (fndecl);
6510       append_to_statement_list (x, &TREE_OPERAND (tf, 0));
6511       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
6512       x = build_call_expr (x, 0);
6513       append_to_statement_list (x, &TREE_OPERAND (tf, 1));
6514
6515       bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);
6516       TREE_SIDE_EFFECTS (bind) = 1;
6517       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
6518       x = build_call_expr (x, 0);
6519       append_to_statement_list (x, &BIND_EXPR_BODY (bind));
6520       append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
6521
6522       DECL_SAVED_TREE (fndecl) = bind;
6523     }
6524
6525   cfun->gimplified = true;
6526   current_function_decl = oldfn;
6527   cfun = oldfn ? DECL_STRUCT_FUNCTION (oldfn) : NULL;
6528 }
6529 \f
6530 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
6531    force the result to be either ssa_name or an invariant, otherwise
6532    just force it to be a rhs expression.  If VAR is not NULL, make the
6533    base variable of the final destination be VAR if suitable.  */
6534
6535 tree
6536 force_gimple_operand (tree expr, tree *stmts, bool simple, tree var)
6537 {
6538   tree t;
6539   enum gimplify_status ret;
6540   gimple_predicate gimple_test_f;
6541
6542   *stmts = NULL_TREE;
6543
6544   if (is_gimple_val (expr))
6545     return expr;
6546
6547   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
6548
6549   push_gimplify_context ();
6550   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
6551
6552   if (var)
6553     expr = build_gimple_modify_stmt (var, expr);
6554
6555   ret = gimplify_expr (&expr, stmts, NULL,
6556                        gimple_test_f, fb_rvalue);
6557   gcc_assert (ret != GS_ERROR);
6558
6559   if (gimple_referenced_vars (cfun))
6560     {
6561       for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
6562         add_referenced_var (t);
6563     }
6564
6565   pop_gimplify_context (NULL);
6566
6567   return expr;
6568 }
6569
6570 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
6571    some statements are produced, emits them before BSI.  */
6572
6573 tree
6574 force_gimple_operand_bsi (block_stmt_iterator *bsi, tree expr,
6575                           bool simple_p, tree var)
6576 {
6577   tree stmts;
6578
6579   expr = force_gimple_operand (expr, &stmts, simple_p, var);
6580   if (stmts)
6581     bsi_insert_before (bsi, stmts, BSI_SAME_STMT);
6582
6583   return expr;
6584 }
6585
6586 #include "gt-gimplify.h"