OSDN Git Service

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