OSDN Git Service

3ba40a88f19b19a3257765dabdaeec1ec81566ed
[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 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
3099    a call to __builtin_memcpy.  */
3100
3101 static enum gimplify_status
3102 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value,
3103                                 gimple_seq *seq_p)
3104 {
3105   tree t, to, to_ptr, from, from_ptr;
3106   gimple gs;
3107   location_t loc = EXPR_LOCATION (*expr_p);
3108
3109   to = TREE_OPERAND (*expr_p, 0);
3110   from = TREE_OPERAND (*expr_p, 1);
3111
3112   mark_addressable (from);
3113   from_ptr = build_fold_addr_expr_loc (loc, from);
3114   gimplify_arg (&from_ptr, seq_p, loc);
3115
3116   mark_addressable (to);
3117   to_ptr = build_fold_addr_expr_loc (loc, to);
3118   gimplify_arg (&to_ptr, seq_p, loc);
3119
3120   t = implicit_built_in_decls[BUILT_IN_MEMCPY];
3121
3122   gs = gimple_build_call (t, 3, to_ptr, from_ptr, size);
3123
3124   if (want_value)
3125     {
3126       /* tmp = memcpy() */
3127       t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3128       gimple_call_set_lhs (gs, t);
3129       gimplify_seq_add_stmt (seq_p, gs);
3130
3131       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (to), t);
3132       return GS_ALL_DONE;
3133     }
3134
3135   gimplify_seq_add_stmt (seq_p, gs);
3136   *expr_p = NULL;
3137   return GS_ALL_DONE;
3138 }
3139
3140 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
3141    a call to __builtin_memset.  In this case we know that the RHS is
3142    a CONSTRUCTOR with an empty element list.  */
3143
3144 static enum gimplify_status
3145 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value,
3146                                 gimple_seq *seq_p)
3147 {
3148   tree t, from, to, to_ptr;
3149   gimple gs;
3150   location_t loc = EXPR_LOCATION (*expr_p);
3151
3152   /* Assert our assumptions, to abort instead of producing wrong code
3153      silently if they are not met.  Beware that the RHS CONSTRUCTOR might
3154      not be immediately exposed.  */
3155   from = TREE_OPERAND (*expr_p, 1);  
3156   if (TREE_CODE (from) == WITH_SIZE_EXPR)
3157     from = TREE_OPERAND (from, 0);
3158
3159   gcc_assert (TREE_CODE (from) == CONSTRUCTOR
3160               && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (from)));
3161
3162   /* Now proceed.  */
3163   to = TREE_OPERAND (*expr_p, 0);
3164
3165   to_ptr = build_fold_addr_expr_loc (loc, to);
3166   gimplify_arg (&to_ptr, seq_p, loc);
3167   t = implicit_built_in_decls[BUILT_IN_MEMSET];
3168
3169   gs = gimple_build_call (t, 3, to_ptr, integer_zero_node, size);
3170
3171   if (want_value)
3172     {
3173       /* tmp = memset() */
3174       t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3175       gimple_call_set_lhs (gs, t);
3176       gimplify_seq_add_stmt (seq_p, gs);
3177
3178       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (to), t);
3179       return GS_ALL_DONE;
3180     }
3181
3182   gimplify_seq_add_stmt (seq_p, gs);
3183   *expr_p = NULL;
3184   return GS_ALL_DONE;
3185 }
3186
3187 /* A subroutine of gimplify_init_ctor_preeval.  Called via walk_tree,
3188    determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
3189    assignment.  Returns non-null if we detect a potential overlap.  */
3190
3191 struct gimplify_init_ctor_preeval_data
3192 {
3193   /* The base decl of the lhs object.  May be NULL, in which case we
3194      have to assume the lhs is indirect.  */
3195   tree lhs_base_decl;
3196
3197   /* The alias set of the lhs object.  */
3198   alias_set_type lhs_alias_set;
3199 };
3200
3201 static tree
3202 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
3203 {
3204   struct gimplify_init_ctor_preeval_data *data
3205     = (struct gimplify_init_ctor_preeval_data *) xdata;
3206   tree t = *tp;
3207
3208   /* If we find the base object, obviously we have overlap.  */
3209   if (data->lhs_base_decl == t)
3210     return t;
3211
3212   /* If the constructor component is indirect, determine if we have a
3213      potential overlap with the lhs.  The only bits of information we
3214      have to go on at this point are addressability and alias sets.  */
3215   if (TREE_CODE (t) == INDIRECT_REF
3216       && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3217       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
3218     return t;
3219
3220   /* If the constructor component is a call, determine if it can hide a
3221      potential overlap with the lhs through an INDIRECT_REF like above.  */
3222   if (TREE_CODE (t) == CALL_EXPR)
3223     {
3224       tree type, fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (t)));
3225
3226       for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
3227         if (POINTER_TYPE_P (TREE_VALUE (type))
3228             && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3229             && alias_sets_conflict_p (data->lhs_alias_set,
3230                                       get_alias_set
3231                                         (TREE_TYPE (TREE_VALUE (type)))))
3232           return t;
3233     }
3234
3235   if (IS_TYPE_OR_DECL_P (t))
3236     *walk_subtrees = 0;
3237   return NULL;
3238 }
3239
3240 /* A subroutine of gimplify_init_constructor.  Pre-evaluate EXPR,
3241    force values that overlap with the lhs (as described by *DATA)
3242    into temporaries.  */
3243
3244 static void
3245 gimplify_init_ctor_preeval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3246                             struct gimplify_init_ctor_preeval_data *data)
3247 {
3248   enum gimplify_status one;
3249
3250   /* If the value is constant, then there's nothing to pre-evaluate.  */
3251   if (TREE_CONSTANT (*expr_p))
3252     {
3253       /* Ensure it does not have side effects, it might contain a reference to
3254          the object we're initializing.  */
3255       gcc_assert (!TREE_SIDE_EFFECTS (*expr_p));
3256       return;
3257     }
3258
3259   /* If the type has non-trivial constructors, we can't pre-evaluate.  */
3260   if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
3261     return;
3262
3263   /* Recurse for nested constructors.  */
3264   if (TREE_CODE (*expr_p) == CONSTRUCTOR)
3265     {
3266       unsigned HOST_WIDE_INT ix;
3267       constructor_elt *ce;
3268       VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
3269
3270       for (ix = 0; VEC_iterate (constructor_elt, v, ix, ce); ix++)
3271         gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
3272
3273       return;
3274     }
3275
3276   /* If this is a variable sized type, we must remember the size.  */
3277   maybe_with_size_expr (expr_p);
3278
3279   /* Gimplify the constructor element to something appropriate for the rhs
3280      of a MODIFY_EXPR.  Given that we know the LHS is an aggregate, we know
3281      the gimplifier will consider this a store to memory.  Doing this
3282      gimplification now means that we won't have to deal with complicated
3283      language-specific trees, nor trees like SAVE_EXPR that can induce
3284      exponential search behavior.  */
3285   one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
3286   if (one == GS_ERROR)
3287     {
3288       *expr_p = NULL;
3289       return;
3290     }
3291
3292   /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
3293      with the lhs, since "a = { .x=a }" doesn't make sense.  This will
3294      always be true for all scalars, since is_gimple_mem_rhs insists on a
3295      temporary variable for them.  */
3296   if (DECL_P (*expr_p))
3297     return;
3298
3299   /* If this is of variable size, we have no choice but to assume it doesn't
3300      overlap since we can't make a temporary for it.  */
3301   if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
3302     return;
3303
3304   /* Otherwise, we must search for overlap ...  */
3305   if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
3306     return;
3307
3308   /* ... and if found, force the value into a temporary.  */
3309   *expr_p = get_formal_tmp_var (*expr_p, pre_p);
3310 }
3311
3312 /* A subroutine of gimplify_init_ctor_eval.  Create a loop for
3313    a RANGE_EXPR in a CONSTRUCTOR for an array.
3314
3315       var = lower;
3316     loop_entry:
3317       object[var] = value;
3318       if (var == upper)
3319         goto loop_exit;
3320       var = var + 1;
3321       goto loop_entry;
3322     loop_exit:
3323
3324    We increment var _after_ the loop exit check because we might otherwise
3325    fail if upper == TYPE_MAX_VALUE (type for upper).
3326
3327    Note that we never have to deal with SAVE_EXPRs here, because this has
3328    already been taken care of for us, in gimplify_init_ctor_preeval().  */
3329
3330 static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
3331                                      gimple_seq *, bool);
3332
3333 static void
3334 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
3335                                tree value, tree array_elt_type,
3336                                gimple_seq *pre_p, bool cleared)
3337 {
3338   tree loop_entry_label, loop_exit_label, fall_thru_label;
3339   tree var, var_type, cref, tmp;
3340
3341   loop_entry_label = create_artificial_label (UNKNOWN_LOCATION);
3342   loop_exit_label = create_artificial_label (UNKNOWN_LOCATION);
3343   fall_thru_label = create_artificial_label (UNKNOWN_LOCATION);
3344
3345   /* Create and initialize the index variable.  */
3346   var_type = TREE_TYPE (upper);
3347   var = create_tmp_var (var_type, NULL);
3348   gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, lower));
3349
3350   /* Add the loop entry label.  */
3351   gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_entry_label));
3352
3353   /* Build the reference.  */
3354   cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3355                  var, NULL_TREE, NULL_TREE);
3356
3357   /* If we are a constructor, just call gimplify_init_ctor_eval to do
3358      the store.  Otherwise just assign value to the reference.  */
3359
3360   if (TREE_CODE (value) == CONSTRUCTOR)
3361     /* NB we might have to call ourself recursively through
3362        gimplify_init_ctor_eval if the value is a constructor.  */
3363     gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3364                              pre_p, cleared);
3365   else
3366     gimplify_seq_add_stmt (pre_p, gimple_build_assign (cref, value));
3367
3368   /* We exit the loop when the index var is equal to the upper bound.  */
3369   gimplify_seq_add_stmt (pre_p,
3370                          gimple_build_cond (EQ_EXPR, var, upper,
3371                                             loop_exit_label, fall_thru_label));
3372
3373   gimplify_seq_add_stmt (pre_p, gimple_build_label (fall_thru_label));
3374
3375   /* Otherwise, increment the index var...  */
3376   tmp = build2 (PLUS_EXPR, var_type, var,
3377                 fold_convert (var_type, integer_one_node));
3378   gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, tmp));
3379
3380   /* ...and jump back to the loop entry.  */
3381   gimplify_seq_add_stmt (pre_p, gimple_build_goto (loop_entry_label));
3382
3383   /* Add the loop exit label.  */
3384   gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_exit_label));
3385 }
3386
3387 /* Return true if FDECL is accessing a field that is zero sized.  */
3388    
3389 static bool
3390 zero_sized_field_decl (const_tree fdecl)
3391 {
3392   if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl) 
3393       && integer_zerop (DECL_SIZE (fdecl)))
3394     return true;
3395   return false;
3396 }
3397
3398 /* Return true if TYPE is zero sized.  */
3399    
3400 static bool
3401 zero_sized_type (const_tree type)
3402 {
3403   if (AGGREGATE_TYPE_P (type) && TYPE_SIZE (type)
3404       && integer_zerop (TYPE_SIZE (type)))
3405     return true;
3406   return false;
3407 }
3408
3409 /* A subroutine of gimplify_init_constructor.  Generate individual
3410    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
3411    assignments should happen.  ELTS is the CONSTRUCTOR_ELTS of the
3412    CONSTRUCTOR.  CLEARED is true if the entire LHS object has been
3413    zeroed first.  */
3414
3415 static void
3416 gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
3417                          gimple_seq *pre_p, bool cleared)
3418 {
3419   tree array_elt_type = NULL;
3420   unsigned HOST_WIDE_INT ix;
3421   tree purpose, value;
3422
3423   if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
3424     array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
3425
3426   FOR_EACH_CONSTRUCTOR_ELT (elts, ix, purpose, value)
3427     {
3428       tree cref;
3429
3430       /* NULL values are created above for gimplification errors.  */
3431       if (value == NULL)
3432         continue;
3433
3434       if (cleared && initializer_zerop (value))
3435         continue;
3436
3437       /* ??? Here's to hoping the front end fills in all of the indices,
3438          so we don't have to figure out what's missing ourselves.  */
3439       gcc_assert (purpose);
3440
3441       /* Skip zero-sized fields, unless value has side-effects.  This can
3442          happen with calls to functions returning a zero-sized type, which
3443          we shouldn't discard.  As a number of downstream passes don't
3444          expect sets of zero-sized fields, we rely on the gimplification of
3445          the MODIFY_EXPR we make below to drop the assignment statement.  */
3446       if (! TREE_SIDE_EFFECTS (value) && zero_sized_field_decl (purpose))
3447         continue;
3448
3449       /* If we have a RANGE_EXPR, we have to build a loop to assign the
3450          whole range.  */
3451       if (TREE_CODE (purpose) == RANGE_EXPR)
3452         {
3453           tree lower = TREE_OPERAND (purpose, 0);
3454           tree upper = TREE_OPERAND (purpose, 1);
3455
3456           /* If the lower bound is equal to upper, just treat it as if
3457              upper was the index.  */
3458           if (simple_cst_equal (lower, upper))
3459             purpose = upper;
3460           else
3461             {
3462               gimplify_init_ctor_eval_range (object, lower, upper, value,
3463                                              array_elt_type, pre_p, cleared);
3464               continue;
3465             }
3466         }
3467
3468       if (array_elt_type)
3469         {
3470           /* Do not use bitsizetype for ARRAY_REF indices.  */
3471           if (TYPE_DOMAIN (TREE_TYPE (object)))
3472             purpose = fold_convert (TREE_TYPE (TYPE_DOMAIN (TREE_TYPE (object))),
3473                                     purpose);
3474           cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3475                          purpose, NULL_TREE, NULL_TREE);
3476         }
3477       else
3478         {
3479           gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
3480           cref = build3 (COMPONENT_REF, TREE_TYPE (purpose),
3481                          unshare_expr (object), purpose, NULL_TREE);
3482         }
3483
3484       if (TREE_CODE (value) == CONSTRUCTOR
3485           && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
3486         gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3487                                  pre_p, cleared);
3488       else
3489         {
3490           tree init = build2 (INIT_EXPR, TREE_TYPE (cref), cref, value);
3491           gimplify_and_add (init, pre_p);
3492           ggc_free (init);
3493         }
3494     }
3495 }
3496
3497
3498 /* Returns the appropriate RHS predicate for this LHS.  */
3499
3500 gimple_predicate
3501 rhs_predicate_for (tree lhs)
3502 {
3503   if (is_gimple_reg (lhs))
3504     return is_gimple_reg_rhs_or_call;
3505   else
3506     return is_gimple_mem_rhs_or_call;
3507 }
3508
3509 /* Gimplify a C99 compound literal expression.  This just means adding
3510    the DECL_EXPR before the current statement and using its anonymous
3511    decl instead.  */
3512
3513 static enum gimplify_status
3514 gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p)
3515 {
3516   tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p);
3517   tree decl = DECL_EXPR_DECL (decl_s);
3518   /* Mark the decl as addressable if the compound literal
3519      expression is addressable now, otherwise it is marked too late
3520      after we gimplify the initialization expression.  */
3521   if (TREE_ADDRESSABLE (*expr_p))
3522     TREE_ADDRESSABLE (decl) = 1;
3523
3524   /* Preliminarily mark non-addressed complex variables as eligible
3525      for promotion to gimple registers.  We'll transform their uses
3526      as we find them.  */
3527   if ((TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE
3528        || TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE)
3529       && !TREE_THIS_VOLATILE (decl)
3530       && !needs_to_live_in_memory (decl))
3531     DECL_GIMPLE_REG_P (decl) = 1;
3532
3533   /* This decl isn't mentioned in the enclosing block, so add it to the
3534      list of temps.  FIXME it seems a bit of a kludge to say that
3535      anonymous artificial vars aren't pushed, but everything else is.  */
3536   if (DECL_NAME (decl) == NULL_TREE && !DECL_SEEN_IN_BIND_EXPR_P (decl))
3537     gimple_add_tmp_var (decl);
3538
3539   gimplify_and_add (decl_s, pre_p);
3540   *expr_p = decl;
3541   return GS_OK;
3542 }
3543
3544 /* Optimize embedded COMPOUND_LITERAL_EXPRs within a CONSTRUCTOR,
3545    return a new CONSTRUCTOR if something changed.  */
3546
3547 static tree
3548 optimize_compound_literals_in_ctor (tree orig_ctor)
3549 {
3550   tree ctor = orig_ctor;
3551   VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (ctor);
3552   unsigned int idx, num = VEC_length (constructor_elt, elts);
3553
3554   for (idx = 0; idx < num; idx++)
3555     {
3556       tree value = VEC_index (constructor_elt, elts, idx)->value;
3557       tree newval = value;
3558       if (TREE_CODE (value) == CONSTRUCTOR)
3559         newval = optimize_compound_literals_in_ctor (value);
3560       else if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR)
3561         {
3562           tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (value);
3563           tree decl = DECL_EXPR_DECL (decl_s);
3564           tree init = DECL_INITIAL (decl);
3565
3566           if (!TREE_ADDRESSABLE (value)
3567               && !TREE_ADDRESSABLE (decl)
3568               && init)
3569             newval = optimize_compound_literals_in_ctor (init);
3570         }
3571       if (newval == value)
3572         continue;
3573
3574       if (ctor == orig_ctor)
3575         {
3576           ctor = copy_node (orig_ctor);
3577           CONSTRUCTOR_ELTS (ctor) = VEC_copy (constructor_elt, gc, elts);
3578           elts = CONSTRUCTOR_ELTS (ctor);
3579         }
3580       VEC_index (constructor_elt, elts, idx)->value = newval;
3581     }
3582   return ctor;
3583 }
3584
3585
3586
3587 /* A subroutine of gimplify_modify_expr.  Break out elements of a
3588    CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
3589
3590    Note that we still need to clear any elements that don't have explicit
3591    initializers, so if not all elements are initialized we keep the
3592    original MODIFY_EXPR, we just remove all of the constructor elements.
3593
3594    If NOTIFY_TEMP_CREATION is true, do not gimplify, just return
3595    GS_ERROR if we would have to create a temporary when gimplifying
3596    this constructor.  Otherwise, return GS_OK.
3597
3598    If NOTIFY_TEMP_CREATION is false, just do the gimplification.  */
3599
3600 static enum gimplify_status
3601 gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3602                            bool want_value, bool notify_temp_creation)
3603 {
3604   tree object, ctor, type;
3605   enum gimplify_status ret;
3606   VEC(constructor_elt,gc) *elts;
3607
3608   gcc_assert (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == CONSTRUCTOR);
3609
3610   if (!notify_temp_creation)
3611     {
3612       ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3613                            is_gimple_lvalue, fb_lvalue);
3614       if (ret == GS_ERROR)
3615         return ret;
3616     }
3617
3618   object = TREE_OPERAND (*expr_p, 0);
3619   ctor = TREE_OPERAND (*expr_p, 1) =
3620     optimize_compound_literals_in_ctor (TREE_OPERAND (*expr_p, 1));
3621   type = TREE_TYPE (ctor);
3622   elts = CONSTRUCTOR_ELTS (ctor);
3623   ret = GS_ALL_DONE;
3624
3625   switch (TREE_CODE (type))
3626     {
3627     case RECORD_TYPE:
3628     case UNION_TYPE:
3629     case QUAL_UNION_TYPE:
3630     case ARRAY_TYPE:
3631       {
3632         struct gimplify_init_ctor_preeval_data preeval_data;
3633         HOST_WIDE_INT num_type_elements, num_ctor_elements;
3634         HOST_WIDE_INT num_nonzero_elements;
3635         bool cleared, valid_const_initializer;
3636
3637         /* Aggregate types must lower constructors to initialization of
3638            individual elements.  The exception is that a CONSTRUCTOR node
3639            with no elements indicates zero-initialization of the whole.  */
3640         if (VEC_empty (constructor_elt, elts))
3641           {
3642             if (notify_temp_creation)
3643               return GS_OK;
3644             break;
3645           }
3646  
3647         /* Fetch information about the constructor to direct later processing.
3648            We might want to make static versions of it in various cases, and
3649            can only do so if it known to be a valid constant initializer.  */
3650         valid_const_initializer
3651           = categorize_ctor_elements (ctor, &num_nonzero_elements,
3652                                       &num_ctor_elements, &cleared);
3653
3654         /* If a const aggregate variable is being initialized, then it
3655            should never be a lose to promote the variable to be static.  */
3656         if (valid_const_initializer
3657             && num_nonzero_elements > 1
3658             && TREE_READONLY (object)
3659             && TREE_CODE (object) == VAR_DECL
3660             && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object)))
3661           {
3662             if (notify_temp_creation)
3663               return GS_ERROR;
3664             DECL_INITIAL (object) = ctor;
3665             TREE_STATIC (object) = 1;
3666             if (!DECL_NAME (object))
3667               DECL_NAME (object) = create_tmp_var_name ("C");
3668             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
3669
3670             /* ??? C++ doesn't automatically append a .<number> to the
3671                assembler name, and even when it does, it looks a FE private
3672                data structures to figure out what that number should be,
3673                which are not set for this variable.  I suppose this is
3674                important for local statics for inline functions, which aren't
3675                "local" in the object file sense.  So in order to get a unique
3676                TU-local symbol, we must invoke the lhd version now.  */
3677             lhd_set_decl_assembler_name (object);
3678
3679             *expr_p = NULL_TREE;
3680             break;
3681           }
3682
3683         /* If there are "lots" of initialized elements, even discounting
3684            those that are not address constants (and thus *must* be
3685            computed at runtime), then partition the constructor into
3686            constant and non-constant parts.  Block copy the constant
3687            parts in, then generate code for the non-constant parts.  */
3688         /* TODO.  There's code in cp/typeck.c to do this.  */
3689
3690         num_type_elements = count_type_elements (type, true);
3691
3692         /* If count_type_elements could not determine number of type elements
3693            for a constant-sized object, assume clearing is needed.
3694            Don't do this for variable-sized objects, as store_constructor
3695            will ignore the clearing of variable-sized objects.  */
3696         if (num_type_elements < 0 && int_size_in_bytes (type) >= 0)
3697           cleared = true;
3698         /* If there are "lots" of zeros, then block clear the object first.  */
3699         else if (num_type_elements - num_nonzero_elements
3700                  > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
3701                  && num_nonzero_elements < num_type_elements/4)
3702           cleared = true;
3703         /* ??? This bit ought not be needed.  For any element not present
3704            in the initializer, we should simply set them to zero.  Except
3705            we'd need to *find* the elements that are not present, and that
3706            requires trickery to avoid quadratic compile-time behavior in
3707            large cases or excessive memory use in small cases.  */
3708         else if (num_ctor_elements < num_type_elements)
3709           cleared = true;
3710
3711         /* If there are "lots" of initialized elements, and all of them
3712            are valid address constants, then the entire initializer can
3713            be dropped to memory, and then memcpy'd out.  Don't do this
3714            for sparse arrays, though, as it's more efficient to follow
3715            the standard CONSTRUCTOR behavior of memset followed by
3716            individual element initialization.  Also don't do this for small
3717            all-zero initializers (which aren't big enough to merit
3718            clearing), and don't try to make bitwise copies of
3719            TREE_ADDRESSABLE types.  */
3720         if (valid_const_initializer
3721             && !(cleared || num_nonzero_elements == 0)
3722             && !TREE_ADDRESSABLE (type))
3723           {
3724             HOST_WIDE_INT size = int_size_in_bytes (type);
3725             unsigned int align;
3726
3727             /* ??? We can still get unbounded array types, at least
3728                from the C++ front end.  This seems wrong, but attempt
3729                to work around it for now.  */
3730             if (size < 0)
3731               {
3732                 size = int_size_in_bytes (TREE_TYPE (object));
3733                 if (size >= 0)
3734                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
3735               }
3736
3737             /* Find the maximum alignment we can assume for the object.  */
3738             /* ??? Make use of DECL_OFFSET_ALIGN.  */
3739             if (DECL_P (object))
3740               align = DECL_ALIGN (object);
3741             else
3742               align = TYPE_ALIGN (type);
3743
3744             if (size > 0
3745                 && num_nonzero_elements > 1
3746                 && !can_move_by_pieces (size, align))
3747               {
3748                 tree new_tree;
3749
3750                 if (notify_temp_creation)
3751                   return GS_ERROR;
3752
3753                 new_tree = create_tmp_var_raw (type, "C");
3754
3755                 gimple_add_tmp_var (new_tree);
3756                 TREE_STATIC (new_tree) = 1;
3757                 TREE_READONLY (new_tree) = 1;
3758                 DECL_INITIAL (new_tree) = ctor;
3759                 if (align > DECL_ALIGN (new_tree))
3760                   {
3761                     DECL_ALIGN (new_tree) = align;
3762                     DECL_USER_ALIGN (new_tree) = 1;
3763                   }
3764                 walk_tree (&DECL_INITIAL (new_tree), force_labels_r, NULL, NULL);
3765
3766                 TREE_OPERAND (*expr_p, 1) = new_tree;
3767
3768                 /* This is no longer an assignment of a CONSTRUCTOR, but
3769                    we still may have processing to do on the LHS.  So
3770                    pretend we didn't do anything here to let that happen.  */
3771                 return GS_UNHANDLED;
3772               }
3773           }
3774
3775         if (notify_temp_creation)
3776           return GS_OK;
3777
3778         /* If there are nonzero elements, pre-evaluate to capture elements
3779            overlapping with the lhs into temporaries.  We must do this before
3780            clearing to fetch the values before they are zeroed-out.  */
3781         if (num_nonzero_elements > 0)
3782           {
3783             preeval_data.lhs_base_decl = get_base_address (object);
3784             if (!DECL_P (preeval_data.lhs_base_decl))
3785               preeval_data.lhs_base_decl = NULL;
3786             preeval_data.lhs_alias_set = get_alias_set (object);
3787
3788             gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
3789                                         pre_p, post_p, &preeval_data);
3790           }
3791
3792         if (cleared)
3793           {
3794             /* Zap the CONSTRUCTOR element list, which simplifies this case.
3795                Note that we still have to gimplify, in order to handle the
3796                case of variable sized types.  Avoid shared tree structures.  */
3797             CONSTRUCTOR_ELTS (ctor) = NULL;
3798             TREE_SIDE_EFFECTS (ctor) = 0;
3799             object = unshare_expr (object);
3800             gimplify_stmt (expr_p, pre_p);
3801           }
3802
3803         /* If we have not block cleared the object, or if there are nonzero
3804            elements in the constructor, add assignments to the individual
3805            scalar fields of the object.  */
3806         if (!cleared || num_nonzero_elements > 0)
3807           gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3808
3809         *expr_p = NULL_TREE;
3810       }
3811       break;
3812
3813     case COMPLEX_TYPE:
3814       {
3815         tree r, i;
3816
3817         if (notify_temp_creation)
3818           return GS_OK;
3819
3820         /* Extract the real and imaginary parts out of the ctor.  */
3821         gcc_assert (VEC_length (constructor_elt, elts) == 2);
3822         r = VEC_index (constructor_elt, elts, 0)->value;
3823         i = VEC_index (constructor_elt, elts, 1)->value;
3824         if (r == NULL || i == NULL)
3825           {
3826             tree zero = fold_convert (TREE_TYPE (type), integer_zero_node);
3827             if (r == NULL)
3828               r = zero;
3829             if (i == NULL)
3830               i = zero;
3831           }
3832
3833         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3834            represent creation of a complex value.  */
3835         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3836           {
3837             ctor = build_complex (type, r, i);
3838             TREE_OPERAND (*expr_p, 1) = ctor;
3839           }
3840         else
3841           {
3842             ctor = build2 (COMPLEX_EXPR, type, r, i);
3843             TREE_OPERAND (*expr_p, 1) = ctor;
3844             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1),
3845                                  pre_p,
3846                                  post_p,
3847                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3848                                  fb_rvalue);
3849           }
3850       }
3851       break;
3852
3853     case VECTOR_TYPE:
3854       {
3855         unsigned HOST_WIDE_INT ix;
3856         constructor_elt *ce;
3857
3858         if (notify_temp_creation)
3859           return GS_OK;
3860
3861         /* Go ahead and simplify constant constructors to VECTOR_CST.  */
3862         if (TREE_CONSTANT (ctor))
3863           {
3864             bool constant_p = true;
3865             tree value;
3866
3867             /* Even when ctor is constant, it might contain non-*_CST
3868                elements, such as addresses or trapping values like
3869                1.0/0.0 - 1.0/0.0.  Such expressions don't belong
3870                in VECTOR_CST nodes.  */
3871             FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
3872               if (!CONSTANT_CLASS_P (value))
3873                 {
3874                   constant_p = false;
3875                   break;
3876                 }
3877
3878             if (constant_p)
3879               {
3880                 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
3881                 break;
3882               }
3883
3884             /* Don't reduce an initializer constant even if we can't
3885                make a VECTOR_CST.  It won't do anything for us, and it'll
3886                prevent us from representing it as a single constant.  */
3887             if (initializer_constant_valid_p (ctor, type))
3888               break;
3889
3890             TREE_CONSTANT (ctor) = 0;
3891           }
3892
3893         /* Vector types use CONSTRUCTOR all the way through gimple
3894           compilation as a general initializer.  */
3895         for (ix = 0; VEC_iterate (constructor_elt, elts, ix, ce); ix++)
3896           {
3897             enum gimplify_status tret;
3898             tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val,
3899                                   fb_rvalue);
3900             if (tret == GS_ERROR)
3901               ret = GS_ERROR;
3902           }
3903         if (!is_gimple_reg (TREE_OPERAND (*expr_p, 0)))
3904           TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
3905       }
3906       break;
3907
3908     default:
3909       /* So how did we get a CONSTRUCTOR for a scalar type?  */
3910       gcc_unreachable ();
3911     }
3912
3913   if (ret == GS_ERROR)
3914     return GS_ERROR;
3915   else if (want_value)
3916     {
3917       *expr_p = object;
3918       return GS_OK;
3919     }
3920   else
3921     {
3922       /* If we have gimplified both sides of the initializer but have
3923          not emitted an assignment, do so now.  */
3924       if (*expr_p)
3925         {
3926           tree lhs = TREE_OPERAND (*expr_p, 0);
3927           tree rhs = TREE_OPERAND (*expr_p, 1);
3928           gimple init = gimple_build_assign (lhs, rhs);
3929           gimplify_seq_add_stmt (pre_p, init);
3930           *expr_p = NULL;
3931         }
3932
3933       return GS_ALL_DONE;
3934     }
3935 }
3936
3937 /* Given a pointer value OP0, return a simplified version of an
3938    indirection through OP0, or NULL_TREE if no simplification is
3939    possible.  Note that the resulting type may be different from
3940    the type pointed to in the sense that it is still compatible
3941    from the langhooks point of view. */
3942
3943 tree
3944 gimple_fold_indirect_ref (tree t)
3945 {
3946   tree type = TREE_TYPE (TREE_TYPE (t));
3947   tree sub = t;
3948   tree subtype;
3949
3950   STRIP_USELESS_TYPE_CONVERSION (sub);
3951   subtype = TREE_TYPE (sub);
3952   if (!POINTER_TYPE_P (subtype))
3953     return NULL_TREE;
3954
3955   if (TREE_CODE (sub) == ADDR_EXPR)
3956     {
3957       tree op = TREE_OPERAND (sub, 0);
3958       tree optype = TREE_TYPE (op);
3959       /* *&p => p */
3960       if (useless_type_conversion_p (type, optype))
3961         return op;
3962
3963       /* *(foo *)&fooarray => fooarray[0] */
3964       if (TREE_CODE (optype) == ARRAY_TYPE
3965           && useless_type_conversion_p (type, TREE_TYPE (optype)))
3966        {
3967          tree type_domain = TYPE_DOMAIN (optype);
3968          tree min_val = size_zero_node;
3969          if (type_domain && TYPE_MIN_VALUE (type_domain))
3970            min_val = TYPE_MIN_VALUE (type_domain);
3971          return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
3972        }
3973     }
3974
3975   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
3976   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
3977       && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
3978     {
3979       tree type_domain;
3980       tree min_val = size_zero_node;
3981       tree osub = sub;
3982       sub = gimple_fold_indirect_ref (sub);
3983       if (! sub)
3984         sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
3985       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
3986       if (type_domain && TYPE_MIN_VALUE (type_domain))
3987         min_val = TYPE_MIN_VALUE (type_domain);
3988       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
3989     }
3990
3991   return NULL_TREE;
3992 }
3993
3994 /* Given a pointer value OP0, return a simplified version of an
3995    indirection through OP0, or NULL_TREE if no simplification is
3996    possible.  This may only be applied to a rhs of an expression.
3997    Note that the resulting type may be different from the type pointed
3998    to in the sense that it is still compatible from the langhooks
3999    point of view. */
4000
4001 static tree
4002 gimple_fold_indirect_ref_rhs (tree t)
4003 {
4004   return gimple_fold_indirect_ref (t);
4005 }
4006
4007 /* Subroutine of gimplify_modify_expr to do simplifications of
4008    MODIFY_EXPRs based on the code of the RHS.  We loop for as long as
4009    something changes.  */
4010
4011 static enum gimplify_status
4012 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
4013                           gimple_seq *pre_p, gimple_seq *post_p,
4014                           bool want_value)
4015 {
4016   enum gimplify_status ret = GS_OK;
4017
4018   while (ret != GS_UNHANDLED)
4019     switch (TREE_CODE (*from_p))
4020       {
4021       case VAR_DECL:
4022         /* If we're assigning from a read-only variable initialized with
4023            a constructor, do the direct assignment from the constructor,
4024            but only if neither source nor target are volatile since this
4025            latter assignment might end up being done on a per-field basis.  */
4026         if (DECL_INITIAL (*from_p)
4027             && TREE_READONLY (*from_p)
4028             && !TREE_THIS_VOLATILE (*from_p)
4029             && !TREE_THIS_VOLATILE (*to_p)
4030             && TREE_CODE (DECL_INITIAL (*from_p)) == CONSTRUCTOR)
4031           {
4032             tree old_from = *from_p;
4033
4034             /* Move the constructor into the RHS.  */
4035             *from_p = unshare_expr (DECL_INITIAL (*from_p));
4036
4037             /* Let's see if gimplify_init_constructor will need to put
4038                it in memory.  If so, revert the change.  */
4039             ret = gimplify_init_constructor (expr_p, NULL, NULL, false, true);
4040             if (ret == GS_ERROR)
4041               {
4042                 *from_p = old_from;
4043                 /* Fall through.  */
4044               }
4045             else
4046               {
4047                 ret = GS_OK;
4048                 break;
4049               }
4050           }
4051         ret = GS_UNHANDLED;
4052         break;
4053       case INDIRECT_REF:
4054         {
4055           /* If we have code like 
4056
4057                 *(const A*)(A*)&x
4058
4059              where the type of "x" is a (possibly cv-qualified variant
4060              of "A"), treat the entire expression as identical to "x".
4061              This kind of code arises in C++ when an object is bound
4062              to a const reference, and if "x" is a TARGET_EXPR we want
4063              to take advantage of the optimization below.  */
4064           tree t = gimple_fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
4065           if (t)
4066             {
4067               *from_p = t;
4068               ret = GS_OK;
4069             }
4070           else
4071             ret = GS_UNHANDLED;
4072           break;
4073         }
4074
4075       case TARGET_EXPR:
4076         {
4077           /* If we are initializing something from a TARGET_EXPR, strip the
4078              TARGET_EXPR and initialize it directly, if possible.  This can't
4079              be done if the initializer is void, since that implies that the
4080              temporary is set in some non-trivial way.
4081
4082              ??? What about code that pulls out the temp and uses it
4083              elsewhere? I think that such code never uses the TARGET_EXPR as
4084              an initializer.  If I'm wrong, we'll die because the temp won't
4085              have any RTL.  In that case, I guess we'll need to replace
4086              references somehow.  */
4087           tree init = TARGET_EXPR_INITIAL (*from_p);
4088
4089           if (init
4090               && !VOID_TYPE_P (TREE_TYPE (init)))
4091             {
4092               *from_p = init;
4093               ret = GS_OK;
4094             }
4095           else
4096             ret = GS_UNHANDLED;
4097         }
4098         break;
4099
4100       case COMPOUND_EXPR:
4101         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
4102            caught.  */
4103         gimplify_compound_expr (from_p, pre_p, true);
4104         ret = GS_OK;
4105         break;
4106
4107       case CONSTRUCTOR:
4108         /* If we're initializing from a CONSTRUCTOR, break this into
4109            individual MODIFY_EXPRs.  */
4110         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value,
4111                                           false);
4112
4113       case COND_EXPR:
4114         /* If we're assigning to a non-register type, push the assignment
4115            down into the branches.  This is mandatory for ADDRESSABLE types,
4116            since we cannot generate temporaries for such, but it saves a
4117            copy in other cases as well.  */
4118         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
4119           {
4120             /* This code should mirror the code in gimplify_cond_expr. */
4121             enum tree_code code = TREE_CODE (*expr_p);
4122             tree cond = *from_p;
4123             tree result = *to_p;
4124
4125             ret = gimplify_expr (&result, pre_p, post_p,
4126                                  is_gimple_lvalue, fb_lvalue);
4127             if (ret != GS_ERROR)
4128               ret = GS_OK;
4129
4130             if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
4131               TREE_OPERAND (cond, 1)
4132                 = build2 (code, void_type_node, result,
4133                           TREE_OPERAND (cond, 1));
4134             if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
4135               TREE_OPERAND (cond, 2)
4136                 = build2 (code, void_type_node, unshare_expr (result),
4137                           TREE_OPERAND (cond, 2));
4138
4139             TREE_TYPE (cond) = void_type_node;
4140             recalculate_side_effects (cond);
4141
4142             if (want_value)
4143               {
4144                 gimplify_and_add (cond, pre_p);
4145                 *expr_p = unshare_expr (result);
4146               }
4147             else
4148               *expr_p = cond;
4149             return ret;
4150           }
4151         else
4152           ret = GS_UNHANDLED;
4153         break;
4154
4155       case CALL_EXPR:
4156         /* For calls that return in memory, give *to_p as the CALL_EXPR's
4157            return slot so that we don't generate a temporary.  */
4158         if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
4159             && aggregate_value_p (*from_p, *from_p))
4160           {
4161             bool use_target;
4162
4163             if (!(rhs_predicate_for (*to_p))(*from_p))
4164               /* If we need a temporary, *to_p isn't accurate.  */
4165               use_target = false;
4166             else if (TREE_CODE (*to_p) == RESULT_DECL
4167                      && DECL_NAME (*to_p) == NULL_TREE
4168                      && needs_to_live_in_memory (*to_p))
4169               /* It's OK to use the return slot directly unless it's an NRV. */
4170               use_target = true;
4171             else if (is_gimple_reg_type (TREE_TYPE (*to_p))
4172                      || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
4173               /* Don't force regs into memory.  */
4174               use_target = false;
4175             else if (TREE_CODE (*expr_p) == INIT_EXPR)
4176               /* It's OK to use the target directly if it's being
4177                  initialized. */
4178               use_target = true;
4179             else if (!is_gimple_non_addressable (*to_p))
4180               /* Don't use the original target if it's already addressable;
4181                  if its address escapes, and the called function uses the
4182                  NRV optimization, a conforming program could see *to_p
4183                  change before the called function returns; see c++/19317.
4184                  When optimizing, the return_slot pass marks more functions
4185                  as safe after we have escape info.  */
4186               use_target = false;
4187             else
4188               use_target = true;
4189
4190             if (use_target)
4191               {
4192                 CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
4193                 mark_addressable (*to_p);
4194               }
4195           }
4196
4197         ret = GS_UNHANDLED;
4198         break;
4199
4200         /* If we're initializing from a container, push the initialization
4201            inside it.  */
4202       case CLEANUP_POINT_EXPR:
4203       case BIND_EXPR:
4204       case STATEMENT_LIST:
4205         {
4206           tree wrap = *from_p;
4207           tree t;
4208
4209           ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_min_lval,
4210                                fb_lvalue);
4211           if (ret != GS_ERROR)
4212             ret = GS_OK;
4213
4214           t = voidify_wrapper_expr (wrap, *expr_p);
4215           gcc_assert (t == *expr_p);
4216
4217           if (want_value)
4218             {
4219               gimplify_and_add (wrap, pre_p);
4220               *expr_p = unshare_expr (*to_p);
4221             }
4222           else
4223             *expr_p = wrap;
4224           return GS_OK;
4225         }
4226         
4227       case COMPOUND_LITERAL_EXPR:
4228         {
4229           tree complit = TREE_OPERAND (*expr_p, 1);
4230           tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (complit);
4231           tree decl = DECL_EXPR_DECL (decl_s);
4232           tree init = DECL_INITIAL (decl);
4233
4234           /* struct T x = (struct T) { 0, 1, 2 } can be optimized
4235              into struct T x = { 0, 1, 2 } if the address of the
4236              compound literal has never been taken.  */
4237           if (!TREE_ADDRESSABLE (complit)
4238               && !TREE_ADDRESSABLE (decl)
4239               && init)
4240             {
4241               *expr_p = copy_node (*expr_p);
4242               TREE_OPERAND (*expr_p, 1) = init;
4243               return GS_OK;
4244             }
4245         }
4246
4247       default:
4248         ret = GS_UNHANDLED;
4249         break;
4250       }
4251
4252   return ret;
4253 }
4254
4255
4256 /* Promote partial stores to COMPLEX variables to total stores.  *EXPR_P is
4257    a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
4258    DECL_GIMPLE_REG_P set.
4259
4260    IMPORTANT NOTE: This promotion is performed by introducing a load of the
4261    other, unmodified part of the complex object just before the total store.
4262    As a consequence, if the object is still uninitialized, an undefined value
4263    will be loaded into a register, which may result in a spurious exception
4264    if the register is floating-point and the value happens to be a signaling
4265    NaN for example.  Then the fully-fledged complex operations lowering pass
4266    followed by a DCE pass are necessary in order to fix things up.  */
4267
4268 static enum gimplify_status
4269 gimplify_modify_expr_complex_part (tree *expr_p, gimple_seq *pre_p,
4270                                    bool want_value)
4271 {
4272   enum tree_code code, ocode;
4273   tree lhs, rhs, new_rhs, other, realpart, imagpart;
4274
4275   lhs = TREE_OPERAND (*expr_p, 0);
4276   rhs = TREE_OPERAND (*expr_p, 1);
4277   code = TREE_CODE (lhs);
4278   lhs = TREE_OPERAND (lhs, 0);
4279
4280   ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
4281   other = build1 (ocode, TREE_TYPE (rhs), lhs);
4282   other = get_formal_tmp_var (other, pre_p);
4283
4284   realpart = code == REALPART_EXPR ? rhs : other;
4285   imagpart = code == REALPART_EXPR ? other : rhs;
4286
4287   if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
4288     new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
4289   else
4290     new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
4291
4292   gimplify_seq_add_stmt (pre_p, gimple_build_assign (lhs, new_rhs));
4293   *expr_p = (want_value) ? rhs : NULL_TREE;
4294
4295   return GS_ALL_DONE;
4296 }
4297
4298
4299 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
4300
4301       modify_expr
4302               : varname '=' rhs
4303               | '*' ID '=' rhs
4304
4305     PRE_P points to the list where side effects that must happen before
4306         *EXPR_P should be stored.
4307
4308     POST_P points to the list where side effects that must happen after
4309         *EXPR_P should be stored.
4310
4311     WANT_VALUE is nonzero iff we want to use the value of this expression
4312         in another expression.  */
4313
4314 static enum gimplify_status
4315 gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
4316                       bool want_value)
4317 {
4318   tree *from_p = &TREE_OPERAND (*expr_p, 1);
4319   tree *to_p = &TREE_OPERAND (*expr_p, 0);
4320   enum gimplify_status ret = GS_UNHANDLED;
4321   gimple assign;
4322   location_t loc = EXPR_LOCATION (*expr_p);
4323
4324   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
4325               || TREE_CODE (*expr_p) == INIT_EXPR);
4326
4327   /* Insert pointer conversions required by the middle-end that are not
4328      required by the frontend.  This fixes middle-end type checking for
4329      for example gcc.dg/redecl-6.c.  */
4330   if (POINTER_TYPE_P (TREE_TYPE (*to_p)))
4331     {
4332       STRIP_USELESS_TYPE_CONVERSION (*from_p);
4333       if (!useless_type_conversion_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
4334         *from_p = fold_convert_loc (loc, TREE_TYPE (*to_p), *from_p);
4335     }
4336
4337   /* See if any simplifications can be done based on what the RHS is.  */
4338   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4339                                   want_value);
4340   if (ret != GS_UNHANDLED)
4341     return ret;
4342
4343   /* For zero sized types only gimplify the left hand side and right hand
4344      side as statements and throw away the assignment.  Do this after
4345      gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
4346      types properly.  */
4347   if (zero_sized_type (TREE_TYPE (*from_p)) && !want_value)
4348     {
4349       gimplify_stmt (from_p, pre_p);
4350       gimplify_stmt (to_p, pre_p);
4351       *expr_p = NULL_TREE;
4352       return GS_ALL_DONE;
4353     }
4354
4355   /* If the value being copied is of variable width, compute the length
4356      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
4357      before gimplifying any of the operands so that we can resolve any
4358      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
4359      the size of the expression to be copied, not of the destination, so
4360      that is what we must do here.  */
4361   maybe_with_size_expr (from_p);
4362
4363   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
4364   if (ret == GS_ERROR)
4365     return ret;
4366
4367   /* As a special case, we have to temporarily allow for assignments
4368      with a CALL_EXPR on the RHS.  Since in GIMPLE a function call is
4369      a toplevel statement, when gimplifying the GENERIC expression
4370      MODIFY_EXPR <a, CALL_EXPR <foo>>, we cannot create the tuple
4371      GIMPLE_ASSIGN <a, GIMPLE_CALL <foo>>.
4372
4373      Instead, we need to create the tuple GIMPLE_CALL <a, foo>.  To
4374      prevent gimplify_expr from trying to create a new temporary for
4375      foo's LHS, we tell it that it should only gimplify until it
4376      reaches the CALL_EXPR.  On return from gimplify_expr, the newly
4377      created GIMPLE_CALL <foo> will be the last statement in *PRE_P
4378      and all we need to do here is set 'a' to be its LHS.  */
4379   ret = gimplify_expr (from_p, pre_p, post_p, rhs_predicate_for (*to_p),
4380                        fb_rvalue);
4381   if (ret == GS_ERROR)
4382     return ret;
4383
4384   /* Now see if the above changed *from_p to something we handle specially.  */
4385   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4386                                   want_value);
4387   if (ret != GS_UNHANDLED)
4388     return ret;
4389
4390   /* If we've got a variable sized assignment between two lvalues (i.e. does
4391      not involve a call), then we can make things a bit more straightforward
4392      by converting the assignment to memcpy or memset.  */
4393   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
4394     {
4395       tree from = TREE_OPERAND (*from_p, 0);
4396       tree size = TREE_OPERAND (*from_p, 1);
4397
4398       if (TREE_CODE (from) == CONSTRUCTOR)
4399         return gimplify_modify_expr_to_memset (expr_p, size, want_value, pre_p);
4400
4401       if (is_gimple_addressable (from))
4402         {
4403           *from_p = from;
4404           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value,
4405                                                  pre_p);
4406         }
4407     }
4408
4409   /* Transform partial stores to non-addressable complex variables into
4410      total stores.  This allows us to use real instead of virtual operands
4411      for these variables, which improves optimization.  */
4412   if ((TREE_CODE (*to_p) == REALPART_EXPR
4413        || TREE_CODE (*to_p) == IMAGPART_EXPR)
4414       && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
4415     return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
4416
4417   /* Try to alleviate the effects of the gimplification creating artificial
4418      temporaries (see for example is_gimple_reg_rhs) on the debug info.  */
4419   if (!gimplify_ctxp->into_ssa
4420       && DECL_P (*from_p)
4421       && DECL_IGNORED_P (*from_p)
4422       && DECL_P (*to_p)
4423       && !DECL_IGNORED_P (*to_p))
4424     {
4425       if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
4426         DECL_NAME (*from_p)
4427           = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
4428       DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
4429       SET_DECL_DEBUG_EXPR (*from_p, *to_p);
4430    }
4431
4432   if (TREE_CODE (*from_p) == CALL_EXPR)
4433     {
4434       /* Since the RHS is a CALL_EXPR, we need to create a GIMPLE_CALL
4435          instead of a GIMPLE_ASSIGN.  */
4436       assign = gimple_build_call_from_tree (*from_p);
4437       gimple_call_set_lhs (assign, *to_p);
4438     }
4439   else
4440     {
4441       assign = gimple_build_assign (*to_p, *from_p);
4442       gimple_set_location (assign, EXPR_LOCATION (*expr_p));
4443     }
4444
4445   gimplify_seq_add_stmt (pre_p, assign);
4446
4447   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
4448     {
4449       /* If we've somehow already got an SSA_NAME on the LHS, then
4450          we've probably modified it twice.  Not good.  */
4451       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
4452       *to_p = make_ssa_name (*to_p, assign);
4453       gimple_set_lhs (assign, *to_p);
4454     }
4455
4456   if (want_value)
4457     {
4458       *expr_p = unshare_expr (*to_p);
4459       return GS_OK;
4460     }
4461   else
4462     *expr_p = NULL;
4463
4464   return GS_ALL_DONE;
4465 }
4466
4467 /*  Gimplify a comparison between two variable-sized objects.  Do this
4468     with a call to BUILT_IN_MEMCMP.  */
4469
4470 static enum gimplify_status
4471 gimplify_variable_sized_compare (tree *expr_p)
4472 {
4473   tree op0 = TREE_OPERAND (*expr_p, 0);
4474   tree op1 = TREE_OPERAND (*expr_p, 1);
4475   tree t, arg, dest, src;
4476   location_t loc = EXPR_LOCATION (*expr_p);
4477
4478   arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
4479   arg = unshare_expr (arg);
4480   arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
4481   src = build_fold_addr_expr_loc (loc, op1);
4482   dest = build_fold_addr_expr_loc (loc, op0);
4483   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
4484   t = build_call_expr_loc (loc, t, 3, dest, src, arg);
4485   *expr_p
4486     = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
4487
4488   return GS_OK;
4489 }
4490
4491 /*  Gimplify a comparison between two aggregate objects of integral scalar
4492     mode as a comparison between the bitwise equivalent scalar values.  */
4493
4494 static enum gimplify_status
4495 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
4496 {
4497   location_t loc = EXPR_LOCATION (*expr_p);
4498   tree op0 = TREE_OPERAND (*expr_p, 0);
4499   tree op1 = TREE_OPERAND (*expr_p, 1);
4500
4501   tree type = TREE_TYPE (op0);
4502   tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
4503
4504   op0 = fold_build1_loc (loc, VIEW_CONVERT_EXPR, scalar_type, op0);
4505   op1 = fold_build1_loc (loc, VIEW_CONVERT_EXPR, scalar_type, op1);
4506
4507   *expr_p
4508     = fold_build2_loc (loc, TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
4509
4510   return GS_OK;
4511 }
4512
4513 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
4514     points to the expression to gimplify.
4515
4516     Expressions of the form 'a && b' are gimplified to:
4517
4518         a && b ? true : false
4519
4520     LOCUS is the source location to be put on the generated COND_EXPR.
4521     gimplify_cond_expr will do the rest.  */
4522
4523 static enum gimplify_status
4524 gimplify_boolean_expr (tree *expr_p, location_t locus)
4525 {
4526   /* Preserve the original type of the expression.  */
4527   tree type = TREE_TYPE (*expr_p);
4528
4529   *expr_p = build3 (COND_EXPR, type, *expr_p,
4530                     fold_convert_loc (locus, type, boolean_true_node),
4531                     fold_convert_loc (locus, type, boolean_false_node));
4532
4533   SET_EXPR_LOCATION (*expr_p, locus);
4534
4535   return GS_OK;
4536 }
4537
4538 /* Gimplifies an expression sequence.  This function gimplifies each
4539    expression and re-writes the original expression with the last
4540    expression of the sequence in GIMPLE form.
4541
4542    PRE_P points to the list where the side effects for all the
4543        expressions in the sequence will be emitted.
4544
4545    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
4546
4547 static enum gimplify_status
4548 gimplify_compound_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
4549 {
4550   tree t = *expr_p;
4551
4552   do
4553     {
4554       tree *sub_p = &TREE_OPERAND (t, 0);
4555
4556       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
4557         gimplify_compound_expr (sub_p, pre_p, false);
4558       else
4559         gimplify_stmt (sub_p, pre_p);
4560
4561       t = TREE_OPERAND (t, 1);
4562     }
4563   while (TREE_CODE (t) == COMPOUND_EXPR);
4564
4565   *expr_p = t;
4566   if (want_value)
4567     return GS_OK;
4568   else
4569     {
4570       gimplify_stmt (expr_p, pre_p);
4571       return GS_ALL_DONE;
4572     }
4573 }
4574
4575
4576 /* Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
4577    gimplify.  After gimplification, EXPR_P will point to a new temporary
4578    that holds the original value of the SAVE_EXPR node.
4579
4580    PRE_P points to the list where side effects that must happen before
4581       *EXPR_P should be stored.  */
4582
4583 static enum gimplify_status
4584 gimplify_save_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4585 {
4586   enum gimplify_status ret = GS_ALL_DONE;
4587   tree val;
4588
4589   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
4590   val = TREE_OPERAND (*expr_p, 0);
4591
4592   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
4593   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
4594     {
4595       /* The operand may be a void-valued expression such as SAVE_EXPRs
4596          generated by the Java frontend for class initialization.  It is
4597          being executed only for its side-effects.  */
4598       if (TREE_TYPE (val) == void_type_node)
4599         {
4600           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4601                                is_gimple_stmt, fb_none);
4602           val = NULL;
4603         }
4604       else
4605         val = get_initialized_tmp_var (val, pre_p, post_p);
4606
4607       TREE_OPERAND (*expr_p, 0) = val;
4608       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
4609     }
4610
4611   *expr_p = val;
4612
4613   return ret;
4614 }
4615
4616 /*  Re-write the ADDR_EXPR node pointed to by EXPR_P
4617
4618       unary_expr
4619               : ...
4620               | '&' varname
4621               ...
4622
4623     PRE_P points to the list where side effects that must happen before
4624         *EXPR_P should be stored.
4625
4626     POST_P points to the list where side effects that must happen after
4627         *EXPR_P should be stored.  */
4628
4629 static enum gimplify_status
4630 gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4631 {
4632   tree expr = *expr_p;
4633   tree op0 = TREE_OPERAND (expr, 0);
4634   enum gimplify_status ret;
4635   location_t loc = EXPR_LOCATION (*expr_p);
4636
4637   switch (TREE_CODE (op0))
4638     {
4639     case INDIRECT_REF:
4640     case MISALIGNED_INDIRECT_REF:
4641     do_indirect_ref:
4642       /* Check if we are dealing with an expression of the form '&*ptr'.
4643          While the front end folds away '&*ptr' into 'ptr', these
4644          expressions may be generated internally by the compiler (e.g.,
4645          builtins like __builtin_va_end).  */
4646       /* Caution: the silent array decomposition semantics we allow for
4647          ADDR_EXPR means we can't always discard the pair.  */
4648       /* Gimplification of the ADDR_EXPR operand may drop
4649          cv-qualification conversions, so make sure we add them if
4650          needed.  */
4651       {
4652         tree op00 = TREE_OPERAND (op0, 0);
4653         tree t_expr = TREE_TYPE (expr);
4654         tree t_op00 = TREE_TYPE (op00);
4655
4656         if (!useless_type_conversion_p (t_expr, t_op00))
4657           op00 = fold_convert_loc (loc, TREE_TYPE (expr), op00);
4658         *expr_p = op00;
4659         ret = GS_OK;
4660       }
4661       break;
4662
4663     case VIEW_CONVERT_EXPR:
4664       /* Take the address of our operand and then convert it to the type of
4665          this ADDR_EXPR.
4666
4667          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4668          all clear.  The impact of this transformation is even less clear.  */
4669
4670       /* If the operand is a useless conversion, look through it.  Doing so
4671          guarantees that the ADDR_EXPR and its operand will remain of the
4672          same type.  */
4673       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4674         op0 = TREE_OPERAND (op0, 0);
4675
4676       *expr_p = fold_convert_loc (loc, TREE_TYPE (expr),
4677                                   build_fold_addr_expr_loc (loc,
4678                                                         TREE_OPERAND (op0, 0)));
4679       ret = GS_OK;
4680       break;
4681
4682     default:
4683       /* We use fb_either here because the C frontend sometimes takes
4684          the address of a call that returns a struct; see
4685          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
4686          the implied temporary explicit.  */
4687
4688       /* Mark the RHS addressable.  */
4689       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4690                            is_gimple_addressable, fb_either);
4691       if (ret == GS_ERROR)
4692         break;
4693
4694       /* We cannot rely on making the RHS addressable if it is
4695          a temporary created by gimplification.  In this case create a
4696          new temporary that is initialized by a copy (which will
4697          become a store after we mark it addressable).
4698          This mostly happens if the frontend passed us something that
4699          it could not mark addressable yet, like a fortran
4700          pass-by-reference parameter (int) floatvar.  */
4701       if (is_gimple_reg (TREE_OPERAND (expr, 0)))
4702         TREE_OPERAND (expr, 0)
4703           = get_initialized_tmp_var (TREE_OPERAND (expr, 0), pre_p, post_p);
4704
4705       op0 = TREE_OPERAND (expr, 0);
4706
4707       /* For various reasons, the gimplification of the expression
4708          may have made a new INDIRECT_REF.  */
4709       if (TREE_CODE (op0) == INDIRECT_REF)
4710         goto do_indirect_ref;
4711
4712       /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly.  */
4713       recompute_tree_invariant_for_addr_expr (expr);
4714
4715       mark_addressable (TREE_OPERAND (expr, 0));
4716       break;
4717     }
4718
4719   return ret;
4720 }
4721
4722 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
4723    value; output operands should be a gimple lvalue.  */
4724
4725 static enum gimplify_status
4726 gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4727 {
4728   tree expr;
4729   int noutputs;
4730   const char **oconstraints;
4731   int i;
4732   tree link;
4733   const char *constraint;
4734   bool allows_mem, allows_reg, is_inout;
4735   enum gimplify_status ret, tret;
4736   gimple stmt;
4737   VEC(tree, gc) *inputs;
4738   VEC(tree, gc) *outputs;
4739   VEC(tree, gc) *clobbers;
4740   tree link_next;
4741   
4742   expr = *expr_p;
4743   noutputs = list_length (ASM_OUTPUTS (expr));
4744   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
4745
4746   inputs = outputs = clobbers = NULL;
4747
4748   ret = GS_ALL_DONE;
4749   link_next = NULL_TREE;
4750   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = link_next)
4751     {
4752       bool ok;
4753       size_t constraint_len;
4754
4755       link_next = TREE_CHAIN (link);
4756
4757       oconstraints[i]
4758         = constraint
4759         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4760       constraint_len = strlen (constraint);
4761       if (constraint_len == 0)
4762         continue;
4763
4764       ok = parse_output_constraint (&constraint, i, 0, 0,
4765                                     &allows_mem, &allows_reg, &is_inout);
4766       if (!ok)
4767         {
4768           ret = GS_ERROR;
4769           is_inout = false;
4770         }
4771
4772       if (!allows_reg && allows_mem)
4773         mark_addressable (TREE_VALUE (link));
4774
4775       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4776                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4777                             fb_lvalue | fb_mayfail);
4778       if (tret == GS_ERROR)
4779         {
4780           error ("invalid lvalue in asm output %d", i);
4781           ret = tret;
4782         }
4783
4784       VEC_safe_push (tree, gc, outputs, link);
4785       TREE_CHAIN (link) = NULL_TREE;
4786
4787       if (is_inout)
4788         {
4789           /* An input/output operand.  To give the optimizers more
4790              flexibility, split it into separate input and output
4791              operands.  */
4792           tree input;
4793           char buf[10];
4794
4795           /* Turn the in/out constraint into an output constraint.  */
4796           char *p = xstrdup (constraint);
4797           p[0] = '=';
4798           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4799
4800           /* And add a matching input constraint.  */
4801           if (allows_reg)
4802             {
4803               sprintf (buf, "%d", i);
4804
4805               /* If there are multiple alternatives in the constraint,
4806                  handle each of them individually.  Those that allow register
4807                  will be replaced with operand number, the others will stay
4808                  unchanged.  */
4809               if (strchr (p, ',') != NULL)
4810                 {
4811                   size_t len = 0, buflen = strlen (buf);
4812                   char *beg, *end, *str, *dst;
4813
4814                   for (beg = p + 1;;)
4815                     {
4816                       end = strchr (beg, ',');
4817                       if (end == NULL)
4818                         end = strchr (beg, '\0');
4819                       if ((size_t) (end - beg) < buflen)
4820                         len += buflen + 1;
4821                       else
4822                         len += end - beg + 1;
4823                       if (*end)
4824                         beg = end + 1;
4825                       else
4826                         break;
4827                     }
4828
4829                   str = (char *) alloca (len);
4830                   for (beg = p + 1, dst = str;;)
4831                     {
4832                       const char *tem;
4833                       bool mem_p, reg_p, inout_p;
4834
4835                       end = strchr (beg, ',');
4836                       if (end)
4837                         *end = '\0';
4838                       beg[-1] = '=';
4839                       tem = beg - 1;
4840                       parse_output_constraint (&tem, i, 0, 0,
4841                                                &mem_p, &reg_p, &inout_p);
4842                       if (dst != str)
4843                         *dst++ = ',';
4844                       if (reg_p)
4845                         {
4846                           memcpy (dst, buf, buflen);
4847                           dst += buflen;
4848                         }
4849                       else
4850                         {
4851                           if (end)
4852                             len = end - beg;
4853                           else
4854                             len = strlen (beg);
4855                           memcpy (dst, beg, len);
4856                           dst += len;
4857                         }
4858                       if (end)
4859                         beg = end + 1;
4860                       else
4861                         break;
4862                     }
4863                   *dst = '\0';
4864                   input = build_string (dst - str, str);
4865                 }
4866               else
4867                 input = build_string (strlen (buf), buf);
4868             }
4869           else
4870             input = build_string (constraint_len - 1, constraint + 1);
4871
4872           free (p);
4873
4874           input = build_tree_list (build_tree_list (NULL_TREE, input),
4875                                    unshare_expr (TREE_VALUE (link)));
4876           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
4877         }
4878     }
4879
4880   link_next = NULL_TREE;
4881   for (link = ASM_INPUTS (expr); link; ++i, link = link_next)
4882     {
4883       link_next = TREE_CHAIN (link);
4884       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4885       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
4886                               oconstraints, &allows_mem, &allows_reg);
4887
4888       /* If we can't make copies, we can only accept memory.  */
4889       if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
4890         {
4891           if (allows_mem)
4892             allows_reg = 0;
4893           else
4894             {
4895               error ("impossible constraint in %<asm%>");
4896               error ("non-memory input %d must stay in memory", i);
4897               return GS_ERROR;
4898             }
4899         }
4900
4901       /* If the operand is a memory input, it should be an lvalue.  */
4902       if (!allows_reg && allows_mem)
4903         {
4904           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4905                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
4906           mark_addressable (TREE_VALUE (link));
4907           if (tret == GS_ERROR)
4908             {
4909               if (EXPR_HAS_LOCATION (TREE_VALUE (link)))
4910                 input_location = EXPR_LOCATION (TREE_VALUE (link));
4911               error ("memory input %d is not directly addressable", i);
4912               ret = tret;
4913             }
4914         }
4915       else
4916         {
4917           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4918                                 is_gimple_asm_val, fb_rvalue);
4919           if (tret == GS_ERROR)
4920             ret = tret;
4921         }
4922
4923       TREE_CHAIN (link) = NULL_TREE;
4924       VEC_safe_push (tree, gc, inputs, link);
4925     }
4926   
4927   for (link = ASM_CLOBBERS (expr); link; ++i, link = TREE_CHAIN (link))
4928       VEC_safe_push (tree, gc, clobbers, link);
4929
4930   /* Do not add ASMs with errors to the gimple IL stream.  */
4931   if (ret != GS_ERROR)
4932     {
4933       stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
4934                                    inputs, outputs, clobbers);
4935
4936       gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr));
4937       gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
4938
4939       gimplify_seq_add_stmt (pre_p, stmt);
4940     }
4941
4942   return ret;
4943 }
4944
4945 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
4946    GIMPLE_WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
4947    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
4948    return to this function.
4949
4950    FIXME should we complexify the prequeue handling instead?  Or use flags
4951    for all the cleanups and let the optimizer tighten them up?  The current
4952    code seems pretty fragile; it will break on a cleanup within any
4953    non-conditional nesting.  But any such nesting would be broken, anyway;
4954    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
4955    and continues out of it.  We can do that at the RTL level, though, so
4956    having an optimizer to tighten up try/finally regions would be a Good
4957    Thing.  */
4958
4959 static enum gimplify_status
4960 gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p)
4961 {
4962   gimple_stmt_iterator iter;
4963   gimple_seq body_sequence = NULL;
4964
4965   tree temp = voidify_wrapper_expr (*expr_p, NULL);
4966
4967   /* We only care about the number of conditions between the innermost
4968      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count and
4969      any cleanups collected outside the CLEANUP_POINT_EXPR.  */
4970   int old_conds = gimplify_ctxp->conditions;
4971   gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups;
4972   gimplify_ctxp->conditions = 0;
4973   gimplify_ctxp->conditional_cleanups = NULL;
4974
4975   gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence);
4976
4977   gimplify_ctxp->conditions = old_conds;
4978   gimplify_ctxp->conditional_cleanups = old_cleanups;
4979
4980   for (iter = gsi_start (body_sequence); !gsi_end_p (iter); )
4981     {
4982       gimple wce = gsi_stmt (iter);
4983
4984       if (gimple_code (wce) == GIMPLE_WITH_CLEANUP_EXPR)
4985         {
4986           if (gsi_one_before_end_p (iter))
4987             {
4988               /* Note that gsi_insert_seq_before and gsi_remove do not
4989                  scan operands, unlike some other sequence mutators.  */
4990               gsi_insert_seq_before_without_update (&iter,
4991                                                     gimple_wce_cleanup (wce),
4992                                                     GSI_SAME_STMT);
4993               gsi_remove (&iter, true);
4994               break;
4995             }
4996           else
4997             {
4998               gimple gtry;
4999               gimple_seq seq;
5000               enum gimple_try_flags kind;
5001
5002               if (gimple_wce_cleanup_eh_only (wce))
5003                 kind = GIMPLE_TRY_CATCH;
5004               else
5005                 kind = GIMPLE_TRY_FINALLY;
5006               seq = gsi_split_seq_after (iter);
5007
5008               gtry = gimple_build_try (seq, gimple_wce_cleanup (wce), kind);
5009               /* Do not use gsi_replace here, as it may scan operands.
5010                  We want to do a simple structural modification only.  */
5011               *gsi_stmt_ptr (&iter) = gtry;
5012               iter = gsi_start (seq);
5013             }
5014         }
5015       else
5016         gsi_next (&iter);
5017     }
5018
5019   gimplify_seq_add_seq (pre_p, body_sequence);
5020   if (temp)
5021     {
5022       *expr_p = temp;
5023       return GS_OK;
5024     }
5025   else
5026     {
5027       *expr_p = NULL;
5028       return GS_ALL_DONE;
5029     }
5030 }
5031
5032 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
5033    is the cleanup action required.  EH_ONLY is true if the cleanup should
5034    only be executed if an exception is thrown, not on normal exit.  */
5035
5036 static void
5037 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p)
5038 {
5039   gimple wce;
5040   gimple_seq cleanup_stmts = NULL;
5041
5042   /* Errors can result in improperly nested cleanups.  Which results in
5043      confusion when trying to resolve the GIMPLE_WITH_CLEANUP_EXPR.  */
5044   if (errorcount || sorrycount)
5045     return;
5046
5047   if (gimple_conditional_context ())
5048     {
5049       /* If we're in a conditional context, this is more complex.  We only
5050          want to run the cleanup if we actually ran the initialization that
5051          necessitates it, but we want to run it after the end of the
5052          conditional context.  So we wrap the try/finally around the
5053          condition and use a flag to determine whether or not to actually
5054          run the destructor.  Thus
5055
5056            test ? f(A()) : 0
5057
5058          becomes (approximately)
5059
5060            flag = 0;
5061            try {
5062              if (test) { A::A(temp); flag = 1; val = f(temp); }
5063              else { val = 0; }
5064            } finally {
5065              if (flag) A::~A(temp);
5066            }
5067            val
5068       */
5069       tree flag = create_tmp_var (boolean_type_node, "cleanup");
5070       gimple ffalse = gimple_build_assign (flag, boolean_false_node);
5071       gimple ftrue = gimple_build_assign (flag, boolean_true_node);
5072
5073       cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
5074       gimplify_stmt (&cleanup, &cleanup_stmts);
5075       wce = gimple_build_wce (cleanup_stmts);
5076
5077       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
5078       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
5079       gimplify_seq_add_stmt (pre_p, ftrue);
5080
5081       /* Because of this manipulation, and the EH edges that jump
5082          threading cannot redirect, the temporary (VAR) will appear
5083          to be used uninitialized.  Don't warn.  */
5084       TREE_NO_WARNING (var) = 1;
5085     }
5086   else
5087     {
5088       gimplify_stmt (&cleanup, &cleanup_stmts);
5089       wce = gimple_build_wce (cleanup_stmts);
5090       gimple_wce_set_cleanup_eh_only (wce, eh_only);
5091       gimplify_seq_add_stmt (pre_p, wce);
5092     }
5093 }
5094
5095 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
5096
5097 static enum gimplify_status
5098 gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
5099 {
5100   tree targ = *expr_p;
5101   tree temp = TARGET_EXPR_SLOT (targ);
5102   tree init = TARGET_EXPR_INITIAL (targ);
5103   enum gimplify_status ret;
5104
5105   if (init)
5106     {
5107       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
5108          to the temps list.  Handle also variable length TARGET_EXPRs.  */
5109       if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
5110         {
5111           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
5112             gimplify_type_sizes (TREE_TYPE (temp), pre_p);
5113           gimplify_vla_decl (temp, pre_p);
5114         }
5115       else
5116         gimple_add_tmp_var (temp);
5117
5118       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
5119          expression is supposed to initialize the slot.  */
5120       if (VOID_TYPE_P (TREE_TYPE (init)))
5121         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5122       else
5123         {
5124           tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
5125           init = init_expr;
5126           ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5127           init = NULL;
5128           ggc_free (init_expr);
5129         }
5130       if (ret == GS_ERROR)
5131         {
5132           /* PR c++/28266 Make sure this is expanded only once. */
5133           TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5134           return GS_ERROR;
5135         }
5136       if (init)
5137         gimplify_and_add (init, pre_p);
5138
5139       /* If needed, push the cleanup for the temp.  */
5140       if (TARGET_EXPR_CLEANUP (targ))
5141         gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
5142                              CLEANUP_EH_ONLY (targ), pre_p);
5143
5144       /* Only expand this once.  */
5145       TREE_OPERAND (targ, 3) = init;
5146       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5147     }
5148   else
5149     /* We should have expanded this before.  */
5150     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
5151
5152   *expr_p = temp;
5153   return GS_OK;
5154 }
5155
5156 /* Gimplification of expression trees.  */
5157
5158 /* Gimplify an expression which appears at statement context.  The
5159    corresponding GIMPLE statements are added to *SEQ_P.  If *SEQ_P is
5160    NULL, a new sequence is allocated.
5161
5162    Return true if we actually added a statement to the queue.  */
5163
5164 bool
5165 gimplify_stmt (tree *stmt_p, gimple_seq *seq_p)
5166 {
5167   gimple_seq_node last;
5168
5169   if (!*seq_p)
5170     *seq_p = gimple_seq_alloc ();
5171
5172   last = gimple_seq_last (*seq_p);
5173   gimplify_expr (stmt_p, seq_p, NULL, is_gimple_stmt, fb_none);
5174   return last != gimple_seq_last (*seq_p);
5175 }
5176
5177
5178 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
5179    to CTX.  If entries already exist, force them to be some flavor of private.
5180    If there is no enclosing parallel, do nothing.  */
5181
5182 void
5183 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
5184 {
5185   splay_tree_node n;
5186
5187   if (decl == NULL || !DECL_P (decl))
5188     return;
5189
5190   do
5191     {
5192       n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5193       if (n != NULL)
5194         {
5195           if (n->value & GOVD_SHARED)
5196             n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
5197           else
5198             return;
5199         }
5200       else if (ctx->region_type != ORT_WORKSHARE)
5201         omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
5202
5203       ctx = ctx->outer_context;
5204     }
5205   while (ctx);
5206 }
5207
5208 /* Similarly for each of the type sizes of TYPE.  */
5209
5210 static void
5211 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
5212 {
5213   if (type == NULL || type == error_mark_node)
5214     return;
5215   type = TYPE_MAIN_VARIANT (type);
5216
5217   if (pointer_set_insert (ctx->privatized_types, type))
5218     return;
5219
5220   switch (TREE_CODE (type))
5221     {
5222     case INTEGER_TYPE:
5223     case ENUMERAL_TYPE:
5224     case BOOLEAN_TYPE:
5225     case REAL_TYPE:
5226     case FIXED_POINT_TYPE:
5227       omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
5228       omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
5229       break;
5230
5231     case ARRAY_TYPE:
5232       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5233       omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
5234       break;
5235
5236     case RECORD_TYPE:
5237     case UNION_TYPE:
5238     case QUAL_UNION_TYPE:
5239       {
5240         tree field;
5241         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5242           if (TREE_CODE (field) == FIELD_DECL)
5243             {
5244               omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
5245               omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
5246             }
5247       }
5248       break;
5249
5250     case POINTER_TYPE:
5251     case REFERENCE_TYPE:
5252       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5253       break;
5254
5255     default:
5256       break;
5257     }
5258
5259   omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
5260   omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
5261   lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
5262 }
5263
5264 /* Add an entry for DECL in the OpenMP context CTX with FLAGS.  */
5265
5266 static void
5267 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
5268 {
5269   splay_tree_node n;
5270   unsigned int nflags;
5271   tree t;
5272
5273   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5274     return;
5275
5276   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
5277      there are constructors involved somewhere.  */
5278   if (TREE_ADDRESSABLE (TREE_TYPE (decl))
5279       || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
5280     flags |= GOVD_SEEN;
5281
5282   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5283   if (n != NULL)
5284     {
5285       /* We shouldn't be re-adding the decl with the same data
5286          sharing class.  */
5287       gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
5288       /* The only combination of data sharing classes we should see is
5289          FIRSTPRIVATE and LASTPRIVATE.  */
5290       nflags = n->value | flags;
5291       gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
5292                   == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
5293       n->value = nflags;
5294       return;
5295     }
5296
5297   /* When adding a variable-sized variable, we have to handle all sorts
5298      of additional bits of data: the pointer replacement variable, and 
5299      the parameters of the type.  */
5300   if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5301     {
5302       /* Add the pointer replacement variable as PRIVATE if the variable
5303          replacement is private, else FIRSTPRIVATE since we'll need the
5304          address of the original variable either for SHARED, or for the
5305          copy into or out of the context.  */
5306       if (!(flags & GOVD_LOCAL))
5307         {
5308           nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
5309           nflags |= flags & GOVD_SEEN;
5310           t = DECL_VALUE_EXPR (decl);
5311           gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5312           t = TREE_OPERAND (t, 0);
5313           gcc_assert (DECL_P (t));
5314           omp_add_variable (ctx, t, nflags);
5315         }
5316
5317       /* Add all of the variable and type parameters (which should have
5318          been gimplified to a formal temporary) as FIRSTPRIVATE.  */
5319       omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
5320       omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
5321       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5322
5323       /* The variable-sized variable itself is never SHARED, only some form
5324          of PRIVATE.  The sharing would take place via the pointer variable
5325          which we remapped above.  */
5326       if (flags & GOVD_SHARED)
5327         flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
5328                 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
5329
5330       /* We're going to make use of the TYPE_SIZE_UNIT at least in the 
5331          alloca statement we generate for the variable, so make sure it
5332          is available.  This isn't automatically needed for the SHARED
5333          case, since we won't be allocating local storage then.
5334          For local variables TYPE_SIZE_UNIT might not be gimplified yet,
5335          in this case omp_notice_variable will be called later
5336          on when it is gimplified.  */
5337       else if (! (flags & GOVD_LOCAL))
5338         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
5339     }
5340   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
5341     {
5342       gcc_assert ((flags & GOVD_LOCAL) == 0);
5343       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5344
5345       /* Similar to the direct variable sized case above, we'll need the
5346          size of references being privatized.  */
5347       if ((flags & GOVD_SHARED) == 0)
5348         {
5349           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
5350           if (TREE_CODE (t) != INTEGER_CST)
5351             omp_notice_variable (ctx, t, true);
5352         }
5353     }
5354
5355   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
5356 }
5357
5358 /* Record the fact that DECL was used within the OpenMP context CTX.
5359    IN_CODE is true when real code uses DECL, and false when we should
5360    merely emit default(none) errors.  Return true if DECL is going to
5361    be remapped and thus DECL shouldn't be gimplified into its
5362    DECL_VALUE_EXPR (if any).  */
5363
5364 static bool
5365 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
5366 {
5367   splay_tree_node n;
5368   unsigned flags = in_code ? GOVD_SEEN : 0;
5369   bool ret = false, shared;
5370
5371   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5372     return false;
5373
5374   /* Threadprivate variables are predetermined.  */
5375   if (is_global_var (decl))
5376     {
5377       if (DECL_THREAD_LOCAL_P (decl))
5378         return false;
5379
5380       if (DECL_HAS_VALUE_EXPR_P (decl))
5381         {
5382           tree value = get_base_address (DECL_VALUE_EXPR (decl));
5383
5384           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
5385             return false;
5386         }
5387     }
5388
5389   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5390   if (n == NULL)
5391     {
5392       enum omp_clause_default_kind default_kind, kind;
5393       struct gimplify_omp_ctx *octx;
5394
5395       if (ctx->region_type == ORT_WORKSHARE)
5396         goto do_outer;
5397
5398       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
5399          remapped firstprivate instead of shared.  To some extent this is
5400          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
5401       default_kind = ctx->default_kind;
5402       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
5403       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
5404         default_kind = kind;
5405
5406       switch (default_kind)
5407         {
5408         case OMP_CLAUSE_DEFAULT_NONE:
5409           error ("%qE not specified in enclosing parallel",
5410                  DECL_NAME (decl));
5411           error_at (ctx->location, "enclosing parallel");
5412           /* FALLTHRU */
5413         case OMP_CLAUSE_DEFAULT_SHARED:
5414           flags |= GOVD_SHARED;
5415           break;
5416         case OMP_CLAUSE_DEFAULT_PRIVATE:
5417           flags |= GOVD_PRIVATE;
5418           break;
5419         case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
5420           flags |= GOVD_FIRSTPRIVATE;
5421           break;
5422         case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
5423           /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED.  */
5424           gcc_assert (ctx->region_type == ORT_TASK);
5425           if (ctx->outer_context)
5426             omp_notice_variable (ctx->outer_context, decl, in_code);
5427           for (octx = ctx->outer_context; octx; octx = octx->outer_context)
5428             {
5429               splay_tree_node n2;
5430
5431               n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
5432               if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED)
5433                 {
5434                   flags |= GOVD_FIRSTPRIVATE;
5435                   break;
5436                 }
5437               if ((octx->region_type & ORT_PARALLEL) != 0)
5438                 break;
5439             }
5440           if (flags & GOVD_FIRSTPRIVATE)
5441             break;
5442           if (octx == NULL
5443               && (TREE_CODE (decl) == PARM_DECL
5444                   || (!is_global_var (decl)
5445                       && DECL_CONTEXT (decl) == current_function_decl)))
5446             {
5447               flags |= GOVD_FIRSTPRIVATE;
5448               break;
5449             }
5450           flags |= GOVD_SHARED;
5451           break;
5452         default:
5453           gcc_unreachable ();
5454         }
5455
5456       if ((flags & GOVD_PRIVATE)
5457           && lang_hooks.decls.omp_private_outer_ref (decl))
5458         flags |= GOVD_PRIVATE_OUTER_REF;
5459
5460       omp_add_variable (ctx, decl, flags);
5461
5462       shared = (flags & GOVD_SHARED) != 0;
5463       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5464       goto do_outer;
5465     }
5466
5467   if ((n->value & (GOVD_SEEN | GOVD_LOCAL)) == 0
5468       && (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
5469       && DECL_SIZE (decl)
5470       && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5471     {
5472       splay_tree_node n2;
5473       tree t = DECL_VALUE_EXPR (decl);
5474       gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5475       t = TREE_OPERAND (t, 0);
5476       gcc_assert (DECL_P (t));
5477       n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
5478       n2->value |= GOVD_SEEN;
5479     }
5480
5481   shared = ((flags | n->value) & GOVD_SHARED) != 0;
5482   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5483
5484   /* If nothing changed, there's nothing left to do.  */
5485   if ((n->value & flags) == flags)
5486     return ret;
5487   flags |= n->value;
5488   n->value = flags;
5489
5490  do_outer:
5491   /* If the variable is private in the current context, then we don't
5492      need to propagate anything to an outer context.  */
5493   if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
5494     return ret;
5495   if (ctx->outer_context
5496       && omp_notice_variable (ctx->outer_context, decl, in_code))
5497     return true;
5498   return ret;
5499 }
5500
5501 /* Verify that DECL is private within CTX.  If there's specific information
5502    to the contrary in the innermost scope, generate an error.  */
5503
5504 static bool
5505 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
5506 {
5507   splay_tree_node n;
5508
5509   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5510   if (n != NULL)
5511     {
5512       if (n->value & GOVD_SHARED)
5513         {
5514           if (ctx == gimplify_omp_ctxp)
5515             {
5516               error ("iteration variable %qE should be private",
5517                      DECL_NAME (decl));
5518               n->value = GOVD_PRIVATE;
5519               return true;
5520             }
5521           else
5522             return false;
5523         }
5524       else if ((n->value & GOVD_EXPLICIT) != 0
5525                && (ctx == gimplify_omp_ctxp
5526                    || (ctx->region_type == ORT_COMBINED_PARALLEL
5527                        && gimplify_omp_ctxp->outer_context == ctx)))
5528         {
5529           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
5530             error ("iteration variable %qE should not be firstprivate",
5531                    DECL_NAME (decl));
5532           else if ((n->value & GOVD_REDUCTION) != 0)
5533             error ("iteration variable %qE should not be reduction",
5534                    DECL_NAME (decl));
5535         }
5536       return (ctx == gimplify_omp_ctxp
5537               || (ctx->region_type == ORT_COMBINED_PARALLEL
5538                   && gimplify_omp_ctxp->outer_context == ctx));
5539     }
5540
5541   if (ctx->region_type != ORT_WORKSHARE)
5542     return false;
5543   else if (ctx->outer_context)
5544     return omp_is_private (ctx->outer_context, decl);
5545   return false;
5546 }
5547
5548 /* Return true if DECL is private within a parallel region
5549    that binds to the current construct's context or in parallel
5550    region's REDUCTION clause.  */
5551
5552 static bool
5553 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
5554 {
5555   splay_tree_node n;
5556
5557   do
5558     {
5559       ctx = ctx->outer_context;
5560       if (ctx == NULL)
5561         return !(is_global_var (decl)
5562                  /* References might be private, but might be shared too.  */
5563                  || lang_hooks.decls.omp_privatize_by_reference (decl));
5564
5565       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5566       if (n != NULL)
5567         return (n->value & GOVD_SHARED) == 0;
5568     }
5569   while (ctx->region_type == ORT_WORKSHARE);
5570   return false;
5571 }
5572
5573 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
5574    and previous omp contexts.  */
5575
5576 static void
5577 gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
5578                            enum omp_region_type region_type)
5579 {
5580   struct gimplify_omp_ctx *ctx, *outer_ctx;
5581   struct gimplify_ctx gctx;
5582   tree c;
5583
5584   ctx = new_omp_context (region_type);
5585   outer_ctx = ctx->outer_context;
5586
5587   while ((c = *list_p) != NULL)
5588     {
5589       bool remove = false;
5590       bool notice_outer = true;
5591       const char *check_non_private = NULL;
5592       unsigned int flags;
5593       tree decl;
5594
5595       switch (OMP_CLAUSE_CODE (c))
5596         {
5597         case OMP_CLAUSE_PRIVATE:
5598           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
5599           if (lang_hooks.decls.omp_private_outer_ref (OMP_CLAUSE_DECL (c)))
5600             {
5601               flags |= GOVD_PRIVATE_OUTER_REF;
5602               OMP_CLAUSE_PRIVATE_OUTER_REF (c) = 1;
5603             }
5604           else
5605             notice_outer = false;
5606           goto do_add;
5607         case OMP_CLAUSE_SHARED:
5608           flags = GOVD_SHARED | GOVD_EXPLICIT;
5609           goto do_add;
5610         case OMP_CLAUSE_FIRSTPRIVATE:
5611           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
5612           check_non_private = "firstprivate";
5613           goto do_add;
5614         case OMP_CLAUSE_LASTPRIVATE:
5615           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
5616           check_non_private = "lastprivate";
5617           goto do_add;
5618         case OMP_CLAUSE_REDUCTION:
5619           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
5620           check_non_private = "reduction";
5621           goto do_add;
5622
5623         do_add:
5624           decl = OMP_CLAUSE_DECL (c);
5625           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5626             {
5627               remove = true;
5628               break;
5629             }
5630           omp_add_variable (ctx, decl, flags);
5631           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5632               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
5633             {
5634               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
5635                                 GOVD_LOCAL | GOVD_SEEN);
5636               gimplify_omp_ctxp = ctx;
5637               push_gimplify_context (&gctx);
5638
5639               OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c) = gimple_seq_alloc ();
5640               OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c) = gimple_seq_alloc ();
5641
5642               gimplify_and_add (OMP_CLAUSE_REDUCTION_INIT (c),
5643                                 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c));
5644               pop_gimplify_context
5645                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)));
5646               push_gimplify_context (&gctx);
5647               gimplify_and_add (OMP_CLAUSE_REDUCTION_MERGE (c),
5648                                 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c));
5649               pop_gimplify_context 
5650                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c)));
5651               OMP_CLAUSE_REDUCTION_INIT (c) = NULL_TREE;
5652               OMP_CLAUSE_REDUCTION_MERGE (c) = NULL_TREE;
5653
5654               gimplify_omp_ctxp = outer_ctx;
5655             }
5656           else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5657                    && OMP_CLAUSE_LASTPRIVATE_STMT (c))
5658             {
5659               gimplify_omp_ctxp = ctx;
5660               push_gimplify_context (&gctx);
5661               if (TREE_CODE (OMP_CLAUSE_LASTPRIVATE_STMT (c)) != BIND_EXPR)
5662                 {
5663                   tree bind = build3 (BIND_EXPR, void_type_node, NULL,
5664                                       NULL, NULL);
5665                   TREE_SIDE_EFFECTS (bind) = 1;
5666                   BIND_EXPR_BODY (bind) = OMP_CLAUSE_LASTPRIVATE_STMT (c);
5667                   OMP_CLAUSE_LASTPRIVATE_STMT (c) = bind;
5668                 }
5669               gimplify_and_add (OMP_CLAUSE_LASTPRIVATE_STMT (c),
5670                                 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5671               pop_gimplify_context
5672                 (gimple_seq_first_stmt (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)));
5673               OMP_CLAUSE_LASTPRIVATE_STMT (c) = NULL_TREE;
5674
5675               gimplify_omp_ctxp = outer_ctx;
5676             }
5677           if (notice_outer)
5678             goto do_notice;
5679           break;
5680
5681         case OMP_CLAUSE_COPYIN:
5682         case OMP_CLAUSE_COPYPRIVATE:
5683           decl = OMP_CLAUSE_DECL (c);
5684           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5685             {
5686               remove = true;
5687               break;
5688             }
5689         do_notice:
5690           if (outer_ctx)
5691             omp_notice_variable (outer_ctx, decl, true);
5692           if (check_non_private
5693               && region_type == ORT_WORKSHARE
5694               && omp_check_private (ctx, decl))
5695             {
5696               error ("%s variable %qE is private in outer context",
5697                      check_non_private, DECL_NAME (decl));
5698               remove = true;
5699             }
5700           break;
5701
5702         case OMP_CLAUSE_IF:
5703           OMP_CLAUSE_OPERAND (c, 0)
5704             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
5705           /* Fall through.  */
5706
5707         case OMP_CLAUSE_SCHEDULE:
5708         case OMP_CLAUSE_NUM_THREADS:
5709           if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
5710                              is_gimple_val, fb_rvalue) == GS_ERROR)
5711               remove = true;
5712           break;
5713
5714         case OMP_CLAUSE_NOWAIT:
5715         case OMP_CLAUSE_ORDERED:
5716         case OMP_CLAUSE_UNTIED:
5717         case OMP_CLAUSE_COLLAPSE:
5718           break;
5719
5720         case OMP_CLAUSE_DEFAULT:
5721           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
5722           break;
5723
5724         default:
5725           gcc_unreachable ();
5726         }
5727
5728       if (remove)
5729         *list_p = OMP_CLAUSE_CHAIN (c);
5730       else
5731         list_p = &OMP_CLAUSE_CHAIN (c);
5732     }
5733
5734   gimplify_omp_ctxp = ctx;
5735 }
5736
5737 /* For all variables that were not actually used within the context,
5738    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
5739
5740 static int
5741 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
5742 {
5743   tree *list_p = (tree *) data;
5744   tree decl = (tree) n->key;
5745   unsigned flags = n->value;
5746   enum omp_clause_code code;
5747   tree clause;
5748   bool private_debug;
5749
5750   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
5751     return 0;
5752   if ((flags & GOVD_SEEN) == 0)
5753     return 0;
5754   if (flags & GOVD_DEBUG_PRIVATE)
5755     {
5756       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
5757       private_debug = true;
5758     }
5759   else
5760     private_debug
5761       = lang_hooks.decls.omp_private_debug_clause (decl,
5762                                                    !!(flags & GOVD_SHARED));
5763   if (private_debug)
5764     code = OMP_CLAUSE_PRIVATE;
5765   else if (flags & GOVD_SHARED)
5766     {
5767       if (is_global_var (decl))
5768         {
5769           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
5770           while (ctx != NULL)
5771             {
5772               splay_tree_node on
5773                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5774               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
5775                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5776                 break;
5777               ctx = ctx->outer_context;
5778             }
5779           if (ctx == NULL)
5780             return 0;
5781         }
5782       code = OMP_CLAUSE_SHARED;
5783     }
5784   else if (flags & GOVD_PRIVATE)
5785     code = OMP_CLAUSE_PRIVATE;
5786   else if (flags & GOVD_FIRSTPRIVATE)
5787     code = OMP_CLAUSE_FIRSTPRIVATE;
5788   else
5789     gcc_unreachable ();
5790
5791   clause = build_omp_clause (input_location, code);
5792   OMP_CLAUSE_DECL (clause) = decl;
5793   OMP_CLAUSE_CHAIN (clause) = *list_p;
5794   if (private_debug)
5795     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
5796   else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
5797     OMP_CLAUSE_PRIVATE_OUTER_REF (clause) = 1;
5798   *list_p = clause;
5799   lang_hooks.decls.omp_finish_clause (clause);
5800
5801   return 0;
5802 }
5803
5804 static void
5805 gimplify_adjust_omp_clauses (tree *list_p)
5806 {
5807   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
5808   tree c, decl;
5809
5810   while ((c = *list_p) != NULL)
5811     {
5812       splay_tree_node n;
5813       bool remove = false;
5814
5815       switch (OMP_CLAUSE_CODE (c))
5816         {
5817         case OMP_CLAUSE_PRIVATE:
5818         case OMP_CLAUSE_SHARED:
5819         case OMP_CLAUSE_FIRSTPRIVATE:
5820           decl = OMP_CLAUSE_DECL (c);
5821           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5822           remove = !(n->value & GOVD_SEEN);
5823           if (! remove)
5824             {
5825               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
5826               if ((n->value & GOVD_DEBUG_PRIVATE)
5827                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
5828                 {
5829                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
5830                               || ((n->value & GOVD_DATA_SHARE_CLASS)
5831                                   == GOVD_PRIVATE));
5832                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
5833                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
5834                 }
5835             }
5836           break;
5837
5838         case OMP_CLAUSE_LASTPRIVATE:
5839           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
5840              accurately reflect the presence of a FIRSTPRIVATE clause.  */
5841           decl = OMP_CLAUSE_DECL (c);
5842           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5843           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
5844             = (n->value & GOVD_FIRSTPRIVATE) != 0;
5845           break;
5846           
5847         case OMP_CLAUSE_REDUCTION:
5848         case OMP_CLAUSE_COPYIN:
5849         case OMP_CLAUSE_COPYPRIVATE:
5850         case OMP_CLAUSE_IF:
5851         case OMP_CLAUSE_NUM_THREADS:
5852         case OMP_CLAUSE_SCHEDULE:
5853         case OMP_CLAUSE_NOWAIT:
5854         case OMP_CLAUSE_ORDERED:
5855         case OMP_CLAUSE_DEFAULT:
5856         case OMP_CLAUSE_UNTIED:
5857         case OMP_CLAUSE_COLLAPSE:
5858           break;
5859
5860         default:
5861           gcc_unreachable ();
5862         }
5863
5864       if (remove)
5865         *list_p = OMP_CLAUSE_CHAIN (c);
5866       else
5867         list_p = &OMP_CLAUSE_CHAIN (c);
5868     }
5869
5870   /* Add in any implicit data sharing.  */
5871   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
5872   
5873   gimplify_omp_ctxp = ctx->outer_context;
5874   delete_omp_context (ctx);
5875 }
5876
5877 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
5878    gimplification of the body, as well as scanning the body for used
5879    variables.  We need to do this scan now, because variable-sized
5880    decls will be decomposed during gimplification.  */
5881
5882 static void
5883 gimplify_omp_parallel (tree *expr_p, gimple_seq *pre_p)
5884 {
5885   tree expr = *expr_p;
5886   gimple g;
5887   gimple_seq body = NULL;
5888   struct gimplify_ctx gctx;
5889
5890   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p,
5891                              OMP_PARALLEL_COMBINED (expr)
5892                              ? ORT_COMBINED_PARALLEL
5893                              : ORT_PARALLEL);
5894
5895   push_gimplify_context (&gctx);
5896
5897   g = gimplify_and_return_first (OMP_PARALLEL_BODY (expr), &body);
5898   if (gimple_code (g) == GIMPLE_BIND)
5899     pop_gimplify_context (g);
5900   else
5901     pop_gimplify_context (NULL);
5902
5903   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
5904
5905   g = gimple_build_omp_parallel (body,
5906                                  OMP_PARALLEL_CLAUSES (expr),
5907                                  NULL_TREE, NULL_TREE);
5908   if (OMP_PARALLEL_COMBINED (expr))
5909     gimple_omp_set_subcode (g, GF_OMP_PARALLEL_COMBINED);
5910   gimplify_seq_add_stmt (pre_p, g);
5911   *expr_p = NULL_TREE;
5912 }
5913
5914 /* Gimplify the contents of an OMP_TASK statement.  This involves
5915    gimplification of the body, as well as scanning the body for used
5916    variables.  We need to do this scan now, because variable-sized
5917    decls will be decomposed during gimplification.  */
5918
5919 static void
5920 gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
5921 {
5922   tree expr = *expr_p;
5923   gimple g;
5924   gimple_seq body = NULL;
5925   struct gimplify_ctx gctx;
5926
5927   gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p, ORT_TASK);
5928
5929   push_gimplify_context (&gctx);
5930
5931   g = gimplify_and_return_first (OMP_TASK_BODY (expr), &body);
5932   if (gimple_code (g) == GIMPLE_BIND)
5933     pop_gimplify_context (g);
5934   else
5935     pop_gimplify_context (NULL);
5936
5937   gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
5938
5939   g = gimple_build_omp_task (body,
5940                              OMP_TASK_CLAUSES (expr),
5941                              NULL_TREE, NULL_TREE,
5942                              NULL_TREE, NULL_TREE, NULL_TREE);
5943   gimplify_seq_add_stmt (pre_p, g);
5944   *expr_p = NULL_TREE;
5945 }
5946
5947 /* Gimplify the gross structure of an OMP_FOR statement.  */
5948
5949 static enum gimplify_status
5950 gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
5951 {
5952   tree for_stmt, decl, var, t;
5953   enum gimplify_status ret = GS_ALL_DONE;
5954   enum gimplify_status tret;
5955   gimple gfor;
5956   gimple_seq for_body, for_pre_body;
5957   int i;
5958
5959   for_stmt = *expr_p;
5960
5961   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
5962                              ORT_WORKSHARE);
5963
5964   /* Handle OMP_FOR_INIT.  */
5965   for_pre_body = NULL;
5966   gimplify_and_add (OMP_FOR_PRE_BODY (for_stmt), &for_pre_body);
5967   OMP_FOR_PRE_BODY (for_stmt) = NULL_TREE;
5968
5969   for_body = gimple_seq_alloc ();
5970   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
5971               == TREE_VEC_LENGTH (OMP_FOR_COND (for_stmt)));
5972   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
5973               == TREE_VEC_LENGTH (OMP_FOR_INCR (for_stmt)));
5974   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
5975     {
5976       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
5977       gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
5978       decl = TREE_OPERAND (t, 0);
5979       gcc_assert (DECL_P (decl));
5980       gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl))
5981                   || POINTER_TYPE_P (TREE_TYPE (decl)));
5982
5983       /* Make sure the iteration variable is private.  */
5984       if (omp_is_private (gimplify_omp_ctxp, decl))
5985         omp_notice_variable (gimplify_omp_ctxp, decl, true);
5986       else
5987         omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
5988
5989       /* If DECL is not a gimple register, create a temporary variable to act
5990          as an iteration counter.  This is valid, since DECL cannot be
5991          modified in the body of the loop.  */
5992       if (!is_gimple_reg (decl))
5993         {
5994           var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
5995           TREE_OPERAND (t, 0) = var;
5996                               
5997           gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
5998
5999           omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
6000         }
6001       else
6002         var = decl;
6003
6004       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6005                             is_gimple_val, fb_rvalue);
6006       ret = MIN (ret, tret);
6007       if (ret == GS_ERROR)
6008         return ret;
6009
6010       /* Handle OMP_FOR_COND.  */
6011       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6012       gcc_assert (COMPARISON_CLASS_P (t));
6013       gcc_assert (TREE_OPERAND (t, 0) == decl);
6014
6015       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6016                             is_gimple_val, fb_rvalue);
6017       ret = MIN (ret, tret);
6018
6019       /* Handle OMP_FOR_INCR.  */
6020       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6021       switch (TREE_CODE (t))
6022         {
6023         case PREINCREMENT_EXPR:
6024         case POSTINCREMENT_EXPR:
6025           t = build_int_cst (TREE_TYPE (decl), 1);
6026           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6027           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6028           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6029           break;
6030
6031         case PREDECREMENT_EXPR:
6032         case POSTDECREMENT_EXPR:
6033           t = build_int_cst (TREE_TYPE (decl), -1);
6034           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6035           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6036           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6037           break;
6038
6039         case MODIFY_EXPR:
6040           gcc_assert (TREE_OPERAND (t, 0) == decl);
6041           TREE_OPERAND (t, 0) = var;
6042
6043           t = TREE_OPERAND (t, 1);
6044           switch (TREE_CODE (t))
6045             {
6046             case PLUS_EXPR:
6047               if (TREE_OPERAND (t, 1) == decl)
6048                 {
6049                   TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
6050                   TREE_OPERAND (t, 0) = var;
6051                   break;
6052                 }
6053
6054               /* Fallthru.  */
6055             case MINUS_EXPR:
6056             case POINTER_PLUS_EXPR:
6057               gcc_assert (TREE_OPERAND (t, 0) == decl);
6058               TREE_OPERAND (t, 0) = var;
6059               break;
6060             default:
6061               gcc_unreachable ();
6062             }
6063
6064           tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6065                                 is_gimple_val, fb_rvalue);
6066           ret = MIN (ret, tret);
6067           break;
6068
6069         default:
6070           gcc_unreachable ();
6071         }
6072
6073       if (var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
6074         {
6075           tree c;
6076           for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
6077             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
6078                 && OMP_CLAUSE_DECL (c) == decl
6079                 && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
6080               {
6081                 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6082                 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6083                 gcc_assert (TREE_OPERAND (t, 0) == var);
6084                 t = TREE_OPERAND (t, 1);
6085                 gcc_assert (TREE_CODE (t) == PLUS_EXPR
6086                             || TREE_CODE (t) == MINUS_EXPR
6087                             || TREE_CODE (t) == POINTER_PLUS_EXPR);
6088                 gcc_assert (TREE_OPERAND (t, 0) == var);
6089                 t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
6090                             TREE_OPERAND (t, 1));
6091                 gimplify_assign (decl, t,
6092                                  &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
6093             }
6094         }
6095     }
6096
6097   gimplify_and_add (OMP_FOR_BODY (for_stmt), &for_body);
6098
6099   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
6100
6101   gfor = gimple_build_omp_for (for_body, OMP_FOR_CLAUSES (for_stmt),
6102                                TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)),
6103                                for_pre_body);
6104
6105   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6106     {
6107       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6108       gimple_omp_for_set_index (gfor, i, TREE_OPERAND (t, 0));
6109       gimple_omp_for_set_initial (gfor, i, TREE_OPERAND (t, 1));
6110       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6111       gimple_omp_for_set_cond (gfor, i, TREE_CODE (t));
6112       gimple_omp_for_set_final (gfor, i, TREE_OPERAND (t, 1));
6113       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6114       gimple_omp_for_set_incr (gfor, i, TREE_OPERAND (t, 1));
6115     }
6116
6117   gimplify_seq_add_stmt (pre_p, gfor);
6118   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
6119 }
6120
6121 /* Gimplify the gross structure of other OpenMP worksharing constructs.
6122    In particular, OMP_SECTIONS and OMP_SINGLE.  */
6123
6124 static void
6125 gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
6126 {
6127   tree expr = *expr_p;
6128   gimple stmt;
6129   gimple_seq body = NULL;
6130
6131   gimplify_scan_omp_clauses (&OMP_CLAUSES (expr), pre_p, ORT_WORKSHARE);
6132   gimplify_and_add (OMP_BODY (expr), &body);
6133   gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
6134
6135   if (TREE_CODE (expr) == OMP_SECTIONS)
6136     stmt = gimple_build_omp_sections (body, OMP_CLAUSES (expr));
6137   else if (TREE_CODE (expr) == OMP_SINGLE)
6138     stmt = gimple_build_omp_single (body, OMP_CLAUSES (expr));
6139   else
6140     gcc_unreachable ();
6141
6142   gimplify_seq_add_stmt (pre_p, stmt);
6143 }
6144
6145 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
6146    stabilized the lhs of the atomic operation as *ADDR.  Return true if 
6147    EXPR is this stabilized form.  */
6148
6149 static bool
6150 goa_lhs_expr_p (tree expr, tree addr)
6151 {
6152   /* Also include casts to other type variants.  The C front end is fond
6153      of adding these for e.g. volatile variables.  This is like 
6154      STRIP_TYPE_NOPS but includes the main variant lookup.  */
6155   STRIP_USELESS_TYPE_CONVERSION (expr);
6156
6157   if (TREE_CODE (expr) == INDIRECT_REF)
6158     {
6159       expr = TREE_OPERAND (expr, 0);
6160       while (expr != addr
6161              && (CONVERT_EXPR_P (expr)
6162                  || TREE_CODE (expr) == NON_LVALUE_EXPR)
6163              && TREE_CODE (expr) == TREE_CODE (addr)
6164              && types_compatible_p (TREE_TYPE (expr), TREE_TYPE (addr)))
6165         {
6166           expr = TREE_OPERAND (expr, 0);
6167           addr = TREE_OPERAND (addr, 0);
6168         }
6169       if (expr == addr)
6170         return true;
6171       return (TREE_CODE (addr) == ADDR_EXPR
6172               && TREE_CODE (expr) == ADDR_EXPR
6173               && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0));
6174     }
6175   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
6176     return true;
6177   return false;
6178 }
6179
6180 /* Walk *EXPR_P and replace
6181    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
6182    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
6183    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
6184
6185 static int
6186 goa_stabilize_expr (tree *expr_p, gimple_seq *pre_p, tree lhs_addr,
6187                     tree lhs_var)
6188 {
6189   tree expr = *expr_p;
6190   int saw_lhs;
6191
6192   if (goa_lhs_expr_p (expr, lhs_addr))
6193     {
6194       *expr_p = lhs_var;
6195       return 1;
6196     }
6197   if (is_gimple_val (expr))
6198     return 0;
6199  
6200   saw_lhs = 0;
6201   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
6202     {
6203     case tcc_binary:
6204     case tcc_comparison:
6205       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p, lhs_addr,
6206                                      lhs_var);
6207     case tcc_unary:
6208       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p, lhs_addr,
6209                                      lhs_var);
6210       break;
6211     case tcc_expression:
6212       switch (TREE_CODE (expr))
6213         {
6214         case TRUTH_ANDIF_EXPR:
6215         case TRUTH_ORIF_EXPR:
6216           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
6217                                          lhs_addr, lhs_var);
6218           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
6219                                          lhs_addr, lhs_var);
6220           break;
6221         default:
6222           break;
6223         }
6224       break;
6225     default:
6226       break;
6227     }
6228
6229   if (saw_lhs == 0)
6230     {
6231       enum gimplify_status gs;
6232       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
6233       if (gs != GS_ALL_DONE)
6234         saw_lhs = -1;
6235     }
6236
6237   return saw_lhs;
6238 }
6239
6240
6241 /* Gimplify an OMP_ATOMIC statement.  */
6242
6243 static enum gimplify_status
6244 gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
6245 {
6246   tree addr = TREE_OPERAND (*expr_p, 0);
6247   tree rhs = TREE_OPERAND (*expr_p, 1);
6248   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
6249   tree tmp_load;
6250
6251    tmp_load = create_tmp_var (type, NULL);
6252    if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
6253      return GS_ERROR;
6254
6255    if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
6256        != GS_ALL_DONE)
6257      return GS_ERROR;
6258
6259    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_load (tmp_load, addr));
6260    if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
6261        != GS_ALL_DONE)
6262      return GS_ERROR;
6263    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_store (rhs));
6264    *expr_p = NULL;
6265
6266    return GS_ALL_DONE;
6267 }
6268
6269
6270 /* Converts the GENERIC expression tree *EXPR_P to GIMPLE.  If the
6271    expression produces a value to be used as an operand inside a GIMPLE
6272    statement, the value will be stored back in *EXPR_P.  This value will
6273    be a tree of class tcc_declaration, tcc_constant, tcc_reference or
6274    an SSA_NAME.  The corresponding sequence of GIMPLE statements is
6275    emitted in PRE_P and POST_P.
6276
6277    Additionally, this process may overwrite parts of the input
6278    expression during gimplification.  Ideally, it should be
6279    possible to do non-destructive gimplification.
6280
6281    EXPR_P points to the GENERIC expression to convert to GIMPLE.  If
6282       the expression needs to evaluate to a value to be used as
6283       an operand in a GIMPLE statement, this value will be stored in
6284       *EXPR_P on exit.  This happens when the caller specifies one
6285       of fb_lvalue or fb_rvalue fallback flags.
6286
6287    PRE_P will contain the sequence of GIMPLE statements corresponding
6288        to the evaluation of EXPR and all the side-effects that must
6289        be executed before the main expression.  On exit, the last
6290        statement of PRE_P is the core statement being gimplified.  For
6291        instance, when gimplifying 'if (++a)' the last statement in
6292        PRE_P will be 'if (t.1)' where t.1 is the result of
6293        pre-incrementing 'a'.
6294
6295    POST_P will contain the sequence of GIMPLE statements corresponding
6296        to the evaluation of all the side-effects that must be executed
6297        after the main expression.  If this is NULL, the post
6298        side-effects are stored at the end of PRE_P.
6299
6300        The reason why the output is split in two is to handle post
6301        side-effects explicitly.  In some cases, an expression may have
6302        inner and outer post side-effects which need to be emitted in
6303        an order different from the one given by the recursive
6304        traversal.  For instance, for the expression (*p--)++ the post
6305        side-effects of '--' must actually occur *after* the post
6306        side-effects of '++'.  However, gimplification will first visit
6307        the inner expression, so if a separate POST sequence was not
6308        used, the resulting sequence would be:
6309
6310             1   t.1 = *p
6311             2   p = p - 1
6312             3   t.2 = t.1 + 1
6313             4   *p = t.2
6314
6315        However, the post-decrement operation in line #2 must not be
6316        evaluated until after the store to *p at line #4, so the
6317        correct sequence should be:
6318
6319             1   t.1 = *p
6320             2   t.2 = t.1 + 1
6321             3   *p = t.2
6322             4   p = p - 1
6323
6324        So, by specifying a separate post queue, it is possible
6325        to emit the post side-effects in the correct order.
6326        If POST_P is NULL, an internal queue will be used.  Before
6327        returning to the caller, the sequence POST_P is appended to
6328        the main output sequence PRE_P.
6329
6330    GIMPLE_TEST_F points to a function that takes a tree T and
6331        returns nonzero if T is in the GIMPLE form requested by the
6332        caller.  The GIMPLE predicates are in tree-gimple.c.
6333
6334    FALLBACK tells the function what sort of a temporary we want if
6335        gimplification cannot produce an expression that complies with
6336        GIMPLE_TEST_F.
6337
6338        fb_none means that no temporary should be generated
6339        fb_rvalue means that an rvalue is OK to generate
6340        fb_lvalue means that an lvalue is OK to generate
6341        fb_either means that either is OK, but an lvalue is preferable.
6342        fb_mayfail means that gimplification may fail (in which case
6343        GS_ERROR will be returned)
6344
6345    The return value is either GS_ERROR or GS_ALL_DONE, since this
6346    function iterates until EXPR is completely gimplified or an error
6347    occurs.  */
6348
6349 enum gimplify_status
6350 gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
6351                bool (*gimple_test_f) (tree), fallback_t fallback)
6352 {
6353   tree tmp;
6354   gimple_seq internal_pre = NULL;
6355   gimple_seq internal_post = NULL;
6356   tree save_expr;
6357   bool is_statement;
6358   location_t saved_location;
6359   enum gimplify_status ret;
6360   gimple_stmt_iterator pre_last_gsi, post_last_gsi;
6361
6362   save_expr = *expr_p;
6363   if (save_expr == NULL_TREE)
6364     return GS_ALL_DONE;
6365
6366   /* If we are gimplifying a top-level statement, PRE_P must be valid.  */
6367   is_statement = gimple_test_f == is_gimple_stmt;
6368   if (is_statement)
6369     gcc_assert (pre_p);
6370
6371   /* Consistency checks.  */
6372   if (gimple_test_f == is_gimple_reg)
6373     gcc_assert (fallback & (fb_rvalue | fb_lvalue));
6374   else if (gimple_test_f == is_gimple_val
6375            || gimple_test_f == is_gimple_call_addr
6376            || gimple_test_f == is_gimple_condexpr
6377            || gimple_test_f == is_gimple_mem_rhs
6378            || gimple_test_f == is_gimple_mem_rhs_or_call
6379            || gimple_test_f == is_gimple_reg_rhs
6380            || gimple_test_f == is_gimple_reg_rhs_or_call
6381            || gimple_test_f == is_gimple_asm_val)
6382     gcc_assert (fallback & fb_rvalue);
6383   else if (gimple_test_f == is_gimple_min_lval
6384            || gimple_test_f == is_gimple_lvalue)
6385     gcc_assert (fallback & fb_lvalue);
6386   else if (gimple_test_f == is_gimple_addressable)
6387     gcc_assert (fallback & fb_either);
6388   else if (gimple_test_f == is_gimple_stmt)
6389     gcc_assert (fallback == fb_none);
6390   else
6391     {
6392       /* We should have recognized the GIMPLE_TEST_F predicate to
6393          know what kind of fallback to use in case a temporary is
6394          needed to hold the value or address of *EXPR_P.  */
6395       gcc_unreachable ();
6396     }
6397
6398   /* We used to check the predicate here and return immediately if it
6399      succeeds.  This is wrong; the design is for gimplification to be
6400      idempotent, and for the predicates to only test for valid forms, not
6401      whether they are fully simplified.  */
6402   if (pre_p == NULL)
6403     pre_p = &internal_pre;
6404
6405   if (post_p == NULL)
6406     post_p = &internal_post;
6407
6408   /* Remember the last statements added to PRE_P and POST_P.  Every
6409      new statement added by the gimplification helpers needs to be
6410      annotated with location information.  To centralize the
6411      responsibility, we remember the last statement that had been
6412      added to both queues before gimplifying *EXPR_P.  If
6413      gimplification produces new statements in PRE_P and POST_P, those
6414      statements will be annotated with the same location information
6415      as *EXPR_P.  */
6416   pre_last_gsi = gsi_last (*pre_p);
6417   post_last_gsi = gsi_last (*post_p);
6418
6419   saved_location = input_location;
6420   if (save_expr != error_mark_node
6421       && EXPR_HAS_LOCATION (*expr_p))
6422     input_location = EXPR_LOCATION (*expr_p);
6423
6424   /* Loop over the specific gimplifiers until the toplevel node
6425      remains the same.  */
6426   do
6427     {
6428       /* Strip away as many useless type conversions as possible
6429          at the toplevel.  */
6430       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
6431
6432       /* Remember the expr.  */
6433       save_expr = *expr_p;
6434
6435       /* Die, die, die, my darling.  */
6436       if (save_expr == error_mark_node
6437           || (TREE_TYPE (save_expr)
6438               && TREE_TYPE (save_expr) == error_mark_node))
6439         {
6440           ret = GS_ERROR;
6441           break;
6442         }
6443
6444       /* Do any language-specific gimplification.  */
6445       ret = ((enum gimplify_status)
6446              lang_hooks.gimplify_expr (expr_p, pre_p, post_p));
6447       if (ret == GS_OK)
6448         {
6449           if (*expr_p == NULL_TREE)
6450             break;
6451           if (*expr_p != save_expr)
6452             continue;
6453         }
6454       else if (ret != GS_UNHANDLED)
6455         break;
6456
6457       ret = GS_OK;
6458       switch (TREE_CODE (*expr_p))
6459         {
6460           /* First deal with the special cases.  */
6461
6462         case POSTINCREMENT_EXPR:
6463         case POSTDECREMENT_EXPR:
6464         case PREINCREMENT_EXPR:
6465         case PREDECREMENT_EXPR:
6466           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
6467                                         fallback != fb_none);
6468           break;
6469
6470         case ARRAY_REF:
6471         case ARRAY_RANGE_REF:
6472         case REALPART_EXPR:
6473         case IMAGPART_EXPR:
6474         case COMPONENT_REF:
6475         case VIEW_CONVERT_EXPR:
6476           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
6477                                         fallback ? fallback : fb_rvalue);
6478           break;
6479
6480         case COND_EXPR:
6481           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
6482
6483           /* C99 code may assign to an array in a structure value of a
6484              conditional expression, and this has undefined behavior
6485              only on execution, so create a temporary if an lvalue is
6486              required.  */
6487           if (fallback == fb_lvalue)
6488             {
6489               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6490               mark_addressable (*expr_p);
6491             }
6492           break;
6493
6494         case CALL_EXPR:
6495           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
6496
6497           /* C99 code may assign to an array in a structure returned
6498              from a function, and this has undefined behavior only on
6499              execution, so create a temporary if an lvalue is
6500              required.  */
6501           if (fallback == fb_lvalue)
6502             {
6503               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6504               mark_addressable (*expr_p);
6505             }
6506           break;
6507
6508         case TREE_LIST:
6509           gcc_unreachable ();
6510
6511         case COMPOUND_EXPR:
6512           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
6513           break;
6514
6515         case COMPOUND_LITERAL_EXPR:
6516           ret = gimplify_compound_literal_expr (expr_p, pre_p);
6517           break;
6518
6519         case MODIFY_EXPR:
6520         case INIT_EXPR:
6521           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
6522                                       fallback != fb_none);
6523           break;
6524
6525         case TRUTH_ANDIF_EXPR:
6526         case TRUTH_ORIF_EXPR:
6527           /* Pass the source location of the outer expression.  */
6528           ret = gimplify_boolean_expr (expr_p, saved_location);
6529           break;
6530
6531         case TRUTH_NOT_EXPR:
6532           if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE)
6533             {
6534               tree type = TREE_TYPE (*expr_p);
6535               *expr_p = fold_convert (type, gimple_boolify (*expr_p));
6536               ret = GS_OK;
6537               break;
6538             }
6539
6540           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6541                                is_gimple_val, fb_rvalue);
6542           recalculate_side_effects (*expr_p);
6543           break;
6544
6545         case ADDR_EXPR:
6546           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
6547           break;
6548
6549         case VA_ARG_EXPR:
6550           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
6551           break;
6552
6553         CASE_CONVERT:
6554           if (IS_EMPTY_STMT (*expr_p))
6555             {
6556               ret = GS_ALL_DONE;
6557               break;
6558             }
6559
6560           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
6561               || fallback == fb_none)
6562             {
6563               /* Just strip a conversion to void (or in void context) and
6564                  try again.  */
6565               *expr_p = TREE_OPERAND (*expr_p, 0);
6566               break;
6567             }
6568
6569           ret = gimplify_conversion (expr_p);
6570           if (ret == GS_ERROR)
6571             break;
6572           if (*expr_p != save_expr)
6573             break;
6574           /* FALLTHRU */
6575
6576         case FIX_TRUNC_EXPR:
6577           /* unary_expr: ... | '(' cast ')' val | ...  */
6578           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6579                                is_gimple_val, fb_rvalue);
6580           recalculate_side_effects (*expr_p);
6581           break;
6582
6583         case INDIRECT_REF:
6584           *expr_p = fold_indirect_ref_loc (input_location, *expr_p);
6585           if (*expr_p != save_expr)
6586             break;
6587           /* else fall through.  */
6588         case ALIGN_INDIRECT_REF:
6589         case MISALIGNED_INDIRECT_REF:
6590           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6591                                is_gimple_reg, fb_rvalue);
6592           recalculate_side_effects (*expr_p);
6593           break;
6594
6595           /* Constants need not be gimplified.  */
6596         case INTEGER_CST:
6597         case REAL_CST:
6598         case FIXED_CST:
6599         case STRING_CST:
6600         case COMPLEX_CST:
6601         case VECTOR_CST:
6602           ret = GS_ALL_DONE;
6603           break;
6604
6605         case CONST_DECL:
6606           /* If we require an lvalue, such as for ADDR_EXPR, retain the
6607              CONST_DECL node.  Otherwise the decl is replaceable by its
6608              value.  */
6609           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
6610           if (fallback & fb_lvalue)
6611             ret = GS_ALL_DONE;
6612           else
6613             *expr_p = DECL_INITIAL (*expr_p);
6614           break;
6615
6616         case DECL_EXPR:
6617           ret = gimplify_decl_expr (expr_p, pre_p);
6618           break;
6619
6620         case EXC_PTR_EXPR:
6621           /* FIXME make this a decl.  */
6622           ret = GS_ALL_DONE;
6623           break;
6624
6625         case BIND_EXPR:
6626           ret = gimplify_bind_expr (expr_p, pre_p);
6627           break;
6628
6629         case LOOP_EXPR:
6630           ret = gimplify_loop_expr (expr_p, pre_p);
6631           break;
6632
6633         case SWITCH_EXPR:
6634           ret = gimplify_switch_expr (expr_p, pre_p);
6635           break;
6636
6637         case EXIT_EXPR:
6638           ret = gimplify_exit_expr (expr_p);
6639           break;
6640
6641         case GOTO_EXPR:
6642           /* If the target is not LABEL, then it is a computed jump
6643              and the target needs to be gimplified.  */
6644           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
6645             {
6646               ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
6647                                    NULL, is_gimple_val, fb_rvalue);
6648               if (ret == GS_ERROR)
6649                 break;
6650             }
6651           gimplify_seq_add_stmt (pre_p,
6652                           gimple_build_goto (GOTO_DESTINATION (*expr_p)));
6653           break;
6654
6655         case PREDICT_EXPR:
6656           gimplify_seq_add_stmt (pre_p,
6657                         gimple_build_predict (PREDICT_EXPR_PREDICTOR (*expr_p),
6658                                               PREDICT_EXPR_OUTCOME (*expr_p)));
6659           ret = GS_ALL_DONE;
6660           break;
6661
6662         case LABEL_EXPR:
6663           ret = GS_ALL_DONE;
6664           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
6665                       == current_function_decl);
6666           gimplify_seq_add_stmt (pre_p,
6667                           gimple_build_label (LABEL_EXPR_LABEL (*expr_p)));
6668           break;
6669
6670         case CASE_LABEL_EXPR:
6671           ret = gimplify_case_label_expr (expr_p, pre_p);
6672           break;
6673
6674         case RETURN_EXPR:
6675           ret = gimplify_return_expr (*expr_p, pre_p);
6676           break;
6677
6678         case CONSTRUCTOR:
6679           /* Don't reduce this in place; let gimplify_init_constructor work its
6680              magic.  Buf if we're just elaborating this for side effects, just
6681              gimplify any element that has side-effects.  */
6682           if (fallback == fb_none)
6683             {
6684               unsigned HOST_WIDE_INT ix;
6685               constructor_elt *ce;
6686               tree temp = NULL_TREE;
6687               for (ix = 0;
6688                    VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
6689                                 ix, ce);
6690                    ix++)
6691                 if (TREE_SIDE_EFFECTS (ce->value))
6692                   append_to_statement_list (ce->value, &temp);
6693
6694               *expr_p = temp;
6695               ret = GS_OK;
6696             }
6697           /* C99 code may assign to an array in a constructed
6698              structure or union, and this has undefined behavior only
6699              on execution, so create a temporary if an lvalue is
6700              required.  */
6701           else if (fallback == fb_lvalue)
6702             {
6703               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6704               mark_addressable (*expr_p);
6705             }
6706           else
6707             ret = GS_ALL_DONE;
6708           break;
6709
6710           /* The following are special cases that are not handled by the
6711              original GIMPLE grammar.  */
6712
6713           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
6714              eliminated.  */
6715         case SAVE_EXPR:
6716           ret = gimplify_save_expr (expr_p, pre_p, post_p);
6717           break;
6718
6719         case BIT_FIELD_REF:
6720           {
6721             enum gimplify_status r0, r1, r2;
6722
6723             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6724                                 post_p, is_gimple_lvalue, fb_either);
6725             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6726                                 post_p, is_gimple_val, fb_rvalue);
6727             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
6728                                 post_p, is_gimple_val, fb_rvalue);
6729             recalculate_side_effects (*expr_p);
6730
6731             ret = MIN (r0, MIN (r1, r2));
6732           }
6733           break;
6734
6735         case TARGET_MEM_REF:
6736           {
6737             enum gimplify_status r0 = GS_ALL_DONE, r1 = GS_ALL_DONE;
6738
6739             if (TMR_SYMBOL (*expr_p))
6740               r0 = gimplify_expr (&TMR_SYMBOL (*expr_p), pre_p,
6741                                   post_p, is_gimple_lvalue, fb_either);
6742             else if (TMR_BASE (*expr_p))
6743               r0 = gimplify_expr (&TMR_BASE (*expr_p), pre_p,
6744                                   post_p, is_gimple_val, fb_either);
6745             if (TMR_INDEX (*expr_p))
6746               r1 = gimplify_expr (&TMR_INDEX (*expr_p), pre_p,
6747                                   post_p, is_gimple_val, fb_rvalue);
6748             /* TMR_STEP and TMR_OFFSET are always integer constants.  */
6749             ret = MIN (r0, r1);
6750           }
6751           break;
6752
6753         case NON_LVALUE_EXPR:
6754           /* This should have been stripped above.  */
6755           gcc_unreachable ();
6756
6757         case ASM_EXPR:
6758           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
6759           break;
6760
6761         case TRY_FINALLY_EXPR:
6762         case TRY_CATCH_EXPR:
6763           {
6764             gimple_seq eval, cleanup;
6765             gimple try_;
6766
6767             eval = cleanup = NULL;
6768             gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
6769             gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
6770             /* Don't create bogus GIMPLE_TRY with empty cleanup.  */
6771             if (gimple_seq_empty_p (cleanup))
6772               {
6773                 gimple_seq_add_seq (pre_p, eval);
6774                 ret = GS_ALL_DONE;
6775                 break;
6776               }
6777             try_ = gimple_build_try (eval, cleanup,
6778                                      TREE_CODE (*expr_p) == TRY_FINALLY_EXPR
6779                                      ? GIMPLE_TRY_FINALLY
6780                                      : GIMPLE_TRY_CATCH);
6781             if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR)
6782               gimple_try_set_catch_is_cleanup (try_,
6783                                                TRY_CATCH_IS_CLEANUP (*expr_p));
6784             gimplify_seq_add_stmt (pre_p, try_);
6785             ret = GS_ALL_DONE;
6786             break;
6787           }
6788
6789         case CLEANUP_POINT_EXPR:
6790           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
6791           break;
6792
6793         case TARGET_EXPR:
6794           ret = gimplify_target_expr (expr_p, pre_p, post_p);
6795           break;
6796
6797         case CATCH_EXPR:
6798           {
6799             gimple c;
6800             gimple_seq handler = NULL;
6801             gimplify_and_add (CATCH_BODY (*expr_p), &handler);
6802             c = gimple_build_catch (CATCH_TYPES (*expr_p), handler);
6803             gimplify_seq_add_stmt (pre_p, c);
6804             ret = GS_ALL_DONE;
6805             break;
6806           }
6807
6808         case EH_FILTER_EXPR:
6809           {
6810             gimple ehf;
6811             gimple_seq failure = NULL;
6812
6813             gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure);
6814             ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure);
6815             gimple_set_no_warning (ehf, TREE_NO_WARNING (*expr_p));
6816             gimple_eh_filter_set_must_not_throw
6817               (ehf, EH_FILTER_MUST_NOT_THROW (*expr_p));
6818             gimplify_seq_add_stmt (pre_p, ehf);
6819             ret = GS_ALL_DONE;
6820             break;
6821           }
6822
6823         case OBJ_TYPE_REF:
6824           {
6825             enum gimplify_status r0, r1;
6826             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p,
6827                                 post_p, is_gimple_val, fb_rvalue);
6828             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p,
6829                                 post_p, is_gimple_val, fb_rvalue);
6830             TREE_SIDE_EFFECTS (*expr_p) = 0;
6831             ret = MIN (r0, r1);
6832           }
6833           break;
6834
6835         case LABEL_DECL:
6836           /* We get here when taking the address of a label.  We mark
6837              the label as "forced"; meaning it can never be removed and
6838              it is a potential target for any computed goto.  */
6839           FORCED_LABEL (*expr_p) = 1;
6840           ret = GS_ALL_DONE;
6841           break;
6842
6843         case STATEMENT_LIST:
6844           ret = gimplify_statement_list (expr_p, pre_p);
6845           break;
6846
6847         case WITH_SIZE_EXPR:
6848           {
6849             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6850                            post_p == &internal_post ? NULL : post_p,
6851                            gimple_test_f, fallback);
6852             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6853                            is_gimple_val, fb_rvalue);
6854           }
6855           break;
6856
6857         case VAR_DECL:
6858         case PARM_DECL:
6859           ret = gimplify_var_or_parm_decl (expr_p);
6860           break;
6861
6862         case RESULT_DECL:
6863           /* When within an OpenMP context, notice uses of variables.  */
6864           if (gimplify_omp_ctxp)
6865             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
6866           ret = GS_ALL_DONE;
6867           break;
6868
6869         case SSA_NAME:
6870           /* Allow callbacks into the gimplifier during optimization.  */
6871           ret = GS_ALL_DONE;
6872           break;
6873
6874         case OMP_PARALLEL:
6875           gimplify_omp_parallel (expr_p, pre_p);
6876           ret = GS_ALL_DONE;
6877           break;
6878
6879         case OMP_TASK:
6880           gimplify_omp_task (expr_p, pre_p);
6881           ret = GS_ALL_DONE;
6882           break;
6883
6884         case OMP_FOR:
6885           ret = gimplify_omp_for (expr_p, pre_p);
6886           break;
6887
6888         case OMP_SECTIONS:
6889         case OMP_SINGLE:
6890           gimplify_omp_workshare (expr_p, pre_p);
6891           ret = GS_ALL_DONE;
6892           break;
6893
6894         case OMP_SECTION:
6895         case OMP_MASTER:
6896         case OMP_ORDERED:
6897         case OMP_CRITICAL:
6898           {
6899             gimple_seq body = NULL;
6900             gimple g;
6901
6902             gimplify_and_add (OMP_BODY (*expr_p), &body);
6903             switch (TREE_CODE (*expr_p))
6904               {
6905               case OMP_SECTION:
6906                 g = gimple_build_omp_section (body);
6907                 break;
6908               case OMP_MASTER:
6909                 g = gimple_build_omp_master (body);
6910                 break;
6911               case OMP_ORDERED:
6912                 g = gimple_build_omp_ordered (body);
6913                 break;
6914               case OMP_CRITICAL:
6915                 g = gimple_build_omp_critical (body,
6916                                                OMP_CRITICAL_NAME (*expr_p));
6917                 break;
6918               default:
6919                 gcc_unreachable ();
6920               }
6921             gimplify_seq_add_stmt (pre_p, g);
6922             ret = GS_ALL_DONE;
6923             break;
6924           }
6925
6926         case OMP_ATOMIC:
6927           ret = gimplify_omp_atomic (expr_p, pre_p);
6928           break;
6929
6930         case POINTER_PLUS_EXPR:
6931           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
6932              The second is gimple immediate saving a need for extra statement.
6933            */
6934           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6935               && (tmp = maybe_fold_offset_to_address
6936                   (EXPR_LOCATION (*expr_p),
6937                    TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
6938                    TREE_TYPE (*expr_p))))
6939             {
6940               *expr_p = tmp;
6941               break;
6942             }
6943           /* Convert (void *)&a + 4 into (void *)&a[1].  */
6944           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
6945               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6946               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
6947                                                                         0),0)))
6948               && (tmp = maybe_fold_offset_to_address
6949                   (EXPR_LOCATION (*expr_p),
6950                    TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
6951                    TREE_OPERAND (*expr_p, 1),
6952                    TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
6953                                             0)))))
6954              {
6955                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
6956                break;
6957              }
6958           /* FALLTHRU */
6959
6960         default:
6961           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
6962             {
6963             case tcc_comparison:
6964               /* Handle comparison of objects of non scalar mode aggregates
6965                  with a call to memcmp.  It would be nice to only have to do
6966                  this for variable-sized objects, but then we'd have to allow
6967                  the same nest of reference nodes we allow for MODIFY_EXPR and
6968                  that's too complex.
6969
6970                  Compare scalar mode aggregates as scalar mode values.  Using
6971                  memcmp for them would be very inefficient at best, and is
6972                  plain wrong if bitfields are involved.  */
6973                 {
6974                   tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
6975
6976                   if (!AGGREGATE_TYPE_P (type))
6977                     goto expr_2;
6978                   else if (TYPE_MODE (type) != BLKmode)
6979                     ret = gimplify_scalar_mode_aggregate_compare (expr_p);
6980                   else
6981                     ret = gimplify_variable_sized_compare (expr_p);
6982
6983                   break;
6984                 }
6985
6986             /* If *EXPR_P does not need to be special-cased, handle it
6987                according to its class.  */
6988             case tcc_unary:
6989               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6990                                    post_p, is_gimple_val, fb_rvalue);
6991               break;
6992
6993             case tcc_binary:
6994             expr_2:
6995               {
6996                 enum gimplify_status r0, r1;
6997
6998                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6999                                     post_p, is_gimple_val, fb_rvalue);
7000                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7001                                     post_p, is_gimple_val, fb_rvalue);
7002
7003                 ret = MIN (r0, r1);
7004                 break;
7005               }
7006
7007             case tcc_declaration:
7008             case tcc_constant:
7009               ret = GS_ALL_DONE;
7010               goto dont_recalculate;
7011
7012             default:
7013               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
7014                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
7015                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
7016               goto expr_2;
7017             }
7018
7019           recalculate_side_effects (*expr_p);
7020
7021         dont_recalculate:
7022           break;
7023         }
7024
7025       /* If we replaced *expr_p, gimplify again.  */
7026       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
7027         ret = GS_ALL_DONE;
7028     }
7029   while (ret == GS_OK);
7030
7031   /* If we encountered an error_mark somewhere nested inside, either
7032      stub out the statement or propagate the error back out.  */
7033   if (ret == GS_ERROR)
7034     {
7035       if (is_statement)
7036         *expr_p = NULL;
7037       goto out;
7038     }
7039
7040   /* This was only valid as a return value from the langhook, which
7041      we handled.  Make sure it doesn't escape from any other context.  */
7042   gcc_assert (ret != GS_UNHANDLED);
7043
7044   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
7045     {
7046       /* We aren't looking for a value, and we don't have a valid
7047          statement.  If it doesn't have side-effects, throw it away.  */
7048       if (!TREE_SIDE_EFFECTS (*expr_p))
7049         *expr_p = NULL;
7050       else if (!TREE_THIS_VOLATILE (*expr_p))
7051         {
7052           /* This is probably a _REF that contains something nested that
7053              has side effects.  Recurse through the operands to find it.  */
7054           enum tree_code code = TREE_CODE (*expr_p);
7055
7056           switch (code)
7057             {
7058             case COMPONENT_REF:
7059             case REALPART_EXPR:
7060             case IMAGPART_EXPR:
7061             case VIEW_CONVERT_EXPR:
7062               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7063                              gimple_test_f, fallback);
7064               break;
7065
7066             case ARRAY_REF:
7067             case ARRAY_RANGE_REF:
7068               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7069                              gimple_test_f, fallback);
7070               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7071                              gimple_test_f, fallback);
7072               break;
7073
7074             default:
7075                /* Anything else with side-effects must be converted to
7076                   a valid statement before we get here.  */
7077               gcc_unreachable ();
7078             }
7079
7080           *expr_p = NULL;
7081         }
7082       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
7083                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
7084         {
7085           /* Historically, the compiler has treated a bare reference
7086              to a non-BLKmode volatile lvalue as forcing a load.  */
7087           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
7088
7089           /* Normally, we do not want to create a temporary for a
7090              TREE_ADDRESSABLE type because such a type should not be
7091              copied by bitwise-assignment.  However, we make an
7092              exception here, as all we are doing here is ensuring that
7093              we read the bytes that make up the type.  We use
7094              create_tmp_var_raw because create_tmp_var will abort when
7095              given a TREE_ADDRESSABLE type.  */
7096           tree tmp = create_tmp_var_raw (type, "vol");
7097           gimple_add_tmp_var (tmp);
7098           gimplify_assign (tmp, *expr_p, pre_p);
7099           *expr_p = NULL;
7100         }
7101       else
7102         /* We can't do anything useful with a volatile reference to
7103            an incomplete type, so just throw it away.  Likewise for
7104            a BLKmode type, since any implicit inner load should
7105            already have been turned into an explicit one by the
7106            gimplification process.  */
7107         *expr_p = NULL;
7108     }
7109
7110   /* If we are gimplifying at the statement level, we're done.  Tack
7111      everything together and return.  */
7112   if (fallback == fb_none || is_statement)
7113     {
7114       /* Since *EXPR_P has been converted into a GIMPLE tuple, clear
7115          it out for GC to reclaim it.  */
7116       *expr_p = NULL_TREE;
7117
7118       if (!gimple_seq_empty_p (internal_pre)
7119           || !gimple_seq_empty_p (internal_post))
7120         {
7121           gimplify_seq_add_seq (&internal_pre, internal_post);
7122           gimplify_seq_add_seq (pre_p, internal_pre);
7123         }
7124
7125       /* The result of gimplifying *EXPR_P is going to be the last few
7126          statements in *PRE_P and *POST_P.  Add location information
7127          to all the statements that were added by the gimplification
7128          helpers.  */
7129       if (!gimple_seq_empty_p (*pre_p))
7130         annotate_all_with_location_after (*pre_p, pre_last_gsi, input_location);
7131
7132       if (!gimple_seq_empty_p (*post_p))
7133         annotate_all_with_location_after (*post_p, post_last_gsi,
7134                                           input_location);
7135
7136       goto out;
7137     }
7138
7139 #ifdef ENABLE_GIMPLE_CHECKING
7140   if (*expr_p)
7141     {
7142       enum tree_code code = TREE_CODE (*expr_p);
7143       /* These expressions should already be in gimple IR form.  */
7144       gcc_assert (code != MODIFY_EXPR
7145                   && code != ASM_EXPR
7146                   && code != BIND_EXPR
7147                   && code != CATCH_EXPR
7148                   && (code != COND_EXPR || gimplify_ctxp->allow_rhs_cond_expr)
7149                   && code != EH_FILTER_EXPR
7150                   && code != GOTO_EXPR
7151                   && code != LABEL_EXPR
7152                   && code != LOOP_EXPR
7153                   && code != RESX_EXPR
7154                   && code != SWITCH_EXPR
7155                   && code != TRY_FINALLY_EXPR
7156                   && code != OMP_CRITICAL
7157                   && code != OMP_FOR
7158                   && code != OMP_MASTER
7159                   && code != OMP_ORDERED
7160                   && code != OMP_PARALLEL
7161                   && code != OMP_SECTIONS
7162                   && code != OMP_SECTION
7163                   && code != OMP_SINGLE);
7164     }
7165 #endif
7166
7167   /* Otherwise we're gimplifying a subexpression, so the resulting
7168      value is interesting.  If it's a valid operand that matches
7169      GIMPLE_TEST_F, we're done. Unless we are handling some
7170      post-effects internally; if that's the case, we need to copy into
7171      a temporary before adding the post-effects to POST_P.  */
7172   if (gimple_seq_empty_p (internal_post) && (*gimple_test_f) (*expr_p))
7173     goto out;
7174
7175   /* Otherwise, we need to create a new temporary for the gimplified
7176      expression.  */
7177
7178   /* We can't return an lvalue if we have an internal postqueue.  The
7179      object the lvalue refers to would (probably) be modified by the
7180      postqueue; we need to copy the value out first, which means an
7181      rvalue.  */
7182   if ((fallback & fb_lvalue)
7183       && gimple_seq_empty_p (internal_post)
7184       && is_gimple_addressable (*expr_p))
7185     {
7186       /* An lvalue will do.  Take the address of the expression, store it
7187          in a temporary, and replace the expression with an INDIRECT_REF of
7188          that temporary.  */
7189       tmp = build_fold_addr_expr_loc (input_location, *expr_p);
7190       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
7191       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
7192     }
7193   else if ((fallback & fb_rvalue) && is_gimple_reg_rhs_or_call (*expr_p))
7194     {
7195       /* An rvalue will do.  Assign the gimplified expression into a
7196          new temporary TMP and replace the original expression with
7197          TMP.  First, make sure that the expression has a type so that
7198          it can be assigned into a temporary.  */
7199       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
7200
7201       if (!gimple_seq_empty_p (internal_post) || (fallback & fb_lvalue))
7202         /* The postqueue might change the value of the expression between
7203            the initialization and use of the temporary, so we can't use a
7204            formal temp.  FIXME do we care?  */
7205         {
7206           *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7207           if (TREE_CODE (TREE_TYPE (*expr_p)) == COMPLEX_TYPE
7208               || TREE_CODE (TREE_TYPE (*expr_p)) == VECTOR_TYPE)
7209             DECL_GIMPLE_REG_P (*expr_p) = 1;
7210         }
7211       else
7212         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
7213     }
7214   else
7215     {
7216 #ifdef ENABLE_GIMPLE_CHECKING
7217       if (!(fallback & fb_mayfail))
7218         {
7219           fprintf (stderr, "gimplification failed:\n");
7220           print_generic_expr (stderr, *expr_p, 0);
7221           debug_tree (*expr_p);
7222           internal_error ("gimplification failed");
7223         }
7224 #endif
7225       gcc_assert (fallback & fb_mayfail);
7226
7227       /* If this is an asm statement, and the user asked for the
7228          impossible, don't die.  Fail and let gimplify_asm_expr
7229          issue an error.  */
7230       ret = GS_ERROR;
7231       goto out;
7232     }
7233
7234   /* Make sure the temporary matches our predicate.  */
7235   gcc_assert ((*gimple_test_f) (*expr_p));
7236
7237   if (!gimple_seq_empty_p (internal_post))
7238     {
7239       annotate_all_with_location (internal_post, input_location);
7240       gimplify_seq_add_seq (pre_p, internal_post);
7241     }
7242
7243  out:
7244   input_location = saved_location;
7245   return ret;
7246 }
7247
7248 /* Look through TYPE for variable-sized objects and gimplify each such
7249    size that we find.  Add to LIST_P any statements generated.  */
7250
7251 void
7252 gimplify_type_sizes (tree type, gimple_seq *list_p)
7253 {
7254   tree field, t;
7255
7256   if (type == NULL || type == error_mark_node)
7257     return;
7258
7259   /* We first do the main variant, then copy into any other variants.  */
7260   type = TYPE_MAIN_VARIANT (type);
7261
7262   /* Avoid infinite recursion.  */
7263   if (TYPE_SIZES_GIMPLIFIED (type))
7264     return;
7265
7266   TYPE_SIZES_GIMPLIFIED (type) = 1;
7267
7268   switch (TREE_CODE (type))
7269     {
7270     case INTEGER_TYPE:
7271     case ENUMERAL_TYPE:
7272     case BOOLEAN_TYPE:
7273     case REAL_TYPE:
7274     case FIXED_POINT_TYPE:
7275       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
7276       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
7277
7278       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7279         {
7280           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
7281           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
7282         }
7283       break;
7284
7285     case ARRAY_TYPE:
7286       /* These types may not have declarations, so handle them here.  */
7287       gimplify_type_sizes (TREE_TYPE (type), list_p);
7288       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
7289       /* When not optimizing, ensure VLA bounds aren't removed.  */
7290       if (!optimize
7291           && TYPE_DOMAIN (type)
7292           && INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
7293         {
7294           t = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
7295           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7296             DECL_IGNORED_P (t) = 0;
7297           t = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
7298           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7299             DECL_IGNORED_P (t) = 0;
7300         }
7301       break;
7302
7303     case RECORD_TYPE:
7304     case UNION_TYPE:
7305     case QUAL_UNION_TYPE:
7306       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
7307         if (TREE_CODE (field) == FIELD_DECL)
7308           {
7309             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
7310             gimplify_one_sizepos (&DECL_SIZE (field), list_p);
7311             gimplify_one_sizepos (&DECL_SIZE_UNIT (field), list_p);
7312             gimplify_type_sizes (TREE_TYPE (field), list_p);
7313           }
7314       break;
7315
7316     case POINTER_TYPE:
7317     case REFERENCE_TYPE:
7318         /* We used to recurse on the pointed-to type here, which turned out to
7319            be incorrect because its definition might refer to variables not
7320            yet initialized at this point if a forward declaration is involved.
7321
7322            It was actually useful for anonymous pointed-to types to ensure
7323            that the sizes evaluation dominates every possible later use of the
7324            values.  Restricting to such types here would be safe since there
7325            is no possible forward declaration around, but would introduce an
7326            undesirable middle-end semantic to anonymity.  We then defer to
7327            front-ends the responsibility of ensuring that the sizes are
7328            evaluated both early and late enough, e.g. by attaching artificial
7329            type declarations to the tree.  */
7330       break;
7331
7332     default:
7333       break;
7334     }
7335
7336   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
7337   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
7338
7339   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7340     {
7341       TYPE_SIZE (t) = TYPE_SIZE (type);
7342       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
7343       TYPE_SIZES_GIMPLIFIED (t) = 1;
7344     }
7345 }
7346
7347 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
7348    a size or position, has had all of its SAVE_EXPRs evaluated.
7349    We add any required statements to *STMT_P.  */
7350
7351 void
7352 gimplify_one_sizepos (tree *expr_p, gimple_seq *stmt_p)
7353 {
7354   tree type, expr = *expr_p;
7355
7356   /* We don't do anything if the value isn't there, is constant, or contains
7357      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
7358      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
7359      will want to replace it with a new variable, but that will cause problems
7360      if this type is from outside the function.  It's OK to have that here.  */
7361   if (expr == NULL_TREE || TREE_CONSTANT (expr)
7362       || TREE_CODE (expr) == VAR_DECL
7363       || CONTAINS_PLACEHOLDER_P (expr))
7364     return;
7365
7366   type = TREE_TYPE (expr);
7367   *expr_p = unshare_expr (expr);
7368
7369   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
7370   expr = *expr_p;
7371
7372   /* Verify that we've an exact type match with the original expression.
7373      In particular, we do not wish to drop a "sizetype" in favour of a
7374      type of similar dimensions.  We don't want to pollute the generic
7375      type-stripping code with this knowledge because it doesn't matter
7376      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
7377      and friends retain their "sizetype-ness".  */
7378   if (TREE_TYPE (expr) != type
7379       && TREE_CODE (type) == INTEGER_TYPE
7380       && TYPE_IS_SIZETYPE (type))
7381     {
7382       tree tmp;
7383       gimple stmt;
7384
7385       *expr_p = create_tmp_var (type, NULL);
7386       tmp = build1 (NOP_EXPR, type, expr);
7387       stmt = gimplify_assign (*expr_p, tmp, stmt_p);
7388       if (EXPR_HAS_LOCATION (expr))
7389         gimple_set_location (stmt, EXPR_LOCATION (expr));
7390       else
7391         gimple_set_location (stmt, input_location);
7392     }
7393 }
7394
7395
7396 /* Gimplify the body of statements pointed to by BODY_P and return a
7397    GIMPLE_BIND containing the sequence of GIMPLE statements
7398    corresponding to BODY_P.  FNDECL is the function decl containing
7399    *BODY_P.  */
7400
7401 gimple
7402 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
7403 {
7404   location_t saved_location = input_location;
7405   gimple_seq parm_stmts, seq;
7406   gimple outer_bind;
7407   struct gimplify_ctx gctx;
7408
7409   timevar_push (TV_TREE_GIMPLIFY);
7410
7411   /* Initialize for optimize_insn_for_s{ize,peed}_p possibly called during
7412      gimplification.  */
7413   default_rtl_profile ();
7414
7415   gcc_assert (gimplify_ctxp == NULL);
7416   push_gimplify_context (&gctx);
7417
7418   /* Unshare most shared trees in the body and in that of any nested functions.
7419      It would seem we don't have to do this for nested functions because
7420      they are supposed to be output and then the outer function gimplified
7421      first, but the g++ front end doesn't always do it that way.  */
7422   unshare_body (body_p, fndecl);
7423   unvisit_body (body_p, fndecl);
7424
7425   if (cgraph_node (fndecl)->origin)
7426     nonlocal_vlas = pointer_set_create ();
7427
7428   /* Make sure input_location isn't set to something weird.  */
7429   input_location = DECL_SOURCE_LOCATION (fndecl);
7430
7431   /* Resolve callee-copies.  This has to be done before processing
7432      the body so that DECL_VALUE_EXPR gets processed correctly.  */
7433   parm_stmts = (do_parms) ? gimplify_parameters () : NULL;
7434
7435   /* Gimplify the function's body.  */
7436   seq = NULL;
7437   gimplify_stmt (body_p, &seq);
7438   outer_bind = gimple_seq_first_stmt (seq);
7439   if (!outer_bind)
7440     {
7441       outer_bind = gimple_build_nop ();
7442       gimplify_seq_add_stmt (&seq, outer_bind);
7443     }
7444
7445   /* The body must contain exactly one statement, a GIMPLE_BIND.  If this is
7446      not the case, wrap everything in a GIMPLE_BIND to make it so.  */
7447   if (gimple_code (outer_bind) == GIMPLE_BIND
7448       && gimple_seq_first (seq) == gimple_seq_last (seq))
7449     ;
7450   else
7451     outer_bind = gimple_build_bind (NULL_TREE, seq, NULL);
7452
7453   *body_p = NULL_TREE;
7454
7455   /* If we had callee-copies statements, insert them at the beginning
7456      of the function.  */
7457   if (!gimple_seq_empty_p (parm_stmts))
7458     {
7459       gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
7460       gimple_bind_set_body (outer_bind, parm_stmts);
7461     }
7462
7463   if (nonlocal_vlas)
7464     {
7465       pointer_set_destroy (nonlocal_vlas);
7466       nonlocal_vlas = NULL;
7467     }
7468
7469   pop_gimplify_context (outer_bind);
7470   gcc_assert (gimplify_ctxp == NULL);
7471
7472 #ifdef ENABLE_TYPES_CHECKING
7473   if (!errorcount && !sorrycount)
7474     verify_types_in_gimple_seq (gimple_bind_body (outer_bind));
7475 #endif
7476
7477   timevar_pop (TV_TREE_GIMPLIFY);
7478   input_location = saved_location;
7479
7480   return outer_bind;
7481 }
7482
7483 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
7484    node for the function we want to gimplify.
7485    
7486    Returns the sequence of GIMPLE statements corresponding to the body
7487    of FNDECL.  */
7488
7489 void
7490 gimplify_function_tree (tree fndecl)
7491 {
7492   tree oldfn, parm, ret;
7493   gimple_seq seq;
7494   gimple bind;
7495
7496   gcc_assert (!gimple_body (fndecl));
7497
7498   oldfn = current_function_decl;
7499   current_function_decl = fndecl;
7500   if (DECL_STRUCT_FUNCTION (fndecl))
7501     push_cfun (DECL_STRUCT_FUNCTION (fndecl));
7502   else
7503     push_struct_function (fndecl);
7504
7505   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
7506     {
7507       /* Preliminarily mark non-addressed complex variables as eligible
7508          for promotion to gimple registers.  We'll transform their uses
7509          as we find them.  */
7510       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
7511            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
7512           && !TREE_THIS_VOLATILE (parm)
7513           && !needs_to_live_in_memory (parm))
7514         DECL_GIMPLE_REG_P (parm) = 1;
7515     }
7516
7517   ret = DECL_RESULT (fndecl);
7518   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
7519        || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
7520       && !needs_to_live_in_memory (ret))
7521     DECL_GIMPLE_REG_P (ret) = 1;
7522
7523   bind = gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
7524
7525   /* The tree body of the function is no longer needed, replace it
7526      with the new GIMPLE body.  */
7527   seq = gimple_seq_alloc ();
7528   gimple_seq_add_stmt (&seq, bind);
7529   gimple_set_body (fndecl, seq);
7530
7531   /* If we're instrumenting function entry/exit, then prepend the call to
7532      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
7533      catch the exit hook.  */
7534   /* ??? Add some way to ignore exceptions for this TFE.  */
7535   if (flag_instrument_function_entry_exit
7536       && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
7537       && !flag_instrument_functions_exclude_p (fndecl))
7538     {
7539       tree x;
7540       gimple new_bind;
7541       gimple tf;
7542       gimple_seq cleanup = NULL, body = NULL;
7543
7544       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
7545       gimplify_seq_add_stmt (&cleanup, gimple_build_call (x, 0));
7546       tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
7547
7548       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
7549       gimplify_seq_add_stmt (&body, gimple_build_call (x, 0));
7550       gimplify_seq_add_stmt (&body, tf);
7551       new_bind = gimple_build_bind (NULL, body, gimple_bind_block (bind));
7552       /* Clear the block for BIND, since it is no longer directly inside
7553          the function, but within a try block.  */
7554       gimple_bind_set_block (bind, NULL);
7555
7556       /* Replace the current function body with the body
7557          wrapped in the try/finally TF.  */
7558       seq = gimple_seq_alloc ();
7559       gimple_seq_add_stmt (&seq, new_bind);
7560       gimple_set_body (fndecl, seq);
7561     }
7562
7563   DECL_SAVED_TREE (fndecl) = NULL_TREE;
7564   cfun->curr_properties = PROP_gimple_any;
7565
7566   current_function_decl = oldfn;
7567   pop_cfun ();
7568 }
7569
7570
7571 /* Some transformations like inlining may invalidate the GIMPLE form
7572    for operands.  This function traverses all the operands in STMT and
7573    gimplifies anything that is not a valid gimple operand.  Any new
7574    GIMPLE statements are inserted before *GSI_P.  */
7575
7576 void
7577 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
7578 {
7579   size_t i, num_ops;
7580   tree orig_lhs = NULL_TREE, lhs, t;
7581   gimple_seq pre = NULL;
7582   gimple post_stmt = NULL;
7583   struct gimplify_ctx gctx;
7584
7585   push_gimplify_context (&gctx);
7586   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7587
7588   switch (gimple_code (stmt))
7589     {
7590     case GIMPLE_COND:
7591       gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
7592                      is_gimple_val, fb_rvalue);
7593       gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
7594                      is_gimple_val, fb_rvalue);
7595       break;
7596     case GIMPLE_SWITCH:
7597       gimplify_expr (gimple_switch_index_ptr (stmt), &pre, NULL,
7598                      is_gimple_val, fb_rvalue);
7599       break;
7600     case GIMPLE_OMP_ATOMIC_LOAD:
7601       gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
7602                      is_gimple_val, fb_rvalue);
7603       break;
7604     case GIMPLE_ASM:
7605       {
7606         size_t i, noutputs = gimple_asm_noutputs (stmt);
7607         const char *constraint, **oconstraints;
7608         bool allows_mem, allows_reg, is_inout;
7609
7610         oconstraints
7611           = (const char **) alloca ((noutputs) * sizeof (const char *));
7612         for (i = 0; i < noutputs; i++)
7613           {
7614             tree op = gimple_asm_output_op (stmt, i);
7615             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7616             oconstraints[i] = constraint;
7617             parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
7618                                      &allows_reg, &is_inout);
7619             gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7620                            is_inout ? is_gimple_min_lval : is_gimple_lvalue,
7621                            fb_lvalue | fb_mayfail);
7622           }
7623         for (i = 0; i < gimple_asm_ninputs (stmt); i++)
7624           {
7625             tree op = gimple_asm_input_op (stmt, i);
7626             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7627             parse_input_constraint (&constraint, 0, 0, noutputs, 0,
7628                                     oconstraints, &allows_mem, &allows_reg);
7629             if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
7630               allows_reg = 0;
7631             if (!allows_reg && allows_mem)
7632               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7633                              is_gimple_lvalue, fb_lvalue | fb_mayfail);
7634             else
7635               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7636                              is_gimple_asm_val, fb_rvalue);
7637           }
7638       }
7639       break;
7640     default:
7641       /* NOTE: We start gimplifying operands from last to first to
7642          make sure that side-effects on the RHS of calls, assignments
7643          and ASMs are executed before the LHS.  The ordering is not
7644          important for other statements.  */
7645       num_ops = gimple_num_ops (stmt);
7646       orig_lhs = gimple_get_lhs (stmt);
7647       for (i = num_ops; i > 0; i--)
7648         {
7649           tree op = gimple_op (stmt, i - 1);
7650           if (op == NULL_TREE)
7651             continue;
7652           if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
7653             gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
7654           else if (i == 2
7655                    && is_gimple_assign (stmt)
7656                    && num_ops == 2
7657                    && get_gimple_rhs_class (gimple_expr_code (stmt))
7658                       == GIMPLE_SINGLE_RHS)
7659             gimplify_expr (&op, &pre, NULL,
7660                            rhs_predicate_for (gimple_assign_lhs (stmt)),
7661                            fb_rvalue);
7662           else if (i == 2 && is_gimple_call (stmt))
7663             {
7664               if (TREE_CODE (op) == FUNCTION_DECL)
7665                 continue;
7666               gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
7667             }
7668           else
7669             gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
7670           gimple_set_op (stmt, i - 1, op);
7671         }
7672
7673       lhs = gimple_get_lhs (stmt);
7674       /* If the LHS changed it in a way that requires a simple RHS,
7675          create temporary.  */
7676       if (lhs && !is_gimple_reg (lhs))
7677         {
7678           bool need_temp = false;
7679
7680           if (is_gimple_assign (stmt)
7681               && num_ops == 2
7682               && get_gimple_rhs_class (gimple_expr_code (stmt))
7683                  == GIMPLE_SINGLE_RHS)
7684             gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
7685                            rhs_predicate_for (gimple_assign_lhs (stmt)),
7686                            fb_rvalue);
7687           else if (is_gimple_reg (lhs))
7688             {
7689               if (is_gimple_reg_type (TREE_TYPE (lhs)))
7690                 {
7691                   if (is_gimple_call (stmt))
7692                     {
7693                       i = gimple_call_flags (stmt);
7694                       if ((i & ECF_LOOPING_CONST_OR_PURE)
7695                           || !(i & (ECF_CONST | ECF_PURE)))
7696                         need_temp = true;
7697                     }
7698                   if (stmt_can_throw_internal (stmt))
7699                     need_temp = true;
7700                 }
7701             }
7702           else
7703             {
7704               if (is_gimple_reg_type (TREE_TYPE (lhs)))
7705                 need_temp = true;
7706               else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
7707                 {
7708                   if (is_gimple_call (stmt))
7709                     {
7710                       tree fndecl = gimple_call_fndecl (stmt);
7711
7712                       if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
7713                           && !(fndecl && DECL_RESULT (fndecl)
7714                                && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
7715                         need_temp = true;
7716                     }
7717                   else
7718                     need_temp = true;
7719                 }
7720             }
7721           if (need_temp)
7722             {
7723               tree temp = create_tmp_var (TREE_TYPE (lhs), NULL);
7724
7725               if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
7726                   || TREE_CODE (TREE_TYPE (lhs)) == VECTOR_TYPE)
7727                 DECL_GIMPLE_REG_P (temp) = 1;
7728               if (TREE_CODE (orig_lhs) == SSA_NAME)
7729                 orig_lhs = SSA_NAME_VAR (orig_lhs);
7730
7731               if (gimple_in_ssa_p (cfun))
7732                 temp = make_ssa_name (temp, NULL);
7733               gimple_set_lhs (stmt, temp);
7734               post_stmt = gimple_build_assign (lhs, temp);
7735               if (TREE_CODE (lhs) == SSA_NAME)
7736                 SSA_NAME_DEF_STMT (lhs) = post_stmt;
7737             }
7738         }
7739       break;
7740     }
7741
7742   if (gimple_referenced_vars (cfun))
7743     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7744       add_referenced_var (t);
7745
7746   if (!gimple_seq_empty_p (pre))
7747     {
7748       if (gimple_in_ssa_p (cfun))
7749         {
7750           gimple_stmt_iterator i;
7751
7752           for (i = gsi_start (pre); !gsi_end_p (i); gsi_next (&i))
7753             mark_symbols_for_renaming (gsi_stmt (i));
7754         }
7755       gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
7756     }
7757   if (post_stmt)
7758     gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
7759
7760   pop_gimplify_context (NULL);
7761 }
7762
7763
7764 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
7765    force the result to be either ssa_name or an invariant, otherwise
7766    just force it to be a rhs expression.  If VAR is not NULL, make the
7767    base variable of the final destination be VAR if suitable.  */
7768
7769 tree
7770 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
7771 {
7772   tree t;
7773   enum gimplify_status ret;
7774   gimple_predicate gimple_test_f;
7775   struct gimplify_ctx gctx;
7776
7777   *stmts = NULL;
7778
7779   if (is_gimple_val (expr))
7780     return expr;
7781
7782   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
7783
7784   push_gimplify_context (&gctx);
7785   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7786   gimplify_ctxp->allow_rhs_cond_expr = true;
7787
7788   if (var)
7789     expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
7790
7791   if (TREE_CODE (expr) != MODIFY_EXPR
7792       && TREE_TYPE (expr) == void_type_node)
7793     {
7794       gimplify_and_add (expr, stmts);
7795       expr = NULL_TREE;
7796     }
7797   else
7798     {
7799       ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
7800       gcc_assert (ret != GS_ERROR);
7801     }
7802
7803   if (gimple_referenced_vars (cfun))
7804     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7805       add_referenced_var (t);
7806
7807   pop_gimplify_context (NULL);
7808
7809   return expr;
7810 }
7811
7812 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
7813    some statements are produced, emits them at GSI.  If BEFORE is true.
7814    the statements are appended before GSI, otherwise they are appended after
7815    it.  M specifies the way GSI moves after insertion (GSI_SAME_STMT or
7816    GSI_CONTINUE_LINKING are the usual values).  */
7817
7818 tree
7819 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
7820                           bool simple_p, tree var, bool before,
7821                           enum gsi_iterator_update m)
7822 {
7823   gimple_seq stmts;
7824
7825   expr = force_gimple_operand (expr, &stmts, simple_p, var);
7826
7827   if (!gimple_seq_empty_p (stmts))
7828     {
7829       if (gimple_in_ssa_p (cfun))
7830         {
7831           gimple_stmt_iterator i;
7832
7833           for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
7834             mark_symbols_for_renaming (gsi_stmt (i));
7835         }
7836
7837       if (before)
7838         gsi_insert_seq_before (gsi, stmts, m);
7839       else
7840         gsi_insert_seq_after (gsi, stmts, m);
7841     }
7842
7843   return expr;
7844 }
7845
7846 #include "gt-gimplify.h"