OSDN Git Service

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