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