OSDN Git Service

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