OSDN Git Service

Squash commit of EH in gimple
[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   tree link_next;
4769   
4770   expr = *expr_p;
4771   noutputs = list_length (ASM_OUTPUTS (expr));
4772   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
4773
4774   inputs = outputs = clobbers = NULL;
4775
4776   ret = GS_ALL_DONE;
4777   link_next = NULL_TREE;
4778   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = link_next)
4779     {
4780       bool ok;
4781       size_t constraint_len;
4782
4783       link_next = TREE_CHAIN (link);
4784
4785       oconstraints[i]
4786         = constraint
4787         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4788       constraint_len = strlen (constraint);
4789       if (constraint_len == 0)
4790         continue;
4791
4792       ok = parse_output_constraint (&constraint, i, 0, 0,
4793                                     &allows_mem, &allows_reg, &is_inout);
4794       if (!ok)
4795         {
4796           ret = GS_ERROR;
4797           is_inout = false;
4798         }
4799
4800       if (!allows_reg && allows_mem)
4801         mark_addressable (TREE_VALUE (link));
4802
4803       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4804                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4805                             fb_lvalue | fb_mayfail);
4806       if (tret == GS_ERROR)
4807         {
4808           error ("invalid lvalue in asm output %d", i);
4809           ret = tret;
4810         }
4811
4812       VEC_safe_push (tree, gc, outputs, link);
4813       TREE_CHAIN (link) = NULL_TREE;
4814
4815       if (is_inout)
4816         {
4817           /* An input/output operand.  To give the optimizers more
4818              flexibility, split it into separate input and output
4819              operands.  */
4820           tree input;
4821           char buf[10];
4822
4823           /* Turn the in/out constraint into an output constraint.  */
4824           char *p = xstrdup (constraint);
4825           p[0] = '=';
4826           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4827
4828           /* And add a matching input constraint.  */
4829           if (allows_reg)
4830             {
4831               sprintf (buf, "%d", i);
4832
4833               /* If there are multiple alternatives in the constraint,
4834                  handle each of them individually.  Those that allow register
4835                  will be replaced with operand number, the others will stay
4836                  unchanged.  */
4837               if (strchr (p, ',') != NULL)
4838                 {
4839                   size_t len = 0, buflen = strlen (buf);
4840                   char *beg, *end, *str, *dst;
4841
4842                   for (beg = p + 1;;)
4843                     {
4844                       end = strchr (beg, ',');
4845                       if (end == NULL)
4846                         end = strchr (beg, '\0');
4847                       if ((size_t) (end - beg) < buflen)
4848                         len += buflen + 1;
4849                       else
4850                         len += end - beg + 1;
4851                       if (*end)
4852                         beg = end + 1;
4853                       else
4854                         break;
4855                     }
4856
4857                   str = (char *) alloca (len);
4858                   for (beg = p + 1, dst = str;;)
4859                     {
4860                       const char *tem;
4861                       bool mem_p, reg_p, inout_p;
4862
4863                       end = strchr (beg, ',');
4864                       if (end)
4865                         *end = '\0';
4866                       beg[-1] = '=';
4867                       tem = beg - 1;
4868                       parse_output_constraint (&tem, i, 0, 0,
4869                                                &mem_p, &reg_p, &inout_p);
4870                       if (dst != str)
4871                         *dst++ = ',';
4872                       if (reg_p)
4873                         {
4874                           memcpy (dst, buf, buflen);
4875                           dst += buflen;
4876                         }
4877                       else
4878                         {
4879                           if (end)
4880                             len = end - beg;
4881                           else
4882                             len = strlen (beg);
4883                           memcpy (dst, beg, len);
4884                           dst += len;
4885                         }
4886                       if (end)
4887                         beg = end + 1;
4888                       else
4889                         break;
4890                     }
4891                   *dst = '\0';
4892                   input = build_string (dst - str, str);
4893                 }
4894               else
4895                 input = build_string (strlen (buf), buf);
4896             }
4897           else
4898             input = build_string (constraint_len - 1, constraint + 1);
4899
4900           free (p);
4901
4902           input = build_tree_list (build_tree_list (NULL_TREE, input),
4903                                    unshare_expr (TREE_VALUE (link)));
4904           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
4905         }
4906     }
4907
4908   link_next = NULL_TREE;
4909   for (link = ASM_INPUTS (expr); link; ++i, link = link_next)
4910     {
4911       link_next = TREE_CHAIN (link);
4912       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4913       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
4914                               oconstraints, &allows_mem, &allows_reg);
4915
4916       /* If we can't make copies, we can only accept memory.  */
4917       if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
4918         {
4919           if (allows_mem)
4920             allows_reg = 0;
4921           else
4922             {
4923               error ("impossible constraint in %<asm%>");
4924               error ("non-memory input %d must stay in memory", i);
4925               return GS_ERROR;
4926             }
4927         }
4928
4929       /* If the operand is a memory input, it should be an lvalue.  */
4930       if (!allows_reg && allows_mem)
4931         {
4932           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4933                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
4934           mark_addressable (TREE_VALUE (link));
4935           if (tret == GS_ERROR)
4936             {
4937               if (EXPR_HAS_LOCATION (TREE_VALUE (link)))
4938                 input_location = EXPR_LOCATION (TREE_VALUE (link));
4939               error ("memory input %d is not directly addressable", i);
4940               ret = tret;
4941             }
4942         }
4943       else
4944         {
4945           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4946                                 is_gimple_asm_val, fb_rvalue);
4947           if (tret == GS_ERROR)
4948             ret = tret;
4949         }
4950
4951       TREE_CHAIN (link) = NULL_TREE;
4952       VEC_safe_push (tree, gc, inputs, link);
4953     }
4954   
4955   for (link = ASM_CLOBBERS (expr); link; ++i, link = TREE_CHAIN (link))
4956       VEC_safe_push (tree, gc, clobbers, link);
4957
4958   /* Do not add ASMs with errors to the gimple IL stream.  */
4959   if (ret != GS_ERROR)
4960     {
4961       stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
4962                                    inputs, outputs, clobbers);
4963
4964       gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr));
4965       gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
4966
4967       gimplify_seq_add_stmt (pre_p, stmt);
4968     }
4969
4970   return ret;
4971 }
4972
4973 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
4974    GIMPLE_WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
4975    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
4976    return to this function.
4977
4978    FIXME should we complexify the prequeue handling instead?  Or use flags
4979    for all the cleanups and let the optimizer tighten them up?  The current
4980    code seems pretty fragile; it will break on a cleanup within any
4981    non-conditional nesting.  But any such nesting would be broken, anyway;
4982    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
4983    and continues out of it.  We can do that at the RTL level, though, so
4984    having an optimizer to tighten up try/finally regions would be a Good
4985    Thing.  */
4986
4987 static enum gimplify_status
4988 gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p)
4989 {
4990   gimple_stmt_iterator iter;
4991   gimple_seq body_sequence = NULL;
4992
4993   tree temp = voidify_wrapper_expr (*expr_p, NULL);
4994
4995   /* We only care about the number of conditions between the innermost
4996      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count and
4997      any cleanups collected outside the CLEANUP_POINT_EXPR.  */
4998   int old_conds = gimplify_ctxp->conditions;
4999   gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups;
5000   gimplify_ctxp->conditions = 0;
5001   gimplify_ctxp->conditional_cleanups = NULL;
5002
5003   gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence);
5004
5005   gimplify_ctxp->conditions = old_conds;
5006   gimplify_ctxp->conditional_cleanups = old_cleanups;
5007
5008   for (iter = gsi_start (body_sequence); !gsi_end_p (iter); )
5009     {
5010       gimple wce = gsi_stmt (iter);
5011
5012       if (gimple_code (wce) == GIMPLE_WITH_CLEANUP_EXPR)
5013         {
5014           if (gsi_one_before_end_p (iter))
5015             {
5016               /* Note that gsi_insert_seq_before and gsi_remove do not
5017                  scan operands, unlike some other sequence mutators.  */
5018               gsi_insert_seq_before_without_update (&iter,
5019                                                     gimple_wce_cleanup (wce),
5020                                                     GSI_SAME_STMT);
5021               gsi_remove (&iter, true);
5022               break;
5023             }
5024           else
5025             {
5026               gimple gtry;
5027               gimple_seq seq;
5028               enum gimple_try_flags kind;
5029
5030               if (gimple_wce_cleanup_eh_only (wce))
5031                 kind = GIMPLE_TRY_CATCH;
5032               else
5033                 kind = GIMPLE_TRY_FINALLY;
5034               seq = gsi_split_seq_after (iter);
5035
5036               gtry = gimple_build_try (seq, gimple_wce_cleanup (wce), kind);
5037               /* Do not use gsi_replace here, as it may scan operands.
5038                  We want to do a simple structural modification only.  */
5039               *gsi_stmt_ptr (&iter) = gtry;
5040               iter = gsi_start (seq);
5041             }
5042         }
5043       else
5044         gsi_next (&iter);
5045     }
5046
5047   gimplify_seq_add_seq (pre_p, body_sequence);
5048   if (temp)
5049     {
5050       *expr_p = temp;
5051       return GS_OK;
5052     }
5053   else
5054     {
5055       *expr_p = NULL;
5056       return GS_ALL_DONE;
5057     }
5058 }
5059
5060 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
5061    is the cleanup action required.  EH_ONLY is true if the cleanup should
5062    only be executed if an exception is thrown, not on normal exit.  */
5063
5064 static void
5065 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p)
5066 {
5067   gimple wce;
5068   gimple_seq cleanup_stmts = NULL;
5069
5070   /* Errors can result in improperly nested cleanups.  Which results in
5071      confusion when trying to resolve the GIMPLE_WITH_CLEANUP_EXPR.  */
5072   if (errorcount || sorrycount)
5073     return;
5074
5075   if (gimple_conditional_context ())
5076     {
5077       /* If we're in a conditional context, this is more complex.  We only
5078          want to run the cleanup if we actually ran the initialization that
5079          necessitates it, but we want to run it after the end of the
5080          conditional context.  So we wrap the try/finally around the
5081          condition and use a flag to determine whether or not to actually
5082          run the destructor.  Thus
5083
5084            test ? f(A()) : 0
5085
5086          becomes (approximately)
5087
5088            flag = 0;
5089            try {
5090              if (test) { A::A(temp); flag = 1; val = f(temp); }
5091              else { val = 0; }
5092            } finally {
5093              if (flag) A::~A(temp);
5094            }
5095            val
5096       */
5097       tree flag = create_tmp_var (boolean_type_node, "cleanup");
5098       gimple ffalse = gimple_build_assign (flag, boolean_false_node);
5099       gimple ftrue = gimple_build_assign (flag, boolean_true_node);
5100
5101       cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
5102       gimplify_stmt (&cleanup, &cleanup_stmts);
5103       wce = gimple_build_wce (cleanup_stmts);
5104
5105       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
5106       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
5107       gimplify_seq_add_stmt (pre_p, ftrue);
5108
5109       /* Because of this manipulation, and the EH edges that jump
5110          threading cannot redirect, the temporary (VAR) will appear
5111          to be used uninitialized.  Don't warn.  */
5112       TREE_NO_WARNING (var) = 1;
5113     }
5114   else
5115     {
5116       gimplify_stmt (&cleanup, &cleanup_stmts);
5117       wce = gimple_build_wce (cleanup_stmts);
5118       gimple_wce_set_cleanup_eh_only (wce, eh_only);
5119       gimplify_seq_add_stmt (pre_p, wce);
5120     }
5121 }
5122
5123 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
5124
5125 static enum gimplify_status
5126 gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
5127 {
5128   tree targ = *expr_p;
5129   tree temp = TARGET_EXPR_SLOT (targ);
5130   tree init = TARGET_EXPR_INITIAL (targ);
5131   enum gimplify_status ret;
5132
5133   if (init)
5134     {
5135       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
5136          to the temps list.  Handle also variable length TARGET_EXPRs.  */
5137       if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
5138         {
5139           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
5140             gimplify_type_sizes (TREE_TYPE (temp), pre_p);
5141           gimplify_vla_decl (temp, pre_p);
5142         }
5143       else
5144         gimple_add_tmp_var (temp);
5145
5146       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
5147          expression is supposed to initialize the slot.  */
5148       if (VOID_TYPE_P (TREE_TYPE (init)))
5149         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5150       else
5151         {
5152           tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
5153           init = init_expr;
5154           ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5155           init = NULL;
5156           ggc_free (init_expr);
5157         }
5158       if (ret == GS_ERROR)
5159         {
5160           /* PR c++/28266 Make sure this is expanded only once. */
5161           TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5162           return GS_ERROR;
5163         }
5164       if (init)
5165         gimplify_and_add (init, pre_p);
5166
5167       /* If needed, push the cleanup for the temp.  */
5168       if (TARGET_EXPR_CLEANUP (targ))
5169         gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
5170                              CLEANUP_EH_ONLY (targ), pre_p);
5171
5172       /* Only expand this once.  */
5173       TREE_OPERAND (targ, 3) = init;
5174       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5175     }
5176   else
5177     /* We should have expanded this before.  */
5178     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
5179
5180   *expr_p = temp;
5181   return GS_OK;
5182 }
5183
5184 /* Gimplification of expression trees.  */
5185
5186 /* Gimplify an expression which appears at statement context.  The
5187    corresponding GIMPLE statements are added to *SEQ_P.  If *SEQ_P is
5188    NULL, a new sequence is allocated.
5189
5190    Return true if we actually added a statement to the queue.  */
5191
5192 bool
5193 gimplify_stmt (tree *stmt_p, gimple_seq *seq_p)
5194 {
5195   gimple_seq_node last;
5196
5197   if (!*seq_p)
5198     *seq_p = gimple_seq_alloc ();
5199
5200   last = gimple_seq_last (*seq_p);
5201   gimplify_expr (stmt_p, seq_p, NULL, is_gimple_stmt, fb_none);
5202   return last != gimple_seq_last (*seq_p);
5203 }
5204
5205
5206 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
5207    to CTX.  If entries already exist, force them to be some flavor of private.
5208    If there is no enclosing parallel, do nothing.  */
5209
5210 void
5211 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
5212 {
5213   splay_tree_node n;
5214
5215   if (decl == NULL || !DECL_P (decl))
5216     return;
5217
5218   do
5219     {
5220       n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5221       if (n != NULL)
5222         {
5223           if (n->value & GOVD_SHARED)
5224             n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
5225           else
5226             return;
5227         }
5228       else if (ctx->region_type != ORT_WORKSHARE)
5229         omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
5230
5231       ctx = ctx->outer_context;
5232     }
5233   while (ctx);
5234 }
5235
5236 /* Similarly for each of the type sizes of TYPE.  */
5237
5238 static void
5239 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
5240 {
5241   if (type == NULL || type == error_mark_node)
5242     return;
5243   type = TYPE_MAIN_VARIANT (type);
5244
5245   if (pointer_set_insert (ctx->privatized_types, type))
5246     return;
5247
5248   switch (TREE_CODE (type))
5249     {
5250     case INTEGER_TYPE:
5251     case ENUMERAL_TYPE:
5252     case BOOLEAN_TYPE:
5253     case REAL_TYPE:
5254     case FIXED_POINT_TYPE:
5255       omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
5256       omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
5257       break;
5258
5259     case ARRAY_TYPE:
5260       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5261       omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
5262       break;
5263
5264     case RECORD_TYPE:
5265     case UNION_TYPE:
5266     case QUAL_UNION_TYPE:
5267       {
5268         tree field;
5269         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5270           if (TREE_CODE (field) == FIELD_DECL)
5271             {
5272               omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
5273               omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
5274             }
5275       }
5276       break;
5277
5278     case POINTER_TYPE:
5279     case REFERENCE_TYPE:
5280       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5281       break;
5282
5283     default:
5284       break;
5285     }
5286
5287   omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
5288   omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
5289   lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
5290 }
5291
5292 /* Add an entry for DECL in the OpenMP context CTX with FLAGS.  */
5293
5294 static void
5295 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
5296 {
5297   splay_tree_node n;
5298   unsigned int nflags;
5299   tree t;
5300
5301   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5302     return;
5303
5304   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
5305      there are constructors involved somewhere.  */
5306   if (TREE_ADDRESSABLE (TREE_TYPE (decl))
5307       || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
5308     flags |= GOVD_SEEN;
5309
5310   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5311   if (n != NULL)
5312     {
5313       /* We shouldn't be re-adding the decl with the same data
5314          sharing class.  */
5315       gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
5316       /* The only combination of data sharing classes we should see is
5317          FIRSTPRIVATE and LASTPRIVATE.  */
5318       nflags = n->value | flags;
5319       gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
5320                   == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
5321       n->value = nflags;
5322       return;
5323     }
5324
5325   /* When adding a variable-sized variable, we have to handle all sorts
5326      of additional bits of data: the pointer replacement variable, and 
5327      the parameters of the type.  */
5328   if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5329     {
5330       /* Add the pointer replacement variable as PRIVATE if the variable
5331          replacement is private, else FIRSTPRIVATE since we'll need the
5332          address of the original variable either for SHARED, or for the
5333          copy into or out of the context.  */
5334       if (!(flags & GOVD_LOCAL))
5335         {
5336           nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
5337           nflags |= flags & GOVD_SEEN;
5338           t = DECL_VALUE_EXPR (decl);
5339           gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5340           t = TREE_OPERAND (t, 0);
5341           gcc_assert (DECL_P (t));
5342           omp_add_variable (ctx, t, nflags);
5343         }
5344
5345       /* Add all of the variable and type parameters (which should have
5346          been gimplified to a formal temporary) as FIRSTPRIVATE.  */
5347       omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
5348       omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
5349       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5350
5351       /* The variable-sized variable itself is never SHARED, only some form
5352          of PRIVATE.  The sharing would take place via the pointer variable
5353          which we remapped above.  */
5354       if (flags & GOVD_SHARED)
5355         flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
5356                 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
5357
5358       /* We're going to make use of the TYPE_SIZE_UNIT at least in the 
5359          alloca statement we generate for the variable, so make sure it
5360          is available.  This isn't automatically needed for the SHARED
5361          case, since we won't be allocating local storage then.
5362          For local variables TYPE_SIZE_UNIT might not be gimplified yet,
5363          in this case omp_notice_variable will be called later
5364          on when it is gimplified.  */
5365       else if (! (flags & GOVD_LOCAL))
5366         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
5367     }
5368   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
5369     {
5370       gcc_assert ((flags & GOVD_LOCAL) == 0);
5371       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5372
5373       /* Similar to the direct variable sized case above, we'll need the
5374          size of references being privatized.  */
5375       if ((flags & GOVD_SHARED) == 0)
5376         {
5377           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
5378           if (TREE_CODE (t) != INTEGER_CST)
5379             omp_notice_variable (ctx, t, true);
5380         }
5381     }
5382
5383   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
5384 }
5385
5386 /* Record the fact that DECL was used within the OpenMP context CTX.
5387    IN_CODE is true when real code uses DECL, and false when we should
5388    merely emit default(none) errors.  Return true if DECL is going to
5389    be remapped and thus DECL shouldn't be gimplified into its
5390    DECL_VALUE_EXPR (if any).  */
5391
5392 static bool
5393 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
5394 {
5395   splay_tree_node n;
5396   unsigned flags = in_code ? GOVD_SEEN : 0;
5397   bool ret = false, shared;
5398
5399   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5400     return false;
5401
5402   /* Threadprivate variables are predetermined.  */
5403   if (is_global_var (decl))
5404     {
5405       if (DECL_THREAD_LOCAL_P (decl))
5406         return false;
5407
5408       if (DECL_HAS_VALUE_EXPR_P (decl))
5409         {
5410           tree value = get_base_address (DECL_VALUE_EXPR (decl));
5411
5412           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
5413             return false;
5414         }
5415     }
5416
5417   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5418   if (n == NULL)
5419     {
5420       enum omp_clause_default_kind default_kind, kind;
5421       struct gimplify_omp_ctx *octx;
5422
5423       if (ctx->region_type == ORT_WORKSHARE)
5424         goto do_outer;
5425
5426       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
5427          remapped firstprivate instead of shared.  To some extent this is
5428          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
5429       default_kind = ctx->default_kind;
5430       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
5431       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
5432         default_kind = kind;
5433
5434       switch (default_kind)
5435         {
5436         case OMP_CLAUSE_DEFAULT_NONE:
5437           error ("%qE not specified in enclosing parallel",
5438                  DECL_NAME (decl));
5439           error_at (ctx->location, "enclosing parallel");
5440           /* FALLTHRU */
5441         case OMP_CLAUSE_DEFAULT_SHARED:
5442           flags |= GOVD_SHARED;
5443           break;
5444         case OMP_CLAUSE_DEFAULT_PRIVATE:
5445           flags |= GOVD_PRIVATE;
5446           break;
5447         case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
5448           flags |= GOVD_FIRSTPRIVATE;
5449           break;
5450         case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
5451           /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED.  */
5452           gcc_assert (ctx->region_type == ORT_TASK);
5453           if (ctx->outer_context)
5454             omp_notice_variable (ctx->outer_context, decl, in_code);
5455           for (octx = ctx->outer_context; octx; octx = octx->outer_context)
5456             {
5457               splay_tree_node n2;
5458
5459               n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
5460               if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED)
5461                 {
5462                   flags |= GOVD_FIRSTPRIVATE;
5463                   break;
5464                 }
5465               if ((octx->region_type & ORT_PARALLEL) != 0)
5466                 break;
5467             }
5468           if (flags & GOVD_FIRSTPRIVATE)
5469             break;
5470           if (octx == NULL
5471               && (TREE_CODE (decl) == PARM_DECL
5472                   || (!is_global_var (decl)
5473                       && DECL_CONTEXT (decl) == current_function_decl)))
5474             {
5475               flags |= GOVD_FIRSTPRIVATE;
5476               break;
5477             }
5478           flags |= GOVD_SHARED;
5479           break;
5480         default:
5481           gcc_unreachable ();
5482         }
5483
5484       if ((flags & GOVD_PRIVATE)
5485           && lang_hooks.decls.omp_private_outer_ref (decl))
5486         flags |= GOVD_PRIVATE_OUTER_REF;
5487
5488       omp_add_variable (ctx, decl, flags);
5489
5490       shared = (flags & GOVD_SHARED) != 0;
5491       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5492       goto do_outer;
5493     }
5494
5495   if ((n->value & (GOVD_SEEN | GOVD_LOCAL)) == 0
5496       && (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
5497       && DECL_SIZE (decl)
5498       && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5499     {
5500       splay_tree_node n2;
5501       tree t = DECL_VALUE_EXPR (decl);
5502       gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5503       t = TREE_OPERAND (t, 0);
5504       gcc_assert (DECL_P (t));
5505       n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
5506       n2->value |= GOVD_SEEN;
5507     }
5508
5509   shared = ((flags | n->value) & GOVD_SHARED) != 0;
5510   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5511
5512   /* If nothing changed, there's nothing left to do.  */
5513   if ((n->value & flags) == flags)
5514     return ret;
5515   flags |= n->value;
5516   n->value = flags;
5517
5518  do_outer:
5519   /* If the variable is private in the current context, then we don't
5520      need to propagate anything to an outer context.  */
5521   if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
5522     return ret;
5523   if (ctx->outer_context
5524       && omp_notice_variable (ctx->outer_context, decl, in_code))
5525     return true;
5526   return ret;
5527 }
5528
5529 /* Verify that DECL is private within CTX.  If there's specific information
5530    to the contrary in the innermost scope, generate an error.  */
5531
5532 static bool
5533 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
5534 {
5535   splay_tree_node n;
5536
5537   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5538   if (n != NULL)
5539     {
5540       if (n->value & GOVD_SHARED)
5541         {
5542           if (ctx == gimplify_omp_ctxp)
5543             {
5544               error ("iteration variable %qE should be private",
5545                      DECL_NAME (decl));
5546               n->value = GOVD_PRIVATE;
5547               return true;
5548             }
5549           else
5550             return false;
5551         }
5552       else if ((n->value & GOVD_EXPLICIT) != 0
5553                && (ctx == gimplify_omp_ctxp
5554                    || (ctx->region_type == ORT_COMBINED_PARALLEL
5555                        && gimplify_omp_ctxp->outer_context == ctx)))
5556         {
5557           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
5558             error ("iteration variable %qE should not be firstprivate",
5559                    DECL_NAME (decl));
5560           else if ((n->value & GOVD_REDUCTION) != 0)
5561             error ("iteration variable %qE should not be reduction",
5562                    DECL_NAME (decl));
5563         }
5564       return (ctx == gimplify_omp_ctxp
5565               || (ctx->region_type == ORT_COMBINED_PARALLEL
5566                   && gimplify_omp_ctxp->outer_context == ctx));
5567     }
5568
5569   if (ctx->region_type != ORT_WORKSHARE)
5570     return false;
5571   else if (ctx->outer_context)
5572     return omp_is_private (ctx->outer_context, decl);
5573   return false;
5574 }
5575
5576 /* Return true if DECL is private within a parallel region
5577    that binds to the current construct's context or in parallel
5578    region's REDUCTION clause.  */
5579
5580 static bool
5581 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
5582 {
5583   splay_tree_node n;
5584
5585   do
5586     {
5587       ctx = ctx->outer_context;
5588       if (ctx == NULL)
5589         return !(is_global_var (decl)
5590                  /* References might be private, but might be shared too.  */
5591                  || lang_hooks.decls.omp_privatize_by_reference (decl));
5592
5593       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5594       if (n != NULL)
5595         return (n->value & GOVD_SHARED) == 0;
5596     }
5597   while (ctx->region_type == ORT_WORKSHARE);
5598   return false;
5599 }
5600
5601 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
5602    and previous omp contexts.  */
5603
5604 static void
5605 gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
5606                            enum omp_region_type region_type)
5607 {
5608   struct gimplify_omp_ctx *ctx, *outer_ctx;
5609   struct gimplify_ctx gctx;
5610   tree c;
5611
5612   ctx = new_omp_context (region_type);
5613   outer_ctx = ctx->outer_context;
5614
5615   while ((c = *list_p) != NULL)
5616     {
5617       bool remove = false;
5618       bool notice_outer = true;
5619       const char *check_non_private = NULL;
5620       unsigned int flags;
5621       tree decl;
5622
5623       switch (OMP_CLAUSE_CODE (c))
5624         {
5625         case OMP_CLAUSE_PRIVATE:
5626           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
5627           if (lang_hooks.decls.omp_private_outer_ref (OMP_CLAUSE_DECL (c)))
5628             {
5629               flags |= GOVD_PRIVATE_OUTER_REF;
5630               OMP_CLAUSE_PRIVATE_OUTER_REF (c) = 1;
5631             }
5632           else
5633             notice_outer = false;
5634           goto do_add;
5635         case OMP_CLAUSE_SHARED:
5636           flags = GOVD_SHARED | GOVD_EXPLICIT;
5637           goto do_add;
5638         case OMP_CLAUSE_FIRSTPRIVATE:
5639           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
5640           check_non_private = "firstprivate";
5641           goto do_add;
5642         case OMP_CLAUSE_LASTPRIVATE:
5643           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
5644           check_non_private = "lastprivate";
5645           goto do_add;
5646         case OMP_CLAUSE_REDUCTION:
5647           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
5648           check_non_private = "reduction";
5649           goto do_add;
5650
5651         do_add:
5652           decl = OMP_CLAUSE_DECL (c);
5653           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5654             {
5655               remove = true;
5656               break;
5657             }
5658           omp_add_variable (ctx, decl, flags);
5659           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5660               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
5661             {
5662               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
5663                                 GOVD_LOCAL | GOVD_SEEN);
5664               gimplify_omp_ctxp = ctx;
5665               push_gimplify_context (&gctx);
5666
5667               OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c) = gimple_seq_alloc ();
5668               OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c) = gimple_seq_alloc ();
5669
5670               gimplify_and_add (OMP_CLAUSE_REDUCTION_INIT (c),
5671                                 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c));
5672               pop_gimplify_context
5673                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)));
5674               push_gimplify_context (&gctx);
5675               gimplify_and_add (OMP_CLAUSE_REDUCTION_MERGE (c),
5676                                 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c));
5677               pop_gimplify_context 
5678                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c)));
5679               OMP_CLAUSE_REDUCTION_INIT (c) = NULL_TREE;
5680               OMP_CLAUSE_REDUCTION_MERGE (c) = NULL_TREE;
5681
5682               gimplify_omp_ctxp = outer_ctx;
5683             }
5684           else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5685                    && OMP_CLAUSE_LASTPRIVATE_STMT (c))
5686             {
5687               gimplify_omp_ctxp = ctx;
5688               push_gimplify_context (&gctx);
5689               if (TREE_CODE (OMP_CLAUSE_LASTPRIVATE_STMT (c)) != BIND_EXPR)
5690                 {
5691                   tree bind = build3 (BIND_EXPR, void_type_node, NULL,
5692                                       NULL, NULL);
5693                   TREE_SIDE_EFFECTS (bind) = 1;
5694                   BIND_EXPR_BODY (bind) = OMP_CLAUSE_LASTPRIVATE_STMT (c);
5695                   OMP_CLAUSE_LASTPRIVATE_STMT (c) = bind;
5696                 }
5697               gimplify_and_add (OMP_CLAUSE_LASTPRIVATE_STMT (c),
5698                                 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5699               pop_gimplify_context
5700                 (gimple_seq_first_stmt (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)));
5701               OMP_CLAUSE_LASTPRIVATE_STMT (c) = NULL_TREE;
5702
5703               gimplify_omp_ctxp = outer_ctx;
5704             }
5705           if (notice_outer)
5706             goto do_notice;
5707           break;
5708
5709         case OMP_CLAUSE_COPYIN:
5710         case OMP_CLAUSE_COPYPRIVATE:
5711           decl = OMP_CLAUSE_DECL (c);
5712           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5713             {
5714               remove = true;
5715               break;
5716             }
5717         do_notice:
5718           if (outer_ctx)
5719             omp_notice_variable (outer_ctx, decl, true);
5720           if (check_non_private
5721               && region_type == ORT_WORKSHARE
5722               && omp_check_private (ctx, decl))
5723             {
5724               error ("%s variable %qE is private in outer context",
5725                      check_non_private, DECL_NAME (decl));
5726               remove = true;
5727             }
5728           break;
5729
5730         case OMP_CLAUSE_IF:
5731           OMP_CLAUSE_OPERAND (c, 0)
5732             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
5733           /* Fall through.  */
5734
5735         case OMP_CLAUSE_SCHEDULE:
5736         case OMP_CLAUSE_NUM_THREADS:
5737           if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
5738                              is_gimple_val, fb_rvalue) == GS_ERROR)
5739               remove = true;
5740           break;
5741
5742         case OMP_CLAUSE_NOWAIT:
5743         case OMP_CLAUSE_ORDERED:
5744         case OMP_CLAUSE_UNTIED:
5745         case OMP_CLAUSE_COLLAPSE:
5746           break;
5747
5748         case OMP_CLAUSE_DEFAULT:
5749           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
5750           break;
5751
5752         default:
5753           gcc_unreachable ();
5754         }
5755
5756       if (remove)
5757         *list_p = OMP_CLAUSE_CHAIN (c);
5758       else
5759         list_p = &OMP_CLAUSE_CHAIN (c);
5760     }
5761
5762   gimplify_omp_ctxp = ctx;
5763 }
5764
5765 /* For all variables that were not actually used within the context,
5766    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
5767
5768 static int
5769 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
5770 {
5771   tree *list_p = (tree *) data;
5772   tree decl = (tree) n->key;
5773   unsigned flags = n->value;
5774   enum omp_clause_code code;
5775   tree clause;
5776   bool private_debug;
5777
5778   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
5779     return 0;
5780   if ((flags & GOVD_SEEN) == 0)
5781     return 0;
5782   if (flags & GOVD_DEBUG_PRIVATE)
5783     {
5784       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
5785       private_debug = true;
5786     }
5787   else
5788     private_debug
5789       = lang_hooks.decls.omp_private_debug_clause (decl,
5790                                                    !!(flags & GOVD_SHARED));
5791   if (private_debug)
5792     code = OMP_CLAUSE_PRIVATE;
5793   else if (flags & GOVD_SHARED)
5794     {
5795       if (is_global_var (decl))
5796         {
5797           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
5798           while (ctx != NULL)
5799             {
5800               splay_tree_node on
5801                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5802               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
5803                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5804                 break;
5805               ctx = ctx->outer_context;
5806             }
5807           if (ctx == NULL)
5808             return 0;
5809         }
5810       code = OMP_CLAUSE_SHARED;
5811     }
5812   else if (flags & GOVD_PRIVATE)
5813     code = OMP_CLAUSE_PRIVATE;
5814   else if (flags & GOVD_FIRSTPRIVATE)
5815     code = OMP_CLAUSE_FIRSTPRIVATE;
5816   else
5817     gcc_unreachable ();
5818
5819   clause = build_omp_clause (input_location, code);
5820   OMP_CLAUSE_DECL (clause) = decl;
5821   OMP_CLAUSE_CHAIN (clause) = *list_p;
5822   if (private_debug)
5823     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
5824   else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
5825     OMP_CLAUSE_PRIVATE_OUTER_REF (clause) = 1;
5826   *list_p = clause;
5827   lang_hooks.decls.omp_finish_clause (clause);
5828
5829   return 0;
5830 }
5831
5832 static void
5833 gimplify_adjust_omp_clauses (tree *list_p)
5834 {
5835   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
5836   tree c, decl;
5837
5838   while ((c = *list_p) != NULL)
5839     {
5840       splay_tree_node n;
5841       bool remove = false;
5842
5843       switch (OMP_CLAUSE_CODE (c))
5844         {
5845         case OMP_CLAUSE_PRIVATE:
5846         case OMP_CLAUSE_SHARED:
5847         case OMP_CLAUSE_FIRSTPRIVATE:
5848           decl = OMP_CLAUSE_DECL (c);
5849           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5850           remove = !(n->value & GOVD_SEEN);
5851           if (! remove)
5852             {
5853               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
5854               if ((n->value & GOVD_DEBUG_PRIVATE)
5855                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
5856                 {
5857                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
5858                               || ((n->value & GOVD_DATA_SHARE_CLASS)
5859                                   == GOVD_PRIVATE));
5860                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
5861                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
5862                 }
5863             }
5864           break;
5865
5866         case OMP_CLAUSE_LASTPRIVATE:
5867           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
5868              accurately reflect the presence of a FIRSTPRIVATE clause.  */
5869           decl = OMP_CLAUSE_DECL (c);
5870           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5871           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
5872             = (n->value & GOVD_FIRSTPRIVATE) != 0;
5873           break;
5874           
5875         case OMP_CLAUSE_REDUCTION:
5876         case OMP_CLAUSE_COPYIN:
5877         case OMP_CLAUSE_COPYPRIVATE:
5878         case OMP_CLAUSE_IF:
5879         case OMP_CLAUSE_NUM_THREADS:
5880         case OMP_CLAUSE_SCHEDULE:
5881         case OMP_CLAUSE_NOWAIT:
5882         case OMP_CLAUSE_ORDERED:
5883         case OMP_CLAUSE_DEFAULT:
5884         case OMP_CLAUSE_UNTIED:
5885         case OMP_CLAUSE_COLLAPSE:
5886           break;
5887
5888         default:
5889           gcc_unreachable ();
5890         }
5891
5892       if (remove)
5893         *list_p = OMP_CLAUSE_CHAIN (c);
5894       else
5895         list_p = &OMP_CLAUSE_CHAIN (c);
5896     }
5897
5898   /* Add in any implicit data sharing.  */
5899   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
5900   
5901   gimplify_omp_ctxp = ctx->outer_context;
5902   delete_omp_context (ctx);
5903 }
5904
5905 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
5906    gimplification of the body, as well as scanning the body for used
5907    variables.  We need to do this scan now, because variable-sized
5908    decls will be decomposed during gimplification.  */
5909
5910 static void
5911 gimplify_omp_parallel (tree *expr_p, gimple_seq *pre_p)
5912 {
5913   tree expr = *expr_p;
5914   gimple g;
5915   gimple_seq body = NULL;
5916   struct gimplify_ctx gctx;
5917
5918   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p,
5919                              OMP_PARALLEL_COMBINED (expr)
5920                              ? ORT_COMBINED_PARALLEL
5921                              : ORT_PARALLEL);
5922
5923   push_gimplify_context (&gctx);
5924
5925   g = gimplify_and_return_first (OMP_PARALLEL_BODY (expr), &body);
5926   if (gimple_code (g) == GIMPLE_BIND)
5927     pop_gimplify_context (g);
5928   else
5929     pop_gimplify_context (NULL);
5930
5931   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
5932
5933   g = gimple_build_omp_parallel (body,
5934                                  OMP_PARALLEL_CLAUSES (expr),
5935                                  NULL_TREE, NULL_TREE);
5936   if (OMP_PARALLEL_COMBINED (expr))
5937     gimple_omp_set_subcode (g, GF_OMP_PARALLEL_COMBINED);
5938   gimplify_seq_add_stmt (pre_p, g);
5939   *expr_p = NULL_TREE;
5940 }
5941
5942 /* Gimplify the contents of an OMP_TASK statement.  This involves
5943    gimplification of the body, as well as scanning the body for used
5944    variables.  We need to do this scan now, because variable-sized
5945    decls will be decomposed during gimplification.  */
5946
5947 static void
5948 gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
5949 {
5950   tree expr = *expr_p;
5951   gimple g;
5952   gimple_seq body = NULL;
5953   struct gimplify_ctx gctx;
5954
5955   gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p, ORT_TASK);
5956
5957   push_gimplify_context (&gctx);
5958
5959   g = gimplify_and_return_first (OMP_TASK_BODY (expr), &body);
5960   if (gimple_code (g) == GIMPLE_BIND)
5961     pop_gimplify_context (g);
5962   else
5963     pop_gimplify_context (NULL);
5964
5965   gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
5966
5967   g = gimple_build_omp_task (body,
5968                              OMP_TASK_CLAUSES (expr),
5969                              NULL_TREE, NULL_TREE,
5970                              NULL_TREE, NULL_TREE, NULL_TREE);
5971   gimplify_seq_add_stmt (pre_p, g);
5972   *expr_p = NULL_TREE;
5973 }
5974
5975 /* Gimplify the gross structure of an OMP_FOR statement.  */
5976
5977 static enum gimplify_status
5978 gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
5979 {
5980   tree for_stmt, decl, var, t;
5981   enum gimplify_status ret = GS_ALL_DONE;
5982   enum gimplify_status tret;
5983   gimple gfor;
5984   gimple_seq for_body, for_pre_body;
5985   int i;
5986
5987   for_stmt = *expr_p;
5988
5989   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
5990                              ORT_WORKSHARE);
5991
5992   /* Handle OMP_FOR_INIT.  */
5993   for_pre_body = NULL;
5994   gimplify_and_add (OMP_FOR_PRE_BODY (for_stmt), &for_pre_body);
5995   OMP_FOR_PRE_BODY (for_stmt) = NULL_TREE;
5996
5997   for_body = gimple_seq_alloc ();
5998   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
5999               == TREE_VEC_LENGTH (OMP_FOR_COND (for_stmt)));
6000   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6001               == TREE_VEC_LENGTH (OMP_FOR_INCR (for_stmt)));
6002   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6003     {
6004       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6005       gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6006       decl = TREE_OPERAND (t, 0);
6007       gcc_assert (DECL_P (decl));
6008       gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl))
6009                   || POINTER_TYPE_P (TREE_TYPE (decl)));
6010
6011       /* Make sure the iteration variable is private.  */
6012       if (omp_is_private (gimplify_omp_ctxp, decl))
6013         omp_notice_variable (gimplify_omp_ctxp, decl, true);
6014       else
6015         omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
6016
6017       /* If DECL is not a gimple register, create a temporary variable to act
6018          as an iteration counter.  This is valid, since DECL cannot be
6019          modified in the body of the loop.  */
6020       if (!is_gimple_reg (decl))
6021         {
6022           var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
6023           TREE_OPERAND (t, 0) = var;
6024                               
6025           gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
6026
6027           omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
6028         }
6029       else
6030         var = decl;
6031
6032       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6033                             is_gimple_val, fb_rvalue);
6034       ret = MIN (ret, tret);
6035       if (ret == GS_ERROR)
6036         return ret;
6037
6038       /* Handle OMP_FOR_COND.  */
6039       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6040       gcc_assert (COMPARISON_CLASS_P (t));
6041       gcc_assert (TREE_OPERAND (t, 0) == decl);
6042
6043       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6044                             is_gimple_val, fb_rvalue);
6045       ret = MIN (ret, tret);
6046
6047       /* Handle OMP_FOR_INCR.  */
6048       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6049       switch (TREE_CODE (t))
6050         {
6051         case PREINCREMENT_EXPR:
6052         case POSTINCREMENT_EXPR:
6053           t = build_int_cst (TREE_TYPE (decl), 1);
6054           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6055           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6056           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6057           break;
6058
6059         case PREDECREMENT_EXPR:
6060         case POSTDECREMENT_EXPR:
6061           t = build_int_cst (TREE_TYPE (decl), -1);
6062           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6063           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6064           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6065           break;
6066
6067         case MODIFY_EXPR:
6068           gcc_assert (TREE_OPERAND (t, 0) == decl);
6069           TREE_OPERAND (t, 0) = var;
6070
6071           t = TREE_OPERAND (t, 1);
6072           switch (TREE_CODE (t))
6073             {
6074             case PLUS_EXPR:
6075               if (TREE_OPERAND (t, 1) == decl)
6076                 {
6077                   TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
6078                   TREE_OPERAND (t, 0) = var;
6079                   break;
6080                 }
6081
6082               /* Fallthru.  */
6083             case MINUS_EXPR:
6084             case POINTER_PLUS_EXPR:
6085               gcc_assert (TREE_OPERAND (t, 0) == decl);
6086               TREE_OPERAND (t, 0) = var;
6087               break;
6088             default:
6089               gcc_unreachable ();
6090             }
6091
6092           tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6093                                 is_gimple_val, fb_rvalue);
6094           ret = MIN (ret, tret);
6095           break;
6096
6097         default:
6098           gcc_unreachable ();
6099         }
6100
6101       if (var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
6102         {
6103           tree c;
6104           for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
6105             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
6106                 && OMP_CLAUSE_DECL (c) == decl
6107                 && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
6108               {
6109                 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6110                 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6111                 gcc_assert (TREE_OPERAND (t, 0) == var);
6112                 t = TREE_OPERAND (t, 1);
6113                 gcc_assert (TREE_CODE (t) == PLUS_EXPR
6114                             || TREE_CODE (t) == MINUS_EXPR
6115                             || TREE_CODE (t) == POINTER_PLUS_EXPR);
6116                 gcc_assert (TREE_OPERAND (t, 0) == var);
6117                 t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
6118                             TREE_OPERAND (t, 1));
6119                 gimplify_assign (decl, t,
6120                                  &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
6121             }
6122         }
6123     }
6124
6125   gimplify_and_add (OMP_FOR_BODY (for_stmt), &for_body);
6126
6127   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
6128
6129   gfor = gimple_build_omp_for (for_body, OMP_FOR_CLAUSES (for_stmt),
6130                                TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)),
6131                                for_pre_body);
6132
6133   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6134     {
6135       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6136       gimple_omp_for_set_index (gfor, i, TREE_OPERAND (t, 0));
6137       gimple_omp_for_set_initial (gfor, i, TREE_OPERAND (t, 1));
6138       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6139       gimple_omp_for_set_cond (gfor, i, TREE_CODE (t));
6140       gimple_omp_for_set_final (gfor, i, TREE_OPERAND (t, 1));
6141       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6142       gimple_omp_for_set_incr (gfor, i, TREE_OPERAND (t, 1));
6143     }
6144
6145   gimplify_seq_add_stmt (pre_p, gfor);
6146   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
6147 }
6148
6149 /* Gimplify the gross structure of other OpenMP worksharing constructs.
6150    In particular, OMP_SECTIONS and OMP_SINGLE.  */
6151
6152 static void
6153 gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
6154 {
6155   tree expr = *expr_p;
6156   gimple stmt;
6157   gimple_seq body = NULL;
6158
6159   gimplify_scan_omp_clauses (&OMP_CLAUSES (expr), pre_p, ORT_WORKSHARE);
6160   gimplify_and_add (OMP_BODY (expr), &body);
6161   gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
6162
6163   if (TREE_CODE (expr) == OMP_SECTIONS)
6164     stmt = gimple_build_omp_sections (body, OMP_CLAUSES (expr));
6165   else if (TREE_CODE (expr) == OMP_SINGLE)
6166     stmt = gimple_build_omp_single (body, OMP_CLAUSES (expr));
6167   else
6168     gcc_unreachable ();
6169
6170   gimplify_seq_add_stmt (pre_p, stmt);
6171 }
6172
6173 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
6174    stabilized the lhs of the atomic operation as *ADDR.  Return true if 
6175    EXPR is this stabilized form.  */
6176
6177 static bool
6178 goa_lhs_expr_p (tree expr, tree addr)
6179 {
6180   /* Also include casts to other type variants.  The C front end is fond
6181      of adding these for e.g. volatile variables.  This is like 
6182      STRIP_TYPE_NOPS but includes the main variant lookup.  */
6183   STRIP_USELESS_TYPE_CONVERSION (expr);
6184
6185   if (TREE_CODE (expr) == INDIRECT_REF)
6186     {
6187       expr = TREE_OPERAND (expr, 0);
6188       while (expr != addr
6189              && (CONVERT_EXPR_P (expr)
6190                  || TREE_CODE (expr) == NON_LVALUE_EXPR)
6191              && TREE_CODE (expr) == TREE_CODE (addr)
6192              && types_compatible_p (TREE_TYPE (expr), TREE_TYPE (addr)))
6193         {
6194           expr = TREE_OPERAND (expr, 0);
6195           addr = TREE_OPERAND (addr, 0);
6196         }
6197       if (expr == addr)
6198         return true;
6199       return (TREE_CODE (addr) == ADDR_EXPR
6200               && TREE_CODE (expr) == ADDR_EXPR
6201               && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0));
6202     }
6203   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
6204     return true;
6205   return false;
6206 }
6207
6208 /* Walk *EXPR_P and replace
6209    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
6210    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
6211    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
6212
6213 static int
6214 goa_stabilize_expr (tree *expr_p, gimple_seq *pre_p, tree lhs_addr,
6215                     tree lhs_var)
6216 {
6217   tree expr = *expr_p;
6218   int saw_lhs;
6219
6220   if (goa_lhs_expr_p (expr, lhs_addr))
6221     {
6222       *expr_p = lhs_var;
6223       return 1;
6224     }
6225   if (is_gimple_val (expr))
6226     return 0;
6227  
6228   saw_lhs = 0;
6229   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
6230     {
6231     case tcc_binary:
6232     case tcc_comparison:
6233       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p, lhs_addr,
6234                                      lhs_var);
6235     case tcc_unary:
6236       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p, lhs_addr,
6237                                      lhs_var);
6238       break;
6239     case tcc_expression:
6240       switch (TREE_CODE (expr))
6241         {
6242         case TRUTH_ANDIF_EXPR:
6243         case TRUTH_ORIF_EXPR:
6244           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
6245                                          lhs_addr, lhs_var);
6246           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
6247                                          lhs_addr, lhs_var);
6248           break;
6249         default:
6250           break;
6251         }
6252       break;
6253     default:
6254       break;
6255     }
6256
6257   if (saw_lhs == 0)
6258     {
6259       enum gimplify_status gs;
6260       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
6261       if (gs != GS_ALL_DONE)
6262         saw_lhs = -1;
6263     }
6264
6265   return saw_lhs;
6266 }
6267
6268
6269 /* Gimplify an OMP_ATOMIC statement.  */
6270
6271 static enum gimplify_status
6272 gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
6273 {
6274   tree addr = TREE_OPERAND (*expr_p, 0);
6275   tree rhs = TREE_OPERAND (*expr_p, 1);
6276   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
6277   tree tmp_load;
6278
6279    tmp_load = create_tmp_var (type, NULL);
6280    if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
6281      return GS_ERROR;
6282
6283    if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
6284        != GS_ALL_DONE)
6285      return GS_ERROR;
6286
6287    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_load (tmp_load, addr));
6288    if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
6289        != GS_ALL_DONE)
6290      return GS_ERROR;
6291    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_store (rhs));
6292    *expr_p = NULL;
6293
6294    return GS_ALL_DONE;
6295 }
6296
6297
6298 /* Converts the GENERIC expression tree *EXPR_P to GIMPLE.  If the
6299    expression produces a value to be used as an operand inside a GIMPLE
6300    statement, the value will be stored back in *EXPR_P.  This value will
6301    be a tree of class tcc_declaration, tcc_constant, tcc_reference or
6302    an SSA_NAME.  The corresponding sequence of GIMPLE statements is
6303    emitted in PRE_P and POST_P.
6304
6305    Additionally, this process may overwrite parts of the input
6306    expression during gimplification.  Ideally, it should be
6307    possible to do non-destructive gimplification.
6308
6309    EXPR_P points to the GENERIC expression to convert to GIMPLE.  If
6310       the expression needs to evaluate to a value to be used as
6311       an operand in a GIMPLE statement, this value will be stored in
6312       *EXPR_P on exit.  This happens when the caller specifies one
6313       of fb_lvalue or fb_rvalue fallback flags.
6314
6315    PRE_P will contain the sequence of GIMPLE statements corresponding
6316        to the evaluation of EXPR and all the side-effects that must
6317        be executed before the main expression.  On exit, the last
6318        statement of PRE_P is the core statement being gimplified.  For
6319        instance, when gimplifying 'if (++a)' the last statement in
6320        PRE_P will be 'if (t.1)' where t.1 is the result of
6321        pre-incrementing 'a'.
6322
6323    POST_P will contain the sequence of GIMPLE statements corresponding
6324        to the evaluation of all the side-effects that must be executed
6325        after the main expression.  If this is NULL, the post
6326        side-effects are stored at the end of PRE_P.
6327
6328        The reason why the output is split in two is to handle post
6329        side-effects explicitly.  In some cases, an expression may have
6330        inner and outer post side-effects which need to be emitted in
6331        an order different from the one given by the recursive
6332        traversal.  For instance, for the expression (*p--)++ the post
6333        side-effects of '--' must actually occur *after* the post
6334        side-effects of '++'.  However, gimplification will first visit
6335        the inner expression, so if a separate POST sequence was not
6336        used, the resulting sequence would be:
6337
6338             1   t.1 = *p
6339             2   p = p - 1
6340             3   t.2 = t.1 + 1
6341             4   *p = t.2
6342
6343        However, the post-decrement operation in line #2 must not be
6344        evaluated until after the store to *p at line #4, so the
6345        correct sequence should be:
6346
6347             1   t.1 = *p
6348             2   t.2 = t.1 + 1
6349             3   *p = t.2
6350             4   p = p - 1
6351
6352        So, by specifying a separate post queue, it is possible
6353        to emit the post side-effects in the correct order.
6354        If POST_P is NULL, an internal queue will be used.  Before
6355        returning to the caller, the sequence POST_P is appended to
6356        the main output sequence PRE_P.
6357
6358    GIMPLE_TEST_F points to a function that takes a tree T and
6359        returns nonzero if T is in the GIMPLE form requested by the
6360        caller.  The GIMPLE predicates are in tree-gimple.c.
6361
6362    FALLBACK tells the function what sort of a temporary we want if
6363        gimplification cannot produce an expression that complies with
6364        GIMPLE_TEST_F.
6365
6366        fb_none means that no temporary should be generated
6367        fb_rvalue means that an rvalue is OK to generate
6368        fb_lvalue means that an lvalue is OK to generate
6369        fb_either means that either is OK, but an lvalue is preferable.
6370        fb_mayfail means that gimplification may fail (in which case
6371        GS_ERROR will be returned)
6372
6373    The return value is either GS_ERROR or GS_ALL_DONE, since this
6374    function iterates until EXPR is completely gimplified or an error
6375    occurs.  */
6376
6377 enum gimplify_status
6378 gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
6379                bool (*gimple_test_f) (tree), fallback_t fallback)
6380 {
6381   tree tmp;
6382   gimple_seq internal_pre = NULL;
6383   gimple_seq internal_post = NULL;
6384   tree save_expr;
6385   bool is_statement;
6386   location_t saved_location;
6387   enum gimplify_status ret;
6388   gimple_stmt_iterator pre_last_gsi, post_last_gsi;
6389
6390   save_expr = *expr_p;
6391   if (save_expr == NULL_TREE)
6392     return GS_ALL_DONE;
6393
6394   /* If we are gimplifying a top-level statement, PRE_P must be valid.  */
6395   is_statement = gimple_test_f == is_gimple_stmt;
6396   if (is_statement)
6397     gcc_assert (pre_p);
6398
6399   /* Consistency checks.  */
6400   if (gimple_test_f == is_gimple_reg)
6401     gcc_assert (fallback & (fb_rvalue | fb_lvalue));
6402   else if (gimple_test_f == is_gimple_val
6403            || gimple_test_f == is_gimple_call_addr
6404            || gimple_test_f == is_gimple_condexpr
6405            || gimple_test_f == is_gimple_mem_rhs
6406            || gimple_test_f == is_gimple_mem_rhs_or_call
6407            || gimple_test_f == is_gimple_reg_rhs
6408            || gimple_test_f == is_gimple_reg_rhs_or_call
6409            || gimple_test_f == is_gimple_asm_val)
6410     gcc_assert (fallback & fb_rvalue);
6411   else if (gimple_test_f == is_gimple_min_lval
6412            || gimple_test_f == is_gimple_lvalue)
6413     gcc_assert (fallback & fb_lvalue);
6414   else if (gimple_test_f == is_gimple_addressable)
6415     gcc_assert (fallback & fb_either);
6416   else if (gimple_test_f == is_gimple_stmt)
6417     gcc_assert (fallback == fb_none);
6418   else
6419     {
6420       /* We should have recognized the GIMPLE_TEST_F predicate to
6421          know what kind of fallback to use in case a temporary is
6422          needed to hold the value or address of *EXPR_P.  */
6423       gcc_unreachable ();
6424     }
6425
6426   /* We used to check the predicate here and return immediately if it
6427      succeeds.  This is wrong; the design is for gimplification to be
6428      idempotent, and for the predicates to only test for valid forms, not
6429      whether they are fully simplified.  */
6430   if (pre_p == NULL)
6431     pre_p = &internal_pre;
6432
6433   if (post_p == NULL)
6434     post_p = &internal_post;
6435
6436   /* Remember the last statements added to PRE_P and POST_P.  Every
6437      new statement added by the gimplification helpers needs to be
6438      annotated with location information.  To centralize the
6439      responsibility, we remember the last statement that had been
6440      added to both queues before gimplifying *EXPR_P.  If
6441      gimplification produces new statements in PRE_P and POST_P, those
6442      statements will be annotated with the same location information
6443      as *EXPR_P.  */
6444   pre_last_gsi = gsi_last (*pre_p);
6445   post_last_gsi = gsi_last (*post_p);
6446
6447   saved_location = input_location;
6448   if (save_expr != error_mark_node
6449       && EXPR_HAS_LOCATION (*expr_p))
6450     input_location = EXPR_LOCATION (*expr_p);
6451
6452   /* Loop over the specific gimplifiers until the toplevel node
6453      remains the same.  */
6454   do
6455     {
6456       /* Strip away as many useless type conversions as possible
6457          at the toplevel.  */
6458       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
6459
6460       /* Remember the expr.  */
6461       save_expr = *expr_p;
6462
6463       /* Die, die, die, my darling.  */
6464       if (save_expr == error_mark_node
6465           || (TREE_TYPE (save_expr)
6466               && TREE_TYPE (save_expr) == error_mark_node))
6467         {
6468           ret = GS_ERROR;
6469           break;
6470         }
6471
6472       /* Do any language-specific gimplification.  */
6473       ret = ((enum gimplify_status)
6474              lang_hooks.gimplify_expr (expr_p, pre_p, post_p));
6475       if (ret == GS_OK)
6476         {
6477           if (*expr_p == NULL_TREE)
6478             break;
6479           if (*expr_p != save_expr)
6480             continue;
6481         }
6482       else if (ret != GS_UNHANDLED)
6483         break;
6484
6485       ret = GS_OK;
6486       switch (TREE_CODE (*expr_p))
6487         {
6488           /* First deal with the special cases.  */
6489
6490         case POSTINCREMENT_EXPR:
6491         case POSTDECREMENT_EXPR:
6492         case PREINCREMENT_EXPR:
6493         case PREDECREMENT_EXPR:
6494           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
6495                                         fallback != fb_none);
6496           break;
6497
6498         case ARRAY_REF:
6499         case ARRAY_RANGE_REF:
6500         case REALPART_EXPR:
6501         case IMAGPART_EXPR:
6502         case COMPONENT_REF:
6503         case VIEW_CONVERT_EXPR:
6504           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
6505                                         fallback ? fallback : fb_rvalue);
6506           break;
6507
6508         case COND_EXPR:
6509           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
6510
6511           /* C99 code may assign to an array in a structure value of a
6512              conditional expression, and this has undefined behavior
6513              only on execution, so create a temporary if an lvalue is
6514              required.  */
6515           if (fallback == fb_lvalue)
6516             {
6517               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6518               mark_addressable (*expr_p);
6519             }
6520           break;
6521
6522         case CALL_EXPR:
6523           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
6524
6525           /* C99 code may assign to an array in a structure returned
6526              from a function, and this has undefined behavior only on
6527              execution, so create a temporary if an lvalue is
6528              required.  */
6529           if (fallback == fb_lvalue)
6530             {
6531               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6532               mark_addressable (*expr_p);
6533             }
6534           break;
6535
6536         case TREE_LIST:
6537           gcc_unreachable ();
6538
6539         case COMPOUND_EXPR:
6540           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
6541           break;
6542
6543         case COMPOUND_LITERAL_EXPR:
6544           ret = gimplify_compound_literal_expr (expr_p, pre_p);
6545           break;
6546
6547         case MODIFY_EXPR:
6548         case INIT_EXPR:
6549           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
6550                                       fallback != fb_none);
6551           break;
6552
6553         case TRUTH_ANDIF_EXPR:
6554         case TRUTH_ORIF_EXPR:
6555           /* Pass the source location of the outer expression.  */
6556           ret = gimplify_boolean_expr (expr_p, saved_location);
6557           break;
6558
6559         case TRUTH_NOT_EXPR:
6560           if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE)
6561             {
6562               tree type = TREE_TYPE (*expr_p);
6563               *expr_p = fold_convert (type, gimple_boolify (*expr_p));
6564               ret = GS_OK;
6565               break;
6566             }
6567
6568           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6569                                is_gimple_val, fb_rvalue);
6570           recalculate_side_effects (*expr_p);
6571           break;
6572
6573         case ADDR_EXPR:
6574           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
6575           break;
6576
6577         case VA_ARG_EXPR:
6578           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
6579           break;
6580
6581         CASE_CONVERT:
6582           if (IS_EMPTY_STMT (*expr_p))
6583             {
6584               ret = GS_ALL_DONE;
6585               break;
6586             }
6587
6588           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
6589               || fallback == fb_none)
6590             {
6591               /* Just strip a conversion to void (or in void context) and
6592                  try again.  */
6593               *expr_p = TREE_OPERAND (*expr_p, 0);
6594               break;
6595             }
6596
6597           ret = gimplify_conversion (expr_p);
6598           if (ret == GS_ERROR)
6599             break;
6600           if (*expr_p != save_expr)
6601             break;
6602           /* FALLTHRU */
6603
6604         case FIX_TRUNC_EXPR:
6605           /* unary_expr: ... | '(' cast ')' val | ...  */
6606           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6607                                is_gimple_val, fb_rvalue);
6608           recalculate_side_effects (*expr_p);
6609           break;
6610
6611         case INDIRECT_REF:
6612           *expr_p = fold_indirect_ref_loc (input_location, *expr_p);
6613           if (*expr_p != save_expr)
6614             break;
6615           /* else fall through.  */
6616         case ALIGN_INDIRECT_REF:
6617         case MISALIGNED_INDIRECT_REF:
6618           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6619                                is_gimple_reg, fb_rvalue);
6620           recalculate_side_effects (*expr_p);
6621           break;
6622
6623           /* Constants need not be gimplified.  */
6624         case INTEGER_CST:
6625         case REAL_CST:
6626         case FIXED_CST:
6627         case STRING_CST:
6628         case COMPLEX_CST:
6629         case VECTOR_CST:
6630           ret = GS_ALL_DONE;
6631           break;
6632
6633         case CONST_DECL:
6634           /* If we require an lvalue, such as for ADDR_EXPR, retain the
6635              CONST_DECL node.  Otherwise the decl is replaceable by its
6636              value.  */
6637           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
6638           if (fallback & fb_lvalue)
6639             ret = GS_ALL_DONE;
6640           else
6641             *expr_p = DECL_INITIAL (*expr_p);
6642           break;
6643
6644         case DECL_EXPR:
6645           ret = gimplify_decl_expr (expr_p, pre_p);
6646           break;
6647
6648         case BIND_EXPR:
6649           ret = gimplify_bind_expr (expr_p, pre_p);
6650           break;
6651
6652         case LOOP_EXPR:
6653           ret = gimplify_loop_expr (expr_p, pre_p);
6654           break;
6655
6656         case SWITCH_EXPR:
6657           ret = gimplify_switch_expr (expr_p, pre_p);
6658           break;
6659
6660         case EXIT_EXPR:
6661           ret = gimplify_exit_expr (expr_p);
6662           break;
6663
6664         case GOTO_EXPR:
6665           /* If the target is not LABEL, then it is a computed jump
6666              and the target needs to be gimplified.  */
6667           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
6668             {
6669               ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
6670                                    NULL, is_gimple_val, fb_rvalue);
6671               if (ret == GS_ERROR)
6672                 break;
6673             }
6674           gimplify_seq_add_stmt (pre_p,
6675                           gimple_build_goto (GOTO_DESTINATION (*expr_p)));
6676           break;
6677
6678         case PREDICT_EXPR:
6679           gimplify_seq_add_stmt (pre_p,
6680                         gimple_build_predict (PREDICT_EXPR_PREDICTOR (*expr_p),
6681                                               PREDICT_EXPR_OUTCOME (*expr_p)));
6682           ret = GS_ALL_DONE;
6683           break;
6684
6685         case LABEL_EXPR:
6686           ret = GS_ALL_DONE;
6687           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
6688                       == current_function_decl);
6689           gimplify_seq_add_stmt (pre_p,
6690                           gimple_build_label (LABEL_EXPR_LABEL (*expr_p)));
6691           break;
6692
6693         case CASE_LABEL_EXPR:
6694           ret = gimplify_case_label_expr (expr_p, pre_p);
6695           break;
6696
6697         case RETURN_EXPR:
6698           ret = gimplify_return_expr (*expr_p, pre_p);
6699           break;
6700
6701         case CONSTRUCTOR:
6702           /* Don't reduce this in place; let gimplify_init_constructor work its
6703              magic.  Buf if we're just elaborating this for side effects, just
6704              gimplify any element that has side-effects.  */
6705           if (fallback == fb_none)
6706             {
6707               unsigned HOST_WIDE_INT ix;
6708               constructor_elt *ce;
6709               tree temp = NULL_TREE;
6710               for (ix = 0;
6711                    VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
6712                                 ix, ce);
6713                    ix++)
6714                 if (TREE_SIDE_EFFECTS (ce->value))
6715                   append_to_statement_list (ce->value, &temp);
6716
6717               *expr_p = temp;
6718               ret = GS_OK;
6719             }
6720           /* C99 code may assign to an array in a constructed
6721              structure or union, and this has undefined behavior only
6722              on execution, so create a temporary if an lvalue is
6723              required.  */
6724           else if (fallback == fb_lvalue)
6725             {
6726               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6727               mark_addressable (*expr_p);
6728             }
6729           else
6730             ret = GS_ALL_DONE;
6731           break;
6732
6733           /* The following are special cases that are not handled by the
6734              original GIMPLE grammar.  */
6735
6736           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
6737              eliminated.  */
6738         case SAVE_EXPR:
6739           ret = gimplify_save_expr (expr_p, pre_p, post_p);
6740           break;
6741
6742         case BIT_FIELD_REF:
6743           {
6744             enum gimplify_status r0, r1, r2;
6745
6746             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6747                                 post_p, is_gimple_lvalue, fb_either);
6748             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6749                                 post_p, is_gimple_val, fb_rvalue);
6750             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
6751                                 post_p, is_gimple_val, fb_rvalue);
6752             recalculate_side_effects (*expr_p);
6753
6754             ret = MIN (r0, MIN (r1, r2));
6755           }
6756           break;
6757
6758         case TARGET_MEM_REF:
6759           {
6760             enum gimplify_status r0 = GS_ALL_DONE, r1 = GS_ALL_DONE;
6761
6762             if (TMR_SYMBOL (*expr_p))
6763               r0 = gimplify_expr (&TMR_SYMBOL (*expr_p), pre_p,
6764                                   post_p, is_gimple_lvalue, fb_either);
6765             else if (TMR_BASE (*expr_p))
6766               r0 = gimplify_expr (&TMR_BASE (*expr_p), pre_p,
6767                                   post_p, is_gimple_val, fb_either);
6768             if (TMR_INDEX (*expr_p))
6769               r1 = gimplify_expr (&TMR_INDEX (*expr_p), pre_p,
6770                                   post_p, is_gimple_val, fb_rvalue);
6771             /* TMR_STEP and TMR_OFFSET are always integer constants.  */
6772             ret = MIN (r0, r1);
6773           }
6774           break;
6775
6776         case NON_LVALUE_EXPR:
6777           /* This should have been stripped above.  */
6778           gcc_unreachable ();
6779
6780         case ASM_EXPR:
6781           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
6782           break;
6783
6784         case TRY_FINALLY_EXPR:
6785         case TRY_CATCH_EXPR:
6786           {
6787             gimple_seq eval, cleanup;
6788             gimple try_;
6789
6790             eval = cleanup = NULL;
6791             gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
6792             gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
6793             /* Don't create bogus GIMPLE_TRY with empty cleanup.  */
6794             if (gimple_seq_empty_p (cleanup))
6795               {
6796                 gimple_seq_add_seq (pre_p, eval);
6797                 ret = GS_ALL_DONE;
6798                 break;
6799               }
6800             try_ = gimple_build_try (eval, cleanup,
6801                                      TREE_CODE (*expr_p) == TRY_FINALLY_EXPR
6802                                      ? GIMPLE_TRY_FINALLY
6803                                      : GIMPLE_TRY_CATCH);
6804             if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR)
6805               gimple_try_set_catch_is_cleanup (try_,
6806                                                TRY_CATCH_IS_CLEANUP (*expr_p));
6807             gimplify_seq_add_stmt (pre_p, try_);
6808             ret = GS_ALL_DONE;
6809             break;
6810           }
6811
6812         case CLEANUP_POINT_EXPR:
6813           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
6814           break;
6815
6816         case TARGET_EXPR:
6817           ret = gimplify_target_expr (expr_p, pre_p, post_p);
6818           break;
6819
6820         case CATCH_EXPR:
6821           {
6822             gimple c;
6823             gimple_seq handler = NULL;
6824             gimplify_and_add (CATCH_BODY (*expr_p), &handler);
6825             c = gimple_build_catch (CATCH_TYPES (*expr_p), handler);
6826             gimplify_seq_add_stmt (pre_p, c);
6827             ret = GS_ALL_DONE;
6828             break;
6829           }
6830
6831         case EH_FILTER_EXPR:
6832           {
6833             gimple ehf;
6834             gimple_seq failure = NULL;
6835
6836             gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure);
6837             ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure);
6838             gimple_set_no_warning (ehf, TREE_NO_WARNING (*expr_p));
6839             gimplify_seq_add_stmt (pre_p, ehf);
6840             ret = GS_ALL_DONE;
6841             break;
6842           }
6843
6844         case OBJ_TYPE_REF:
6845           {
6846             enum gimplify_status r0, r1;
6847             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p,
6848                                 post_p, is_gimple_val, fb_rvalue);
6849             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p,
6850                                 post_p, is_gimple_val, fb_rvalue);
6851             TREE_SIDE_EFFECTS (*expr_p) = 0;
6852             ret = MIN (r0, r1);
6853           }
6854           break;
6855
6856         case LABEL_DECL:
6857           /* We get here when taking the address of a label.  We mark
6858              the label as "forced"; meaning it can never be removed and
6859              it is a potential target for any computed goto.  */
6860           FORCED_LABEL (*expr_p) = 1;
6861           ret = GS_ALL_DONE;
6862           break;
6863
6864         case STATEMENT_LIST:
6865           ret = gimplify_statement_list (expr_p, pre_p);
6866           break;
6867
6868         case WITH_SIZE_EXPR:
6869           {
6870             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6871                            post_p == &internal_post ? NULL : post_p,
6872                            gimple_test_f, fallback);
6873             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6874                            is_gimple_val, fb_rvalue);
6875           }
6876           break;
6877
6878         case VAR_DECL:
6879         case PARM_DECL:
6880           ret = gimplify_var_or_parm_decl (expr_p);
6881           break;
6882
6883         case RESULT_DECL:
6884           /* When within an OpenMP context, notice uses of variables.  */
6885           if (gimplify_omp_ctxp)
6886             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
6887           ret = GS_ALL_DONE;
6888           break;
6889
6890         case SSA_NAME:
6891           /* Allow callbacks into the gimplifier during optimization.  */
6892           ret = GS_ALL_DONE;
6893           break;
6894
6895         case OMP_PARALLEL:
6896           gimplify_omp_parallel (expr_p, pre_p);
6897           ret = GS_ALL_DONE;
6898           break;
6899
6900         case OMP_TASK:
6901           gimplify_omp_task (expr_p, pre_p);
6902           ret = GS_ALL_DONE;
6903           break;
6904
6905         case OMP_FOR:
6906           ret = gimplify_omp_for (expr_p, pre_p);
6907           break;
6908
6909         case OMP_SECTIONS:
6910         case OMP_SINGLE:
6911           gimplify_omp_workshare (expr_p, pre_p);
6912           ret = GS_ALL_DONE;
6913           break;
6914
6915         case OMP_SECTION:
6916         case OMP_MASTER:
6917         case OMP_ORDERED:
6918         case OMP_CRITICAL:
6919           {
6920             gimple_seq body = NULL;
6921             gimple g;
6922
6923             gimplify_and_add (OMP_BODY (*expr_p), &body);
6924             switch (TREE_CODE (*expr_p))
6925               {
6926               case OMP_SECTION:
6927                 g = gimple_build_omp_section (body);
6928                 break;
6929               case OMP_MASTER:
6930                 g = gimple_build_omp_master (body);
6931                 break;
6932               case OMP_ORDERED:
6933                 g = gimple_build_omp_ordered (body);
6934                 break;
6935               case OMP_CRITICAL:
6936                 g = gimple_build_omp_critical (body,
6937                                                OMP_CRITICAL_NAME (*expr_p));
6938                 break;
6939               default:
6940                 gcc_unreachable ();
6941               }
6942             gimplify_seq_add_stmt (pre_p, g);
6943             ret = GS_ALL_DONE;
6944             break;
6945           }
6946
6947         case OMP_ATOMIC:
6948           ret = gimplify_omp_atomic (expr_p, pre_p);
6949           break;
6950
6951         case POINTER_PLUS_EXPR:
6952           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
6953              The second is gimple immediate saving a need for extra statement.
6954            */
6955           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6956               && (tmp = maybe_fold_offset_to_address
6957                   (EXPR_LOCATION (*expr_p),
6958                    TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
6959                    TREE_TYPE (*expr_p))))
6960             {
6961               *expr_p = tmp;
6962               break;
6963             }
6964           /* Convert (void *)&a + 4 into (void *)&a[1].  */
6965           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
6966               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6967               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
6968                                                                         0),0)))
6969               && (tmp = maybe_fold_offset_to_address
6970                   (EXPR_LOCATION (*expr_p),
6971                    TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
6972                    TREE_OPERAND (*expr_p, 1),
6973                    TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
6974                                             0)))))
6975              {
6976                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
6977                break;
6978              }
6979           /* FALLTHRU */
6980
6981         default:
6982           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
6983             {
6984             case tcc_comparison:
6985               /* Handle comparison of objects of non scalar mode aggregates
6986                  with a call to memcmp.  It would be nice to only have to do
6987                  this for variable-sized objects, but then we'd have to allow
6988                  the same nest of reference nodes we allow for MODIFY_EXPR and
6989                  that's too complex.
6990
6991                  Compare scalar mode aggregates as scalar mode values.  Using
6992                  memcmp for them would be very inefficient at best, and is
6993                  plain wrong if bitfields are involved.  */
6994                 {
6995                   tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
6996
6997                   if (!AGGREGATE_TYPE_P (type))
6998                     goto expr_2;
6999                   else if (TYPE_MODE (type) != BLKmode)
7000                     ret = gimplify_scalar_mode_aggregate_compare (expr_p);
7001                   else
7002                     ret = gimplify_variable_sized_compare (expr_p);
7003
7004                   break;
7005                 }
7006
7007             /* If *EXPR_P does not need to be special-cased, handle it
7008                according to its class.  */
7009             case tcc_unary:
7010               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7011                                    post_p, is_gimple_val, fb_rvalue);
7012               break;
7013
7014             case tcc_binary:
7015             expr_2:
7016               {
7017                 enum gimplify_status r0, r1;
7018
7019                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7020                                     post_p, is_gimple_val, fb_rvalue);
7021                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7022                                     post_p, is_gimple_val, fb_rvalue);
7023
7024                 ret = MIN (r0, r1);
7025                 break;
7026               }
7027
7028             case tcc_declaration:
7029             case tcc_constant:
7030               ret = GS_ALL_DONE;
7031               goto dont_recalculate;
7032
7033             default:
7034               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
7035                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
7036                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
7037               goto expr_2;
7038             }
7039
7040           recalculate_side_effects (*expr_p);
7041
7042         dont_recalculate:
7043           break;
7044         }
7045
7046       /* If we replaced *expr_p, gimplify again.  */
7047       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
7048         ret = GS_ALL_DONE;
7049     }
7050   while (ret == GS_OK);
7051
7052   /* If we encountered an error_mark somewhere nested inside, either
7053      stub out the statement or propagate the error back out.  */
7054   if (ret == GS_ERROR)
7055     {
7056       if (is_statement)
7057         *expr_p = NULL;
7058       goto out;
7059     }
7060
7061   /* This was only valid as a return value from the langhook, which
7062      we handled.  Make sure it doesn't escape from any other context.  */
7063   gcc_assert (ret != GS_UNHANDLED);
7064
7065   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
7066     {
7067       /* We aren't looking for a value, and we don't have a valid
7068          statement.  If it doesn't have side-effects, throw it away.  */
7069       if (!TREE_SIDE_EFFECTS (*expr_p))
7070         *expr_p = NULL;
7071       else if (!TREE_THIS_VOLATILE (*expr_p))
7072         {
7073           /* This is probably a _REF that contains something nested that
7074              has side effects.  Recurse through the operands to find it.  */
7075           enum tree_code code = TREE_CODE (*expr_p);
7076
7077           switch (code)
7078             {
7079             case COMPONENT_REF:
7080             case REALPART_EXPR:
7081             case IMAGPART_EXPR:
7082             case VIEW_CONVERT_EXPR:
7083               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7084                              gimple_test_f, fallback);
7085               break;
7086
7087             case ARRAY_REF:
7088             case ARRAY_RANGE_REF:
7089               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7090                              gimple_test_f, fallback);
7091               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7092                              gimple_test_f, fallback);
7093               break;
7094
7095             default:
7096                /* Anything else with side-effects must be converted to
7097                   a valid statement before we get here.  */
7098               gcc_unreachable ();
7099             }
7100
7101           *expr_p = NULL;
7102         }
7103       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
7104                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
7105         {
7106           /* Historically, the compiler has treated a bare reference
7107              to a non-BLKmode volatile lvalue as forcing a load.  */
7108           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
7109
7110           /* Normally, we do not want to create a temporary for a
7111              TREE_ADDRESSABLE type because such a type should not be
7112              copied by bitwise-assignment.  However, we make an
7113              exception here, as all we are doing here is ensuring that
7114              we read the bytes that make up the type.  We use
7115              create_tmp_var_raw because create_tmp_var will abort when
7116              given a TREE_ADDRESSABLE type.  */
7117           tree tmp = create_tmp_var_raw (type, "vol");
7118           gimple_add_tmp_var (tmp);
7119           gimplify_assign (tmp, *expr_p, pre_p);
7120           *expr_p = NULL;
7121         }
7122       else
7123         /* We can't do anything useful with a volatile reference to
7124            an incomplete type, so just throw it away.  Likewise for
7125            a BLKmode type, since any implicit inner load should
7126            already have been turned into an explicit one by the
7127            gimplification process.  */
7128         *expr_p = NULL;
7129     }
7130
7131   /* If we are gimplifying at the statement level, we're done.  Tack
7132      everything together and return.  */
7133   if (fallback == fb_none || is_statement)
7134     {
7135       /* Since *EXPR_P has been converted into a GIMPLE tuple, clear
7136          it out for GC to reclaim it.  */
7137       *expr_p = NULL_TREE;
7138
7139       if (!gimple_seq_empty_p (internal_pre)
7140           || !gimple_seq_empty_p (internal_post))
7141         {
7142           gimplify_seq_add_seq (&internal_pre, internal_post);
7143           gimplify_seq_add_seq (pre_p, internal_pre);
7144         }
7145
7146       /* The result of gimplifying *EXPR_P is going to be the last few
7147          statements in *PRE_P and *POST_P.  Add location information
7148          to all the statements that were added by the gimplification
7149          helpers.  */
7150       if (!gimple_seq_empty_p (*pre_p))
7151         annotate_all_with_location_after (*pre_p, pre_last_gsi, input_location);
7152
7153       if (!gimple_seq_empty_p (*post_p))
7154         annotate_all_with_location_after (*post_p, post_last_gsi,
7155                                           input_location);
7156
7157       goto out;
7158     }
7159
7160 #ifdef ENABLE_GIMPLE_CHECKING
7161   if (*expr_p)
7162     {
7163       enum tree_code code = TREE_CODE (*expr_p);
7164       /* These expressions should already be in gimple IR form.  */
7165       gcc_assert (code != MODIFY_EXPR
7166                   && code != ASM_EXPR
7167                   && code != BIND_EXPR
7168                   && code != CATCH_EXPR
7169                   && (code != COND_EXPR || gimplify_ctxp->allow_rhs_cond_expr)
7170                   && code != EH_FILTER_EXPR
7171                   && code != GOTO_EXPR
7172                   && code != LABEL_EXPR
7173                   && code != LOOP_EXPR
7174                   && code != SWITCH_EXPR
7175                   && code != TRY_FINALLY_EXPR
7176                   && code != OMP_CRITICAL
7177                   && code != OMP_FOR
7178                   && code != OMP_MASTER
7179                   && code != OMP_ORDERED
7180                   && code != OMP_PARALLEL
7181                   && code != OMP_SECTIONS
7182                   && code != OMP_SECTION
7183                   && code != OMP_SINGLE);
7184     }
7185 #endif
7186
7187   /* Otherwise we're gimplifying a subexpression, so the resulting
7188      value is interesting.  If it's a valid operand that matches
7189      GIMPLE_TEST_F, we're done. Unless we are handling some
7190      post-effects internally; if that's the case, we need to copy into
7191      a temporary before adding the post-effects to POST_P.  */
7192   if (gimple_seq_empty_p (internal_post) && (*gimple_test_f) (*expr_p))
7193     goto out;
7194
7195   /* Otherwise, we need to create a new temporary for the gimplified
7196      expression.  */
7197
7198   /* We can't return an lvalue if we have an internal postqueue.  The
7199      object the lvalue refers to would (probably) be modified by the
7200      postqueue; we need to copy the value out first, which means an
7201      rvalue.  */
7202   if ((fallback & fb_lvalue)
7203       && gimple_seq_empty_p (internal_post)
7204       && is_gimple_addressable (*expr_p))
7205     {
7206       /* An lvalue will do.  Take the address of the expression, store it
7207          in a temporary, and replace the expression with an INDIRECT_REF of
7208          that temporary.  */
7209       tmp = build_fold_addr_expr_loc (input_location, *expr_p);
7210       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
7211       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
7212     }
7213   else if ((fallback & fb_rvalue) && is_gimple_reg_rhs_or_call (*expr_p))
7214     {
7215       /* An rvalue will do.  Assign the gimplified expression into a
7216          new temporary TMP and replace the original expression with
7217          TMP.  First, make sure that the expression has a type so that
7218          it can be assigned into a temporary.  */
7219       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
7220
7221       if (!gimple_seq_empty_p (internal_post) || (fallback & fb_lvalue))
7222         /* The postqueue might change the value of the expression between
7223            the initialization and use of the temporary, so we can't use a
7224            formal temp.  FIXME do we care?  */
7225         {
7226           *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7227           if (TREE_CODE (TREE_TYPE (*expr_p)) == COMPLEX_TYPE
7228               || TREE_CODE (TREE_TYPE (*expr_p)) == VECTOR_TYPE)
7229             DECL_GIMPLE_REG_P (*expr_p) = 1;
7230         }
7231       else
7232         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
7233     }
7234   else
7235     {
7236 #ifdef ENABLE_GIMPLE_CHECKING
7237       if (!(fallback & fb_mayfail))
7238         {
7239           fprintf (stderr, "gimplification failed:\n");
7240           print_generic_expr (stderr, *expr_p, 0);
7241           debug_tree (*expr_p);
7242           internal_error ("gimplification failed");
7243         }
7244 #endif
7245       gcc_assert (fallback & fb_mayfail);
7246
7247       /* If this is an asm statement, and the user asked for the
7248          impossible, don't die.  Fail and let gimplify_asm_expr
7249          issue an error.  */
7250       ret = GS_ERROR;
7251       goto out;
7252     }
7253
7254   /* Make sure the temporary matches our predicate.  */
7255   gcc_assert ((*gimple_test_f) (*expr_p));
7256
7257   if (!gimple_seq_empty_p (internal_post))
7258     {
7259       annotate_all_with_location (internal_post, input_location);
7260       gimplify_seq_add_seq (pre_p, internal_post);
7261     }
7262
7263  out:
7264   input_location = saved_location;
7265   return ret;
7266 }
7267
7268 /* Look through TYPE for variable-sized objects and gimplify each such
7269    size that we find.  Add to LIST_P any statements generated.  */
7270
7271 void
7272 gimplify_type_sizes (tree type, gimple_seq *list_p)
7273 {
7274   tree field, t;
7275
7276   if (type == NULL || type == error_mark_node)
7277     return;
7278
7279   /* We first do the main variant, then copy into any other variants.  */
7280   type = TYPE_MAIN_VARIANT (type);
7281
7282   /* Avoid infinite recursion.  */
7283   if (TYPE_SIZES_GIMPLIFIED (type))
7284     return;
7285
7286   TYPE_SIZES_GIMPLIFIED (type) = 1;
7287
7288   switch (TREE_CODE (type))
7289     {
7290     case INTEGER_TYPE:
7291     case ENUMERAL_TYPE:
7292     case BOOLEAN_TYPE:
7293     case REAL_TYPE:
7294     case FIXED_POINT_TYPE:
7295       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
7296       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
7297
7298       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7299         {
7300           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
7301           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
7302         }
7303       break;
7304
7305     case ARRAY_TYPE:
7306       /* These types may not have declarations, so handle them here.  */
7307       gimplify_type_sizes (TREE_TYPE (type), list_p);
7308       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
7309       /* When not optimizing, ensure VLA bounds aren't removed.  */
7310       if (!optimize
7311           && TYPE_DOMAIN (type)
7312           && INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
7313         {
7314           t = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
7315           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7316             DECL_IGNORED_P (t) = 0;
7317           t = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
7318           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7319             DECL_IGNORED_P (t) = 0;
7320         }
7321       break;
7322
7323     case RECORD_TYPE:
7324     case UNION_TYPE:
7325     case QUAL_UNION_TYPE:
7326       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
7327         if (TREE_CODE (field) == FIELD_DECL)
7328           {
7329             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
7330             gimplify_one_sizepos (&DECL_SIZE (field), list_p);
7331             gimplify_one_sizepos (&DECL_SIZE_UNIT (field), list_p);
7332             gimplify_type_sizes (TREE_TYPE (field), list_p);
7333           }
7334       break;
7335
7336     case POINTER_TYPE:
7337     case REFERENCE_TYPE:
7338         /* We used to recurse on the pointed-to type here, which turned out to
7339            be incorrect because its definition might refer to variables not
7340            yet initialized at this point if a forward declaration is involved.
7341
7342            It was actually useful for anonymous pointed-to types to ensure
7343            that the sizes evaluation dominates every possible later use of the
7344            values.  Restricting to such types here would be safe since there
7345            is no possible forward declaration around, but would introduce an
7346            undesirable middle-end semantic to anonymity.  We then defer to
7347            front-ends the responsibility of ensuring that the sizes are
7348            evaluated both early and late enough, e.g. by attaching artificial
7349            type declarations to the tree.  */
7350       break;
7351
7352     default:
7353       break;
7354     }
7355
7356   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
7357   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
7358
7359   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7360     {
7361       TYPE_SIZE (t) = TYPE_SIZE (type);
7362       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
7363       TYPE_SIZES_GIMPLIFIED (t) = 1;
7364     }
7365 }
7366
7367 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
7368    a size or position, has had all of its SAVE_EXPRs evaluated.
7369    We add any required statements to *STMT_P.  */
7370
7371 void
7372 gimplify_one_sizepos (tree *expr_p, gimple_seq *stmt_p)
7373 {
7374   tree type, expr = *expr_p;
7375
7376   /* We don't do anything if the value isn't there, is constant, or contains
7377      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
7378      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
7379      will want to replace it with a new variable, but that will cause problems
7380      if this type is from outside the function.  It's OK to have that here.  */
7381   if (expr == NULL_TREE || TREE_CONSTANT (expr)
7382       || TREE_CODE (expr) == VAR_DECL
7383       || CONTAINS_PLACEHOLDER_P (expr))
7384     return;
7385
7386   type = TREE_TYPE (expr);
7387   *expr_p = unshare_expr (expr);
7388
7389   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
7390   expr = *expr_p;
7391
7392   /* Verify that we've an exact type match with the original expression.
7393      In particular, we do not wish to drop a "sizetype" in favour of a
7394      type of similar dimensions.  We don't want to pollute the generic
7395      type-stripping code with this knowledge because it doesn't matter
7396      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
7397      and friends retain their "sizetype-ness".  */
7398   if (TREE_TYPE (expr) != type
7399       && TREE_CODE (type) == INTEGER_TYPE
7400       && TYPE_IS_SIZETYPE (type))
7401     {
7402       tree tmp;
7403       gimple stmt;
7404
7405       *expr_p = create_tmp_var (type, NULL);
7406       tmp = build1 (NOP_EXPR, type, expr);
7407       stmt = gimplify_assign (*expr_p, tmp, stmt_p);
7408       if (EXPR_HAS_LOCATION (expr))
7409         gimple_set_location (stmt, EXPR_LOCATION (expr));
7410       else
7411         gimple_set_location (stmt, input_location);
7412     }
7413 }
7414
7415
7416 /* Gimplify the body of statements pointed to by BODY_P and return a
7417    GIMPLE_BIND containing the sequence of GIMPLE statements
7418    corresponding to BODY_P.  FNDECL is the function decl containing
7419    *BODY_P.  */
7420
7421 gimple
7422 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
7423 {
7424   location_t saved_location = input_location;
7425   gimple_seq parm_stmts, seq;
7426   gimple outer_bind;
7427   struct gimplify_ctx gctx;
7428
7429   timevar_push (TV_TREE_GIMPLIFY);
7430
7431   /* Initialize for optimize_insn_for_s{ize,peed}_p possibly called during
7432      gimplification.  */
7433   default_rtl_profile ();
7434
7435   gcc_assert (gimplify_ctxp == NULL);
7436   push_gimplify_context (&gctx);
7437
7438   /* Unshare most shared trees in the body and in that of any nested functions.
7439      It would seem we don't have to do this for nested functions because
7440      they are supposed to be output and then the outer function gimplified
7441      first, but the g++ front end doesn't always do it that way.  */
7442   unshare_body (body_p, fndecl);
7443   unvisit_body (body_p, fndecl);
7444
7445   if (cgraph_node (fndecl)->origin)
7446     nonlocal_vlas = pointer_set_create ();
7447
7448   /* Make sure input_location isn't set to something weird.  */
7449   input_location = DECL_SOURCE_LOCATION (fndecl);
7450
7451   /* Resolve callee-copies.  This has to be done before processing
7452      the body so that DECL_VALUE_EXPR gets processed correctly.  */
7453   parm_stmts = (do_parms) ? gimplify_parameters () : NULL;
7454
7455   /* Gimplify the function's body.  */
7456   seq = NULL;
7457   gimplify_stmt (body_p, &seq);
7458   outer_bind = gimple_seq_first_stmt (seq);
7459   if (!outer_bind)
7460     {
7461       outer_bind = gimple_build_nop ();
7462       gimplify_seq_add_stmt (&seq, outer_bind);
7463     }
7464
7465   /* The body must contain exactly one statement, a GIMPLE_BIND.  If this is
7466      not the case, wrap everything in a GIMPLE_BIND to make it so.  */
7467   if (gimple_code (outer_bind) == GIMPLE_BIND
7468       && gimple_seq_first (seq) == gimple_seq_last (seq))
7469     ;
7470   else
7471     outer_bind = gimple_build_bind (NULL_TREE, seq, NULL);
7472
7473   *body_p = NULL_TREE;
7474
7475   /* If we had callee-copies statements, insert them at the beginning
7476      of the function.  */
7477   if (!gimple_seq_empty_p (parm_stmts))
7478     {
7479       gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
7480       gimple_bind_set_body (outer_bind, parm_stmts);
7481     }
7482
7483   if (nonlocal_vlas)
7484     {
7485       pointer_set_destroy (nonlocal_vlas);
7486       nonlocal_vlas = NULL;
7487     }
7488
7489   pop_gimplify_context (outer_bind);
7490   gcc_assert (gimplify_ctxp == NULL);
7491
7492 #ifdef ENABLE_TYPES_CHECKING
7493   if (!errorcount && !sorrycount)
7494     verify_types_in_gimple_seq (gimple_bind_body (outer_bind));
7495 #endif
7496
7497   timevar_pop (TV_TREE_GIMPLIFY);
7498   input_location = saved_location;
7499
7500   return outer_bind;
7501 }
7502
7503 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
7504    node for the function we want to gimplify.
7505    
7506    Returns the sequence of GIMPLE statements corresponding to the body
7507    of FNDECL.  */
7508
7509 void
7510 gimplify_function_tree (tree fndecl)
7511 {
7512   tree oldfn, parm, ret;
7513   gimple_seq seq;
7514   gimple bind;
7515
7516   gcc_assert (!gimple_body (fndecl));
7517
7518   oldfn = current_function_decl;
7519   current_function_decl = fndecl;
7520   if (DECL_STRUCT_FUNCTION (fndecl))
7521     push_cfun (DECL_STRUCT_FUNCTION (fndecl));
7522   else
7523     push_struct_function (fndecl);
7524
7525   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
7526     {
7527       /* Preliminarily mark non-addressed complex variables as eligible
7528          for promotion to gimple registers.  We'll transform their uses
7529          as we find them.  */
7530       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
7531            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
7532           && !TREE_THIS_VOLATILE (parm)
7533           && !needs_to_live_in_memory (parm))
7534         DECL_GIMPLE_REG_P (parm) = 1;
7535     }
7536
7537   ret = DECL_RESULT (fndecl);
7538   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
7539        || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
7540       && !needs_to_live_in_memory (ret))
7541     DECL_GIMPLE_REG_P (ret) = 1;
7542
7543   bind = gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
7544
7545   /* The tree body of the function is no longer needed, replace it
7546      with the new GIMPLE body.  */
7547   seq = gimple_seq_alloc ();
7548   gimple_seq_add_stmt (&seq, bind);
7549   gimple_set_body (fndecl, seq);
7550
7551   /* If we're instrumenting function entry/exit, then prepend the call to
7552      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
7553      catch the exit hook.  */
7554   /* ??? Add some way to ignore exceptions for this TFE.  */
7555   if (flag_instrument_function_entry_exit
7556       && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
7557       && !flag_instrument_functions_exclude_p (fndecl))
7558     {
7559       tree x;
7560       gimple new_bind;
7561       gimple tf;
7562       gimple_seq cleanup = NULL, body = NULL;
7563
7564       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
7565       gimplify_seq_add_stmt (&cleanup, gimple_build_call (x, 0));
7566       tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
7567
7568       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
7569       gimplify_seq_add_stmt (&body, gimple_build_call (x, 0));
7570       gimplify_seq_add_stmt (&body, tf);
7571       new_bind = gimple_build_bind (NULL, body, gimple_bind_block (bind));
7572       /* Clear the block for BIND, since it is no longer directly inside
7573          the function, but within a try block.  */
7574       gimple_bind_set_block (bind, NULL);
7575
7576       /* Replace the current function body with the body
7577          wrapped in the try/finally TF.  */
7578       seq = gimple_seq_alloc ();
7579       gimple_seq_add_stmt (&seq, new_bind);
7580       gimple_set_body (fndecl, seq);
7581     }
7582
7583   DECL_SAVED_TREE (fndecl) = NULL_TREE;
7584   cfun->curr_properties = PROP_gimple_any;
7585
7586   current_function_decl = oldfn;
7587   pop_cfun ();
7588 }
7589
7590
7591 /* Some transformations like inlining may invalidate the GIMPLE form
7592    for operands.  This function traverses all the operands in STMT and
7593    gimplifies anything that is not a valid gimple operand.  Any new
7594    GIMPLE statements are inserted before *GSI_P.  */
7595
7596 void
7597 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
7598 {
7599   size_t i, num_ops;
7600   tree orig_lhs = NULL_TREE, lhs, t;
7601   gimple_seq pre = NULL;
7602   gimple post_stmt = NULL;
7603   struct gimplify_ctx gctx;
7604
7605   push_gimplify_context (&gctx);
7606   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7607
7608   switch (gimple_code (stmt))
7609     {
7610     case GIMPLE_COND:
7611       gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
7612                      is_gimple_val, fb_rvalue);
7613       gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
7614                      is_gimple_val, fb_rvalue);
7615       break;
7616     case GIMPLE_SWITCH:
7617       gimplify_expr (gimple_switch_index_ptr (stmt), &pre, NULL,
7618                      is_gimple_val, fb_rvalue);
7619       break;
7620     case GIMPLE_OMP_ATOMIC_LOAD:
7621       gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
7622                      is_gimple_val, fb_rvalue);
7623       break;
7624     case GIMPLE_ASM:
7625       {
7626         size_t i, noutputs = gimple_asm_noutputs (stmt);
7627         const char *constraint, **oconstraints;
7628         bool allows_mem, allows_reg, is_inout;
7629
7630         oconstraints
7631           = (const char **) alloca ((noutputs) * sizeof (const char *));
7632         for (i = 0; i < noutputs; i++)
7633           {
7634             tree op = gimple_asm_output_op (stmt, i);
7635             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7636             oconstraints[i] = constraint;
7637             parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
7638                                      &allows_reg, &is_inout);
7639             gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7640                            is_inout ? is_gimple_min_lval : is_gimple_lvalue,
7641                            fb_lvalue | fb_mayfail);
7642           }
7643         for (i = 0; i < gimple_asm_ninputs (stmt); i++)
7644           {
7645             tree op = gimple_asm_input_op (stmt, i);
7646             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7647             parse_input_constraint (&constraint, 0, 0, noutputs, 0,
7648                                     oconstraints, &allows_mem, &allows_reg);
7649             if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
7650               allows_reg = 0;
7651             if (!allows_reg && allows_mem)
7652               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7653                              is_gimple_lvalue, fb_lvalue | fb_mayfail);
7654             else
7655               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7656                              is_gimple_asm_val, fb_rvalue);
7657           }
7658       }
7659       break;
7660     default:
7661       /* NOTE: We start gimplifying operands from last to first to
7662          make sure that side-effects on the RHS of calls, assignments
7663          and ASMs are executed before the LHS.  The ordering is not
7664          important for other statements.  */
7665       num_ops = gimple_num_ops (stmt);
7666       orig_lhs = gimple_get_lhs (stmt);
7667       for (i = num_ops; i > 0; i--)
7668         {
7669           tree op = gimple_op (stmt, i - 1);
7670           if (op == NULL_TREE)
7671             continue;
7672           if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
7673             gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
7674           else if (i == 2
7675                    && is_gimple_assign (stmt)
7676                    && num_ops == 2
7677                    && get_gimple_rhs_class (gimple_expr_code (stmt))
7678                       == GIMPLE_SINGLE_RHS)
7679             gimplify_expr (&op, &pre, NULL,
7680                            rhs_predicate_for (gimple_assign_lhs (stmt)),
7681                            fb_rvalue);
7682           else if (i == 2 && is_gimple_call (stmt))
7683             {
7684               if (TREE_CODE (op) == FUNCTION_DECL)
7685                 continue;
7686               gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
7687             }
7688           else
7689             gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
7690           gimple_set_op (stmt, i - 1, op);
7691         }
7692
7693       lhs = gimple_get_lhs (stmt);
7694       /* If the LHS changed it in a way that requires a simple RHS,
7695          create temporary.  */
7696       if (lhs && !is_gimple_reg (lhs))
7697         {
7698           bool need_temp = false;
7699
7700           if (is_gimple_assign (stmt)
7701               && num_ops == 2
7702               && get_gimple_rhs_class (gimple_expr_code (stmt))
7703                  == GIMPLE_SINGLE_RHS)
7704             gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
7705                            rhs_predicate_for (gimple_assign_lhs (stmt)),
7706                            fb_rvalue);
7707           else if (is_gimple_reg (lhs))
7708             {
7709               if (is_gimple_reg_type (TREE_TYPE (lhs)))
7710                 {
7711                   if (is_gimple_call (stmt))
7712                     {
7713                       i = gimple_call_flags (stmt);
7714                       if ((i & ECF_LOOPING_CONST_OR_PURE)
7715                           || !(i & (ECF_CONST | ECF_PURE)))
7716                         need_temp = true;
7717                     }
7718                   if (stmt_can_throw_internal (stmt))
7719                     need_temp = true;
7720                 }
7721             }
7722           else
7723             {
7724               if (is_gimple_reg_type (TREE_TYPE (lhs)))
7725                 need_temp = true;
7726               else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
7727                 {
7728                   if (is_gimple_call (stmt))
7729                     {
7730                       tree fndecl = gimple_call_fndecl (stmt);
7731
7732                       if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
7733                           && !(fndecl && DECL_RESULT (fndecl)
7734                                && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
7735                         need_temp = true;
7736                     }
7737                   else
7738                     need_temp = true;
7739                 }
7740             }
7741           if (need_temp)
7742             {
7743               tree temp = create_tmp_var (TREE_TYPE (lhs), NULL);
7744
7745               if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
7746                   || TREE_CODE (TREE_TYPE (lhs)) == VECTOR_TYPE)
7747                 DECL_GIMPLE_REG_P (temp) = 1;
7748               if (TREE_CODE (orig_lhs) == SSA_NAME)
7749                 orig_lhs = SSA_NAME_VAR (orig_lhs);
7750
7751               if (gimple_in_ssa_p (cfun))
7752                 temp = make_ssa_name (temp, NULL);
7753               gimple_set_lhs (stmt, temp);
7754               post_stmt = gimple_build_assign (lhs, temp);
7755               if (TREE_CODE (lhs) == SSA_NAME)
7756                 SSA_NAME_DEF_STMT (lhs) = post_stmt;
7757             }
7758         }
7759       break;
7760     }
7761
7762   if (gimple_referenced_vars (cfun))
7763     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7764       add_referenced_var (t);
7765
7766   if (!gimple_seq_empty_p (pre))
7767     {
7768       if (gimple_in_ssa_p (cfun))
7769         {
7770           gimple_stmt_iterator i;
7771
7772           for (i = gsi_start (pre); !gsi_end_p (i); gsi_next (&i))
7773             mark_symbols_for_renaming (gsi_stmt (i));
7774         }
7775       gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
7776     }
7777   if (post_stmt)
7778     gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
7779
7780   pop_gimplify_context (NULL);
7781 }
7782
7783
7784 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
7785    force the result to be either ssa_name or an invariant, otherwise
7786    just force it to be a rhs expression.  If VAR is not NULL, make the
7787    base variable of the final destination be VAR if suitable.  */
7788
7789 tree
7790 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
7791 {
7792   tree t;
7793   enum gimplify_status ret;
7794   gimple_predicate gimple_test_f;
7795   struct gimplify_ctx gctx;
7796
7797   *stmts = NULL;
7798
7799   if (is_gimple_val (expr))
7800     return expr;
7801
7802   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
7803
7804   push_gimplify_context (&gctx);
7805   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7806   gimplify_ctxp->allow_rhs_cond_expr = true;
7807
7808   if (var)
7809     expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
7810
7811   if (TREE_CODE (expr) != MODIFY_EXPR
7812       && TREE_TYPE (expr) == void_type_node)
7813     {
7814       gimplify_and_add (expr, stmts);
7815       expr = NULL_TREE;
7816     }
7817   else
7818     {
7819       ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
7820       gcc_assert (ret != GS_ERROR);
7821     }
7822
7823   if (gimple_referenced_vars (cfun))
7824     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7825       add_referenced_var (t);
7826
7827   pop_gimplify_context (NULL);
7828
7829   return expr;
7830 }
7831
7832 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
7833    some statements are produced, emits them at GSI.  If BEFORE is true.
7834    the statements are appended before GSI, otherwise they are appended after
7835    it.  M specifies the way GSI moves after insertion (GSI_SAME_STMT or
7836    GSI_CONTINUE_LINKING are the usual values).  */
7837
7838 tree
7839 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
7840                           bool simple_p, tree var, bool before,
7841                           enum gsi_iterator_update m)
7842 {
7843   gimple_seq stmts;
7844
7845   expr = force_gimple_operand (expr, &stmts, simple_p, var);
7846
7847   if (!gimple_seq_empty_p (stmts))
7848     {
7849       if (gimple_in_ssa_p (cfun))
7850         {
7851           gimple_stmt_iterator i;
7852
7853           for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
7854             mark_symbols_for_renaming (gsi_stmt (i));
7855         }
7856
7857       if (before)
7858         gsi_insert_seq_before (gsi, stmts, m);
7859       else
7860         gsi_insert_seq_after (gsi, stmts, m);
7861     }
7862
7863   return expr;
7864 }
7865
7866 #include "gt-gimplify.h"