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