OSDN Git Service

* tree.c (protected_set_expr_location): New.
[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_UNIT (decl)) != INTEGER_CST
1451           || (!TREE_STATIC (decl)
1452               && flag_stack_check == GENERIC_STACK_CHECK
1453               && compare_tree_int (DECL_SIZE_UNIT (decl),
1454                                    STACK_CHECK_MAX_VAR_SIZE) > 0))
1455         gimplify_vla_decl (decl, seq_p);
1456
1457       if (init && init != error_mark_node)
1458         {
1459           if (!TREE_STATIC (decl))
1460             {
1461               DECL_INITIAL (decl) = NULL_TREE;
1462               init = build2 (INIT_EXPR, void_type_node, decl, init);
1463               gimplify_and_add (init, seq_p);
1464               ggc_free (init);
1465             }
1466           else
1467             /* We must still examine initializers for static variables
1468                as they may contain a label address.  */
1469             walk_tree (&init, force_labels_r, NULL, NULL);
1470         }
1471
1472       /* Some front ends do not explicitly declare all anonymous
1473          artificial variables.  We compensate here by declaring the
1474          variables, though it would be better if the front ends would
1475          explicitly declare them.  */
1476       if (!DECL_SEEN_IN_BIND_EXPR_P (decl)
1477           && DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1478         gimple_add_tmp_var (decl);
1479     }
1480
1481   return GS_ALL_DONE;
1482 }
1483
1484 /* Gimplify a LOOP_EXPR.  Normally this just involves gimplifying the body
1485    and replacing the LOOP_EXPR with goto, but if the loop contains an
1486    EXIT_EXPR, we need to append a label for it to jump to.  */
1487
1488 static enum gimplify_status
1489 gimplify_loop_expr (tree *expr_p, gimple_seq *pre_p)
1490 {
1491   tree saved_label = gimplify_ctxp->exit_label;
1492   tree start_label = create_artificial_label ();
1493
1494   gimplify_seq_add_stmt (pre_p, gimple_build_label (start_label));
1495
1496   gimplify_ctxp->exit_label = NULL_TREE;
1497
1498   gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1499
1500   gimplify_seq_add_stmt (pre_p, gimple_build_goto (start_label));
1501
1502   if (gimplify_ctxp->exit_label)
1503     gimplify_seq_add_stmt (pre_p, gimple_build_label (gimplify_ctxp->exit_label));
1504
1505   gimplify_ctxp->exit_label = saved_label;
1506
1507   *expr_p = NULL;
1508   return GS_ALL_DONE;
1509 }
1510
1511 /* Gimplifies a statement list onto a sequence.  These may be created either
1512    by an enlightened front-end, or by shortcut_cond_expr.  */
1513
1514 static enum gimplify_status
1515 gimplify_statement_list (tree *expr_p, gimple_seq *pre_p)
1516 {
1517   tree temp = voidify_wrapper_expr (*expr_p, NULL);
1518
1519   tree_stmt_iterator i = tsi_start (*expr_p);
1520
1521   while (!tsi_end_p (i))
1522     {
1523       gimplify_stmt (tsi_stmt_ptr (i), pre_p);
1524       tsi_delink (&i);
1525     }
1526
1527   if (temp)
1528     {
1529       *expr_p = temp;
1530       return GS_OK;
1531     }
1532
1533   return GS_ALL_DONE;
1534 }
1535
1536 /* Compare two case labels.  Because the front end should already have
1537    made sure that case ranges do not overlap, it is enough to only compare
1538    the CASE_LOW values of each case label.  */
1539
1540 static int
1541 compare_case_labels (const void *p1, const void *p2)
1542 {
1543   const_tree const case1 = *(const_tree const*)p1;
1544   const_tree const case2 = *(const_tree const*)p2;
1545
1546   /* The 'default' case label always goes first.  */
1547   if (!CASE_LOW (case1))
1548     return -1;
1549   else if (!CASE_LOW (case2))
1550     return 1;
1551   else
1552     return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1553 }
1554
1555
1556 /* Sort the case labels in LABEL_VEC in place in ascending order.  */
1557
1558 void
1559 sort_case_labels (VEC(tree,heap)* label_vec)
1560 {
1561   size_t len = VEC_length (tree, label_vec);
1562   qsort (VEC_address (tree, label_vec), len, sizeof (tree),
1563          compare_case_labels);
1564 }
1565
1566
1567 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1568    branch to.  */
1569
1570 static enum gimplify_status
1571 gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
1572 {
1573   tree switch_expr = *expr_p;
1574   gimple_seq switch_body_seq = NULL;
1575   enum gimplify_status ret;
1576
1577   ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL, is_gimple_val,
1578                        fb_rvalue);
1579   if (ret == GS_ERROR || ret == GS_UNHANDLED)
1580     return ret;
1581
1582   if (SWITCH_BODY (switch_expr))
1583     {
1584       VEC (tree,heap) *labels;
1585       VEC (tree,heap) *saved_labels;
1586       tree default_case = NULL_TREE;
1587       size_t i, len;
1588       gimple gimple_switch;
1589       
1590       /* If someone can be bothered to fill in the labels, they can
1591          be bothered to null out the body too.  */
1592       gcc_assert (!SWITCH_LABELS (switch_expr));
1593
1594       /* save old labels, get new ones from body, then restore the old 
1595          labels.  Save all the things from the switch body to append after.  */
1596       saved_labels = gimplify_ctxp->case_labels;
1597       gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
1598
1599       gimplify_stmt (&SWITCH_BODY (switch_expr), &switch_body_seq);
1600       labels = gimplify_ctxp->case_labels;
1601       gimplify_ctxp->case_labels = saved_labels;
1602  
1603       i = 0;
1604       while (i < VEC_length (tree, labels))
1605         {
1606           tree elt = VEC_index (tree, labels, i);
1607           tree low = CASE_LOW (elt);
1608           bool remove_element = FALSE;
1609
1610           if (low)
1611             {
1612               /* Discard empty ranges.  */
1613               tree high = CASE_HIGH (elt);
1614               if (high && tree_int_cst_lt (high, low))
1615                 remove_element = TRUE;
1616             }
1617           else
1618             {
1619               /* The default case must be the last label in the list.  */
1620               gcc_assert (!default_case);
1621               default_case = elt;
1622               remove_element = TRUE;
1623             }
1624
1625           if (remove_element)
1626             VEC_ordered_remove (tree, labels, i);
1627           else
1628             i++;
1629         }
1630       len = i;
1631
1632       if (!default_case)
1633         {
1634           gimple new_default;
1635
1636           /* If the switch has no default label, add one, so that we jump
1637              around the switch body.  */
1638           default_case = build3 (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
1639                                  NULL_TREE, create_artificial_label ());
1640           new_default = gimple_build_label (CASE_LABEL (default_case));
1641           gimplify_seq_add_stmt (&switch_body_seq, new_default);
1642         }
1643
1644       if (!VEC_empty (tree, labels))
1645         sort_case_labels (labels);
1646
1647       gimple_switch = gimple_build_switch_vec (SWITCH_COND (switch_expr), 
1648                                                default_case, labels);
1649       gimplify_seq_add_stmt (pre_p, gimple_switch);
1650       gimplify_seq_add_seq (pre_p, switch_body_seq);
1651       VEC_free(tree, heap, labels);
1652     }
1653   else
1654     gcc_assert (SWITCH_LABELS (switch_expr));
1655
1656   return GS_ALL_DONE;
1657 }
1658
1659
1660 static enum gimplify_status
1661 gimplify_case_label_expr (tree *expr_p, gimple_seq *pre_p)
1662 {
1663   struct gimplify_ctx *ctxp;
1664   gimple gimple_label;
1665
1666   /* Invalid OpenMP programs can play Duff's Device type games with
1667      #pragma omp parallel.  At least in the C front end, we don't
1668      detect such invalid branches until after gimplification.  */
1669   for (ctxp = gimplify_ctxp; ; ctxp = ctxp->prev_context)
1670     if (ctxp->case_labels)
1671       break;
1672
1673   gimple_label = gimple_build_label (CASE_LABEL (*expr_p));
1674   VEC_safe_push (tree, heap, ctxp->case_labels, *expr_p);
1675   gimplify_seq_add_stmt (pre_p, gimple_label);
1676
1677   return GS_ALL_DONE;
1678 }
1679
1680 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1681    if necessary.  */
1682
1683 tree
1684 build_and_jump (tree *label_p)
1685 {
1686   if (label_p == NULL)
1687     /* If there's nowhere to jump, just fall through.  */
1688     return NULL_TREE;
1689
1690   if (*label_p == NULL_TREE)
1691     {
1692       tree label = create_artificial_label ();
1693       *label_p = label;
1694     }
1695
1696   return build1 (GOTO_EXPR, void_type_node, *label_p);
1697 }
1698
1699 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1700    This also involves building a label to jump to and communicating it to
1701    gimplify_loop_expr through gimplify_ctxp->exit_label.  */
1702
1703 static enum gimplify_status
1704 gimplify_exit_expr (tree *expr_p)
1705 {
1706   tree cond = TREE_OPERAND (*expr_p, 0);
1707   tree expr;
1708
1709   expr = build_and_jump (&gimplify_ctxp->exit_label);
1710   expr = build3 (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1711   *expr_p = expr;
1712
1713   return GS_OK;
1714 }
1715
1716 /* A helper function to be called via walk_tree.  Mark all labels under *TP
1717    as being forced.  To be called for DECL_INITIAL of static variables.  */
1718
1719 tree
1720 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1721 {
1722   if (TYPE_P (*tp))
1723     *walk_subtrees = 0;
1724   if (TREE_CODE (*tp) == LABEL_DECL)
1725     FORCED_LABEL (*tp) = 1;
1726
1727   return NULL_TREE;
1728 }
1729
1730 /* *EXPR_P is a COMPONENT_REF being used as an rvalue.  If its type is
1731    different from its canonical type, wrap the whole thing inside a
1732    NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1733    type.
1734
1735    The canonical type of a COMPONENT_REF is the type of the field being
1736    referenced--unless the field is a bit-field which can be read directly
1737    in a smaller mode, in which case the canonical type is the
1738    sign-appropriate type corresponding to that mode.  */
1739
1740 static void
1741 canonicalize_component_ref (tree *expr_p)
1742 {
1743   tree expr = *expr_p;
1744   tree type;
1745
1746   gcc_assert (TREE_CODE (expr) == COMPONENT_REF);
1747
1748   if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1749     type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1750   else
1751     type = TREE_TYPE (TREE_OPERAND (expr, 1));
1752
1753   /* One could argue that all the stuff below is not necessary for
1754      the non-bitfield case and declare it a FE error if type
1755      adjustment would be needed.  */
1756   if (TREE_TYPE (expr) != type)
1757     {
1758 #ifdef ENABLE_TYPES_CHECKING
1759       tree old_type = TREE_TYPE (expr);
1760 #endif
1761       int type_quals;
1762
1763       /* We need to preserve qualifiers and propagate them from
1764          operand 0.  */
1765       type_quals = TYPE_QUALS (type)
1766         | TYPE_QUALS (TREE_TYPE (TREE_OPERAND (expr, 0)));
1767       if (TYPE_QUALS (type) != type_quals)
1768         type = build_qualified_type (TYPE_MAIN_VARIANT (type), type_quals);
1769
1770       /* Set the type of the COMPONENT_REF to the underlying type.  */
1771       TREE_TYPE (expr) = type;
1772
1773 #ifdef ENABLE_TYPES_CHECKING
1774       /* It is now a FE error, if the conversion from the canonical
1775          type to the original expression type is not useless.  */
1776       gcc_assert (useless_type_conversion_p (old_type, type));
1777 #endif
1778     }
1779 }
1780
1781 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1782    to foo, embed that change in the ADDR_EXPR by converting
1783       T array[U];
1784       (T *)&array
1785    ==>
1786       &array[L]
1787    where L is the lower bound.  For simplicity, only do this for constant
1788    lower bound.
1789    The constraint is that the type of &array[L] is trivially convertible
1790    to T *.  */
1791
1792 static void
1793 canonicalize_addr_expr (tree *expr_p)
1794 {
1795   tree expr = *expr_p;
1796   tree addr_expr = TREE_OPERAND (expr, 0);
1797   tree datype, ddatype, pddatype;
1798
1799   /* We simplify only conversions from an ADDR_EXPR to a pointer type.  */
1800   if (!POINTER_TYPE_P (TREE_TYPE (expr))
1801       || TREE_CODE (addr_expr) != ADDR_EXPR)
1802     return;
1803
1804   /* The addr_expr type should be a pointer to an array.  */
1805   datype = TREE_TYPE (TREE_TYPE (addr_expr));
1806   if (TREE_CODE (datype) != ARRAY_TYPE)
1807     return;
1808
1809   /* The pointer to element type shall be trivially convertible to
1810      the expression pointer type.  */
1811   ddatype = TREE_TYPE (datype);
1812   pddatype = build_pointer_type (ddatype);
1813   if (!useless_type_conversion_p (pddatype, ddatype))
1814     return;
1815
1816   /* The lower bound and element sizes must be constant.  */
1817   if (!TYPE_SIZE_UNIT (ddatype)
1818       || TREE_CODE (TYPE_SIZE_UNIT (ddatype)) != INTEGER_CST
1819       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1820       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1821     return;
1822
1823   /* All checks succeeded.  Build a new node to merge the cast.  */
1824   *expr_p = build4 (ARRAY_REF, ddatype, TREE_OPERAND (addr_expr, 0),
1825                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1826                     NULL_TREE, NULL_TREE);
1827   *expr_p = build1 (ADDR_EXPR, pddatype, *expr_p);
1828 }
1829
1830 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR.  Remove it and/or other conversions
1831    underneath as appropriate.  */
1832
1833 static enum gimplify_status
1834 gimplify_conversion (tree *expr_p)
1835 {
1836   tree tem;
1837   gcc_assert (CONVERT_EXPR_P (*expr_p));
1838   
1839   /* Then strip away all but the outermost conversion.  */
1840   STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1841
1842   /* And remove the outermost conversion if it's useless.  */
1843   if (tree_ssa_useless_type_conversion (*expr_p))
1844     *expr_p = TREE_OPERAND (*expr_p, 0);
1845
1846   /* Attempt to avoid NOP_EXPR by producing reference to a subtype.
1847      For example this fold (subclass *)&A into &A->subclass avoiding
1848      a need for statement.  */
1849   if (CONVERT_EXPR_P (*expr_p)
1850       && POINTER_TYPE_P (TREE_TYPE (*expr_p))
1851       && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 0)))
1852       && (tem = maybe_fold_offset_to_address
1853                   (TREE_OPERAND (*expr_p, 0),
1854                    integer_zero_node, TREE_TYPE (*expr_p))) != NULL_TREE)
1855     *expr_p = tem;
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_tree = fold_call_expr (*expr_p, !want_value);
2298
2299       if (new_tree && new_tree != *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_tree;
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_tree = fold_call_expr (*expr_p, !want_value);
2456
2457       if (new_tree && new_tree != *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_tree;
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
3599                  > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
3600                  && num_nonzero_elements < num_type_elements/4)
3601           cleared = true;
3602         /* ??? This bit ought not be needed.  For any element not present
3603            in the initializer, we should simply set them to zero.  Except
3604            we'd need to *find* the elements that are not present, and that
3605            requires trickery to avoid quadratic compile-time behavior in
3606            large cases or excessive memory use in small cases.  */
3607         else if (num_ctor_elements < num_type_elements)
3608           cleared = true;
3609
3610         /* If there are "lots" of initialized elements, and all of them
3611            are valid address constants, then the entire initializer can
3612            be dropped to memory, and then memcpy'd out.  Don't do this
3613            for sparse arrays, though, as it's more efficient to follow
3614            the standard CONSTRUCTOR behavior of memset followed by
3615            individual element initialization.  */
3616         if (valid_const_initializer && !cleared)
3617           {
3618             HOST_WIDE_INT size = int_size_in_bytes (type);
3619             unsigned int align;
3620
3621             /* ??? We can still get unbounded array types, at least
3622                from the C++ front end.  This seems wrong, but attempt
3623                to work around it for now.  */
3624             if (size < 0)
3625               {
3626                 size = int_size_in_bytes (TREE_TYPE (object));
3627                 if (size >= 0)
3628                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
3629               }
3630
3631             /* Find the maximum alignment we can assume for the object.  */
3632             /* ??? Make use of DECL_OFFSET_ALIGN.  */
3633             if (DECL_P (object))
3634               align = DECL_ALIGN (object);
3635             else
3636               align = TYPE_ALIGN (type);
3637
3638             if (size > 0 && !can_move_by_pieces (size, align))
3639               {
3640                 tree new_tree;
3641
3642                 if (notify_temp_creation)
3643                   return GS_ERROR;
3644
3645                 new_tree = create_tmp_var_raw (type, "C");
3646
3647                 gimple_add_tmp_var (new_tree);
3648                 TREE_STATIC (new_tree) = 1;
3649                 TREE_READONLY (new_tree) = 1;
3650                 DECL_INITIAL (new_tree) = ctor;
3651                 if (align > DECL_ALIGN (new_tree))
3652                   {
3653                     DECL_ALIGN (new_tree) = align;
3654                     DECL_USER_ALIGN (new_tree) = 1;
3655                   }
3656                 walk_tree (&DECL_INITIAL (new_tree), force_labels_r, NULL, NULL);
3657
3658                 TREE_OPERAND (*expr_p, 1) = new_tree;
3659
3660                 /* This is no longer an assignment of a CONSTRUCTOR, but
3661                    we still may have processing to do on the LHS.  So
3662                    pretend we didn't do anything here to let that happen.  */
3663                 return GS_UNHANDLED;
3664               }
3665           }
3666
3667         if (notify_temp_creation)
3668           return GS_OK;
3669
3670         /* If there are nonzero elements, pre-evaluate to capture elements
3671            overlapping with the lhs into temporaries.  We must do this before
3672            clearing to fetch the values before they are zeroed-out.  */
3673         if (num_nonzero_elements > 0)
3674           {
3675             preeval_data.lhs_base_decl = get_base_address (object);
3676             if (!DECL_P (preeval_data.lhs_base_decl))
3677               preeval_data.lhs_base_decl = NULL;
3678             preeval_data.lhs_alias_set = get_alias_set (object);
3679
3680             gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
3681                                         pre_p, post_p, &preeval_data);
3682           }
3683
3684         if (cleared)
3685           {
3686             /* Zap the CONSTRUCTOR element list, which simplifies this case.
3687                Note that we still have to gimplify, in order to handle the
3688                case of variable sized types.  Avoid shared tree structures.  */
3689             CONSTRUCTOR_ELTS (ctor) = NULL;
3690             TREE_SIDE_EFFECTS (ctor) = 0;
3691             object = unshare_expr (object);
3692             gimplify_stmt (expr_p, pre_p);
3693           }
3694
3695         /* If we have not block cleared the object, or if there are nonzero
3696            elements in the constructor, add assignments to the individual
3697            scalar fields of the object.  */
3698         if (!cleared || num_nonzero_elements > 0)
3699           gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3700
3701         *expr_p = NULL_TREE;
3702       }
3703       break;
3704
3705     case COMPLEX_TYPE:
3706       {
3707         tree r, i;
3708
3709         if (notify_temp_creation)
3710           return GS_OK;
3711
3712         /* Extract the real and imaginary parts out of the ctor.  */
3713         gcc_assert (VEC_length (constructor_elt, elts) == 2);
3714         r = VEC_index (constructor_elt, elts, 0)->value;
3715         i = VEC_index (constructor_elt, elts, 1)->value;
3716         if (r == NULL || i == NULL)
3717           {
3718             tree zero = fold_convert (TREE_TYPE (type), integer_zero_node);
3719             if (r == NULL)
3720               r = zero;
3721             if (i == NULL)
3722               i = zero;
3723           }
3724
3725         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3726            represent creation of a complex value.  */
3727         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3728           {
3729             ctor = build_complex (type, r, i);
3730             TREE_OPERAND (*expr_p, 1) = ctor;
3731           }
3732         else
3733           {
3734             ctor = build2 (COMPLEX_EXPR, type, r, i);
3735             TREE_OPERAND (*expr_p, 1) = ctor;
3736             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1),
3737                                  pre_p,
3738                                  post_p,
3739                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3740                                  fb_rvalue);
3741           }
3742       }
3743       break;
3744
3745     case VECTOR_TYPE:
3746       {
3747         unsigned HOST_WIDE_INT ix;
3748         constructor_elt *ce;
3749
3750         if (notify_temp_creation)
3751           return GS_OK;
3752
3753         /* Go ahead and simplify constant constructors to VECTOR_CST.  */
3754         if (TREE_CONSTANT (ctor))
3755           {
3756             bool constant_p = true;
3757             tree value;
3758
3759             /* Even when ctor is constant, it might contain non-*_CST
3760                elements, such as addresses or trapping values like
3761                1.0/0.0 - 1.0/0.0.  Such expressions don't belong
3762                in VECTOR_CST nodes.  */
3763             FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
3764               if (!CONSTANT_CLASS_P (value))
3765                 {
3766                   constant_p = false;
3767                   break;
3768                 }
3769
3770             if (constant_p)
3771               {
3772                 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
3773                 break;
3774               }
3775
3776             /* Don't reduce an initializer constant even if we can't
3777                make a VECTOR_CST.  It won't do anything for us, and it'll
3778                prevent us from representing it as a single constant.  */
3779             if (initializer_constant_valid_p (ctor, type))
3780               break;
3781
3782             TREE_CONSTANT (ctor) = 0;
3783           }
3784
3785         /* Vector types use CONSTRUCTOR all the way through gimple
3786           compilation as a general initializer.  */
3787         for (ix = 0; VEC_iterate (constructor_elt, elts, ix, ce); ix++)
3788           {
3789             enum gimplify_status tret;
3790             tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val,
3791                                   fb_rvalue);
3792             if (tret == GS_ERROR)
3793               ret = GS_ERROR;
3794           }
3795         if (!is_gimple_reg (TREE_OPERAND (*expr_p, 0)))
3796           TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
3797       }
3798       break;
3799
3800     default:
3801       /* So how did we get a CONSTRUCTOR for a scalar type?  */
3802       gcc_unreachable ();
3803     }
3804
3805   if (ret == GS_ERROR)
3806     return GS_ERROR;
3807   else if (want_value)
3808     {
3809       *expr_p = object;
3810       return GS_OK;
3811     }
3812   else
3813     {
3814       /* If we have gimplified both sides of the initializer but have
3815          not emitted an assignment, do so now.  */
3816       if (*expr_p)
3817         {
3818           tree lhs = TREE_OPERAND (*expr_p, 0);
3819           tree rhs = TREE_OPERAND (*expr_p, 1);
3820           gimple init = gimple_build_assign (lhs, rhs);
3821           gimplify_seq_add_stmt (pre_p, init);
3822           *expr_p = NULL;
3823         }
3824
3825       return GS_ALL_DONE;
3826     }
3827 }
3828
3829 /* Given a pointer value OP0, return a simplified version of an
3830    indirection through OP0, or NULL_TREE if no simplification is
3831    possible.  Note that the resulting type may be different from
3832    the type pointed to in the sense that it is still compatible
3833    from the langhooks point of view. */
3834
3835 tree
3836 gimple_fold_indirect_ref (tree t)
3837 {
3838   tree type = TREE_TYPE (TREE_TYPE (t));
3839   tree sub = t;
3840   tree subtype;
3841
3842   STRIP_USELESS_TYPE_CONVERSION (sub);
3843   subtype = TREE_TYPE (sub);
3844   if (!POINTER_TYPE_P (subtype))
3845     return NULL_TREE;
3846
3847   if (TREE_CODE (sub) == ADDR_EXPR)
3848     {
3849       tree op = TREE_OPERAND (sub, 0);
3850       tree optype = TREE_TYPE (op);
3851       /* *&p => p */
3852       if (useless_type_conversion_p (type, optype))
3853         return op;
3854
3855       /* *(foo *)&fooarray => fooarray[0] */
3856       if (TREE_CODE (optype) == ARRAY_TYPE
3857           && useless_type_conversion_p (type, TREE_TYPE (optype)))
3858        {
3859          tree type_domain = TYPE_DOMAIN (optype);
3860          tree min_val = size_zero_node;
3861          if (type_domain && TYPE_MIN_VALUE (type_domain))
3862            min_val = TYPE_MIN_VALUE (type_domain);
3863          return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
3864        }
3865     }
3866
3867   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
3868   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
3869       && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
3870     {
3871       tree type_domain;
3872       tree min_val = size_zero_node;
3873       tree osub = sub;
3874       sub = gimple_fold_indirect_ref (sub);
3875       if (! sub)
3876         sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
3877       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
3878       if (type_domain && TYPE_MIN_VALUE (type_domain))
3879         min_val = TYPE_MIN_VALUE (type_domain);
3880       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
3881     }
3882
3883   return NULL_TREE;
3884 }
3885
3886 /* Given a pointer value OP0, return a simplified version of an
3887    indirection through OP0, or NULL_TREE if no simplification is
3888    possible.  This may only be applied to a rhs of an expression.
3889    Note that the resulting type may be different from the type pointed
3890    to in the sense that it is still compatible from the langhooks
3891    point of view. */
3892
3893 static tree
3894 gimple_fold_indirect_ref_rhs (tree t)
3895 {
3896   return gimple_fold_indirect_ref (t);
3897 }
3898
3899 /* Subroutine of gimplify_modify_expr to do simplifications of
3900    MODIFY_EXPRs based on the code of the RHS.  We loop for as long as
3901    something changes.  */
3902
3903 static enum gimplify_status
3904 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
3905                           gimple_seq *pre_p, gimple_seq *post_p,
3906                           bool want_value)
3907 {
3908   enum gimplify_status ret = GS_OK;
3909
3910   while (ret != GS_UNHANDLED)
3911     switch (TREE_CODE (*from_p))
3912       {
3913       case VAR_DECL:
3914         /* If we're assigning from a constant constructor, move the
3915            constructor expression to the RHS of the MODIFY_EXPR.  */
3916         if (DECL_INITIAL (*from_p)
3917             && TREE_READONLY (*from_p)
3918             && !TREE_THIS_VOLATILE (*from_p)
3919             && TREE_CODE (DECL_INITIAL (*from_p)) == CONSTRUCTOR)
3920           {
3921             tree old_from = *from_p;
3922
3923             /* Move the constructor into the RHS.  */
3924             *from_p = unshare_expr (DECL_INITIAL (*from_p));
3925
3926             /* Let's see if gimplify_init_constructor will need to put
3927                it in memory.  If so, revert the change.  */
3928             ret = gimplify_init_constructor (expr_p, NULL, NULL, false, true);
3929             if (ret == GS_ERROR)
3930               {
3931                 *from_p = old_from;
3932                 /* Fall through.  */
3933               }
3934             else
3935               {
3936                 ret = GS_OK;
3937                 break;
3938               }
3939           }
3940         ret = GS_UNHANDLED;
3941         break;
3942       case INDIRECT_REF:
3943         {
3944           /* If we have code like 
3945
3946                 *(const A*)(A*)&x
3947
3948              where the type of "x" is a (possibly cv-qualified variant
3949              of "A"), treat the entire expression as identical to "x".
3950              This kind of code arises in C++ when an object is bound
3951              to a const reference, and if "x" is a TARGET_EXPR we want
3952              to take advantage of the optimization below.  */
3953           tree t = gimple_fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
3954           if (t)
3955             {
3956               *from_p = t;
3957               ret = GS_OK;
3958             }
3959           else
3960             ret = GS_UNHANDLED;
3961           break;
3962         }
3963
3964       case TARGET_EXPR:
3965         {
3966           /* If we are initializing something from a TARGET_EXPR, strip the
3967              TARGET_EXPR and initialize it directly, if possible.  This can't
3968              be done if the initializer is void, since that implies that the
3969              temporary is set in some non-trivial way.
3970
3971              ??? What about code that pulls out the temp and uses it
3972              elsewhere? I think that such code never uses the TARGET_EXPR as
3973              an initializer.  If I'm wrong, we'll die because the temp won't
3974              have any RTL.  In that case, I guess we'll need to replace
3975              references somehow.  */
3976           tree init = TARGET_EXPR_INITIAL (*from_p);
3977
3978           if (init
3979               && !VOID_TYPE_P (TREE_TYPE (init)))
3980             {
3981               *from_p = init;
3982               ret = GS_OK;
3983             }
3984           else
3985             ret = GS_UNHANDLED;
3986         }
3987         break;
3988
3989       case COMPOUND_EXPR:
3990         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
3991            caught.  */
3992         gimplify_compound_expr (from_p, pre_p, true);
3993         ret = GS_OK;
3994         break;
3995
3996       case CONSTRUCTOR:
3997         /* If we're initializing from a CONSTRUCTOR, break this into
3998            individual MODIFY_EXPRs.  */
3999         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value,
4000                                           false);
4001
4002       case COND_EXPR:
4003         /* If we're assigning to a non-register type, push the assignment
4004            down into the branches.  This is mandatory for ADDRESSABLE types,
4005            since we cannot generate temporaries for such, but it saves a
4006            copy in other cases as well.  */
4007         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
4008           {
4009             /* This code should mirror the code in gimplify_cond_expr. */
4010             enum tree_code code = TREE_CODE (*expr_p);
4011             tree cond = *from_p;
4012             tree result = *to_p;
4013
4014             ret = gimplify_expr (&result, pre_p, post_p,
4015                                  is_gimple_lvalue, fb_lvalue);
4016             if (ret != GS_ERROR)
4017               ret = GS_OK;
4018
4019             if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
4020               TREE_OPERAND (cond, 1)
4021                 = build2 (code, void_type_node, result,
4022                           TREE_OPERAND (cond, 1));
4023             if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
4024               TREE_OPERAND (cond, 2)
4025                 = build2 (code, void_type_node, unshare_expr (result),
4026                           TREE_OPERAND (cond, 2));
4027
4028             TREE_TYPE (cond) = void_type_node;
4029             recalculate_side_effects (cond);
4030
4031             if (want_value)
4032               {
4033                 gimplify_and_add (cond, pre_p);
4034                 *expr_p = unshare_expr (result);
4035               }
4036             else
4037               *expr_p = cond;
4038             return ret;
4039           }
4040         else
4041           ret = GS_UNHANDLED;
4042         break;
4043
4044       case CALL_EXPR:
4045         /* For calls that return in memory, give *to_p as the CALL_EXPR's
4046            return slot so that we don't generate a temporary.  */
4047         if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
4048             && aggregate_value_p (*from_p, *from_p))
4049           {
4050             bool use_target;
4051
4052             if (!(rhs_predicate_for (*to_p))(*from_p))
4053               /* If we need a temporary, *to_p isn't accurate.  */
4054               use_target = false;
4055             else if (TREE_CODE (*to_p) == RESULT_DECL
4056                      && DECL_NAME (*to_p) == NULL_TREE
4057                      && needs_to_live_in_memory (*to_p))
4058               /* It's OK to use the return slot directly unless it's an NRV. */
4059               use_target = true;
4060             else if (is_gimple_reg_type (TREE_TYPE (*to_p))
4061                      || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
4062               /* Don't force regs into memory.  */
4063               use_target = false;
4064             else if (TREE_CODE (*to_p) == VAR_DECL
4065                      && DECL_GIMPLE_FORMAL_TEMP_P (*to_p))
4066               /* Don't use the original target if it's a formal temp; we
4067                  don't want to take their addresses.  */
4068               use_target = false;
4069             else if (TREE_CODE (*expr_p) == INIT_EXPR)
4070               /* It's OK to use the target directly if it's being
4071                  initialized. */
4072               use_target = true;
4073             else if (!is_gimple_non_addressable (*to_p))
4074               /* Don't use the original target if it's already addressable;
4075                  if its address escapes, and the called function uses the
4076                  NRV optimization, a conforming program could see *to_p
4077                  change before the called function returns; see c++/19317.
4078                  When optimizing, the return_slot pass marks more functions
4079                  as safe after we have escape info.  */
4080               use_target = false;
4081             else
4082               use_target = true;
4083
4084             if (use_target)
4085               {
4086                 CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
4087                 mark_addressable (*to_p);
4088               }
4089           }
4090
4091         ret = GS_UNHANDLED;
4092         break;
4093
4094         /* If we're initializing from a container, push the initialization
4095            inside it.  */
4096       case CLEANUP_POINT_EXPR:
4097       case BIND_EXPR:
4098       case STATEMENT_LIST:
4099         {
4100           tree wrap = *from_p;
4101           tree t;
4102
4103           ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_min_lval,
4104                                fb_lvalue);
4105           if (ret != GS_ERROR)
4106             ret = GS_OK;
4107
4108           t = voidify_wrapper_expr (wrap, *expr_p);
4109           gcc_assert (t == *expr_p);
4110
4111           if (want_value)
4112             {
4113               gimplify_and_add (wrap, pre_p);
4114               *expr_p = unshare_expr (*to_p);
4115             }
4116           else
4117             *expr_p = wrap;
4118           return GS_OK;
4119         }
4120         
4121       default:
4122         ret = GS_UNHANDLED;
4123         break;
4124       }
4125
4126   return ret;
4127 }
4128
4129
4130 /* Promote partial stores to COMPLEX variables to total stores.  *EXPR_P is
4131    a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
4132    DECL_GIMPLE_REG_P set.
4133
4134    IMPORTANT NOTE: This promotion is performed by introducing a load of the
4135    other, unmodified part of the complex object just before the total store.
4136    As a consequence, if the object is still uninitialized, an undefined value
4137    will be loaded into a register, which may result in a spurious exception
4138    if the register is floating-point and the value happens to be a signaling
4139    NaN for example.  Then the fully-fledged complex operations lowering pass
4140    followed by a DCE pass are necessary in order to fix things up.  */
4141
4142 static enum gimplify_status
4143 gimplify_modify_expr_complex_part (tree *expr_p, gimple_seq *pre_p,
4144                                    bool want_value)
4145 {
4146   enum tree_code code, ocode;
4147   tree lhs, rhs, new_rhs, other, realpart, imagpart;
4148
4149   lhs = TREE_OPERAND (*expr_p, 0);
4150   rhs = TREE_OPERAND (*expr_p, 1);
4151   code = TREE_CODE (lhs);
4152   lhs = TREE_OPERAND (lhs, 0);
4153
4154   ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
4155   other = build1 (ocode, TREE_TYPE (rhs), lhs);
4156   other = get_formal_tmp_var (other, pre_p);
4157
4158   realpart = code == REALPART_EXPR ? rhs : other;
4159   imagpart = code == REALPART_EXPR ? other : rhs;
4160
4161   if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
4162     new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
4163   else
4164     new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
4165
4166   gimplify_seq_add_stmt (pre_p, gimple_build_assign (lhs, new_rhs));
4167   *expr_p = (want_value) ? rhs : NULL_TREE;
4168
4169   return GS_ALL_DONE;
4170 }
4171
4172
4173 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
4174
4175       modify_expr
4176               : varname '=' rhs
4177               | '*' ID '=' rhs
4178
4179     PRE_P points to the list where side effects that must happen before
4180         *EXPR_P should be stored.
4181
4182     POST_P points to the list where side effects that must happen after
4183         *EXPR_P should be stored.
4184
4185     WANT_VALUE is nonzero iff we want to use the value of this expression
4186         in another expression.  */
4187
4188 static enum gimplify_status
4189 gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
4190                       bool want_value)
4191 {
4192   tree *from_p = &TREE_OPERAND (*expr_p, 1);
4193   tree *to_p = &TREE_OPERAND (*expr_p, 0);
4194   enum gimplify_status ret = GS_UNHANDLED;
4195   gimple assign;
4196
4197   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
4198               || TREE_CODE (*expr_p) == INIT_EXPR);
4199
4200   /* Insert pointer conversions required by the middle-end that are not
4201      required by the frontend.  This fixes middle-end type checking for
4202      for example gcc.dg/redecl-6.c.  */
4203   if (POINTER_TYPE_P (TREE_TYPE (*to_p))
4204       && lang_hooks.types_compatible_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
4205     {
4206       STRIP_USELESS_TYPE_CONVERSION (*from_p);
4207       if (!useless_type_conversion_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
4208         *from_p = fold_convert (TREE_TYPE (*to_p), *from_p);
4209     }
4210
4211   /* See if any simplifications can be done based on what the RHS is.  */
4212   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4213                                   want_value);
4214   if (ret != GS_UNHANDLED)
4215     return ret;
4216
4217   /* For zero sized types only gimplify the left hand side and right hand
4218      side as statements and throw away the assignment.  Do this after
4219      gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
4220      types properly.  */
4221   if (zero_sized_type (TREE_TYPE (*from_p)) && !want_value)
4222     {
4223       gimplify_stmt (from_p, pre_p);
4224       gimplify_stmt (to_p, pre_p);
4225       *expr_p = NULL_TREE;
4226       return GS_ALL_DONE;
4227     }
4228
4229   /* If the value being copied is of variable width, compute the length
4230      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
4231      before gimplifying any of the operands so that we can resolve any
4232      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
4233      the size of the expression to be copied, not of the destination, so
4234      that is what we must do here.  */
4235   maybe_with_size_expr (from_p);
4236
4237   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
4238   if (ret == GS_ERROR)
4239     return ret;
4240
4241   /* As a special case, we have to temporarily allow for assignments
4242      with a CALL_EXPR on the RHS.  Since in GIMPLE a function call is
4243      a toplevel statement, when gimplifying the GENERIC expression
4244      MODIFY_EXPR <a, CALL_EXPR <foo>>, we cannot create the tuple
4245      GIMPLE_ASSIGN <a, GIMPLE_CALL <foo>>.
4246
4247      Instead, we need to create the tuple GIMPLE_CALL <a, foo>.  To
4248      prevent gimplify_expr from trying to create a new temporary for
4249      foo's LHS, we tell it that it should only gimplify until it
4250      reaches the CALL_EXPR.  On return from gimplify_expr, the newly
4251      created GIMPLE_CALL <foo> will be the last statement in *PRE_P
4252      and all we need to do here is set 'a' to be its LHS.  */
4253   ret = gimplify_expr (from_p, pre_p, post_p, rhs_predicate_for (*to_p),
4254                        fb_rvalue);
4255   if (ret == GS_ERROR)
4256     return ret;
4257
4258   /* Now see if the above changed *from_p to something we handle specially.  */
4259   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4260                                   want_value);
4261   if (ret != GS_UNHANDLED)
4262     return ret;
4263
4264   /* If we've got a variable sized assignment between two lvalues (i.e. does
4265      not involve a call), then we can make things a bit more straightforward
4266      by converting the assignment to memcpy or memset.  */
4267   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
4268     {
4269       tree from = TREE_OPERAND (*from_p, 0);
4270       tree size = TREE_OPERAND (*from_p, 1);
4271
4272       if (TREE_CODE (from) == CONSTRUCTOR)
4273         return gimplify_modify_expr_to_memset (expr_p, size, want_value, pre_p);
4274
4275       if (is_gimple_addressable (from))
4276         {
4277           *from_p = from;
4278           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value,
4279                                                  pre_p);
4280         }
4281     }
4282
4283   /* Transform partial stores to non-addressable complex variables into
4284      total stores.  This allows us to use real instead of virtual operands
4285      for these variables, which improves optimization.  */
4286   if ((TREE_CODE (*to_p) == REALPART_EXPR
4287        || TREE_CODE (*to_p) == IMAGPART_EXPR)
4288       && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
4289     return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
4290
4291   /* Try to alleviate the effects of the gimplification creating artificial
4292      temporaries (see for example is_gimple_reg_rhs) on the debug info.  */
4293   if (!gimplify_ctxp->into_ssa
4294       && DECL_P (*from_p)
4295       && DECL_IGNORED_P (*from_p)
4296       && DECL_P (*to_p)
4297       && !DECL_IGNORED_P (*to_p))
4298     {
4299       if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
4300         DECL_NAME (*from_p)
4301           = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
4302       DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
4303       SET_DECL_DEBUG_EXPR (*from_p, *to_p);
4304    }
4305
4306   if (TREE_CODE (*from_p) == CALL_EXPR)
4307     {
4308       /* Since the RHS is a CALL_EXPR, we need to create a GIMPLE_CALL
4309          instead of a GIMPLE_ASSIGN.  */
4310       assign = gimple_build_call_from_tree (*from_p);
4311       gimple_call_set_lhs (assign, *to_p);
4312     }
4313   else
4314     assign = gimple_build_assign (*to_p, *from_p);
4315
4316   gimplify_seq_add_stmt (pre_p, assign);
4317
4318   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
4319     {
4320       /* If we've somehow already got an SSA_NAME on the LHS, then
4321          we've probably modified it twice.  Not good.  */
4322       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
4323       *to_p = make_ssa_name (*to_p, assign);
4324       gimple_set_lhs (assign, *to_p);
4325     }
4326
4327   if (want_value)
4328     {
4329       *expr_p = unshare_expr (*to_p);
4330       return GS_OK;
4331     }
4332   else
4333     *expr_p = NULL;
4334
4335   return GS_ALL_DONE;
4336 }
4337
4338 /*  Gimplify a comparison between two variable-sized objects.  Do this
4339     with a call to BUILT_IN_MEMCMP.  */
4340
4341 static enum gimplify_status
4342 gimplify_variable_sized_compare (tree *expr_p)
4343 {
4344   tree op0 = TREE_OPERAND (*expr_p, 0);
4345   tree op1 = TREE_OPERAND (*expr_p, 1);
4346   tree t, arg, dest, src;
4347
4348   arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
4349   arg = unshare_expr (arg);
4350   arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
4351   src = build_fold_addr_expr (op1);
4352   dest = build_fold_addr_expr (op0);
4353   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
4354   t = build_call_expr (t, 3, dest, src, arg);
4355   *expr_p
4356     = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
4357
4358   return GS_OK;
4359 }
4360
4361 /*  Gimplify a comparison between two aggregate objects of integral scalar
4362     mode as a comparison between the bitwise equivalent scalar values.  */
4363
4364 static enum gimplify_status
4365 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
4366 {
4367   tree op0 = TREE_OPERAND (*expr_p, 0);
4368   tree op1 = TREE_OPERAND (*expr_p, 1);
4369
4370   tree type = TREE_TYPE (op0);
4371   tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
4372
4373   op0 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op0);
4374   op1 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op1);
4375
4376   *expr_p
4377     = fold_build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
4378
4379   return GS_OK;
4380 }
4381
4382 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
4383     points to the expression to gimplify.
4384
4385     Expressions of the form 'a && b' are gimplified to:
4386
4387         a && b ? true : false
4388
4389     gimplify_cond_expr will do the rest.
4390
4391     PRE_P points to the list where side effects that must happen before
4392         *EXPR_P should be stored.  */
4393
4394 static enum gimplify_status
4395 gimplify_boolean_expr (tree *expr_p)
4396 {
4397   /* Preserve the original type of the expression.  */
4398   tree type = TREE_TYPE (*expr_p);
4399
4400   *expr_p = build3 (COND_EXPR, type, *expr_p,
4401                     fold_convert (type, boolean_true_node),
4402                     fold_convert (type, boolean_false_node));
4403
4404   return GS_OK;
4405 }
4406
4407 /* Gimplifies an expression sequence.  This function gimplifies each
4408    expression and re-writes the original expression with the last
4409    expression of the sequence in GIMPLE form.
4410
4411    PRE_P points to the list where the side effects for all the
4412        expressions in the sequence will be emitted.
4413
4414    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
4415
4416 static enum gimplify_status
4417 gimplify_compound_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
4418 {
4419   tree t = *expr_p;
4420
4421   do
4422     {
4423       tree *sub_p = &TREE_OPERAND (t, 0);
4424
4425       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
4426         gimplify_compound_expr (sub_p, pre_p, false);
4427       else
4428         gimplify_stmt (sub_p, pre_p);
4429
4430       t = TREE_OPERAND (t, 1);
4431     }
4432   while (TREE_CODE (t) == COMPOUND_EXPR);
4433
4434   *expr_p = t;
4435   if (want_value)
4436     return GS_OK;
4437   else
4438     {
4439       gimplify_stmt (expr_p, pre_p);
4440       return GS_ALL_DONE;
4441     }
4442 }
4443
4444
4445 /* Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
4446    gimplify.  After gimplification, EXPR_P will point to a new temporary
4447    that holds the original value of the SAVE_EXPR node.
4448
4449    PRE_P points to the list where side effects that must happen before
4450       *EXPR_P should be stored.  */
4451
4452 static enum gimplify_status
4453 gimplify_save_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4454 {
4455   enum gimplify_status ret = GS_ALL_DONE;
4456   tree val;
4457
4458   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
4459   val = TREE_OPERAND (*expr_p, 0);
4460
4461   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
4462   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
4463     {
4464       /* The operand may be a void-valued expression such as SAVE_EXPRs
4465          generated by the Java frontend for class initialization.  It is
4466          being executed only for its side-effects.  */
4467       if (TREE_TYPE (val) == void_type_node)
4468         {
4469           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4470                                is_gimple_stmt, fb_none);
4471           val = NULL;
4472         }
4473       else
4474         val = get_initialized_tmp_var (val, pre_p, post_p);
4475
4476       TREE_OPERAND (*expr_p, 0) = val;
4477       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
4478     }
4479
4480   *expr_p = val;
4481
4482   return ret;
4483 }
4484
4485 /*  Re-write the ADDR_EXPR node pointed to by EXPR_P
4486
4487       unary_expr
4488               : ...
4489               | '&' varname
4490               ...
4491
4492     PRE_P points to the list where side effects that must happen before
4493         *EXPR_P should be stored.
4494
4495     POST_P points to the list where side effects that must happen after
4496         *EXPR_P should be stored.  */
4497
4498 static enum gimplify_status
4499 gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4500 {
4501   tree expr = *expr_p;
4502   tree op0 = TREE_OPERAND (expr, 0);
4503   enum gimplify_status ret;
4504
4505   switch (TREE_CODE (op0))
4506     {
4507     case INDIRECT_REF:
4508     case MISALIGNED_INDIRECT_REF:
4509     do_indirect_ref:
4510       /* Check if we are dealing with an expression of the form '&*ptr'.
4511          While the front end folds away '&*ptr' into 'ptr', these
4512          expressions may be generated internally by the compiler (e.g.,
4513          builtins like __builtin_va_end).  */
4514       /* Caution: the silent array decomposition semantics we allow for
4515          ADDR_EXPR means we can't always discard the pair.  */
4516       /* Gimplification of the ADDR_EXPR operand may drop
4517          cv-qualification conversions, so make sure we add them if
4518          needed.  */
4519       {
4520         tree op00 = TREE_OPERAND (op0, 0);
4521         tree t_expr = TREE_TYPE (expr);
4522         tree t_op00 = TREE_TYPE (op00);
4523
4524         if (!useless_type_conversion_p (t_expr, t_op00))
4525           op00 = fold_convert (TREE_TYPE (expr), op00);
4526         *expr_p = op00;
4527         ret = GS_OK;
4528       }
4529       break;
4530
4531     case VIEW_CONVERT_EXPR:
4532       /* Take the address of our operand and then convert it to the type of
4533          this ADDR_EXPR.
4534
4535          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4536          all clear.  The impact of this transformation is even less clear.  */
4537
4538       /* If the operand is a useless conversion, look through it.  Doing so
4539          guarantees that the ADDR_EXPR and its operand will remain of the
4540          same type.  */
4541       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4542         op0 = TREE_OPERAND (op0, 0);
4543
4544       *expr_p = fold_convert (TREE_TYPE (expr),
4545                               build_fold_addr_expr (TREE_OPERAND (op0, 0)));
4546       ret = GS_OK;
4547       break;
4548
4549     default:
4550       /* We use fb_either here because the C frontend sometimes takes
4551          the address of a call that returns a struct; see
4552          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
4553          the implied temporary explicit.  */
4554
4555       /* Mark the RHS addressable.  */
4556       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4557                            is_gimple_addressable, fb_either);
4558       if (ret != GS_ERROR)
4559         {
4560           op0 = TREE_OPERAND (expr, 0);
4561
4562           /* For various reasons, the gimplification of the expression
4563              may have made a new INDIRECT_REF.  */
4564           if (TREE_CODE (op0) == INDIRECT_REF)
4565             goto do_indirect_ref;
4566
4567           /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly.  */
4568           recompute_tree_invariant_for_addr_expr (expr);
4569
4570           mark_addressable (TREE_OPERAND (expr, 0));
4571         }
4572       break;
4573     }
4574
4575   return ret;
4576 }
4577
4578 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
4579    value; output operands should be a gimple lvalue.  */
4580
4581 static enum gimplify_status
4582 gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4583 {
4584   tree expr;
4585   int noutputs;
4586   const char **oconstraints;
4587   int i;
4588   tree link;
4589   const char *constraint;
4590   bool allows_mem, allows_reg, is_inout;
4591   enum gimplify_status ret, tret;
4592   gimple stmt;
4593   VEC(tree, gc) *inputs;
4594   VEC(tree, gc) *outputs;
4595   VEC(tree, gc) *clobbers;
4596   tree link_next;
4597   
4598   expr = *expr_p;
4599   noutputs = list_length (ASM_OUTPUTS (expr));
4600   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
4601
4602   inputs = outputs = clobbers = NULL;
4603
4604   ret = GS_ALL_DONE;
4605   link_next = NULL_TREE;
4606   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = link_next)
4607     {
4608       bool ok;
4609       size_t constraint_len;
4610
4611       link_next = TREE_CHAIN (link);
4612
4613       oconstraints[i]
4614         = constraint
4615         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4616       constraint_len = strlen (constraint);
4617       if (constraint_len == 0)
4618         continue;
4619
4620       ok = parse_output_constraint (&constraint, i, 0, 0,
4621                                     &allows_mem, &allows_reg, &is_inout);
4622       if (!ok)
4623         {
4624           ret = GS_ERROR;
4625           is_inout = false;
4626         }
4627
4628       if (!allows_reg && allows_mem)
4629         mark_addressable (TREE_VALUE (link));
4630
4631       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4632                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4633                             fb_lvalue | fb_mayfail);
4634       if (tret == GS_ERROR)
4635         {
4636           error ("invalid lvalue in asm output %d", i);
4637           ret = tret;
4638         }
4639
4640       VEC_safe_push (tree, gc, outputs, link);
4641       TREE_CHAIN (link) = NULL_TREE;
4642
4643       if (is_inout)
4644         {
4645           /* An input/output operand.  To give the optimizers more
4646              flexibility, split it into separate input and output
4647              operands.  */
4648           tree input;
4649           char buf[10];
4650
4651           /* Turn the in/out constraint into an output constraint.  */
4652           char *p = xstrdup (constraint);
4653           p[0] = '=';
4654           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4655
4656           /* And add a matching input constraint.  */
4657           if (allows_reg)
4658             {
4659               sprintf (buf, "%d", i);
4660
4661               /* If there are multiple alternatives in the constraint,
4662                  handle each of them individually.  Those that allow register
4663                  will be replaced with operand number, the others will stay
4664                  unchanged.  */
4665               if (strchr (p, ',') != NULL)
4666                 {
4667                   size_t len = 0, buflen = strlen (buf);
4668                   char *beg, *end, *str, *dst;
4669
4670                   for (beg = p + 1;;)
4671                     {
4672                       end = strchr (beg, ',');
4673                       if (end == NULL)
4674                         end = strchr (beg, '\0');
4675                       if ((size_t) (end - beg) < buflen)
4676                         len += buflen + 1;
4677                       else
4678                         len += end - beg + 1;
4679                       if (*end)
4680                         beg = end + 1;
4681                       else
4682                         break;
4683                     }
4684
4685                   str = (char *) alloca (len);
4686                   for (beg = p + 1, dst = str;;)
4687                     {
4688                       const char *tem;
4689                       bool mem_p, reg_p, inout_p;
4690
4691                       end = strchr (beg, ',');
4692                       if (end)
4693                         *end = '\0';
4694                       beg[-1] = '=';
4695                       tem = beg - 1;
4696                       parse_output_constraint (&tem, i, 0, 0,
4697                                                &mem_p, &reg_p, &inout_p);
4698                       if (dst != str)
4699                         *dst++ = ',';
4700                       if (reg_p)
4701                         {
4702                           memcpy (dst, buf, buflen);
4703                           dst += buflen;
4704                         }
4705                       else
4706                         {
4707                           if (end)
4708                             len = end - beg;
4709                           else
4710                             len = strlen (beg);
4711                           memcpy (dst, beg, len);
4712                           dst += len;
4713                         }
4714                       if (end)
4715                         beg = end + 1;
4716                       else
4717                         break;
4718                     }
4719                   *dst = '\0';
4720                   input = build_string (dst - str, str);
4721                 }
4722               else
4723                 input = build_string (strlen (buf), buf);
4724             }
4725           else
4726             input = build_string (constraint_len - 1, constraint + 1);
4727
4728           free (p);
4729
4730           input = build_tree_list (build_tree_list (NULL_TREE, input),
4731                                    unshare_expr (TREE_VALUE (link)));
4732           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
4733         }
4734     }
4735
4736   link_next = NULL_TREE;
4737   for (link = ASM_INPUTS (expr); link; ++i, link = link_next)
4738     {
4739       link_next = TREE_CHAIN (link);
4740       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4741       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
4742                               oconstraints, &allows_mem, &allows_reg);
4743
4744       /* If we can't make copies, we can only accept memory.  */
4745       if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
4746         {
4747           if (allows_mem)
4748             allows_reg = 0;
4749           else
4750             {
4751               error ("impossible constraint in %<asm%>");
4752               error ("non-memory input %d must stay in memory", i);
4753               return GS_ERROR;
4754             }
4755         }
4756
4757       /* If the operand is a memory input, it should be an lvalue.  */
4758       if (!allows_reg && allows_mem)
4759         {
4760           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4761                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
4762           mark_addressable (TREE_VALUE (link));
4763           if (tret == GS_ERROR)
4764             {
4765               if (EXPR_HAS_LOCATION (TREE_VALUE (link)))
4766                 input_location = EXPR_LOCATION (TREE_VALUE (link));
4767               error ("memory input %d is not directly addressable", i);
4768               ret = tret;
4769             }
4770         }
4771       else
4772         {
4773           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4774                                 is_gimple_asm_val, fb_rvalue);
4775           if (tret == GS_ERROR)
4776             ret = tret;
4777         }
4778
4779       TREE_CHAIN (link) = NULL_TREE;
4780       VEC_safe_push (tree, gc, inputs, link);
4781     }
4782   
4783   for (link = ASM_CLOBBERS (expr); link; ++i, link = TREE_CHAIN (link))
4784       VEC_safe_push (tree, gc, clobbers, link);
4785     
4786   stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
4787                                inputs, outputs, clobbers);
4788
4789   gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr));
4790   gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
4791
4792   gimplify_seq_add_stmt (pre_p, stmt);
4793
4794   return ret;
4795 }
4796
4797 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
4798    GIMPLE_WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
4799    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
4800    return to this function.
4801
4802    FIXME should we complexify the prequeue handling instead?  Or use flags
4803    for all the cleanups and let the optimizer tighten them up?  The current
4804    code seems pretty fragile; it will break on a cleanup within any
4805    non-conditional nesting.  But any such nesting would be broken, anyway;
4806    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
4807    and continues out of it.  We can do that at the RTL level, though, so
4808    having an optimizer to tighten up try/finally regions would be a Good
4809    Thing.  */
4810
4811 static enum gimplify_status
4812 gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p)
4813 {
4814   gimple_stmt_iterator iter;
4815   gimple_seq body_sequence = NULL;
4816
4817   tree temp = voidify_wrapper_expr (*expr_p, NULL);
4818
4819   /* We only care about the number of conditions between the innermost
4820      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count and
4821      any cleanups collected outside the CLEANUP_POINT_EXPR.  */
4822   int old_conds = gimplify_ctxp->conditions;
4823   gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups;
4824   gimplify_ctxp->conditions = 0;
4825   gimplify_ctxp->conditional_cleanups = NULL;
4826
4827   gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence);
4828
4829   gimplify_ctxp->conditions = old_conds;
4830   gimplify_ctxp->conditional_cleanups = old_cleanups;
4831
4832   for (iter = gsi_start (body_sequence); !gsi_end_p (iter); )
4833     {
4834       gimple wce = gsi_stmt (iter);
4835
4836       if (gimple_code (wce) == GIMPLE_WITH_CLEANUP_EXPR)
4837         {
4838           if (gsi_one_before_end_p (iter))
4839             {
4840               /* Note that gsi_insert_seq_before and gsi_remove do not
4841                  scan operands, unlike some other sequence mutators.  */
4842               gsi_insert_seq_before_without_update (&iter,
4843                                                     gimple_wce_cleanup (wce),
4844                                                     GSI_SAME_STMT);
4845               gsi_remove (&iter, true);
4846               break;
4847             }
4848           else
4849             {
4850               gimple gtry;
4851               gimple_seq seq;
4852               enum gimple_try_flags kind;
4853
4854               if (gimple_wce_cleanup_eh_only (wce))
4855                 kind = GIMPLE_TRY_CATCH;
4856               else
4857                 kind = GIMPLE_TRY_FINALLY;
4858               seq = gsi_split_seq_after (iter);
4859
4860               gtry = gimple_build_try (seq, gimple_wce_cleanup (wce), kind);
4861               /* Do not use gsi_replace here, as it may scan operands.
4862                  We want to do a simple structural modification only.  */
4863               *gsi_stmt_ptr (&iter) = gtry;
4864               iter = gsi_start (seq);
4865             }
4866         }
4867       else
4868         gsi_next (&iter);
4869     }
4870
4871   gimplify_seq_add_seq (pre_p, body_sequence);
4872   if (temp)
4873     {
4874       *expr_p = temp;
4875       return GS_OK;
4876     }
4877   else
4878     {
4879       *expr_p = NULL;
4880       return GS_ALL_DONE;
4881     }
4882 }
4883
4884 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
4885    is the cleanup action required.  EH_ONLY is true if the cleanup should
4886    only be executed if an exception is thrown, not on normal exit.  */
4887
4888 static void
4889 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p)
4890 {
4891   gimple wce;
4892   gimple_seq cleanup_stmts = NULL;
4893
4894   /* Errors can result in improperly nested cleanups.  Which results in
4895      confusion when trying to resolve the GIMPLE_WITH_CLEANUP_EXPR.  */
4896   if (errorcount || sorrycount)
4897     return;
4898
4899   if (gimple_conditional_context ())
4900     {
4901       /* If we're in a conditional context, this is more complex.  We only
4902          want to run the cleanup if we actually ran the initialization that
4903          necessitates it, but we want to run it after the end of the
4904          conditional context.  So we wrap the try/finally around the
4905          condition and use a flag to determine whether or not to actually
4906          run the destructor.  Thus
4907
4908            test ? f(A()) : 0
4909
4910          becomes (approximately)
4911
4912            flag = 0;
4913            try {
4914              if (test) { A::A(temp); flag = 1; val = f(temp); }
4915              else { val = 0; }
4916            } finally {
4917              if (flag) A::~A(temp);
4918            }
4919            val
4920       */
4921       tree flag = create_tmp_var (boolean_type_node, "cleanup");
4922       gimple ffalse = gimple_build_assign (flag, boolean_false_node);
4923       gimple ftrue = gimple_build_assign (flag, boolean_true_node);
4924
4925       cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
4926       gimplify_stmt (&cleanup, &cleanup_stmts);
4927       wce = gimple_build_wce (cleanup_stmts);
4928
4929       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
4930       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
4931       gimplify_seq_add_stmt (pre_p, ftrue);
4932
4933       /* Because of this manipulation, and the EH edges that jump
4934          threading cannot redirect, the temporary (VAR) will appear
4935          to be used uninitialized.  Don't warn.  */
4936       TREE_NO_WARNING (var) = 1;
4937     }
4938   else
4939     {
4940       gimplify_stmt (&cleanup, &cleanup_stmts);
4941       wce = gimple_build_wce (cleanup_stmts);
4942       gimple_wce_set_cleanup_eh_only (wce, eh_only);
4943       gimplify_seq_add_stmt (pre_p, wce);
4944     }
4945 }
4946
4947 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
4948
4949 static enum gimplify_status
4950 gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4951 {
4952   tree targ = *expr_p;
4953   tree temp = TARGET_EXPR_SLOT (targ);
4954   tree init = TARGET_EXPR_INITIAL (targ);
4955   enum gimplify_status ret;
4956
4957   if (init)
4958     {
4959       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
4960          to the temps list.  Handle also variable length TARGET_EXPRs.  */
4961       if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
4962         {
4963           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
4964             gimplify_type_sizes (TREE_TYPE (temp), pre_p);
4965           gimplify_vla_decl (temp, pre_p);
4966         }
4967       else
4968         gimple_add_tmp_var (temp);
4969
4970       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
4971          expression is supposed to initialize the slot.  */
4972       if (VOID_TYPE_P (TREE_TYPE (init)))
4973         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
4974       else
4975         {
4976           tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
4977           init = init_expr;
4978           ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
4979           init = NULL;
4980           ggc_free (init_expr);
4981         }
4982       if (ret == GS_ERROR)
4983         {
4984           /* PR c++/28266 Make sure this is expanded only once. */
4985           TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4986           return GS_ERROR;
4987         }
4988       if (init)
4989         gimplify_and_add (init, pre_p);
4990
4991       /* If needed, push the cleanup for the temp.  */
4992       if (TARGET_EXPR_CLEANUP (targ))
4993         gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
4994                              CLEANUP_EH_ONLY (targ), pre_p);
4995
4996       /* Only expand this once.  */
4997       TREE_OPERAND (targ, 3) = init;
4998       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4999     }
5000   else
5001     /* We should have expanded this before.  */
5002     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
5003
5004   *expr_p = temp;
5005   return GS_OK;
5006 }
5007
5008 /* Gimplification of expression trees.  */
5009
5010 /* Gimplify an expression which appears at statement context.  The
5011    corresponding GIMPLE statements are added to *SEQ_P.  If *SEQ_P is
5012    NULL, a new sequence is allocated.
5013
5014    Return true if we actually added a statement to the queue.  */
5015
5016 bool
5017 gimplify_stmt (tree *stmt_p, gimple_seq *seq_p)
5018 {
5019   gimple_seq_node last;
5020
5021   if (!*seq_p)
5022     *seq_p = gimple_seq_alloc ();
5023
5024   last = gimple_seq_last (*seq_p);
5025   gimplify_expr (stmt_p, seq_p, NULL, is_gimple_stmt, fb_none);
5026   return last != gimple_seq_last (*seq_p);
5027 }
5028
5029
5030 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
5031    to CTX.  If entries already exist, force them to be some flavor of private.
5032    If there is no enclosing parallel, do nothing.  */
5033
5034 void
5035 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
5036 {
5037   splay_tree_node n;
5038
5039   if (decl == NULL || !DECL_P (decl))
5040     return;
5041
5042   do
5043     {
5044       n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5045       if (n != NULL)
5046         {
5047           if (n->value & GOVD_SHARED)
5048             n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
5049           else
5050             return;
5051         }
5052       else if (ctx->region_type != ORT_WORKSHARE)
5053         omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
5054
5055       ctx = ctx->outer_context;
5056     }
5057   while (ctx);
5058 }
5059
5060 /* Similarly for each of the type sizes of TYPE.  */
5061
5062 static void
5063 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
5064 {
5065   if (type == NULL || type == error_mark_node)
5066     return;
5067   type = TYPE_MAIN_VARIANT (type);
5068
5069   if (pointer_set_insert (ctx->privatized_types, type))
5070     return;
5071
5072   switch (TREE_CODE (type))
5073     {
5074     case INTEGER_TYPE:
5075     case ENUMERAL_TYPE:
5076     case BOOLEAN_TYPE:
5077     case REAL_TYPE:
5078     case FIXED_POINT_TYPE:
5079       omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
5080       omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
5081       break;
5082
5083     case ARRAY_TYPE:
5084       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5085       omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
5086       break;
5087
5088     case RECORD_TYPE:
5089     case UNION_TYPE:
5090     case QUAL_UNION_TYPE:
5091       {
5092         tree field;
5093         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5094           if (TREE_CODE (field) == FIELD_DECL)
5095             {
5096               omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
5097               omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
5098             }
5099       }
5100       break;
5101
5102     case POINTER_TYPE:
5103     case REFERENCE_TYPE:
5104       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5105       break;
5106
5107     default:
5108       break;
5109     }
5110
5111   omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
5112   omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
5113   lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
5114 }
5115
5116 /* Add an entry for DECL in the OpenMP context CTX with FLAGS.  */
5117
5118 static void
5119 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
5120 {
5121   splay_tree_node n;
5122   unsigned int nflags;
5123   tree t;
5124
5125   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5126     return;
5127
5128   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
5129      there are constructors involved somewhere.  */
5130   if (TREE_ADDRESSABLE (TREE_TYPE (decl))
5131       || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
5132     flags |= GOVD_SEEN;
5133
5134   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5135   if (n != NULL)
5136     {
5137       /* We shouldn't be re-adding the decl with the same data
5138          sharing class.  */
5139       gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
5140       /* The only combination of data sharing classes we should see is
5141          FIRSTPRIVATE and LASTPRIVATE.  */
5142       nflags = n->value | flags;
5143       gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
5144                   == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
5145       n->value = nflags;
5146       return;
5147     }
5148
5149   /* When adding a variable-sized variable, we have to handle all sorts
5150      of additional bits of data: the pointer replacement variable, and 
5151      the parameters of the type.  */
5152   if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5153     {
5154       /* Add the pointer replacement variable as PRIVATE if the variable
5155          replacement is private, else FIRSTPRIVATE since we'll need the
5156          address of the original variable either for SHARED, or for the
5157          copy into or out of the context.  */
5158       if (!(flags & GOVD_LOCAL))
5159         {
5160           nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
5161           nflags |= flags & GOVD_SEEN;
5162           t = DECL_VALUE_EXPR (decl);
5163           gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5164           t = TREE_OPERAND (t, 0);
5165           gcc_assert (DECL_P (t));
5166           omp_add_variable (ctx, t, nflags);
5167         }
5168
5169       /* Add all of the variable and type parameters (which should have
5170          been gimplified to a formal temporary) as FIRSTPRIVATE.  */
5171       omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
5172       omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
5173       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5174
5175       /* The variable-sized variable itself is never SHARED, only some form
5176          of PRIVATE.  The sharing would take place via the pointer variable
5177          which we remapped above.  */
5178       if (flags & GOVD_SHARED)
5179         flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
5180                 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
5181
5182       /* We're going to make use of the TYPE_SIZE_UNIT at least in the 
5183          alloca statement we generate for the variable, so make sure it
5184          is available.  This isn't automatically needed for the SHARED
5185          case, since we won't be allocating local storage then.
5186          For local variables TYPE_SIZE_UNIT might not be gimplified yet,
5187          in this case omp_notice_variable will be called later
5188          on when it is gimplified.  */
5189       else if (! (flags & GOVD_LOCAL))
5190         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
5191     }
5192   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
5193     {
5194       gcc_assert ((flags & GOVD_LOCAL) == 0);
5195       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5196
5197       /* Similar to the direct variable sized case above, we'll need the
5198          size of references being privatized.  */
5199       if ((flags & GOVD_SHARED) == 0)
5200         {
5201           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
5202           if (TREE_CODE (t) != INTEGER_CST)
5203             omp_notice_variable (ctx, t, true);
5204         }
5205     }
5206
5207   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
5208 }
5209
5210 /* Record the fact that DECL was used within the OpenMP context CTX.
5211    IN_CODE is true when real code uses DECL, and false when we should
5212    merely emit default(none) errors.  Return true if DECL is going to
5213    be remapped and thus DECL shouldn't be gimplified into its
5214    DECL_VALUE_EXPR (if any).  */
5215
5216 static bool
5217 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
5218 {
5219   splay_tree_node n;
5220   unsigned flags = in_code ? GOVD_SEEN : 0;
5221   bool ret = false, shared;
5222
5223   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5224     return false;
5225
5226   /* Threadprivate variables are predetermined.  */
5227   if (is_global_var (decl))
5228     {
5229       if (DECL_THREAD_LOCAL_P (decl))
5230         return false;
5231
5232       if (DECL_HAS_VALUE_EXPR_P (decl))
5233         {
5234           tree value = get_base_address (DECL_VALUE_EXPR (decl));
5235
5236           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
5237             return false;
5238         }
5239     }
5240
5241   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5242   if (n == NULL)
5243     {
5244       enum omp_clause_default_kind default_kind, kind;
5245       struct gimplify_omp_ctx *octx;
5246
5247       if (ctx->region_type == ORT_WORKSHARE)
5248         goto do_outer;
5249
5250       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
5251          remapped firstprivate instead of shared.  To some extent this is
5252          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
5253       default_kind = ctx->default_kind;
5254       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
5255       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
5256         default_kind = kind;
5257
5258       switch (default_kind)
5259         {
5260         case OMP_CLAUSE_DEFAULT_NONE:
5261           error ("%qs not specified in enclosing parallel",
5262                  IDENTIFIER_POINTER (DECL_NAME (decl)));
5263           error ("%Henclosing parallel", &ctx->location);
5264           /* FALLTHRU */
5265         case OMP_CLAUSE_DEFAULT_SHARED:
5266           flags |= GOVD_SHARED;
5267           break;
5268         case OMP_CLAUSE_DEFAULT_PRIVATE:
5269           flags |= GOVD_PRIVATE;
5270           break;
5271         case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
5272           flags |= GOVD_FIRSTPRIVATE;
5273           break;
5274         case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
5275           /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED.  */
5276           gcc_assert (ctx->region_type == ORT_TASK);
5277           if (ctx->outer_context)
5278             omp_notice_variable (ctx->outer_context, decl, in_code);
5279           for (octx = ctx->outer_context; octx; octx = octx->outer_context)
5280             {
5281               splay_tree_node n2;
5282
5283               n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
5284               if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED)
5285                 {
5286                   flags |= GOVD_FIRSTPRIVATE;
5287                   break;
5288                 }
5289               if ((octx->region_type & ORT_PARALLEL) != 0)
5290                 break;
5291             }
5292           if (flags & GOVD_FIRSTPRIVATE)
5293             break;
5294           if (octx == NULL
5295               && (TREE_CODE (decl) == PARM_DECL
5296                   || (!is_global_var (decl)
5297                       && DECL_CONTEXT (decl) == current_function_decl)))
5298             {
5299               flags |= GOVD_FIRSTPRIVATE;
5300               break;
5301             }
5302           flags |= GOVD_SHARED;
5303           break;
5304         default:
5305           gcc_unreachable ();
5306         }
5307
5308       if ((flags & GOVD_PRIVATE)
5309           && lang_hooks.decls.omp_private_outer_ref (decl))
5310         flags |= GOVD_PRIVATE_OUTER_REF;
5311
5312       omp_add_variable (ctx, decl, flags);
5313
5314       shared = (flags & GOVD_SHARED) != 0;
5315       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5316       goto do_outer;
5317     }
5318
5319   shared = ((flags | n->value) & GOVD_SHARED) != 0;
5320   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5321
5322   /* If nothing changed, there's nothing left to do.  */
5323   if ((n->value & flags) == flags)
5324     return ret;
5325   flags |= n->value;
5326   n->value = flags;
5327
5328  do_outer:
5329   /* If the variable is private in the current context, then we don't
5330      need to propagate anything to an outer context.  */
5331   if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
5332     return ret;
5333   if (ctx->outer_context
5334       && omp_notice_variable (ctx->outer_context, decl, in_code))
5335     return true;
5336   return ret;
5337 }
5338
5339 /* Verify that DECL is private within CTX.  If there's specific information
5340    to the contrary in the innermost scope, generate an error.  */
5341
5342 static bool
5343 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
5344 {
5345   splay_tree_node n;
5346
5347   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5348   if (n != NULL)
5349     {
5350       if (n->value & GOVD_SHARED)
5351         {
5352           if (ctx == gimplify_omp_ctxp)
5353             {
5354               error ("iteration variable %qs should be private",
5355                      IDENTIFIER_POINTER (DECL_NAME (decl)));
5356               n->value = GOVD_PRIVATE;
5357               return true;
5358             }
5359           else
5360             return false;
5361         }
5362       else if ((n->value & GOVD_EXPLICIT) != 0
5363                && (ctx == gimplify_omp_ctxp
5364                    || (ctx->region_type == ORT_COMBINED_PARALLEL
5365                        && gimplify_omp_ctxp->outer_context == ctx)))
5366         {
5367           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
5368             error ("iteration variable %qs should not be firstprivate",
5369                    IDENTIFIER_POINTER (DECL_NAME (decl)));
5370           else if ((n->value & GOVD_REDUCTION) != 0)
5371             error ("iteration variable %qs should not be reduction",
5372                    IDENTIFIER_POINTER (DECL_NAME (decl)));
5373         }
5374       return (ctx == gimplify_omp_ctxp
5375               || (ctx->region_type == ORT_COMBINED_PARALLEL
5376                   && gimplify_omp_ctxp->outer_context == ctx));
5377     }
5378
5379   if (ctx->region_type != ORT_WORKSHARE)
5380     return false;
5381   else if (ctx->outer_context)
5382     return omp_is_private (ctx->outer_context, decl);
5383   return false;
5384 }
5385
5386 /* Return true if DECL is private within a parallel region
5387    that binds to the current construct's context or in parallel
5388    region's REDUCTION clause.  */
5389
5390 static bool
5391 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
5392 {
5393   splay_tree_node n;
5394
5395   do
5396     {
5397       ctx = ctx->outer_context;
5398       if (ctx == NULL)
5399         return !(is_global_var (decl)
5400                  /* References might be private, but might be shared too.  */
5401                  || lang_hooks.decls.omp_privatize_by_reference (decl));
5402
5403       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5404       if (n != NULL)
5405         return (n->value & GOVD_SHARED) == 0;
5406     }
5407   while (ctx->region_type == ORT_WORKSHARE);
5408   return false;
5409 }
5410
5411 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
5412    and previous omp contexts.  */
5413
5414 static void
5415 gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
5416                            enum omp_region_type region_type)
5417 {
5418   struct gimplify_omp_ctx *ctx, *outer_ctx;
5419   struct gimplify_ctx gctx;
5420   tree c;
5421
5422   ctx = new_omp_context (region_type);
5423   outer_ctx = ctx->outer_context;
5424
5425   while ((c = *list_p) != NULL)
5426     {
5427       bool remove = false;
5428       bool notice_outer = true;
5429       const char *check_non_private = NULL;
5430       unsigned int flags;
5431       tree decl;
5432
5433       switch (OMP_CLAUSE_CODE (c))
5434         {
5435         case OMP_CLAUSE_PRIVATE:
5436           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
5437           if (lang_hooks.decls.omp_private_outer_ref (OMP_CLAUSE_DECL (c)))
5438             {
5439               flags |= GOVD_PRIVATE_OUTER_REF;
5440               OMP_CLAUSE_PRIVATE_OUTER_REF (c) = 1;
5441             }
5442           else
5443             notice_outer = false;
5444           goto do_add;
5445         case OMP_CLAUSE_SHARED:
5446           flags = GOVD_SHARED | GOVD_EXPLICIT;
5447           goto do_add;
5448         case OMP_CLAUSE_FIRSTPRIVATE:
5449           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
5450           check_non_private = "firstprivate";
5451           goto do_add;
5452         case OMP_CLAUSE_LASTPRIVATE:
5453           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
5454           check_non_private = "lastprivate";
5455           goto do_add;
5456         case OMP_CLAUSE_REDUCTION:
5457           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
5458           check_non_private = "reduction";
5459           goto do_add;
5460
5461         do_add:
5462           decl = OMP_CLAUSE_DECL (c);
5463           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5464             {
5465               remove = true;
5466               break;
5467             }
5468           omp_add_variable (ctx, decl, flags);
5469           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5470               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
5471             {
5472               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
5473                                 GOVD_LOCAL | GOVD_SEEN);
5474               gimplify_omp_ctxp = ctx;
5475               push_gimplify_context (&gctx);
5476
5477               OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c) = gimple_seq_alloc ();
5478               OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c) = gimple_seq_alloc ();
5479
5480               gimplify_and_add (OMP_CLAUSE_REDUCTION_INIT (c),
5481                                 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c));
5482               pop_gimplify_context
5483                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)));
5484               push_gimplify_context (&gctx);
5485               gimplify_and_add (OMP_CLAUSE_REDUCTION_MERGE (c),
5486                                 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c));
5487               pop_gimplify_context 
5488                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c)));
5489               OMP_CLAUSE_REDUCTION_INIT (c) = NULL_TREE;
5490               OMP_CLAUSE_REDUCTION_MERGE (c) = NULL_TREE;
5491
5492               gimplify_omp_ctxp = outer_ctx;
5493             }
5494           else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5495                    && OMP_CLAUSE_LASTPRIVATE_STMT (c))
5496             {
5497               gimplify_omp_ctxp = ctx;
5498               push_gimplify_context (&gctx);
5499               if (TREE_CODE (OMP_CLAUSE_LASTPRIVATE_STMT (c)) != BIND_EXPR)
5500                 {
5501                   tree bind = build3 (BIND_EXPR, void_type_node, NULL,
5502                                       NULL, NULL);
5503                   TREE_SIDE_EFFECTS (bind) = 1;
5504                   BIND_EXPR_BODY (bind) = OMP_CLAUSE_LASTPRIVATE_STMT (c);
5505                   OMP_CLAUSE_LASTPRIVATE_STMT (c) = bind;
5506                 }
5507               gimplify_and_add (OMP_CLAUSE_LASTPRIVATE_STMT (c),
5508                                 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5509               pop_gimplify_context
5510                 (gimple_seq_first_stmt (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)));
5511               OMP_CLAUSE_LASTPRIVATE_STMT (c) = NULL_TREE;
5512
5513               gimplify_omp_ctxp = outer_ctx;
5514             }
5515           if (notice_outer)
5516             goto do_notice;
5517           break;
5518
5519         case OMP_CLAUSE_COPYIN:
5520         case OMP_CLAUSE_COPYPRIVATE:
5521           decl = OMP_CLAUSE_DECL (c);
5522           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5523             {
5524               remove = true;
5525               break;
5526             }
5527         do_notice:
5528           if (outer_ctx)
5529             omp_notice_variable (outer_ctx, decl, true);
5530           if (check_non_private
5531               && region_type == ORT_WORKSHARE
5532               && omp_check_private (ctx, decl))
5533             {
5534               error ("%s variable %qs is private in outer context",
5535                      check_non_private, IDENTIFIER_POINTER (DECL_NAME (decl)));
5536               remove = true;
5537             }
5538           break;
5539
5540         case OMP_CLAUSE_IF:
5541           OMP_CLAUSE_OPERAND (c, 0)
5542             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
5543           /* Fall through.  */
5544
5545         case OMP_CLAUSE_SCHEDULE:
5546         case OMP_CLAUSE_NUM_THREADS:
5547           if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
5548                              is_gimple_val, fb_rvalue) == GS_ERROR)
5549               remove = true;
5550           break;
5551
5552         case OMP_CLAUSE_NOWAIT:
5553         case OMP_CLAUSE_ORDERED:
5554         case OMP_CLAUSE_UNTIED:
5555         case OMP_CLAUSE_COLLAPSE:
5556           break;
5557
5558         case OMP_CLAUSE_DEFAULT:
5559           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
5560           break;
5561
5562         default:
5563           gcc_unreachable ();
5564         }
5565
5566       if (remove)
5567         *list_p = OMP_CLAUSE_CHAIN (c);
5568       else
5569         list_p = &OMP_CLAUSE_CHAIN (c);
5570     }
5571
5572   gimplify_omp_ctxp = ctx;
5573 }
5574
5575 /* For all variables that were not actually used within the context,
5576    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
5577
5578 static int
5579 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
5580 {
5581   tree *list_p = (tree *) data;
5582   tree decl = (tree) n->key;
5583   unsigned flags = n->value;
5584   enum omp_clause_code code;
5585   tree clause;
5586   bool private_debug;
5587
5588   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
5589     return 0;
5590   if ((flags & GOVD_SEEN) == 0)
5591     return 0;
5592   if (flags & GOVD_DEBUG_PRIVATE)
5593     {
5594       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
5595       private_debug = true;
5596     }
5597   else
5598     private_debug
5599       = lang_hooks.decls.omp_private_debug_clause (decl,
5600                                                    !!(flags & GOVD_SHARED));
5601   if (private_debug)
5602     code = OMP_CLAUSE_PRIVATE;
5603   else if (flags & GOVD_SHARED)
5604     {
5605       if (is_global_var (decl))
5606         {
5607           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
5608           while (ctx != NULL)
5609             {
5610               splay_tree_node on
5611                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5612               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
5613                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5614                 break;
5615               ctx = ctx->outer_context;
5616             }
5617           if (ctx == NULL)
5618             return 0;
5619         }
5620       code = OMP_CLAUSE_SHARED;
5621     }
5622   else if (flags & GOVD_PRIVATE)
5623     code = OMP_CLAUSE_PRIVATE;
5624   else if (flags & GOVD_FIRSTPRIVATE)
5625     code = OMP_CLAUSE_FIRSTPRIVATE;
5626   else
5627     gcc_unreachable ();
5628
5629   clause = build_omp_clause (code);
5630   OMP_CLAUSE_DECL (clause) = decl;
5631   OMP_CLAUSE_CHAIN (clause) = *list_p;
5632   if (private_debug)
5633     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
5634   else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
5635     OMP_CLAUSE_PRIVATE_OUTER_REF (clause) = 1;
5636   *list_p = clause;
5637   lang_hooks.decls.omp_finish_clause (clause);
5638
5639   return 0;
5640 }
5641
5642 static void
5643 gimplify_adjust_omp_clauses (tree *list_p)
5644 {
5645   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
5646   tree c, decl;
5647
5648   while ((c = *list_p) != NULL)
5649     {
5650       splay_tree_node n;
5651       bool remove = false;
5652
5653       switch (OMP_CLAUSE_CODE (c))
5654         {
5655         case OMP_CLAUSE_PRIVATE:
5656         case OMP_CLAUSE_SHARED:
5657         case OMP_CLAUSE_FIRSTPRIVATE:
5658           decl = OMP_CLAUSE_DECL (c);
5659           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5660           remove = !(n->value & GOVD_SEEN);
5661           if (! remove)
5662             {
5663               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
5664               if ((n->value & GOVD_DEBUG_PRIVATE)
5665                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
5666                 {
5667                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
5668                               || ((n->value & GOVD_DATA_SHARE_CLASS)
5669                                   == GOVD_PRIVATE));
5670                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
5671                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
5672                 }
5673             }
5674           break;
5675
5676         case OMP_CLAUSE_LASTPRIVATE:
5677           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
5678              accurately reflect the presence of a FIRSTPRIVATE clause.  */
5679           decl = OMP_CLAUSE_DECL (c);
5680           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5681           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
5682             = (n->value & GOVD_FIRSTPRIVATE) != 0;
5683           break;
5684           
5685         case OMP_CLAUSE_REDUCTION:
5686         case OMP_CLAUSE_COPYIN:
5687         case OMP_CLAUSE_COPYPRIVATE:
5688         case OMP_CLAUSE_IF:
5689         case OMP_CLAUSE_NUM_THREADS:
5690         case OMP_CLAUSE_SCHEDULE:
5691         case OMP_CLAUSE_NOWAIT:
5692         case OMP_CLAUSE_ORDERED:
5693         case OMP_CLAUSE_DEFAULT:
5694         case OMP_CLAUSE_UNTIED:
5695         case OMP_CLAUSE_COLLAPSE:
5696           break;
5697
5698         default:
5699           gcc_unreachable ();
5700         }
5701
5702       if (remove)
5703         *list_p = OMP_CLAUSE_CHAIN (c);
5704       else
5705         list_p = &OMP_CLAUSE_CHAIN (c);
5706     }
5707
5708   /* Add in any implicit data sharing.  */
5709   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
5710   
5711   gimplify_omp_ctxp = ctx->outer_context;
5712   delete_omp_context (ctx);
5713 }
5714
5715 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
5716    gimplification of the body, as well as scanning the body for used
5717    variables.  We need to do this scan now, because variable-sized
5718    decls will be decomposed during gimplification.  */
5719
5720 static void
5721 gimplify_omp_parallel (tree *expr_p, gimple_seq *pre_p)
5722 {
5723   tree expr = *expr_p;
5724   gimple g;
5725   gimple_seq body = NULL;
5726   struct gimplify_ctx gctx;
5727
5728   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p,
5729                              OMP_PARALLEL_COMBINED (expr)
5730                              ? ORT_COMBINED_PARALLEL
5731                              : ORT_PARALLEL);
5732
5733   push_gimplify_context (&gctx);
5734
5735   g = gimplify_and_return_first (OMP_PARALLEL_BODY (expr), &body);
5736   if (gimple_code (g) == GIMPLE_BIND)
5737     pop_gimplify_context (g);
5738   else
5739     pop_gimplify_context (NULL);
5740
5741   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
5742
5743   g = gimple_build_omp_parallel (body,
5744                                  OMP_PARALLEL_CLAUSES (expr),
5745                                  NULL_TREE, NULL_TREE);
5746   if (OMP_PARALLEL_COMBINED (expr))
5747     gimple_omp_set_subcode (g, GF_OMP_PARALLEL_COMBINED);
5748   gimplify_seq_add_stmt (pre_p, g);
5749   *expr_p = NULL_TREE;
5750 }
5751
5752 /* Gimplify the contents of an OMP_TASK statement.  This involves
5753    gimplification of the body, as well as scanning the body for used
5754    variables.  We need to do this scan now, because variable-sized
5755    decls will be decomposed during gimplification.  */
5756
5757 static void
5758 gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
5759 {
5760   tree expr = *expr_p;
5761   gimple g;
5762   gimple_seq body = NULL;
5763   struct gimplify_ctx gctx;
5764
5765   gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p, ORT_TASK);
5766
5767   push_gimplify_context (&gctx);
5768
5769   g = gimplify_and_return_first (OMP_TASK_BODY (expr), &body);
5770   if (gimple_code (g) == GIMPLE_BIND)
5771     pop_gimplify_context (g);
5772   else
5773     pop_gimplify_context (NULL);
5774
5775   gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
5776
5777   g = gimple_build_omp_task (body,
5778                              OMP_TASK_CLAUSES (expr),
5779                              NULL_TREE, NULL_TREE,
5780                              NULL_TREE, NULL_TREE, NULL_TREE);
5781   gimplify_seq_add_stmt (pre_p, g);
5782   *expr_p = NULL_TREE;
5783 }
5784
5785 /* Gimplify the gross structure of an OMP_FOR statement.  */
5786
5787 static enum gimplify_status
5788 gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
5789 {
5790   tree for_stmt, decl, var, t;
5791   enum gimplify_status ret = GS_OK;
5792   gimple gfor;
5793   gimple_seq for_body, for_pre_body;
5794   int i;
5795
5796   for_stmt = *expr_p;
5797
5798   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
5799                              ORT_WORKSHARE);
5800
5801   /* Handle OMP_FOR_INIT.  */
5802   for_pre_body = NULL;
5803   gimplify_and_add (OMP_FOR_PRE_BODY (for_stmt), &for_pre_body);
5804   OMP_FOR_PRE_BODY (for_stmt) = NULL_TREE;
5805
5806   for_body = gimple_seq_alloc ();
5807   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
5808               == TREE_VEC_LENGTH (OMP_FOR_COND (for_stmt)));
5809   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
5810               == TREE_VEC_LENGTH (OMP_FOR_INCR (for_stmt)));
5811   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
5812     {
5813       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
5814       gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
5815       decl = TREE_OPERAND (t, 0);
5816       gcc_assert (DECL_P (decl));
5817       gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl))
5818                   || POINTER_TYPE_P (TREE_TYPE (decl)));
5819
5820       /* Make sure the iteration variable is private.  */
5821       if (omp_is_private (gimplify_omp_ctxp, decl))
5822         omp_notice_variable (gimplify_omp_ctxp, decl, true);
5823       else
5824         omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
5825
5826       /* If DECL is not a gimple register, create a temporary variable to act
5827          as an iteration counter.  This is valid, since DECL cannot be
5828          modified in the body of the loop.  */
5829       if (!is_gimple_reg (decl))
5830         {
5831           var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
5832           TREE_OPERAND (t, 0) = var;
5833                               
5834           gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
5835
5836           omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
5837         }
5838       else
5839         var = decl;
5840
5841       ret |= gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
5842                             is_gimple_val, fb_rvalue);
5843       if (ret == GS_ERROR)
5844         return ret;
5845
5846       /* Handle OMP_FOR_COND.  */
5847       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
5848       gcc_assert (COMPARISON_CLASS_P (t));
5849       gcc_assert (TREE_OPERAND (t, 0) == decl);
5850
5851       ret |= gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
5852                             is_gimple_val, fb_rvalue);
5853
5854       /* Handle OMP_FOR_INCR.  */
5855       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
5856       switch (TREE_CODE (t))
5857         {
5858         case PREINCREMENT_EXPR:
5859         case POSTINCREMENT_EXPR:
5860           t = build_int_cst (TREE_TYPE (decl), 1);
5861           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
5862           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
5863           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
5864           break;
5865
5866         case PREDECREMENT_EXPR:
5867         case POSTDECREMENT_EXPR:
5868           t = build_int_cst (TREE_TYPE (decl), -1);
5869           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
5870           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
5871           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
5872           break;
5873
5874         case MODIFY_EXPR:
5875           gcc_assert (TREE_OPERAND (t, 0) == decl);
5876           TREE_OPERAND (t, 0) = var;
5877
5878           t = TREE_OPERAND (t, 1);
5879           switch (TREE_CODE (t))
5880             {
5881             case PLUS_EXPR:
5882               if (TREE_OPERAND (t, 1) == decl)
5883                 {
5884                   TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
5885                   TREE_OPERAND (t, 0) = var;
5886                   break;
5887                 }
5888
5889               /* Fallthru.  */
5890             case MINUS_EXPR:
5891             case POINTER_PLUS_EXPR:
5892               gcc_assert (TREE_OPERAND (t, 0) == decl);
5893               TREE_OPERAND (t, 0) = var;
5894               break;
5895             default:
5896               gcc_unreachable ();
5897             }
5898
5899           ret |= gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
5900                                 is_gimple_val, fb_rvalue);
5901           break;
5902
5903         default:
5904           gcc_unreachable ();
5905         }
5906
5907       if (var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
5908         {
5909           tree c;
5910           for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
5911             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5912                 && OMP_CLAUSE_DECL (c) == decl
5913                 && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
5914               {
5915                 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
5916                 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
5917                 gcc_assert (TREE_OPERAND (t, 0) == var);
5918                 t = TREE_OPERAND (t, 1);
5919                 gcc_assert (TREE_CODE (t) == PLUS_EXPR
5920                             || TREE_CODE (t) == MINUS_EXPR
5921                             || TREE_CODE (t) == POINTER_PLUS_EXPR);
5922                 gcc_assert (TREE_OPERAND (t, 0) == var);
5923                 t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
5924                             TREE_OPERAND (t, 1));
5925                 gimplify_assign (decl, t,
5926                                  &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5927             }
5928         }
5929     }
5930
5931   gimplify_and_add (OMP_FOR_BODY (for_stmt), &for_body);
5932
5933   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
5934
5935   gfor = gimple_build_omp_for (for_body, OMP_FOR_CLAUSES (for_stmt),
5936                                TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)),
5937                                for_pre_body);
5938
5939   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
5940     {
5941       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
5942       gimple_omp_for_set_index (gfor, i, TREE_OPERAND (t, 0));
5943       gimple_omp_for_set_initial (gfor, i, TREE_OPERAND (t, 1));
5944       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
5945       gimple_omp_for_set_cond (gfor, i, TREE_CODE (t));
5946       gimple_omp_for_set_final (gfor, i, TREE_OPERAND (t, 1));
5947       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
5948       gimple_omp_for_set_incr (gfor, i, TREE_OPERAND (t, 1));
5949     }
5950
5951   gimplify_seq_add_stmt (pre_p, gfor);
5952   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
5953 }
5954
5955 /* Gimplify the gross structure of other OpenMP worksharing constructs.
5956    In particular, OMP_SECTIONS and OMP_SINGLE.  */
5957
5958 static void
5959 gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
5960 {
5961   tree expr = *expr_p;
5962   gimple stmt;
5963   gimple_seq body = NULL;
5964
5965   gimplify_scan_omp_clauses (&OMP_CLAUSES (expr), pre_p, ORT_WORKSHARE);
5966   gimplify_and_add (OMP_BODY (expr), &body);
5967   gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
5968
5969   if (TREE_CODE (expr) == OMP_SECTIONS)
5970     stmt = gimple_build_omp_sections (body, OMP_CLAUSES (expr));
5971   else if (TREE_CODE (expr) == OMP_SINGLE)
5972     stmt = gimple_build_omp_single (body, OMP_CLAUSES (expr));
5973   else
5974     gcc_unreachable ();
5975
5976   gimplify_seq_add_stmt (pre_p, stmt);
5977 }
5978
5979 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
5980    stabilized the lhs of the atomic operation as *ADDR.  Return true if 
5981    EXPR is this stabilized form.  */
5982
5983 static bool
5984 goa_lhs_expr_p (tree expr, tree addr)
5985 {
5986   /* Also include casts to other type variants.  The C front end is fond
5987      of adding these for e.g. volatile variables.  This is like 
5988      STRIP_TYPE_NOPS but includes the main variant lookup.  */
5989   while ((CONVERT_EXPR_P (expr)
5990           || TREE_CODE (expr) == NON_LVALUE_EXPR)
5991          && TREE_OPERAND (expr, 0) != error_mark_node
5992          && (TYPE_MAIN_VARIANT (TREE_TYPE (expr))
5993              == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
5994     expr = TREE_OPERAND (expr, 0);
5995
5996   if (TREE_CODE (expr) == INDIRECT_REF)
5997     {
5998       expr = TREE_OPERAND (expr, 0);
5999       while (expr != addr
6000              && (CONVERT_EXPR_P (expr)
6001                  || TREE_CODE (expr) == NON_LVALUE_EXPR)
6002              && TREE_CODE (expr) == TREE_CODE (addr)
6003              && TYPE_MAIN_VARIANT (TREE_TYPE (expr))
6004                 == TYPE_MAIN_VARIANT (TREE_TYPE (addr)))
6005         {
6006           expr = TREE_OPERAND (expr, 0);
6007           addr = TREE_OPERAND (addr, 0);
6008         }
6009       if (expr == addr)
6010         return true;
6011       return (TREE_CODE (addr) == ADDR_EXPR
6012               && TREE_CODE (expr) == ADDR_EXPR
6013               && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0));
6014     }
6015   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
6016     return true;
6017   return false;
6018 }
6019
6020 /* Walk *EXPR_P and replace
6021    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
6022    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
6023    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
6024
6025 static int
6026 goa_stabilize_expr (tree *expr_p, gimple_seq *pre_p, tree lhs_addr,
6027                     tree lhs_var)
6028 {
6029   tree expr = *expr_p;
6030   int saw_lhs;
6031
6032   if (goa_lhs_expr_p (expr, lhs_addr))
6033     {
6034       *expr_p = lhs_var;
6035       return 1;
6036     }
6037   if (is_gimple_val (expr))
6038     return 0;
6039  
6040   saw_lhs = 0;
6041   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
6042     {
6043     case tcc_binary:
6044       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p, lhs_addr,
6045                                      lhs_var);
6046     case tcc_unary:
6047       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p, lhs_addr,
6048                                      lhs_var);
6049       break;
6050     default:
6051       break;
6052     }
6053
6054   if (saw_lhs == 0)
6055     {
6056       enum gimplify_status gs;
6057       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
6058       if (gs != GS_ALL_DONE)
6059         saw_lhs = -1;
6060     }
6061
6062   return saw_lhs;
6063 }
6064
6065
6066 /* Gimplify an OMP_ATOMIC statement.  */
6067
6068 static enum gimplify_status
6069 gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
6070 {
6071   tree addr = TREE_OPERAND (*expr_p, 0);
6072   tree rhs = TREE_OPERAND (*expr_p, 1);
6073   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
6074   tree tmp_load;
6075
6076    tmp_load = create_tmp_var (type, NULL);
6077    if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
6078      return GS_ERROR;
6079
6080    if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
6081        != GS_ALL_DONE)
6082      return GS_ERROR;
6083
6084    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_load (tmp_load, addr));
6085    if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
6086        != GS_ALL_DONE)
6087      return GS_ERROR;
6088    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_store (rhs));
6089    *expr_p = NULL;
6090
6091    return GS_ALL_DONE;
6092 }
6093
6094
6095 /* Converts the GENERIC expression tree *EXPR_P to GIMPLE.  If the
6096    expression produces a value to be used as an operand inside a GIMPLE
6097    statement, the value will be stored back in *EXPR_P.  This value will
6098    be a tree of class tcc_declaration, tcc_constant, tcc_reference or
6099    an SSA_NAME.  The corresponding sequence of GIMPLE statements is
6100    emitted in PRE_P and POST_P.
6101
6102    Additionally, this process may overwrite parts of the input
6103    expression during gimplification.  Ideally, it should be
6104    possible to do non-destructive gimplification.
6105
6106    EXPR_P points to the GENERIC expression to convert to GIMPLE.  If
6107       the expression needs to evaluate to a value to be used as
6108       an operand in a GIMPLE statement, this value will be stored in
6109       *EXPR_P on exit.  This happens when the caller specifies one
6110       of fb_lvalue or fb_rvalue fallback flags.
6111
6112    PRE_P will contain the sequence of GIMPLE statements corresponding
6113        to the evaluation of EXPR and all the side-effects that must
6114        be executed before the main expression.  On exit, the last
6115        statement of PRE_P is the core statement being gimplified.  For
6116        instance, when gimplifying 'if (++a)' the last statement in
6117        PRE_P will be 'if (t.1)' where t.1 is the result of
6118        pre-incrementing 'a'.
6119
6120    POST_P will contain the sequence of GIMPLE statements corresponding
6121        to the evaluation of all the side-effects that must be executed
6122        after the main expression.  If this is NULL, the post
6123        side-effects are stored at the end of PRE_P.
6124
6125        The reason why the output is split in two is to handle post
6126        side-effects explicitly.  In some cases, an expression may have
6127        inner and outer post side-effects which need to be emitted in
6128        an order different from the one given by the recursive
6129        traversal.  For instance, for the expression (*p--)++ the post
6130        side-effects of '--' must actually occur *after* the post
6131        side-effects of '++'.  However, gimplification will first visit
6132        the inner expression, so if a separate POST sequence was not
6133        used, the resulting sequence would be:
6134
6135             1   t.1 = *p
6136             2   p = p - 1
6137             3   t.2 = t.1 + 1
6138             4   *p = t.2
6139
6140        However, the post-decrement operation in line #2 must not be
6141        evaluated until after the store to *p at line #4, so the
6142        correct sequence should be:
6143
6144             1   t.1 = *p
6145             2   t.2 = t.1 + 1
6146             3   *p = t.2
6147             4   p = p - 1
6148
6149        So, by specifying a separate post queue, it is possible
6150        to emit the post side-effects in the correct order.
6151        If POST_P is NULL, an internal queue will be used.  Before
6152        returning to the caller, the sequence POST_P is appended to
6153        the main output sequence PRE_P.
6154
6155    GIMPLE_TEST_F points to a function that takes a tree T and
6156        returns nonzero if T is in the GIMPLE form requested by the
6157        caller.  The GIMPLE predicates are in tree-gimple.c.
6158
6159    FALLBACK tells the function what sort of a temporary we want if
6160        gimplification cannot produce an expression that complies with
6161        GIMPLE_TEST_F.
6162
6163        fb_none means that no temporary should be generated
6164        fb_rvalue means that an rvalue is OK to generate
6165        fb_lvalue means that an lvalue is OK to generate
6166        fb_either means that either is OK, but an lvalue is preferable.
6167        fb_mayfail means that gimplification may fail (in which case
6168        GS_ERROR will be returned)
6169
6170    The return value is either GS_ERROR or GS_ALL_DONE, since this
6171    function iterates until EXPR is completely gimplified or an error
6172    occurs.  */
6173
6174 enum gimplify_status
6175 gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
6176                bool (*gimple_test_f) (tree), fallback_t fallback)
6177 {
6178   tree tmp;
6179   gimple_seq internal_pre = NULL;
6180   gimple_seq internal_post = NULL;
6181   tree save_expr;
6182   bool is_statement;
6183   location_t saved_location;
6184   enum gimplify_status ret;
6185   gimple_stmt_iterator pre_last_gsi, post_last_gsi;
6186
6187   save_expr = *expr_p;
6188   if (save_expr == NULL_TREE)
6189     return GS_ALL_DONE;
6190
6191   /* If we are gimplifying a top-level statement, PRE_P must be valid.  */
6192   is_statement = gimple_test_f == is_gimple_stmt;
6193   if (is_statement)
6194     gcc_assert (pre_p);
6195
6196   /* Consistency checks.  */
6197   if (gimple_test_f == is_gimple_reg)
6198     gcc_assert (fallback & (fb_rvalue | fb_lvalue));
6199   else if (gimple_test_f == is_gimple_val
6200            || gimple_test_f == is_gimple_formal_tmp_rhs
6201            || gimple_test_f == is_gimple_formal_tmp_or_call_rhs
6202            || gimple_test_f == is_gimple_formal_tmp_reg
6203            || gimple_test_f == is_gimple_formal_tmp_var
6204            || gimple_test_f == is_gimple_call_addr
6205            || gimple_test_f == is_gimple_condexpr
6206            || gimple_test_f == is_gimple_mem_rhs
6207            || gimple_test_f == is_gimple_mem_or_call_rhs
6208            || gimple_test_f == is_gimple_reg_rhs
6209            || gimple_test_f == is_gimple_reg_or_call_rhs
6210            || gimple_test_f == is_gimple_asm_val)
6211     gcc_assert (fallback & fb_rvalue);
6212   else if (gimple_test_f == is_gimple_min_lval
6213            || gimple_test_f == is_gimple_lvalue)
6214     gcc_assert (fallback & fb_lvalue);
6215   else if (gimple_test_f == is_gimple_addressable)
6216     gcc_assert (fallback & fb_either);
6217   else if (gimple_test_f == is_gimple_stmt)
6218     gcc_assert (fallback == fb_none);
6219   else
6220     {
6221       /* We should have recognized the GIMPLE_TEST_F predicate to
6222          know what kind of fallback to use in case a temporary is
6223          needed to hold the value or address of *EXPR_P.  */
6224       gcc_unreachable ();
6225     }
6226
6227   /* We used to check the predicate here and return immediately if it
6228      succeeds.  This is wrong; the design is for gimplification to be
6229      idempotent, and for the predicates to only test for valid forms, not
6230      whether they are fully simplified.  */
6231   if (pre_p == NULL)
6232     pre_p = &internal_pre;
6233
6234   if (post_p == NULL)
6235     post_p = &internal_post;
6236
6237   /* Remember the last statements added to PRE_P and POST_P.  Every
6238      new statement added by the gimplification helpers needs to be
6239      annotated with location information.  To centralize the
6240      responsibility, we remember the last statement that had been
6241      added to both queues before gimplifying *EXPR_P.  If
6242      gimplification produces new statements in PRE_P and POST_P, those
6243      statements will be annotated with the same location information
6244      as *EXPR_P.  */
6245   pre_last_gsi = gsi_last (*pre_p);
6246   post_last_gsi = gsi_last (*post_p);
6247
6248   saved_location = input_location;
6249   if (save_expr != error_mark_node
6250       && EXPR_HAS_LOCATION (*expr_p))
6251     input_location = EXPR_LOCATION (*expr_p);
6252
6253   /* Loop over the specific gimplifiers until the toplevel node
6254      remains the same.  */
6255   do
6256     {
6257       /* Strip away as many useless type conversions as possible
6258          at the toplevel.  */
6259       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
6260
6261       /* Remember the expr.  */
6262       save_expr = *expr_p;
6263
6264       /* Die, die, die, my darling.  */
6265       if (save_expr == error_mark_node
6266           || (TREE_TYPE (save_expr)
6267               && TREE_TYPE (save_expr) == error_mark_node))
6268         {
6269           ret = GS_ERROR;
6270           break;
6271         }
6272
6273       /* Do any language-specific gimplification.  */
6274       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
6275       if (ret == GS_OK)
6276         {
6277           if (*expr_p == NULL_TREE)
6278             break;
6279           if (*expr_p != save_expr)
6280             continue;
6281         }
6282       else if (ret != GS_UNHANDLED)
6283         break;
6284
6285       ret = GS_OK;
6286       switch (TREE_CODE (*expr_p))
6287         {
6288           /* First deal with the special cases.  */
6289
6290         case POSTINCREMENT_EXPR:
6291         case POSTDECREMENT_EXPR:
6292         case PREINCREMENT_EXPR:
6293         case PREDECREMENT_EXPR:
6294           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
6295                                         fallback != fb_none);
6296           break;
6297
6298         case ARRAY_REF:
6299         case ARRAY_RANGE_REF:
6300         case REALPART_EXPR:
6301         case IMAGPART_EXPR:
6302         case COMPONENT_REF:
6303         case VIEW_CONVERT_EXPR:
6304           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
6305                                         fallback ? fallback : fb_rvalue);
6306           break;
6307
6308         case COND_EXPR:
6309           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
6310
6311           /* C99 code may assign to an array in a structure value of a
6312              conditional expression, and this has undefined behavior
6313              only on execution, so create a temporary if an lvalue is
6314              required.  */
6315           if (fallback == fb_lvalue)
6316             {
6317               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6318               mark_addressable (*expr_p);
6319             }
6320           break;
6321
6322         case CALL_EXPR:
6323           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
6324
6325           /* C99 code may assign to an array in a structure returned
6326              from a function, and this has undefined behavior only on
6327              execution, so create a temporary if an lvalue is
6328              required.  */
6329           if (fallback == fb_lvalue)
6330             {
6331               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6332               mark_addressable (*expr_p);
6333             }
6334           break;
6335
6336         case TREE_LIST:
6337           gcc_unreachable ();
6338
6339         case COMPOUND_EXPR:
6340           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
6341           break;
6342
6343         case MODIFY_EXPR:
6344         case INIT_EXPR:
6345           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
6346                                       fallback != fb_none);
6347           break;
6348
6349         case TRUTH_ANDIF_EXPR:
6350         case TRUTH_ORIF_EXPR:
6351           ret = gimplify_boolean_expr (expr_p);
6352           break;
6353
6354         case TRUTH_NOT_EXPR:
6355           if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE)
6356             {
6357               tree type = TREE_TYPE (*expr_p);
6358               *expr_p = fold_convert (type, gimple_boolify (*expr_p));
6359               ret = GS_OK;
6360               break;
6361             }
6362
6363           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6364                                is_gimple_val, fb_rvalue);
6365           recalculate_side_effects (*expr_p);
6366           break;
6367
6368         case ADDR_EXPR:
6369           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
6370           break;
6371
6372         case VA_ARG_EXPR:
6373           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
6374           break;
6375
6376         CASE_CONVERT:
6377           if (IS_EMPTY_STMT (*expr_p))
6378             {
6379               ret = GS_ALL_DONE;
6380               break;
6381             }
6382
6383           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
6384               || fallback == fb_none)
6385             {
6386               /* Just strip a conversion to void (or in void context) and
6387                  try again.  */
6388               *expr_p = TREE_OPERAND (*expr_p, 0);
6389               break;
6390             }
6391
6392           ret = gimplify_conversion (expr_p);
6393           if (ret == GS_ERROR)
6394             break;
6395           if (*expr_p != save_expr)
6396             break;
6397           /* FALLTHRU */
6398
6399         case FIX_TRUNC_EXPR:
6400           /* unary_expr: ... | '(' cast ')' val | ...  */
6401           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6402                                is_gimple_val, fb_rvalue);
6403           recalculate_side_effects (*expr_p);
6404           break;
6405
6406         case INDIRECT_REF:
6407           *expr_p = fold_indirect_ref (*expr_p);
6408           if (*expr_p != save_expr)
6409             break;
6410           /* else fall through.  */
6411         case ALIGN_INDIRECT_REF:
6412         case MISALIGNED_INDIRECT_REF:
6413           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6414                                is_gimple_reg, fb_rvalue);
6415           recalculate_side_effects (*expr_p);
6416           break;
6417
6418           /* Constants need not be gimplified.  */
6419         case INTEGER_CST:
6420         case REAL_CST:
6421         case FIXED_CST:
6422         case STRING_CST:
6423         case COMPLEX_CST:
6424         case VECTOR_CST:
6425           ret = GS_ALL_DONE;
6426           break;
6427
6428         case CONST_DECL:
6429           /* If we require an lvalue, such as for ADDR_EXPR, retain the
6430              CONST_DECL node.  Otherwise the decl is replaceable by its
6431              value.  */
6432           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
6433           if (fallback & fb_lvalue)
6434             ret = GS_ALL_DONE;
6435           else
6436             *expr_p = DECL_INITIAL (*expr_p);
6437           break;
6438
6439         case DECL_EXPR:
6440           ret = gimplify_decl_expr (expr_p, pre_p);
6441           break;
6442
6443         case EXC_PTR_EXPR:
6444           /* FIXME make this a decl.  */
6445           ret = GS_ALL_DONE;
6446           break;
6447
6448         case BIND_EXPR:
6449           ret = gimplify_bind_expr (expr_p, pre_p);
6450           break;
6451
6452         case LOOP_EXPR:
6453           ret = gimplify_loop_expr (expr_p, pre_p);
6454           break;
6455
6456         case SWITCH_EXPR:
6457           ret = gimplify_switch_expr (expr_p, pre_p);
6458           break;
6459
6460         case EXIT_EXPR:
6461           ret = gimplify_exit_expr (expr_p);
6462           break;
6463
6464         case GOTO_EXPR:
6465           /* If the target is not LABEL, then it is a computed jump
6466              and the target needs to be gimplified.  */
6467           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
6468             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
6469                                  NULL, is_gimple_val, fb_rvalue);
6470           gimplify_seq_add_stmt (pre_p,
6471                           gimple_build_goto (GOTO_DESTINATION (*expr_p)));
6472           break;
6473
6474         case PREDICT_EXPR:
6475           gimplify_seq_add_stmt (pre_p,
6476                         gimple_build_predict (PREDICT_EXPR_PREDICTOR (*expr_p),
6477                                               PREDICT_EXPR_OUTCOME (*expr_p)));
6478           ret = GS_ALL_DONE;
6479           break;
6480
6481         case LABEL_EXPR:
6482           ret = GS_ALL_DONE;
6483           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
6484                       == current_function_decl);
6485           gimplify_seq_add_stmt (pre_p,
6486                           gimple_build_label (LABEL_EXPR_LABEL (*expr_p)));
6487           break;
6488
6489         case CASE_LABEL_EXPR:
6490           ret = gimplify_case_label_expr (expr_p, pre_p);
6491           break;
6492
6493         case RETURN_EXPR:
6494           ret = gimplify_return_expr (*expr_p, pre_p);
6495           break;
6496
6497         case CONSTRUCTOR:
6498           /* Don't reduce this in place; let gimplify_init_constructor work its
6499              magic.  Buf if we're just elaborating this for side effects, just
6500              gimplify any element that has side-effects.  */
6501           if (fallback == fb_none)
6502             {
6503               unsigned HOST_WIDE_INT ix;
6504               constructor_elt *ce;
6505               tree temp = NULL_TREE;
6506               for (ix = 0;
6507                    VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
6508                                 ix, ce);
6509                    ix++)
6510                 if (TREE_SIDE_EFFECTS (ce->value))
6511                   append_to_statement_list (ce->value, &temp);
6512
6513               *expr_p = temp;
6514               ret = GS_OK;
6515             }
6516           /* C99 code may assign to an array in a constructed
6517              structure or union, and this has undefined behavior only
6518              on execution, so create a temporary if an lvalue is
6519              required.  */
6520           else if (fallback == fb_lvalue)
6521             {
6522               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6523               mark_addressable (*expr_p);
6524             }
6525           else
6526             ret = GS_ALL_DONE;
6527           break;
6528
6529           /* The following are special cases that are not handled by the
6530              original GIMPLE grammar.  */
6531
6532           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
6533              eliminated.  */
6534         case SAVE_EXPR:
6535           ret = gimplify_save_expr (expr_p, pre_p, post_p);
6536           break;
6537
6538         case BIT_FIELD_REF:
6539           {
6540             enum gimplify_status r0, r1, r2;
6541
6542             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6543                                 post_p, is_gimple_lvalue, fb_either);
6544             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6545                                 post_p, is_gimple_val, fb_rvalue);
6546             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
6547                                 post_p, is_gimple_val, fb_rvalue);
6548             recalculate_side_effects (*expr_p);
6549
6550             ret = MIN (r0, MIN (r1, r2));
6551           }
6552           break;
6553
6554         case NON_LVALUE_EXPR:
6555           /* This should have been stripped above.  */
6556           gcc_unreachable ();
6557
6558         case ASM_EXPR:
6559           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
6560           break;
6561
6562         case TRY_FINALLY_EXPR:
6563         case TRY_CATCH_EXPR:
6564           {
6565             gimple_seq eval, cleanup;
6566             gimple try_;
6567
6568             eval = cleanup = NULL;
6569             gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
6570             gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
6571             try_ = gimple_build_try (eval, cleanup,
6572                                      TREE_CODE (*expr_p) == TRY_FINALLY_EXPR
6573                                      ? GIMPLE_TRY_FINALLY
6574                                      : GIMPLE_TRY_CATCH);
6575             if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR)
6576               gimple_try_set_catch_is_cleanup (try_,
6577                                                TRY_CATCH_IS_CLEANUP (*expr_p));
6578             gimplify_seq_add_stmt (pre_p, try_);
6579             ret = GS_ALL_DONE;
6580             break;
6581           }
6582
6583         case CLEANUP_POINT_EXPR:
6584           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
6585           break;
6586
6587         case TARGET_EXPR:
6588           ret = gimplify_target_expr (expr_p, pre_p, post_p);
6589           break;
6590
6591         case CATCH_EXPR:
6592           {
6593             gimple c;
6594             gimple_seq handler = NULL;
6595             gimplify_and_add (CATCH_BODY (*expr_p), &handler);
6596             c = gimple_build_catch (CATCH_TYPES (*expr_p), handler);
6597             gimplify_seq_add_stmt (pre_p, c);
6598             ret = GS_ALL_DONE;
6599             break;
6600           }
6601
6602         case EH_FILTER_EXPR:
6603           {
6604             gimple ehf;
6605             gimple_seq failure = NULL;
6606
6607             gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure);
6608             ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure);
6609             gimple_eh_filter_set_must_not_throw
6610               (ehf, EH_FILTER_MUST_NOT_THROW (*expr_p));
6611             gimplify_seq_add_stmt (pre_p, ehf);
6612             ret = GS_ALL_DONE;
6613             break;
6614           }
6615
6616         case CHANGE_DYNAMIC_TYPE_EXPR:
6617           {
6618             gimple cdt;
6619
6620             ret = gimplify_expr (&CHANGE_DYNAMIC_TYPE_LOCATION (*expr_p),
6621                                  pre_p, post_p, is_gimple_reg, fb_lvalue);
6622             cdt = gimple_build_cdt (CHANGE_DYNAMIC_TYPE_NEW_TYPE (*expr_p),
6623                                     CHANGE_DYNAMIC_TYPE_LOCATION (*expr_p));
6624             gimplify_seq_add_stmt (pre_p, cdt);
6625             ret = GS_ALL_DONE;
6626           }
6627           break;
6628
6629         case OBJ_TYPE_REF:
6630           {
6631             enum gimplify_status r0, r1;
6632             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p,
6633                                 post_p, is_gimple_val, fb_rvalue);
6634             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p,
6635                                 post_p, is_gimple_val, fb_rvalue);
6636             TREE_SIDE_EFFECTS (*expr_p) = 0;
6637             ret = MIN (r0, r1);
6638           }
6639           break;
6640
6641         case LABEL_DECL:
6642           /* We get here when taking the address of a label.  We mark
6643              the label as "forced"; meaning it can never be removed and
6644              it is a potential target for any computed goto.  */
6645           FORCED_LABEL (*expr_p) = 1;
6646           ret = GS_ALL_DONE;
6647           break;
6648
6649         case STATEMENT_LIST:
6650           ret = gimplify_statement_list (expr_p, pre_p);
6651           break;
6652
6653         case WITH_SIZE_EXPR:
6654           {
6655             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6656                            post_p == &internal_post ? NULL : post_p,
6657                            gimple_test_f, fallback);
6658             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6659                            is_gimple_val, fb_rvalue);
6660           }
6661           break;
6662
6663         case VAR_DECL:
6664         case PARM_DECL:
6665           ret = gimplify_var_or_parm_decl (expr_p);
6666           break;
6667
6668         case RESULT_DECL:
6669           /* When within an OpenMP context, notice uses of variables.  */
6670           if (gimplify_omp_ctxp)
6671             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
6672           ret = GS_ALL_DONE;
6673           break;
6674
6675         case SSA_NAME:
6676           /* Allow callbacks into the gimplifier during optimization.  */
6677           ret = GS_ALL_DONE;
6678           break;
6679
6680         case OMP_PARALLEL:
6681           gimplify_omp_parallel (expr_p, pre_p);
6682           ret = GS_ALL_DONE;
6683           break;
6684
6685         case OMP_TASK:
6686           gimplify_omp_task (expr_p, pre_p);
6687           ret = GS_ALL_DONE;
6688           break;
6689
6690         case OMP_FOR:
6691           ret = gimplify_omp_for (expr_p, pre_p);
6692           break;
6693
6694         case OMP_SECTIONS:
6695         case OMP_SINGLE:
6696           gimplify_omp_workshare (expr_p, pre_p);
6697           ret = GS_ALL_DONE;
6698           break;
6699
6700         case OMP_SECTION:
6701         case OMP_MASTER:
6702         case OMP_ORDERED:
6703         case OMP_CRITICAL:
6704           {
6705             gimple_seq body = NULL;
6706             gimple g;
6707
6708             gimplify_and_add (OMP_BODY (*expr_p), &body);
6709             switch (TREE_CODE (*expr_p))
6710               {
6711               case OMP_SECTION:
6712                 g = gimple_build_omp_section (body);
6713                 break;
6714               case OMP_MASTER:
6715                 g = gimple_build_omp_master (body);
6716                 break;
6717               case OMP_ORDERED:
6718                 g = gimple_build_omp_ordered (body);
6719                 break;
6720               case OMP_CRITICAL:
6721                 g = gimple_build_omp_critical (body,
6722                                                OMP_CRITICAL_NAME (*expr_p));
6723                 break;
6724               default:
6725                 gcc_unreachable ();
6726               }
6727             gimplify_seq_add_stmt (pre_p, g);
6728             ret = GS_ALL_DONE;
6729             break;
6730           }
6731
6732         case OMP_ATOMIC:
6733           ret = gimplify_omp_atomic (expr_p, pre_p);
6734           break;
6735
6736         case POINTER_PLUS_EXPR:
6737           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
6738              The second is gimple immediate saving a need for extra statement.
6739            */
6740           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6741               && (tmp = maybe_fold_offset_to_address
6742                          (TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
6743                           TREE_TYPE (*expr_p))))
6744             {
6745               *expr_p = tmp;
6746               break;
6747             }
6748           /* Convert (void *)&a + 4 into (void *)&a[1].  */
6749           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
6750               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
6751               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
6752                                                                         0),0)))
6753               && (tmp = maybe_fold_offset_to_address
6754                          (TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
6755                           TREE_OPERAND (*expr_p, 1),
6756                           TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
6757                                                    0)))))
6758              {
6759                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
6760                break;
6761              }
6762           /* FALLTHRU */
6763
6764         default:
6765           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
6766             {
6767             case tcc_comparison:
6768               /* Handle comparison of objects of non scalar mode aggregates
6769                  with a call to memcmp.  It would be nice to only have to do
6770                  this for variable-sized objects, but then we'd have to allow
6771                  the same nest of reference nodes we allow for MODIFY_EXPR and
6772                  that's too complex.
6773
6774                  Compare scalar mode aggregates as scalar mode values.  Using
6775                  memcmp for them would be very inefficient at best, and is
6776                  plain wrong if bitfields are involved.  */
6777                 {
6778                   tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
6779
6780                   if (!AGGREGATE_TYPE_P (type))
6781                     goto expr_2;
6782                   else if (TYPE_MODE (type) != BLKmode)
6783                     ret = gimplify_scalar_mode_aggregate_compare (expr_p);
6784                   else
6785                     ret = gimplify_variable_sized_compare (expr_p);
6786
6787                   break;
6788                 }
6789
6790             /* If *EXPR_P does not need to be special-cased, handle it
6791                according to its class.  */
6792             case tcc_unary:
6793               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6794                                    post_p, is_gimple_val, fb_rvalue);
6795               break;
6796
6797             case tcc_binary:
6798             expr_2:
6799               {
6800                 enum gimplify_status r0, r1;
6801
6802                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6803                                     post_p, is_gimple_val, fb_rvalue);
6804                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6805                                     post_p, is_gimple_val, fb_rvalue);
6806
6807                 ret = MIN (r0, r1);
6808                 break;
6809               }
6810
6811             case tcc_declaration:
6812             case tcc_constant:
6813               ret = GS_ALL_DONE;
6814               goto dont_recalculate;
6815
6816             default:
6817               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
6818                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
6819                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
6820               goto expr_2;
6821             }
6822
6823           recalculate_side_effects (*expr_p);
6824
6825         dont_recalculate:
6826           break;
6827         }
6828
6829       /* If we replaced *expr_p, gimplify again.  */
6830       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
6831         ret = GS_ALL_DONE;
6832     }
6833   while (ret == GS_OK);
6834
6835   /* If we encountered an error_mark somewhere nested inside, either
6836      stub out the statement or propagate the error back out.  */
6837   if (ret == GS_ERROR)
6838     {
6839       if (is_statement)
6840         *expr_p = NULL;
6841       goto out;
6842     }
6843
6844   /* This was only valid as a return value from the langhook, which
6845      we handled.  Make sure it doesn't escape from any other context.  */
6846   gcc_assert (ret != GS_UNHANDLED);
6847
6848   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
6849     {
6850       /* We aren't looking for a value, and we don't have a valid
6851          statement.  If it doesn't have side-effects, throw it away.  */
6852       if (!TREE_SIDE_EFFECTS (*expr_p))
6853         *expr_p = NULL;
6854       else if (!TREE_THIS_VOLATILE (*expr_p))
6855         {
6856           /* This is probably a _REF that contains something nested that
6857              has side effects.  Recurse through the operands to find it.  */
6858           enum tree_code code = TREE_CODE (*expr_p);
6859
6860           switch (code)
6861             {
6862             case COMPONENT_REF:
6863             case REALPART_EXPR:
6864             case IMAGPART_EXPR:
6865             case VIEW_CONVERT_EXPR:
6866               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6867                              gimple_test_f, fallback);
6868               break;
6869
6870             case ARRAY_REF:
6871             case ARRAY_RANGE_REF:
6872               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6873                              gimple_test_f, fallback);
6874               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6875                              gimple_test_f, fallback);
6876               break;
6877
6878             default:
6879                /* Anything else with side-effects must be converted to
6880                   a valid statement before we get here.  */
6881               gcc_unreachable ();
6882             }
6883
6884           *expr_p = NULL;
6885         }
6886       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
6887                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
6888         {
6889           /* Historically, the compiler has treated a bare reference
6890              to a non-BLKmode volatile lvalue as forcing a load.  */
6891           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
6892
6893           /* Normally, we do not want to create a temporary for a
6894              TREE_ADDRESSABLE type because such a type should not be
6895              copied by bitwise-assignment.  However, we make an
6896              exception here, as all we are doing here is ensuring that
6897              we read the bytes that make up the type.  We use
6898              create_tmp_var_raw because create_tmp_var will abort when
6899              given a TREE_ADDRESSABLE type.  */
6900           tree tmp = create_tmp_var_raw (type, "vol");
6901           gimple_add_tmp_var (tmp);
6902           gimplify_assign (tmp, *expr_p, pre_p);
6903           *expr_p = NULL;
6904         }
6905       else
6906         /* We can't do anything useful with a volatile reference to
6907            an incomplete type, so just throw it away.  Likewise for
6908            a BLKmode type, since any implicit inner load should
6909            already have been turned into an explicit one by the
6910            gimplification process.  */
6911         *expr_p = NULL;
6912     }
6913
6914   /* If we are gimplifying at the statement level, we're done.  Tack
6915      everything together and return.  */
6916   if (fallback == fb_none || is_statement)
6917     {
6918       /* Since *EXPR_P has been converted into a GIMPLE tuple, clear
6919          it out for GC to reclaim it.  */
6920       *expr_p = NULL_TREE;
6921
6922       if (!gimple_seq_empty_p (internal_pre)
6923           || !gimple_seq_empty_p (internal_post))
6924         {
6925           gimplify_seq_add_seq (&internal_pre, internal_post);
6926           gimplify_seq_add_seq (pre_p, internal_pre);
6927         }
6928
6929       /* The result of gimplifying *EXPR_P is going to be the last few
6930          statements in *PRE_P and *POST_P.  Add location information
6931          to all the statements that were added by the gimplification
6932          helpers.  */
6933       if (!gimple_seq_empty_p (*pre_p))
6934         annotate_all_with_location_after (*pre_p, pre_last_gsi, input_location);
6935
6936       if (!gimple_seq_empty_p (*post_p))
6937         annotate_all_with_location_after (*post_p, post_last_gsi,
6938                                           input_location);
6939
6940       goto out;
6941     }
6942
6943 #ifdef ENABLE_GIMPLE_CHECKING
6944   if (*expr_p)
6945     {
6946       enum tree_code code = TREE_CODE (*expr_p);
6947       /* These expressions should already be in gimple IR form.  */
6948       gcc_assert (code != MODIFY_EXPR
6949                   && code != ASM_EXPR
6950                   && code != BIND_EXPR
6951                   && code != CATCH_EXPR
6952                   && code != COND_EXPR
6953                   && code != EH_FILTER_EXPR
6954                   && code != GOTO_EXPR
6955                   && code != LABEL_EXPR
6956                   && code != LOOP_EXPR
6957                   && code != RESX_EXPR
6958                   && code != SWITCH_EXPR
6959                   && code != TRY_FINALLY_EXPR
6960                   && code != OMP_CRITICAL
6961                   && code != OMP_FOR
6962                   && code != OMP_MASTER
6963                   && code != OMP_ORDERED
6964                   && code != OMP_PARALLEL
6965                   && code != OMP_SECTIONS
6966                   && code != OMP_SECTION
6967                   && code != OMP_SINGLE);
6968     }
6969 #endif
6970
6971   /* Otherwise we're gimplifying a subexpression, so the resulting
6972      value is interesting.  If it's a valid operand that matches
6973      GIMPLE_TEST_F, we're done. Unless we are handling some
6974      post-effects internally; if that's the case, we need to copy into
6975      a temporary before adding the post-effects to POST_P.  */
6976   if (gimple_seq_empty_p (internal_post) && (*gimple_test_f) (*expr_p))
6977     goto out;
6978
6979   /* Otherwise, we need to create a new temporary for the gimplified
6980      expression.  */
6981
6982   /* We can't return an lvalue if we have an internal postqueue.  The
6983      object the lvalue refers to would (probably) be modified by the
6984      postqueue; we need to copy the value out first, which means an
6985      rvalue.  */
6986   if ((fallback & fb_lvalue)
6987       && gimple_seq_empty_p (internal_post)
6988       && is_gimple_addressable (*expr_p))
6989     {
6990       /* An lvalue will do.  Take the address of the expression, store it
6991          in a temporary, and replace the expression with an INDIRECT_REF of
6992          that temporary.  */
6993       tmp = build_fold_addr_expr (*expr_p);
6994       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
6995       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
6996     }
6997   else if ((fallback & fb_rvalue) && is_gimple_formal_tmp_or_call_rhs (*expr_p))
6998     {
6999       /* An rvalue will do.  Assign the gimplified expression into a
7000          new temporary TMP and replace the original expression with
7001          TMP.  First, make sure that the expression has a type so that
7002          it can be assigned into a temporary.  */
7003       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
7004
7005       if (!gimple_seq_empty_p (internal_post) || (fallback & fb_lvalue))
7006         /* The postqueue might change the value of the expression between
7007            the initialization and use of the temporary, so we can't use a
7008            formal temp.  FIXME do we care?  */
7009         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7010       else
7011         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
7012
7013       if (TREE_CODE (*expr_p) != SSA_NAME)
7014         DECL_GIMPLE_FORMAL_TEMP_P (*expr_p) = 1;
7015     }
7016   else
7017     {
7018 #ifdef ENABLE_GIMPLE_CHECKING
7019       if (!(fallback & fb_mayfail))
7020         {
7021           fprintf (stderr, "gimplification failed:\n");
7022           print_generic_expr (stderr, *expr_p, 0);
7023           debug_tree (*expr_p);
7024           internal_error ("gimplification failed");
7025         }
7026 #endif
7027       gcc_assert (fallback & fb_mayfail);
7028
7029       /* If this is an asm statement, and the user asked for the
7030          impossible, don't die.  Fail and let gimplify_asm_expr
7031          issue an error.  */
7032       ret = GS_ERROR;
7033       goto out;
7034     }
7035
7036   /* Make sure the temporary matches our predicate.  */
7037   gcc_assert ((*gimple_test_f) (*expr_p));
7038
7039   if (!gimple_seq_empty_p (internal_post))
7040     {
7041       annotate_all_with_location (internal_post, input_location);
7042       gimplify_seq_add_seq (pre_p, internal_post);
7043     }
7044
7045  out:
7046   input_location = saved_location;
7047   return ret;
7048 }
7049
7050 /* Look through TYPE for variable-sized objects and gimplify each such
7051    size that we find.  Add to LIST_P any statements generated.  */
7052
7053 void
7054 gimplify_type_sizes (tree type, gimple_seq *list_p)
7055 {
7056   tree field, t;
7057
7058   if (type == NULL || type == error_mark_node)
7059     return;
7060
7061   /* We first do the main variant, then copy into any other variants.  */
7062   type = TYPE_MAIN_VARIANT (type);
7063
7064   /* Avoid infinite recursion.  */
7065   if (TYPE_SIZES_GIMPLIFIED (type))
7066     return;
7067
7068   TYPE_SIZES_GIMPLIFIED (type) = 1;
7069
7070   switch (TREE_CODE (type))
7071     {
7072     case INTEGER_TYPE:
7073     case ENUMERAL_TYPE:
7074     case BOOLEAN_TYPE:
7075     case REAL_TYPE:
7076     case FIXED_POINT_TYPE:
7077       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
7078       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
7079
7080       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7081         {
7082           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
7083           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
7084         }
7085       break;
7086
7087     case ARRAY_TYPE:
7088       /* These types may not have declarations, so handle them here.  */
7089       gimplify_type_sizes (TREE_TYPE (type), list_p);
7090       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
7091       break;
7092
7093     case RECORD_TYPE:
7094     case UNION_TYPE:
7095     case QUAL_UNION_TYPE:
7096       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
7097         if (TREE_CODE (field) == FIELD_DECL)
7098           {
7099             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
7100             gimplify_type_sizes (TREE_TYPE (field), list_p);
7101           }
7102       break;
7103
7104     case POINTER_TYPE:
7105     case REFERENCE_TYPE:
7106         /* We used to recurse on the pointed-to type here, which turned out to
7107            be incorrect because its definition might refer to variables not
7108            yet initialized at this point if a forward declaration is involved.
7109
7110            It was actually useful for anonymous pointed-to types to ensure
7111            that the sizes evaluation dominates every possible later use of the
7112            values.  Restricting to such types here would be safe since there
7113            is no possible forward declaration around, but would introduce an
7114            undesirable middle-end semantic to anonymity.  We then defer to
7115            front-ends the responsibility of ensuring that the sizes are
7116            evaluated both early and late enough, e.g. by attaching artificial
7117            type declarations to the tree.  */
7118       break;
7119
7120     default:
7121       break;
7122     }
7123
7124   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
7125   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
7126
7127   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7128     {
7129       TYPE_SIZE (t) = TYPE_SIZE (type);
7130       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
7131       TYPE_SIZES_GIMPLIFIED (t) = 1;
7132     }
7133 }
7134
7135 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
7136    a size or position, has had all of its SAVE_EXPRs evaluated.
7137    We add any required statements to *STMT_P.  */
7138
7139 void
7140 gimplify_one_sizepos (tree *expr_p, gimple_seq *stmt_p)
7141 {
7142   tree type, expr = *expr_p;
7143
7144   /* We don't do anything if the value isn't there, is constant, or contains
7145      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
7146      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
7147      will want to replace it with a new variable, but that will cause problems
7148      if this type is from outside the function.  It's OK to have that here.  */
7149   if (expr == NULL_TREE || TREE_CONSTANT (expr)
7150       || TREE_CODE (expr) == VAR_DECL
7151       || CONTAINS_PLACEHOLDER_P (expr))
7152     return;
7153
7154   type = TREE_TYPE (expr);
7155   *expr_p = unshare_expr (expr);
7156
7157   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
7158   expr = *expr_p;
7159
7160   /* Verify that we've an exact type match with the original expression.
7161      In particular, we do not wish to drop a "sizetype" in favour of a
7162      type of similar dimensions.  We don't want to pollute the generic
7163      type-stripping code with this knowledge because it doesn't matter
7164      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
7165      and friends retain their "sizetype-ness".  */
7166   if (TREE_TYPE (expr) != type
7167       && TREE_CODE (type) == INTEGER_TYPE
7168       && TYPE_IS_SIZETYPE (type))
7169     {
7170       tree tmp;
7171       gimple stmt;
7172
7173       *expr_p = create_tmp_var (type, NULL);
7174       tmp = build1 (NOP_EXPR, type, expr);
7175       stmt = gimplify_assign (*expr_p, tmp, stmt_p);
7176       if (EXPR_HAS_LOCATION (expr))
7177         gimple_set_location (stmt, *EXPR_LOCUS (expr));
7178       else
7179         gimple_set_location (stmt, input_location);
7180     }
7181 }
7182
7183
7184 /* Gimplify the body of statements pointed to by BODY_P and return a
7185    GIMPLE_BIND containing the sequence of GIMPLE statements
7186    corresponding to BODY_P.  FNDECL is the function decl containing
7187    *BODY_P.  */
7188
7189 gimple
7190 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
7191 {
7192   location_t saved_location = input_location;
7193   gimple_seq parm_stmts, seq;
7194   gimple outer_bind;
7195   struct gimplify_ctx gctx;
7196
7197   timevar_push (TV_TREE_GIMPLIFY);
7198
7199   gcc_assert (gimplify_ctxp == NULL);
7200   push_gimplify_context (&gctx);
7201
7202   /* Unshare most shared trees in the body and in that of any nested functions.
7203      It would seem we don't have to do this for nested functions because
7204      they are supposed to be output and then the outer function gimplified
7205      first, but the g++ front end doesn't always do it that way.  */
7206   unshare_body (body_p, fndecl);
7207   unvisit_body (body_p, fndecl);
7208
7209   /* Make sure input_location isn't set to something weird.  */
7210   input_location = DECL_SOURCE_LOCATION (fndecl);
7211
7212   /* Resolve callee-copies.  This has to be done before processing
7213      the body so that DECL_VALUE_EXPR gets processed correctly.  */
7214   parm_stmts = (do_parms) ? gimplify_parameters () : NULL;
7215
7216   /* Gimplify the function's body.  */
7217   seq = NULL;
7218   gimplify_stmt (body_p, &seq);
7219   outer_bind = gimple_seq_first_stmt (seq);
7220   if (!outer_bind)
7221     {
7222       outer_bind = gimple_build_nop ();
7223       gimplify_seq_add_stmt (&seq, outer_bind);
7224     }
7225
7226   /* The body must contain exactly one statement, a GIMPLE_BIND.  If this is
7227      not the case, wrap everything in a GIMPLE_BIND to make it so.  */
7228   if (gimple_code (outer_bind) == GIMPLE_BIND
7229       && gimple_seq_first (seq) == gimple_seq_last (seq))
7230     ;
7231   else
7232     outer_bind = gimple_build_bind (NULL_TREE, seq, NULL);
7233
7234   *body_p = NULL_TREE;
7235
7236   /* If we had callee-copies statements, insert them at the beginning
7237      of the function.  */
7238   if (!gimple_seq_empty_p (parm_stmts))
7239     {
7240       gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
7241       gimple_bind_set_body (outer_bind, parm_stmts);
7242     }
7243
7244   pop_gimplify_context (outer_bind);
7245   gcc_assert (gimplify_ctxp == NULL);
7246
7247 #ifdef ENABLE_TYPES_CHECKING
7248   if (!errorcount && !sorrycount)
7249     verify_types_in_gimple_seq (gimple_bind_body (outer_bind));
7250 #endif
7251
7252   timevar_pop (TV_TREE_GIMPLIFY);
7253   input_location = saved_location;
7254
7255   return outer_bind;
7256 }
7257
7258 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
7259    node for the function we want to gimplify.
7260    
7261    Returns the sequence of GIMPLE statements corresponding to the body
7262    of FNDECL.  */
7263
7264 void
7265 gimplify_function_tree (tree fndecl)
7266 {
7267   tree oldfn, parm, ret;
7268   gimple_seq seq;
7269   gimple bind;
7270
7271   oldfn = current_function_decl;
7272   current_function_decl = fndecl;
7273   if (DECL_STRUCT_FUNCTION (fndecl))
7274     push_cfun (DECL_STRUCT_FUNCTION (fndecl));
7275   else
7276     push_struct_function (fndecl);
7277
7278   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
7279     {
7280       /* Preliminarily mark non-addressed complex variables as eligible
7281          for promotion to gimple registers.  We'll transform their uses
7282          as we find them.  */
7283       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
7284            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
7285           && !TREE_THIS_VOLATILE (parm)
7286           && !needs_to_live_in_memory (parm))
7287         DECL_GIMPLE_REG_P (parm) = 1;
7288     }
7289
7290   ret = DECL_RESULT (fndecl);
7291   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
7292        || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
7293       && !needs_to_live_in_memory (ret))
7294     DECL_GIMPLE_REG_P (ret) = 1;
7295
7296   bind = gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
7297
7298   /* The tree body of the function is no longer needed, replace it
7299      with the new GIMPLE body.  */
7300   seq = gimple_seq_alloc ();
7301   gimple_seq_add_stmt (&seq, bind);
7302   gimple_set_body (fndecl, seq);
7303
7304   /* If we're instrumenting function entry/exit, then prepend the call to
7305      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
7306      catch the exit hook.  */
7307   /* ??? Add some way to ignore exceptions for this TFE.  */
7308   if (flag_instrument_function_entry_exit
7309       && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
7310       && !flag_instrument_functions_exclude_p (fndecl))
7311     {
7312       tree x;
7313       gimple new_bind;
7314       gimple tf;
7315       gimple_seq cleanup = NULL, body = NULL;
7316
7317       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
7318       gimplify_seq_add_stmt (&cleanup, gimple_build_call (x, 0));
7319       tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
7320
7321       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
7322       gimplify_seq_add_stmt (&body, gimple_build_call (x, 0));
7323       gimplify_seq_add_stmt (&body, tf);
7324       new_bind = gimple_build_bind (NULL, body, gimple_block (bind));
7325       /* Clear the block for BIND, since it is no longer directly inside
7326          the function, but within a try block.  */
7327       gimple_set_block (bind, NULL);
7328
7329       /* Replace the current function body with the body
7330          wrapped in the try/finally TF.  */
7331       seq = gimple_seq_alloc ();
7332       gimple_seq_add_stmt (&seq, new_bind);
7333       gimple_set_body (fndecl, seq);
7334     }
7335
7336   DECL_SAVED_TREE (fndecl) = NULL_TREE;
7337
7338   current_function_decl = oldfn;
7339   pop_cfun ();
7340 }
7341
7342
7343 /* Some transformations like inlining may invalidate the GIMPLE form
7344    for operands.  This function traverses all the operands in STMT and
7345    gimplifies anything that is not a valid gimple operand.  Any new
7346    GIMPLE statements are inserted before *GSI_P.  */
7347
7348 void
7349 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
7350 {
7351   size_t i, num_ops;
7352   tree orig_lhs = NULL_TREE, lhs, t;
7353   gimple_seq pre = NULL;
7354   gimple post_stmt = NULL;
7355   struct gimplify_ctx gctx;
7356
7357   push_gimplify_context (&gctx);
7358   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7359
7360   switch (gimple_code (stmt))
7361     {
7362     case GIMPLE_COND:
7363       gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
7364                      is_gimple_val, fb_rvalue);
7365       gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
7366                      is_gimple_val, fb_rvalue);
7367       break;
7368     case GIMPLE_OMP_ATOMIC_LOAD:
7369       gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
7370                      is_gimple_val, fb_rvalue);
7371       break;
7372     case GIMPLE_ASM:
7373       {
7374         size_t i, noutputs = gimple_asm_noutputs (stmt);
7375         const char *constraint, **oconstraints;
7376         bool allows_mem, allows_reg, is_inout;
7377
7378         oconstraints
7379           = (const char **) alloca ((noutputs) * sizeof (const char *));
7380         for (i = 0; i < noutputs; i++)
7381           {
7382             tree op = gimple_asm_output_op (stmt, i);
7383             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7384             oconstraints[i] = constraint;
7385             parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
7386                                      &allows_reg, &is_inout);
7387             gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7388                            is_inout ? is_gimple_min_lval : is_gimple_lvalue,
7389                            fb_lvalue | fb_mayfail);
7390           }
7391         for (i = 0; i < gimple_asm_ninputs (stmt); i++)
7392           {
7393             tree op = gimple_asm_input_op (stmt, i);
7394             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7395             parse_input_constraint (&constraint, 0, 0, noutputs, 0,
7396                                     oconstraints, &allows_mem, &allows_reg);
7397             if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
7398               allows_reg = 0;
7399             if (!allows_reg && allows_mem)
7400               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7401                              is_gimple_lvalue, fb_lvalue | fb_mayfail);
7402             else
7403               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7404                              is_gimple_asm_val, fb_rvalue);
7405           }
7406       }
7407       break;
7408     default:
7409       /* NOTE: We start gimplifying operands from last to first to
7410          make sure that side-effects on the RHS of calls, assignments
7411          and ASMs are executed before the LHS.  The ordering is not
7412          important for other statements.  */
7413       num_ops = gimple_num_ops (stmt);
7414       orig_lhs = gimple_get_lhs (stmt);
7415       for (i = num_ops; i > 0; i--)
7416         {
7417           tree op = gimple_op (stmt, i - 1);
7418           if (op == NULL_TREE)
7419             continue;
7420           if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
7421             gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
7422           else if (i == 2
7423                    && is_gimple_assign (stmt)
7424                    && num_ops == 2
7425                    && get_gimple_rhs_class (gimple_expr_code (stmt))
7426                       == GIMPLE_SINGLE_RHS)
7427             gimplify_expr (&op, &pre, NULL,
7428                            rhs_predicate_for (gimple_assign_lhs (stmt)),
7429                            fb_rvalue);
7430           else if (i == 2 && is_gimple_call (stmt))
7431             {
7432               if (TREE_CODE (op) == FUNCTION_DECL)
7433                 continue;
7434               gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
7435             }
7436           else
7437             gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
7438           gimple_set_op (stmt, i - 1, op);
7439         }
7440
7441       lhs = gimple_get_lhs (stmt);
7442       /* If regimplification of the LHS changed it in a way that requires
7443          a simple RHS, create temporary.  */
7444       if (orig_lhs != lhs && !is_gimple_formal_tmp_var (lhs))
7445         {
7446           bool need_temp = false;
7447
7448           if (is_gimple_assign (stmt)
7449               && num_ops == 2
7450               && get_gimple_rhs_class (gimple_expr_code (stmt))
7451                  == GIMPLE_SINGLE_RHS)
7452             gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
7453                            rhs_predicate_for (gimple_assign_lhs (stmt)),
7454                            fb_rvalue);
7455           else if (is_gimple_reg (lhs))
7456             {
7457               if (is_gimple_reg_type (TREE_TYPE (lhs)))
7458                 {
7459                   if (is_gimple_call (stmt))
7460                     {
7461                       i = gimple_call_flags (stmt);
7462                       if ((i & ECF_LOOPING_CONST_OR_PURE)
7463                           || !(i & (ECF_CONST | ECF_PURE)))
7464                         need_temp = true;
7465                     }
7466                   if (stmt_can_throw_internal (stmt))
7467                     need_temp = true;
7468                 }
7469             }
7470           else
7471             {
7472               if (is_gimple_reg_type (TREE_TYPE (lhs)))
7473                 need_temp = true;
7474               else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
7475                 {
7476                   if (is_gimple_call (stmt))
7477                     {
7478                       tree fndecl = gimple_call_fndecl (stmt);
7479
7480                       if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
7481                           && !(fndecl && DECL_RESULT (fndecl)
7482                                && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
7483                         need_temp = true;
7484                     }
7485                   else
7486                     need_temp = true;
7487                 }
7488             }
7489           if (need_temp)
7490             {
7491               tree temp = create_tmp_var (TREE_TYPE (lhs), NULL);
7492
7493               DECL_GIMPLE_FORMAL_TEMP_P (temp) = 1;
7494               if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
7495                   || TREE_CODE (TREE_TYPE (lhs)) == VECTOR_TYPE)
7496                 DECL_GIMPLE_REG_P (temp) = 1;
7497               if (TREE_CODE (orig_lhs) == SSA_NAME)
7498                 orig_lhs = SSA_NAME_VAR (orig_lhs);
7499               if (TREE_CODE (orig_lhs) == VAR_DECL
7500                   && DECL_BASED_ON_RESTRICT_P (orig_lhs))
7501                 {
7502                   DECL_BASED_ON_RESTRICT_P (temp) = 1;
7503                   SET_DECL_RESTRICT_BASE (temp,
7504                                           DECL_GET_RESTRICT_BASE (orig_lhs));
7505                 }
7506
7507               if (gimple_in_ssa_p (cfun))
7508                 temp = make_ssa_name (temp, NULL);
7509               gimple_set_lhs (stmt, temp);
7510               post_stmt = gimple_build_assign (lhs, temp);
7511               if (TREE_CODE (lhs) == SSA_NAME)
7512                 SSA_NAME_DEF_STMT (lhs) = post_stmt;
7513             }
7514         }
7515       break;
7516     }
7517
7518   if (!gimple_seq_empty_p (pre))
7519     {
7520       if (gimple_in_ssa_p (cfun))
7521         {
7522           gimple_stmt_iterator i;
7523
7524           for (i = gsi_start (pre); !gsi_end_p (i); gsi_next (&i))
7525             mark_symbols_for_renaming (gsi_stmt (i));
7526         }
7527       gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
7528     }
7529   if (post_stmt)
7530     gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
7531
7532   if (gimple_referenced_vars (cfun))
7533     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7534       add_referenced_var (t);
7535
7536   pop_gimplify_context (NULL);
7537 }
7538
7539
7540 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
7541    force the result to be either ssa_name or an invariant, otherwise
7542    just force it to be a rhs expression.  If VAR is not NULL, make the
7543    base variable of the final destination be VAR if suitable.  */
7544
7545 tree
7546 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
7547 {
7548   tree t;
7549   enum gimplify_status ret;
7550   gimple_predicate gimple_test_f;
7551   struct gimplify_ctx gctx;
7552
7553   *stmts = NULL;
7554
7555   if (is_gimple_val (expr))
7556     return expr;
7557
7558   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
7559
7560   push_gimplify_context (&gctx);
7561   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7562   gimplify_ctxp->allow_rhs_cond_expr = true;
7563
7564   if (var)
7565     expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
7566
7567   if (TREE_CODE (expr) != MODIFY_EXPR
7568       && TREE_TYPE (expr) == void_type_node)
7569     {
7570       gimplify_and_add (expr, stmts);
7571       expr = NULL_TREE;
7572     }
7573   else
7574     {
7575       ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
7576       gcc_assert (ret != GS_ERROR);
7577     }
7578
7579   if (gimple_referenced_vars (cfun))
7580     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
7581       add_referenced_var (t);
7582
7583   pop_gimplify_context (NULL);
7584
7585   return expr;
7586 }
7587
7588 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
7589    some statements are produced, emits them at GSI.  If BEFORE is true.
7590    the statements are appended before GSI, otherwise they are appended after
7591    it.  M specifies the way GSI moves after insertion (GSI_SAME_STMT or
7592    GSI_CONTINUE_LINKING are the usual values).  */
7593
7594 tree
7595 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
7596                           bool simple_p, tree var, bool before,
7597                           enum gsi_iterator_update m)
7598 {
7599   gimple_seq stmts;
7600
7601   expr = force_gimple_operand (expr, &stmts, simple_p, var);
7602
7603   if (!gimple_seq_empty_p (stmts))
7604     {
7605       if (gimple_in_ssa_p (cfun))
7606         {
7607           gimple_stmt_iterator i;
7608
7609           for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
7610             mark_symbols_for_renaming (gsi_stmt (i));
7611         }
7612
7613       if (before)
7614         gsi_insert_seq_before (gsi, stmts, m);
7615       else
7616         gsi_insert_seq_after (gsi, stmts, m);
7617     }
7618
7619   return expr;
7620 }
7621
7622 #include "gt-gimplify.h"