OSDN Git Service

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