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