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