OSDN Git Service

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