OSDN Git Service

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