OSDN Git Service

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