OSDN Git Service

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