OSDN Git Service

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