OSDN Git Service

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