OSDN Git Service

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