OSDN Git Service

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