OSDN Git Service

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