OSDN Git Service

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