OSDN Git Service

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