OSDN Git Service

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