OSDN Git Service

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