OSDN Git Service

Add newlib-stdint.h to moxie-eld config.
[pf3gnuchains/gcc-fork.git] / gcc / gimplify.c
1 /* Tree lowering pass.  This pass converts the GENERIC functions-as-trees
2    tree representation into the GIMPLE form.
3    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5    Major work done by Sebastian Pop <s.pop@laposte.net>,
6    Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "gimple.h"
30 #include "tree-iterator.h"
31 #include "tree-inline.h"
32 #include "tree-pretty-print.h"
33 #include "langhooks.h"
34 #include "tree-flow.h"
35 #include "cgraph.h"
36 #include "timevar.h"
37 #include "hashtab.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "output.h"
41 #include "ggc.h"
42 #include "diagnostic-core.h"
43 #include "target.h"
44 #include "pointer-set.h"
45 #include "splay-tree.h"
46 #include "vec.h"
47 #include "gimple.h"
48 #include "tree-pass.h"
49
50 #include "langhooks-def.h"      /* FIXME: for lhd_set_decl_assembler_name.  */
51 #include "expr.h"               /* FIXME: for can_move_by_pieces
52                                    and STACK_CHECK_MAX_VAR_SIZE.  */
53
54 enum gimplify_omp_var_data
55 {
56   GOVD_SEEN = 1,
57   GOVD_EXPLICIT = 2,
58   GOVD_SHARED = 4,
59   GOVD_PRIVATE = 8,
60   GOVD_FIRSTPRIVATE = 16,
61   GOVD_LASTPRIVATE = 32,
62   GOVD_REDUCTION = 64,
63   GOVD_LOCAL = 128,
64   GOVD_DEBUG_PRIVATE = 256,
65   GOVD_PRIVATE_OUTER_REF = 512,
66   GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
67                            | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LOCAL)
68 };
69
70
71 enum omp_region_type
72 {
73   ORT_WORKSHARE = 0,
74   ORT_PARALLEL = 2,
75   ORT_COMBINED_PARALLEL = 3,
76   ORT_TASK = 4,
77   ORT_UNTIED_TASK = 5
78 };
79
80 struct gimplify_omp_ctx
81 {
82   struct gimplify_omp_ctx *outer_context;
83   splay_tree variables;
84   struct pointer_set_t *privatized_types;
85   location_t location;
86   enum omp_clause_default_kind default_kind;
87   enum omp_region_type region_type;
88 };
89
90 static struct gimplify_ctx *gimplify_ctxp;
91 static struct gimplify_omp_ctx *gimplify_omp_ctxp;
92
93
94 /* Formal (expression) temporary table handling: Multiple occurrences of
95    the same scalar expression are evaluated into the same temporary.  */
96
97 typedef struct gimple_temp_hash_elt
98 {
99   tree val;   /* Key */
100   tree temp;  /* Value */
101 } elt_t;
102
103 /* Forward declarations.  */
104 static enum gimplify_status gimplify_compound_expr (tree *, gimple_seq *, bool);
105
106 /* Mark X addressable.  Unlike the langhook we expect X to be in gimple
107    form and we don't do any syntax checking.  */
108 void
109 mark_addressable (tree x)
110 {
111   while (handled_component_p (x))
112     x = TREE_OPERAND (x, 0);
113   if (TREE_CODE (x) == MEM_REF
114       && TREE_CODE (TREE_OPERAND (x, 0)) == ADDR_EXPR)
115     x = TREE_OPERAND (TREE_OPERAND (x, 0), 0);
116   if (TREE_CODE (x) != VAR_DECL
117       && TREE_CODE (x) != PARM_DECL
118       && TREE_CODE (x) != RESULT_DECL)
119     return;
120   TREE_ADDRESSABLE (x) = 1;
121 }
122
123 /* Return a hash value for a formal temporary table entry.  */
124
125 static hashval_t
126 gimple_tree_hash (const void *p)
127 {
128   tree t = ((const elt_t *) p)->val;
129   return iterative_hash_expr (t, 0);
130 }
131
132 /* Compare two formal temporary table entries.  */
133
134 static int
135 gimple_tree_eq (const void *p1, const void *p2)
136 {
137   tree t1 = ((const elt_t *) p1)->val;
138   tree t2 = ((const elt_t *) p2)->val;
139   enum tree_code code = TREE_CODE (t1);
140
141   if (TREE_CODE (t2) != code
142       || TREE_TYPE (t1) != TREE_TYPE (t2))
143     return 0;
144
145   if (!operand_equal_p (t1, t2, 0))
146     return 0;
147
148 #ifdef ENABLE_CHECKING
149   /* Only allow them to compare equal if they also hash equal; otherwise
150      results are nondeterminate, and we fail bootstrap comparison.  */
151   gcc_assert (gimple_tree_hash (p1) == gimple_tree_hash (p2));
152 #endif
153
154   return 1;
155 }
156
157 /* Link gimple statement GS to the end of the sequence *SEQ_P.  If
158    *SEQ_P is NULL, a new sequence is allocated.  This function is
159    similar to gimple_seq_add_stmt, but does not scan the operands.
160    During gimplification, we need to manipulate statement sequences
161    before the def/use vectors have been constructed.  */
162
163 void
164 gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
165 {
166   gimple_stmt_iterator si;
167
168   if (gs == NULL)
169     return;
170
171   if (*seq_p == NULL)
172     *seq_p = gimple_seq_alloc ();
173
174   si = gsi_last (*seq_p);
175
176   gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
177 }
178
179 /* Append sequence SRC to the end of sequence *DST_P.  If *DST_P is
180    NULL, a new sequence is allocated.   This function is
181    similar to gimple_seq_add_seq, but does not scan the operands.
182    During gimplification, we need to manipulate statement sequences
183    before the def/use vectors have been constructed.  */
184
185 static void
186 gimplify_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
187 {
188   gimple_stmt_iterator si;
189
190   if (src == NULL)
191     return;
192
193   if (*dst_p == NULL)
194     *dst_p = gimple_seq_alloc ();
195
196   si = gsi_last (*dst_p);
197   gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
198 }
199
200 /* Set up a context for the gimplifier.  */
201
202 void
203 push_gimplify_context (struct gimplify_ctx *c)
204 {
205   memset (c, '\0', sizeof (*c));
206   c->prev_context = gimplify_ctxp;
207   gimplify_ctxp = c;
208 }
209
210 /* Tear down a context for the gimplifier.  If BODY is non-null, then
211    put the temporaries into the outer BIND_EXPR.  Otherwise, put them
212    in the local_decls.
213
214    BODY is not a sequence, but the first tuple in a sequence.  */
215
216 void
217 pop_gimplify_context (gimple body)
218 {
219   struct gimplify_ctx *c = gimplify_ctxp;
220
221   gcc_assert (c && (c->bind_expr_stack == NULL
222                     || VEC_empty (gimple, c->bind_expr_stack)));
223   VEC_free (gimple, heap, c->bind_expr_stack);
224   gimplify_ctxp = c->prev_context;
225
226   if (body)
227     declare_vars (c->temps, body, false);
228   else
229     record_vars (c->temps);
230
231   if (c->temp_htab)
232     htab_delete (c->temp_htab);
233 }
234
235 static void
236 gimple_push_bind_expr (gimple gimple_bind)
237 {
238   if (gimplify_ctxp->bind_expr_stack == NULL)
239     gimplify_ctxp->bind_expr_stack = VEC_alloc (gimple, heap, 8);
240   VEC_safe_push (gimple, heap, gimplify_ctxp->bind_expr_stack, gimple_bind);
241 }
242
243 static void
244 gimple_pop_bind_expr (void)
245 {
246   VEC_pop (gimple, gimplify_ctxp->bind_expr_stack);
247 }
248
249 gimple
250 gimple_current_bind_expr (void)
251 {
252   return VEC_last (gimple, gimplify_ctxp->bind_expr_stack);
253 }
254
255 /* Return the stack GIMPLE_BINDs created during gimplification.  */
256
257 VEC(gimple, heap) *
258 gimple_bind_expr_stack (void)
259 {
260   return gimplify_ctxp->bind_expr_stack;
261 }
262
263 /* Returns true iff there is a COND_EXPR between us and the innermost
264    CLEANUP_POINT_EXPR.  This info is used by gimple_push_cleanup.  */
265
266 static bool
267 gimple_conditional_context (void)
268 {
269   return gimplify_ctxp->conditions > 0;
270 }
271
272 /* Note that we've entered a COND_EXPR.  */
273
274 static void
275 gimple_push_condition (void)
276 {
277 #ifdef ENABLE_GIMPLE_CHECKING
278   if (gimplify_ctxp->conditions == 0)
279     gcc_assert (gimple_seq_empty_p (gimplify_ctxp->conditional_cleanups));
280 #endif
281   ++(gimplify_ctxp->conditions);
282 }
283
284 /* Note that we've left a COND_EXPR.  If we're back at unconditional scope
285    now, add any conditional cleanups we've seen to the prequeue.  */
286
287 static void
288 gimple_pop_condition (gimple_seq *pre_p)
289 {
290   int conds = --(gimplify_ctxp->conditions);
291
292   gcc_assert (conds >= 0);
293   if (conds == 0)
294     {
295       gimplify_seq_add_seq (pre_p, gimplify_ctxp->conditional_cleanups);
296       gimplify_ctxp->conditional_cleanups = NULL;
297     }
298 }
299
300 /* A stable comparison routine for use with splay trees and DECLs.  */
301
302 static int
303 splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb)
304 {
305   tree a = (tree) xa;
306   tree b = (tree) xb;
307
308   return DECL_UID (a) - DECL_UID (b);
309 }
310
311 /* Create a new omp construct that deals with variable remapping.  */
312
313 static struct gimplify_omp_ctx *
314 new_omp_context (enum omp_region_type region_type)
315 {
316   struct gimplify_omp_ctx *c;
317
318   c = XCNEW (struct gimplify_omp_ctx);
319   c->outer_context = gimplify_omp_ctxp;
320   c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
321   c->privatized_types = pointer_set_create ();
322   c->location = input_location;
323   c->region_type = region_type;
324   if ((region_type & ORT_TASK) == 0)
325     c->default_kind = OMP_CLAUSE_DEFAULT_SHARED;
326   else
327     c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
328
329   return c;
330 }
331
332 /* Destroy an omp construct that deals with variable remapping.  */
333
334 static void
335 delete_omp_context (struct gimplify_omp_ctx *c)
336 {
337   splay_tree_delete (c->variables);
338   pointer_set_destroy (c->privatized_types);
339   XDELETE (c);
340 }
341
342 static void omp_add_variable (struct gimplify_omp_ctx *, tree, unsigned int);
343 static bool omp_notice_variable (struct gimplify_omp_ctx *, tree, bool);
344
345 /* Both gimplify the statement T and append it to *SEQ_P.  This function
346    behaves exactly as gimplify_stmt, but you don't have to pass T as a
347    reference.  */
348
349 void
350 gimplify_and_add (tree t, gimple_seq *seq_p)
351 {
352   gimplify_stmt (&t, seq_p);
353 }
354
355 /* Gimplify statement T into sequence *SEQ_P, and return the first
356    tuple in the sequence of generated tuples for this statement.
357    Return NULL if gimplifying T produced no tuples.  */
358
359 static gimple
360 gimplify_and_return_first (tree t, gimple_seq *seq_p)
361 {
362   gimple_stmt_iterator last = gsi_last (*seq_p);
363
364   gimplify_and_add (t, seq_p);
365
366   if (!gsi_end_p (last))
367     {
368       gsi_next (&last);
369       return gsi_stmt (last);
370     }
371   else
372     return gimple_seq_first_stmt (*seq_p);
373 }
374
375 /* Strip off a legitimate source ending from the input string NAME of
376    length LEN.  Rather than having to know the names used by all of
377    our front ends, we strip off an ending of a period followed by
378    up to five characters.  (Java uses ".class".)  */
379
380 static inline void
381 remove_suffix (char *name, int len)
382 {
383   int i;
384
385   for (i = 2;  i < 8 && len > i;  i++)
386     {
387       if (name[len - i] == '.')
388         {
389           name[len - i] = '\0';
390           break;
391         }
392     }
393 }
394
395 /* Create a new temporary name with PREFIX.  Returns an identifier.  */
396
397 static GTY(()) unsigned int tmp_var_id_num;
398
399 tree
400 create_tmp_var_name (const char *prefix)
401 {
402   char *tmp_name;
403
404   if (prefix)
405     {
406       char *preftmp = ASTRDUP (prefix);
407
408       remove_suffix (preftmp, strlen (preftmp));
409       prefix = preftmp;
410     }
411
412   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
413   return get_identifier (tmp_name);
414 }
415
416
417 /* Create a new temporary variable declaration of type TYPE.
418    Does NOT push it into the current binding.  */
419
420 tree
421 create_tmp_var_raw (tree type, const char *prefix)
422 {
423   tree tmp_var;
424   tree new_type;
425
426   /* Make the type of the variable writable.  */
427   new_type = build_type_variant (type, 0, 0);
428   TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
429
430   tmp_var = build_decl (input_location,
431                         VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
432                         type);
433
434   /* The variable was declared by the compiler.  */
435   DECL_ARTIFICIAL (tmp_var) = 1;
436   /* And we don't want debug info for it.  */
437   DECL_IGNORED_P (tmp_var) = 1;
438
439   /* Make the variable writable.  */
440   TREE_READONLY (tmp_var) = 0;
441
442   DECL_EXTERNAL (tmp_var) = 0;
443   TREE_STATIC (tmp_var) = 0;
444   TREE_USED (tmp_var) = 1;
445
446   return tmp_var;
447 }
448
449 /* Create a new temporary variable declaration of type TYPE.  DOES push the
450    variable into the current binding.  Further, assume that this is called
451    only from gimplification or optimization, at which point the creation of
452    certain types are bugs.  */
453
454 tree
455 create_tmp_var (tree type, const char *prefix)
456 {
457   tree tmp_var;
458
459   /* We don't allow types that are addressable (meaning we can't make copies),
460      or incomplete.  We also used to reject every variable size objects here,
461      but now support those for which a constant upper bound can be obtained.
462      The processing for variable sizes is performed in gimple_add_tmp_var,
463      point at which it really matters and possibly reached via paths not going
464      through this function, e.g. after direct calls to create_tmp_var_raw.  */
465   gcc_assert (!TREE_ADDRESSABLE (type) && COMPLETE_TYPE_P (type));
466
467   tmp_var = create_tmp_var_raw (type, prefix);
468   gimple_add_tmp_var (tmp_var);
469   return tmp_var;
470 }
471
472 /* Create a new temporary variable declaration of type TYPE by calling
473    create_tmp_var and if TYPE is a vector or a complex number, mark the new
474    temporary as gimple register.  */
475
476 tree
477 create_tmp_reg (tree type, const char *prefix)
478 {
479   tree tmp;
480
481   tmp = create_tmp_var (type, prefix);
482   if (TREE_CODE (type) == COMPLEX_TYPE
483       || TREE_CODE (type) == VECTOR_TYPE)
484     DECL_GIMPLE_REG_P (tmp) = 1;
485
486   return tmp;
487 }
488
489 /* Create a temporary with a name derived from VAL.  Subroutine of
490    lookup_tmp_var; nobody else should call this function.  */
491
492 static inline tree
493 create_tmp_from_val (tree val)
494 {
495   return create_tmp_var (TREE_TYPE (val), get_name (val));
496 }
497
498 /* Create a temporary to hold the value of VAL.  If IS_FORMAL, try to reuse
499    an existing expression temporary.  */
500
501 static tree
502 lookup_tmp_var (tree val, bool is_formal)
503 {
504   tree ret;
505
506   /* If not optimizing, never really reuse a temporary.  local-alloc
507      won't allocate any variable that is used in more than one basic
508      block, which means it will go into memory, causing much extra
509      work in reload and final and poorer code generation, outweighing
510      the extra memory allocation here.  */
511   if (!optimize || !is_formal || TREE_SIDE_EFFECTS (val))
512     ret = create_tmp_from_val (val);
513   else
514     {
515       elt_t elt, *elt_p;
516       void **slot;
517
518       elt.val = val;
519       if (gimplify_ctxp->temp_htab == NULL)
520         gimplify_ctxp->temp_htab
521           = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
522       slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
523       if (*slot == NULL)
524         {
525           elt_p = XNEW (elt_t);
526           elt_p->val = val;
527           elt_p->temp = ret = create_tmp_from_val (val);
528           *slot = (void *) elt_p;
529         }
530       else
531         {
532           elt_p = (elt_t *) *slot;
533           ret = elt_p->temp;
534         }
535     }
536
537   return ret;
538 }
539
540
541 /* Return true if T is a CALL_EXPR or an expression that can be
542    assigned to a temporary.  Note that this predicate should only be
543    used during gimplification.  See the rationale for this in
544    gimplify_modify_expr.  */
545
546 static bool
547 is_gimple_reg_rhs_or_call (tree t)
548 {
549   return (get_gimple_rhs_class (TREE_CODE (t)) != GIMPLE_INVALID_RHS
550           || TREE_CODE (t) == CALL_EXPR);
551 }
552
553 /* Return true if T is a valid memory RHS or a CALL_EXPR.  Note that
554    this predicate should only be used during gimplification.  See the
555    rationale for this in gimplify_modify_expr.  */
556
557 static bool
558 is_gimple_mem_rhs_or_call (tree t)
559 {
560   /* If we're dealing with a renamable type, either source or dest must be
561      a renamed variable.  */
562   if (is_gimple_reg_type (TREE_TYPE (t)))
563     return is_gimple_val (t);
564   else
565     return (is_gimple_val (t) || is_gimple_lvalue (t)
566             || TREE_CODE (t) == CALL_EXPR);
567 }
568
569 /* Helper for get_formal_tmp_var and get_initialized_tmp_var.  */
570
571 static tree
572 internal_get_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p,
573                       bool is_formal)
574 {
575   tree t, mod;
576
577   /* Notice that we explicitly allow VAL to be a CALL_EXPR so that we
578      can create an INIT_EXPR and convert it into a GIMPLE_CALL below.  */
579   gimplify_expr (&val, pre_p, post_p, is_gimple_reg_rhs_or_call,
580                  fb_rvalue);
581
582   t = lookup_tmp_var (val, is_formal);
583
584   if (is_formal
585       && (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
586           || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE))
587     DECL_GIMPLE_REG_P (t) = 1;
588
589   mod = build2 (INIT_EXPR, TREE_TYPE (t), t, unshare_expr (val));
590
591   SET_EXPR_LOCATION (mod, EXPR_LOC_OR_HERE (val));
592
593   /* gimplify_modify_expr might want to reduce this further.  */
594   gimplify_and_add (mod, pre_p);
595   ggc_free (mod);
596
597   /* If we're gimplifying into ssa, gimplify_modify_expr will have
598      given our temporary an SSA name.  Find and return it.  */
599   if (gimplify_ctxp->into_ssa)
600     {
601       gimple last = gimple_seq_last_stmt (*pre_p);
602       t = gimple_get_lhs (last);
603     }
604
605   return t;
606 }
607
608 /* Returns a formal temporary variable initialized with VAL.  PRE_P is as
609    in gimplify_expr.  Only use this function if:
610
611    1) The value of the unfactored expression represented by VAL will not
612       change between the initialization and use of the temporary, and
613    2) The temporary will not be otherwise modified.
614
615    For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
616    and #2 means it is inappropriate for && temps.
617
618    For other cases, use get_initialized_tmp_var instead.  */
619
620 tree
621 get_formal_tmp_var (tree val, gimple_seq *pre_p)
622 {
623   return internal_get_tmp_var (val, pre_p, NULL, true);
624 }
625
626 /* Returns a temporary variable initialized with VAL.  PRE_P and POST_P
627    are as in gimplify_expr.  */
628
629 tree
630 get_initialized_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p)
631 {
632   return internal_get_tmp_var (val, pre_p, post_p, false);
633 }
634
635 /* Declares all the variables in VARS in SCOPE.  If DEBUG_INFO is
636    true, generate debug info for them; otherwise don't.  */
637
638 void
639 declare_vars (tree vars, gimple scope, bool debug_info)
640 {
641   tree last = vars;
642   if (last)
643     {
644       tree temps, block;
645
646       gcc_assert (gimple_code (scope) == GIMPLE_BIND);
647
648       temps = nreverse (last);
649
650       block = gimple_bind_block (scope);
651       gcc_assert (!block || TREE_CODE (block) == BLOCK);
652       if (!block || !debug_info)
653         {
654           DECL_CHAIN (last) = gimple_bind_vars (scope);
655           gimple_bind_set_vars (scope, temps);
656         }
657       else
658         {
659           /* We need to attach the nodes both to the BIND_EXPR and to its
660              associated BLOCK for debugging purposes.  The key point here
661              is that the BLOCK_VARS of the BIND_EXPR_BLOCK of a BIND_EXPR
662              is a subchain of the BIND_EXPR_VARS of the BIND_EXPR.  */
663           if (BLOCK_VARS (block))
664             BLOCK_VARS (block) = chainon (BLOCK_VARS (block), temps);
665           else
666             {
667               gimple_bind_set_vars (scope,
668                                     chainon (gimple_bind_vars (scope), temps));
669               BLOCK_VARS (block) = temps;
670             }
671         }
672     }
673 }
674
675 /* For VAR a VAR_DECL of variable size, try to find a constant upper bound
676    for the size and adjust DECL_SIZE/DECL_SIZE_UNIT accordingly.  Abort if
677    no such upper bound can be obtained.  */
678
679 static void
680 force_constant_size (tree var)
681 {
682   /* The only attempt we make is by querying the maximum size of objects
683      of the variable's type.  */
684
685   HOST_WIDE_INT max_size;
686
687   gcc_assert (TREE_CODE (var) == VAR_DECL);
688
689   max_size = max_int_size_in_bytes (TREE_TYPE (var));
690
691   gcc_assert (max_size >= 0);
692
693   DECL_SIZE_UNIT (var)
694     = build_int_cst (TREE_TYPE (DECL_SIZE_UNIT (var)), max_size);
695   DECL_SIZE (var)
696     = build_int_cst (TREE_TYPE (DECL_SIZE (var)), max_size * BITS_PER_UNIT);
697 }
698
699 void
700 gimple_add_tmp_var (tree tmp)
701 {
702   gcc_assert (!DECL_CHAIN (tmp) && !DECL_SEEN_IN_BIND_EXPR_P (tmp));
703
704   /* Later processing assumes that the object size is constant, which might
705      not be true at this point.  Force the use of a constant upper bound in
706      this case.  */
707   if (!host_integerp (DECL_SIZE_UNIT (tmp), 1))
708     force_constant_size (tmp);
709
710   DECL_CONTEXT (tmp) = current_function_decl;
711   DECL_SEEN_IN_BIND_EXPR_P (tmp) = 1;
712
713   if (gimplify_ctxp)
714     {
715       DECL_CHAIN (tmp) = gimplify_ctxp->temps;
716       gimplify_ctxp->temps = tmp;
717
718       /* Mark temporaries local within the nearest enclosing parallel.  */
719       if (gimplify_omp_ctxp)
720         {
721           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
722           while (ctx && ctx->region_type == ORT_WORKSHARE)
723             ctx = ctx->outer_context;
724           if (ctx)
725             omp_add_variable (ctx, tmp, GOVD_LOCAL | GOVD_SEEN);
726         }
727     }
728   else if (cfun)
729     record_vars (tmp);
730   else
731     {
732       gimple_seq body_seq;
733
734       /* This case is for nested functions.  We need to expose the locals
735          they create.  */
736       body_seq = gimple_body (current_function_decl);
737       declare_vars (tmp, gimple_seq_first_stmt (body_seq), false);
738     }
739 }
740
741 /* Determines whether to assign a location to the statement GS.  */
742
743 static bool
744 should_carry_location_p (gimple gs)
745 {
746   /* Don't emit a line note for a label.  We particularly don't want to
747      emit one for the break label, since it doesn't actually correspond
748      to the beginning of the loop/switch.  */
749   if (gimple_code (gs) == GIMPLE_LABEL)
750     return false;
751
752   return true;
753 }
754
755
756 /* Return true if a location should not be emitted for this statement
757    by annotate_one_with_location.  */
758
759 static inline bool
760 gimple_do_not_emit_location_p (gimple g)
761 {
762   return gimple_plf (g, GF_PLF_1);
763 }
764
765 /* Mark statement G so a location will not be emitted by
766    annotate_one_with_location.  */
767
768 static inline void
769 gimple_set_do_not_emit_location (gimple g)
770 {
771   /* The PLF flags are initialized to 0 when a new tuple is created,
772      so no need to initialize it anywhere.  */
773   gimple_set_plf (g, GF_PLF_1, true);
774 }
775
776 /* Set the location for gimple statement GS to LOCATION.  */
777
778 static void
779 annotate_one_with_location (gimple gs, location_t location)
780 {
781   if (!gimple_has_location (gs)
782       && !gimple_do_not_emit_location_p (gs)
783       && should_carry_location_p (gs))
784     gimple_set_location (gs, location);
785 }
786
787
788 /* Set LOCATION for all the statements after iterator GSI in sequence
789    SEQ.  If GSI is pointing to the end of the sequence, start with the
790    first statement in SEQ.  */
791
792 static void
793 annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
794                                   location_t location)
795 {
796   if (gsi_end_p (gsi))
797     gsi = gsi_start (seq);
798   else
799     gsi_next (&gsi);
800
801   for (; !gsi_end_p (gsi); gsi_next (&gsi))
802     annotate_one_with_location (gsi_stmt (gsi), location);
803 }
804
805
806 /* Set the location for all the statements in a sequence STMT_P to LOCATION.  */
807
808 void
809 annotate_all_with_location (gimple_seq stmt_p, location_t location)
810 {
811   gimple_stmt_iterator i;
812
813   if (gimple_seq_empty_p (stmt_p))
814     return;
815
816   for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
817     {
818       gimple gs = gsi_stmt (i);
819       annotate_one_with_location (gs, location);
820     }
821 }
822 \f
823 /* This page contains routines to unshare tree nodes, i.e. to duplicate tree
824    nodes that are referenced more than once in GENERIC functions.  This is
825    necessary because gimplification (translation into GIMPLE) is performed
826    by modifying tree nodes in-place, so gimplication of a shared node in a
827    first context could generate an invalid GIMPLE form in a second context.
828
829    This is achieved with a simple mark/copy/unmark algorithm that walks the
830    GENERIC representation top-down, marks nodes with TREE_VISITED the first
831    time it encounters them, duplicates them if they already have TREE_VISITED
832    set, and finally removes the TREE_VISITED marks it has set.
833
834    The algorithm works only at the function level, i.e. it generates a GENERIC
835    representation of a function with no nodes shared within the function when
836    passed a GENERIC function (except for nodes that are allowed to be shared).
837
838    At the global level, it is also necessary to unshare tree nodes that are
839    referenced in more than one function, for the same aforementioned reason.
840    This requires some cooperation from the front-end.  There are 2 strategies:
841
842      1. Manual unsharing.  The front-end needs to call unshare_expr on every
843         expression that might end up being shared across functions.
844
845      2. Deep unsharing.  This is an extension of regular unsharing.  Instead
846         of calling unshare_expr on expressions that might be shared across
847         functions, the front-end pre-marks them with TREE_VISITED.  This will
848         ensure that they are unshared on the first reference within functions
849         when the regular unsharing algorithm runs.  The counterpart is that
850         this algorithm must look deeper than for manual unsharing, which is
851         specified by LANG_HOOKS_DEEP_UNSHARING.
852
853   If there are only few specific cases of node sharing across functions, it is
854   probably easier for a front-end to unshare the expressions manually.  On the
855   contrary, if the expressions generated at the global level are as widespread
856   as expressions generated within functions, deep unsharing is very likely the
857   way to go.  */
858
859 /* Similar to copy_tree_r but do not copy SAVE_EXPR or TARGET_EXPR nodes.
860    These nodes model computations that should only be done once.  If we
861    were to unshare something like SAVE_EXPR(i++), the gimplification
862    process would create wrong code.  */
863
864 static tree
865 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
866 {
867   tree t = *tp;
868   enum tree_code code = TREE_CODE (t);
869
870   /* Do not copy SAVE_EXPR, TARGET_EXPR or BIND_EXPR nodes themselves, but
871      copy their subtrees if we can make sure to do it only once.  */
872   if (code == SAVE_EXPR || code == TARGET_EXPR || code == BIND_EXPR)
873     {
874       if (data && !pointer_set_insert ((struct pointer_set_t *)data, t))
875         ;
876       else
877         *walk_subtrees = 0;
878     }
879
880   /* Stop at types, decls, constants like copy_tree_r.  */
881   else if (TREE_CODE_CLASS (code) == tcc_type
882            || TREE_CODE_CLASS (code) == tcc_declaration
883            || TREE_CODE_CLASS (code) == tcc_constant
884            /* We can't do anything sensible with a BLOCK used as an
885               expression, but we also can't just die when we see it
886               because of non-expression uses.  So we avert our eyes
887               and cross our fingers.  Silly Java.  */
888            || code == BLOCK)
889     *walk_subtrees = 0;
890
891   /* Cope with the statement expression extension.  */
892   else if (code == STATEMENT_LIST)
893     ;
894
895   /* Leave the bulk of the work to copy_tree_r itself.  */
896   else
897     copy_tree_r (tp, walk_subtrees, NULL);
898
899   return NULL_TREE;
900 }
901
902 /* Callback for walk_tree to unshare most of the shared trees rooted at
903    *TP.  If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
904    then *TP is deep copied by calling mostly_copy_tree_r.  */
905
906 static tree
907 copy_if_shared_r (tree *tp, int *walk_subtrees, void *data)
908 {
909   tree t = *tp;
910   enum tree_code code = TREE_CODE (t);
911
912   /* Skip types, decls, and constants.  But we do want to look at their
913      types and the bounds of types.  Mark them as visited so we properly
914      unmark their subtrees on the unmark pass.  If we've already seen them,
915      don't look down further.  */
916   if (TREE_CODE_CLASS (code) == tcc_type
917       || TREE_CODE_CLASS (code) == tcc_declaration
918       || TREE_CODE_CLASS (code) == tcc_constant)
919     {
920       if (TREE_VISITED (t))
921         *walk_subtrees = 0;
922       else
923         TREE_VISITED (t) = 1;
924     }
925
926   /* If this node has been visited already, unshare it and don't look
927      any deeper.  */
928   else if (TREE_VISITED (t))
929     {
930       walk_tree (tp, mostly_copy_tree_r, data, NULL);
931       *walk_subtrees = 0;
932     }
933
934   /* Otherwise, mark the node as visited and keep looking.  */
935   else
936     TREE_VISITED (t) = 1;
937
938   return NULL_TREE;
939 }
940
941 /* Unshare most of the shared trees rooted at *TP. */
942
943 static inline void
944 copy_if_shared (tree *tp)
945 {
946   /* If the language requires deep unsharing, we need a pointer set to make
947      sure we don't repeatedly unshare subtrees of unshareable nodes.  */
948   struct pointer_set_t *visited
949     = lang_hooks.deep_unsharing ? pointer_set_create () : NULL;
950   walk_tree (tp, copy_if_shared_r, visited, NULL);
951   if (visited)
952     pointer_set_destroy (visited);
953 }
954
955 /* Unshare all the trees in BODY_P, a pointer into the body of FNDECL, and the
956    bodies of any nested functions if we are unsharing the entire body of
957    FNDECL.  */
958
959 static void
960 unshare_body (tree *body_p, tree fndecl)
961 {
962   struct cgraph_node *cgn = cgraph_node (fndecl);
963
964   copy_if_shared (body_p);
965
966   if (body_p == &DECL_SAVED_TREE (fndecl))
967     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
968       unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
969 }
970
971 /* Callback for walk_tree to unmark the visited trees rooted at *TP.
972    Subtrees are walked until the first unvisited node is encountered.  */
973
974 static tree
975 unmark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
976 {
977   tree t = *tp;
978
979   /* If this node has been visited, unmark it and keep looking.  */
980   if (TREE_VISITED (t))
981     TREE_VISITED (t) = 0;
982
983   /* Otherwise, don't look any deeper.  */
984   else
985     *walk_subtrees = 0;
986
987   return NULL_TREE;
988 }
989
990 /* Unmark the visited trees rooted at *TP.  */
991
992 static inline void
993 unmark_visited (tree *tp)
994 {
995   walk_tree (tp, unmark_visited_r, NULL, NULL);
996 }
997
998 /* Likewise, but mark all trees as not visited.  */
999
1000 static void
1001 unvisit_body (tree *body_p, tree fndecl)
1002 {
1003   struct cgraph_node *cgn = cgraph_node (fndecl);
1004
1005   unmark_visited (body_p);
1006
1007   if (body_p == &DECL_SAVED_TREE (fndecl))
1008     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
1009       unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
1010 }
1011
1012 /* Unconditionally make an unshared copy of EXPR.  This is used when using
1013    stored expressions which span multiple functions, such as BINFO_VTABLE,
1014    as the normal unsharing process can't tell that they're shared.  */
1015
1016 tree
1017 unshare_expr (tree expr)
1018 {
1019   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
1020   return expr;
1021 }
1022 \f
1023 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
1024    contain statements and have a value.  Assign its value to a temporary
1025    and give it void_type_node.  Returns the temporary, or NULL_TREE if
1026    WRAPPER was already void.  */
1027
1028 tree
1029 voidify_wrapper_expr (tree wrapper, tree temp)
1030 {
1031   tree type = TREE_TYPE (wrapper);
1032   if (type && !VOID_TYPE_P (type))
1033     {
1034       tree *p;
1035
1036       /* Set p to point to the body of the wrapper.  Loop until we find
1037          something that isn't a wrapper.  */
1038       for (p = &wrapper; p && *p; )
1039         {
1040           switch (TREE_CODE (*p))
1041             {
1042             case BIND_EXPR:
1043               TREE_SIDE_EFFECTS (*p) = 1;
1044               TREE_TYPE (*p) = void_type_node;
1045               /* For a BIND_EXPR, the body is operand 1.  */
1046               p = &BIND_EXPR_BODY (*p);
1047               break;
1048
1049             case CLEANUP_POINT_EXPR:
1050             case TRY_FINALLY_EXPR:
1051             case TRY_CATCH_EXPR:
1052               TREE_SIDE_EFFECTS (*p) = 1;
1053               TREE_TYPE (*p) = void_type_node;
1054               p = &TREE_OPERAND (*p, 0);
1055               break;
1056
1057             case STATEMENT_LIST:
1058               {
1059                 tree_stmt_iterator i = tsi_last (*p);
1060                 TREE_SIDE_EFFECTS (*p) = 1;
1061                 TREE_TYPE (*p) = void_type_node;
1062                 p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
1063               }
1064               break;
1065
1066             case COMPOUND_EXPR:
1067               /* Advance to the last statement.  Set all container types to void.  */
1068               for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
1069                 {
1070                   TREE_SIDE_EFFECTS (*p) = 1;
1071                   TREE_TYPE (*p) = void_type_node;
1072                 }
1073               break;
1074
1075             default:
1076               goto out;
1077             }
1078         }
1079
1080     out:
1081       if (p == NULL || IS_EMPTY_STMT (*p))
1082         temp = NULL_TREE;
1083       else if (temp)
1084         {
1085           /* The wrapper is on the RHS of an assignment that we're pushing
1086              down.  */
1087           gcc_assert (TREE_CODE (temp) == INIT_EXPR
1088                       || TREE_CODE (temp) == MODIFY_EXPR);
1089           TREE_OPERAND (temp, 1) = *p;
1090           *p = temp;
1091         }
1092       else
1093         {
1094           temp = create_tmp_var (type, "retval");
1095           *p = build2 (INIT_EXPR, type, temp, *p);
1096         }
1097
1098       return temp;
1099     }
1100
1101   return NULL_TREE;
1102 }
1103
1104 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
1105    a temporary through which they communicate.  */
1106
1107 static void
1108 build_stack_save_restore (gimple *save, gimple *restore)
1109 {
1110   tree tmp_var;
1111
1112   *save = gimple_build_call (implicit_built_in_decls[BUILT_IN_STACK_SAVE], 0);
1113   tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
1114   gimple_call_set_lhs (*save, tmp_var);
1115
1116   *restore = gimple_build_call (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
1117                             1, tmp_var);
1118 }
1119
1120 /* Gimplify a BIND_EXPR.  Just voidify and recurse.  */
1121
1122 static enum gimplify_status
1123 gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p)
1124 {
1125   tree bind_expr = *expr_p;
1126   bool old_save_stack = gimplify_ctxp->save_stack;
1127   tree t;
1128   gimple gimple_bind;
1129   gimple_seq body;
1130
1131   tree temp = voidify_wrapper_expr (bind_expr, NULL);
1132
1133   /* Mark variables seen in this bind expr.  */
1134   for (t = BIND_EXPR_VARS (bind_expr); t ; t = DECL_CHAIN (t))
1135     {
1136       if (TREE_CODE (t) == VAR_DECL)
1137         {
1138           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
1139
1140           /* Mark variable as local.  */
1141           if (ctx && !is_global_var (t)
1142               && (! DECL_SEEN_IN_BIND_EXPR_P (t)
1143                   || splay_tree_lookup (ctx->variables,
1144                                         (splay_tree_key) t) == NULL))
1145             omp_add_variable (gimplify_omp_ctxp, t, GOVD_LOCAL | GOVD_SEEN);
1146
1147           DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
1148
1149           if (DECL_HARD_REGISTER (t) && !is_global_var (t) && cfun)
1150             cfun->has_local_explicit_reg_vars = true;
1151         }
1152
1153       /* Preliminarily mark non-addressed complex variables as eligible
1154          for promotion to gimple registers.  We'll transform their uses
1155          as we find them.  */
1156       if ((TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
1157            || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
1158           && !TREE_THIS_VOLATILE (t)
1159           && (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
1160           && !needs_to_live_in_memory (t))
1161         DECL_GIMPLE_REG_P (t) = 1;
1162     }
1163
1164   gimple_bind = gimple_build_bind (BIND_EXPR_VARS (bind_expr), NULL,
1165                                    BIND_EXPR_BLOCK (bind_expr));
1166   gimple_push_bind_expr (gimple_bind);
1167
1168   gimplify_ctxp->save_stack = false;
1169
1170   /* Gimplify the body into the GIMPLE_BIND tuple's body.  */
1171   body = NULL;
1172   gimplify_stmt (&BIND_EXPR_BODY (bind_expr), &body);
1173   gimple_bind_set_body (gimple_bind, body);
1174
1175   if (gimplify_ctxp->save_stack)
1176     {
1177       gimple stack_save, stack_restore, gs;
1178       gimple_seq cleanup, new_body;
1179
1180       /* Save stack on entry and restore it on exit.  Add a try_finally
1181          block to achieve this.  Note that mudflap depends on the
1182          format of the emitted code: see mx_register_decls().  */
1183       build_stack_save_restore (&stack_save, &stack_restore);
1184
1185       cleanup = new_body = NULL;
1186       gimplify_seq_add_stmt (&cleanup, stack_restore);
1187       gs = gimple_build_try (gimple_bind_body (gimple_bind), cleanup,
1188                              GIMPLE_TRY_FINALLY);
1189
1190       gimplify_seq_add_stmt (&new_body, stack_save);
1191       gimplify_seq_add_stmt (&new_body, gs);
1192       gimple_bind_set_body (gimple_bind, new_body);
1193     }
1194
1195   gimplify_ctxp->save_stack = old_save_stack;
1196   gimple_pop_bind_expr ();
1197
1198   gimplify_seq_add_stmt (pre_p, gimple_bind);
1199
1200   if (temp)
1201     {
1202       *expr_p = temp;
1203       return GS_OK;
1204     }
1205
1206   *expr_p = NULL_TREE;
1207   return GS_ALL_DONE;
1208 }
1209
1210 /* Gimplify a RETURN_EXPR.  If the expression to be returned is not a
1211    GIMPLE value, it is assigned to a new temporary and the statement is
1212    re-written to return the temporary.
1213
1214    PRE_P points to the sequence where side effects that must happen before
1215    STMT should be stored.  */
1216
1217 static enum gimplify_status
1218 gimplify_return_expr (tree stmt, gimple_seq *pre_p)
1219 {
1220   gimple ret;
1221   tree ret_expr = TREE_OPERAND (stmt, 0);
1222   tree result_decl, result;
1223
1224   if (ret_expr == error_mark_node)
1225     return GS_ERROR;
1226
1227   if (!ret_expr
1228       || TREE_CODE (ret_expr) == RESULT_DECL
1229       || ret_expr == error_mark_node)
1230     {
1231       gimple ret = gimple_build_return (ret_expr);
1232       gimple_set_no_warning (ret, TREE_NO_WARNING (stmt));
1233       gimplify_seq_add_stmt (pre_p, ret);
1234       return GS_ALL_DONE;
1235     }
1236
1237   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
1238     result_decl = NULL_TREE;
1239   else
1240     {
1241       result_decl = TREE_OPERAND (ret_expr, 0);
1242
1243       /* See through a return by reference.  */
1244       if (TREE_CODE (result_decl) == INDIRECT_REF)
1245         result_decl = TREE_OPERAND (result_decl, 0);
1246
1247       gcc_assert ((TREE_CODE (ret_expr) == MODIFY_EXPR
1248                    || TREE_CODE (ret_expr) == INIT_EXPR)
1249                   && TREE_CODE (result_decl) == RESULT_DECL);
1250     }
1251
1252   /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
1253      Recall that aggregate_value_p is FALSE for any aggregate type that is
1254      returned in registers.  If we're returning values in registers, then
1255      we don't want to extend the lifetime of the RESULT_DECL, particularly
1256      across another call.  In addition, for those aggregates for which
1257      hard_function_value generates a PARALLEL, we'll die during normal
1258      expansion of structure assignments; there's special code in expand_return
1259      to handle this case that does not exist in expand_expr.  */
1260   if (!result_decl)
1261     result = NULL_TREE;
1262   else if (aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
1263     {
1264       if (TREE_CODE (DECL_SIZE (result_decl)) != INTEGER_CST)
1265         {
1266           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (result_decl)))
1267             gimplify_type_sizes (TREE_TYPE (result_decl), pre_p);
1268           /* Note that we don't use gimplify_vla_decl because the RESULT_DECL
1269              should be effectively allocated by the caller, i.e. all calls to
1270              this function must be subject to the Return Slot Optimization.  */
1271           gimplify_one_sizepos (&DECL_SIZE (result_decl), pre_p);
1272           gimplify_one_sizepos (&DECL_SIZE_UNIT (result_decl), pre_p);
1273         }
1274       result = result_decl;
1275     }
1276   else if (gimplify_ctxp->return_temp)
1277     result = gimplify_ctxp->return_temp;
1278   else
1279     {
1280       result = create_tmp_reg (TREE_TYPE (result_decl), NULL);
1281
1282       /* ??? With complex control flow (usually involving abnormal edges),
1283          we can wind up warning about an uninitialized value for this.  Due
1284          to how this variable is constructed and initialized, this is never
1285          true.  Give up and never warn.  */
1286       TREE_NO_WARNING (result) = 1;
1287
1288       gimplify_ctxp->return_temp = result;
1289     }
1290
1291   /* Smash the lhs of the MODIFY_EXPR to the temporary we plan to use.
1292      Then gimplify the whole thing.  */
1293   if (result != result_decl)
1294     TREE_OPERAND (ret_expr, 0) = result;
1295
1296   gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
1297
1298   ret = gimple_build_return (result);
1299   gimple_set_no_warning (ret, TREE_NO_WARNING (stmt));
1300   gimplify_seq_add_stmt (pre_p, ret);
1301
1302   return GS_ALL_DONE;
1303 }
1304
1305 static void
1306 gimplify_vla_decl (tree decl, gimple_seq *seq_p)
1307 {
1308   /* This is a variable-sized decl.  Simplify its size and mark it
1309      for deferred expansion.  Note that mudflap depends on the format
1310      of the emitted code: see mx_register_decls().  */
1311   tree t, addr, ptr_type;
1312
1313   gimplify_one_sizepos (&DECL_SIZE (decl), seq_p);
1314   gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), seq_p);
1315
1316   /* All occurrences of this decl in final gimplified code will be
1317      replaced by indirection.  Setting DECL_VALUE_EXPR does two
1318      things: First, it lets the rest of the gimplifier know what
1319      replacement to use.  Second, it lets the debug info know
1320      where to find the value.  */
1321   ptr_type = build_pointer_type (TREE_TYPE (decl));
1322   addr = create_tmp_var (ptr_type, get_name (decl));
1323   DECL_IGNORED_P (addr) = 0;
1324   t = build_fold_indirect_ref (addr);
1325   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                && DECL_P (TYPE_SIZE_UNIT (TREE_TYPE (decl))))
5516         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
5517     }
5518   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
5519     {
5520       gcc_assert ((flags & GOVD_LOCAL) == 0);
5521       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5522
5523       /* Similar to the direct variable sized case above, we'll need the
5524          size of references being privatized.  */
5525       if ((flags & GOVD_SHARED) == 0)
5526         {
5527           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
5528           if (TREE_CODE (t) != INTEGER_CST)
5529             omp_notice_variable (ctx, t, true);
5530         }
5531     }
5532
5533   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
5534 }
5535
5536 /* Notice a threadprivate variable DECL used in OpenMP context CTX.
5537    This just prints out diagnostics about threadprivate variable uses
5538    in untied tasks.  If DECL2 is non-NULL, prevent this warning
5539    on that variable.  */
5540
5541 static bool
5542 omp_notice_threadprivate_variable (struct gimplify_omp_ctx *ctx, tree decl,
5543                                    tree decl2)
5544 {
5545   splay_tree_node n;
5546
5547   if (ctx->region_type != ORT_UNTIED_TASK)
5548     return false;
5549   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5550   if (n == NULL)
5551     {
5552       error ("threadprivate variable %qE used in untied task", DECL_NAME (decl));
5553       error_at (ctx->location, "enclosing task");
5554       splay_tree_insert (ctx->variables, (splay_tree_key)decl, 0);
5555     }
5556   if (decl2)
5557     splay_tree_insert (ctx->variables, (splay_tree_key)decl2, 0);
5558   return false;
5559 }
5560
5561 /* Record the fact that DECL was used within the OpenMP context CTX.
5562    IN_CODE is true when real code uses DECL, and false when we should
5563    merely emit default(none) errors.  Return true if DECL is going to
5564    be remapped and thus DECL shouldn't be gimplified into its
5565    DECL_VALUE_EXPR (if any).  */
5566
5567 static bool
5568 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
5569 {
5570   splay_tree_node n;
5571   unsigned flags = in_code ? GOVD_SEEN : 0;
5572   bool ret = false, shared;
5573
5574   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5575     return false;
5576
5577   /* Threadprivate variables are predetermined.  */
5578   if (is_global_var (decl))
5579     {
5580       if (DECL_THREAD_LOCAL_P (decl))
5581         return omp_notice_threadprivate_variable (ctx, decl, NULL_TREE);
5582
5583       if (DECL_HAS_VALUE_EXPR_P (decl))
5584         {
5585           tree value = get_base_address (DECL_VALUE_EXPR (decl));
5586
5587           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
5588             return omp_notice_threadprivate_variable (ctx, decl, value);
5589         }
5590     }
5591
5592   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5593   if (n == NULL)
5594     {
5595       enum omp_clause_default_kind default_kind, kind;
5596       struct gimplify_omp_ctx *octx;
5597
5598       if (ctx->region_type == ORT_WORKSHARE)
5599         goto do_outer;
5600
5601       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
5602          remapped firstprivate instead of shared.  To some extent this is
5603          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
5604       default_kind = ctx->default_kind;
5605       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
5606       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
5607         default_kind = kind;
5608
5609       switch (default_kind)
5610         {
5611         case OMP_CLAUSE_DEFAULT_NONE:
5612           error ("%qE not specified in enclosing parallel",
5613                  DECL_NAME (lang_hooks.decls.omp_report_decl (decl)));
5614           if ((ctx->region_type & ORT_TASK) != 0)
5615             error_at (ctx->location, "enclosing task");
5616           else
5617             error_at (ctx->location, "enclosing parallel");
5618           /* FALLTHRU */
5619         case OMP_CLAUSE_DEFAULT_SHARED:
5620           flags |= GOVD_SHARED;
5621           break;
5622         case OMP_CLAUSE_DEFAULT_PRIVATE:
5623           flags |= GOVD_PRIVATE;
5624           break;
5625         case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
5626           flags |= GOVD_FIRSTPRIVATE;
5627           break;
5628         case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
5629           /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED.  */
5630           gcc_assert ((ctx->region_type & ORT_TASK) != 0);
5631           if (ctx->outer_context)
5632             omp_notice_variable (ctx->outer_context, decl, in_code);
5633           for (octx = ctx->outer_context; octx; octx = octx->outer_context)
5634             {
5635               splay_tree_node n2;
5636
5637               n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
5638               if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED)
5639                 {
5640                   flags |= GOVD_FIRSTPRIVATE;
5641                   break;
5642                 }
5643               if ((octx->region_type & ORT_PARALLEL) != 0)
5644                 break;
5645             }
5646           if (flags & GOVD_FIRSTPRIVATE)
5647             break;
5648           if (octx == NULL
5649               && (TREE_CODE (decl) == PARM_DECL
5650                   || (!is_global_var (decl)
5651                       && DECL_CONTEXT (decl) == current_function_decl)))
5652             {
5653               flags |= GOVD_FIRSTPRIVATE;
5654               break;
5655             }
5656           flags |= GOVD_SHARED;
5657           break;
5658         default:
5659           gcc_unreachable ();
5660         }
5661
5662       if ((flags & GOVD_PRIVATE)
5663           && lang_hooks.decls.omp_private_outer_ref (decl))
5664         flags |= GOVD_PRIVATE_OUTER_REF;
5665
5666       omp_add_variable (ctx, decl, flags);
5667
5668       shared = (flags & GOVD_SHARED) != 0;
5669       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5670       goto do_outer;
5671     }
5672
5673   if ((n->value & (GOVD_SEEN | GOVD_LOCAL)) == 0
5674       && (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
5675       && DECL_SIZE (decl)
5676       && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5677     {
5678       splay_tree_node n2;
5679       tree t = DECL_VALUE_EXPR (decl);
5680       gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5681       t = TREE_OPERAND (t, 0);
5682       gcc_assert (DECL_P (t));
5683       n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
5684       n2->value |= GOVD_SEEN;
5685     }
5686
5687   shared = ((flags | n->value) & GOVD_SHARED) != 0;
5688   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5689
5690   /* If nothing changed, there's nothing left to do.  */
5691   if ((n->value & flags) == flags)
5692     return ret;
5693   flags |= n->value;
5694   n->value = flags;
5695
5696  do_outer:
5697   /* If the variable is private in the current context, then we don't
5698      need to propagate anything to an outer context.  */
5699   if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
5700     return ret;
5701   if (ctx->outer_context
5702       && omp_notice_variable (ctx->outer_context, decl, in_code))
5703     return true;
5704   return ret;
5705 }
5706
5707 /* Verify that DECL is private within CTX.  If there's specific information
5708    to the contrary in the innermost scope, generate an error.  */
5709
5710 static bool
5711 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
5712 {
5713   splay_tree_node n;
5714
5715   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5716   if (n != NULL)
5717     {
5718       if (n->value & GOVD_SHARED)
5719         {
5720           if (ctx == gimplify_omp_ctxp)
5721             {
5722               error ("iteration variable %qE should be private",
5723                      DECL_NAME (decl));
5724               n->value = GOVD_PRIVATE;
5725               return true;
5726             }
5727           else
5728             return false;
5729         }
5730       else if ((n->value & GOVD_EXPLICIT) != 0
5731                && (ctx == gimplify_omp_ctxp
5732                    || (ctx->region_type == ORT_COMBINED_PARALLEL
5733                        && gimplify_omp_ctxp->outer_context == ctx)))
5734         {
5735           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
5736             error ("iteration variable %qE should not be firstprivate",
5737                    DECL_NAME (decl));
5738           else if ((n->value & GOVD_REDUCTION) != 0)
5739             error ("iteration variable %qE should not be reduction",
5740                    DECL_NAME (decl));
5741         }
5742       return (ctx == gimplify_omp_ctxp
5743               || (ctx->region_type == ORT_COMBINED_PARALLEL
5744                   && gimplify_omp_ctxp->outer_context == ctx));
5745     }
5746
5747   if (ctx->region_type != ORT_WORKSHARE)
5748     return false;
5749   else if (ctx->outer_context)
5750     return omp_is_private (ctx->outer_context, decl);
5751   return false;
5752 }
5753
5754 /* Return true if DECL is private within a parallel region
5755    that binds to the current construct's context or in parallel
5756    region's REDUCTION clause.  */
5757
5758 static bool
5759 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
5760 {
5761   splay_tree_node n;
5762
5763   do
5764     {
5765       ctx = ctx->outer_context;
5766       if (ctx == NULL)
5767         return !(is_global_var (decl)
5768                  /* References might be private, but might be shared too.  */
5769                  || lang_hooks.decls.omp_privatize_by_reference (decl));
5770
5771       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5772       if (n != NULL)
5773         return (n->value & GOVD_SHARED) == 0;
5774     }
5775   while (ctx->region_type == ORT_WORKSHARE);
5776   return false;
5777 }
5778
5779 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
5780    and previous omp contexts.  */
5781
5782 static void
5783 gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
5784                            enum omp_region_type region_type)
5785 {
5786   struct gimplify_omp_ctx *ctx, *outer_ctx;
5787   struct gimplify_ctx gctx;
5788   tree c;
5789
5790   ctx = new_omp_context (region_type);
5791   outer_ctx = ctx->outer_context;
5792
5793   while ((c = *list_p) != NULL)
5794     {
5795       bool remove = false;
5796       bool notice_outer = true;
5797       const char *check_non_private = NULL;
5798       unsigned int flags;
5799       tree decl;
5800
5801       switch (OMP_CLAUSE_CODE (c))
5802         {
5803         case OMP_CLAUSE_PRIVATE:
5804           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
5805           if (lang_hooks.decls.omp_private_outer_ref (OMP_CLAUSE_DECL (c)))
5806             {
5807               flags |= GOVD_PRIVATE_OUTER_REF;
5808               OMP_CLAUSE_PRIVATE_OUTER_REF (c) = 1;
5809             }
5810           else
5811             notice_outer = false;
5812           goto do_add;
5813         case OMP_CLAUSE_SHARED:
5814           flags = GOVD_SHARED | GOVD_EXPLICIT;
5815           goto do_add;
5816         case OMP_CLAUSE_FIRSTPRIVATE:
5817           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
5818           check_non_private = "firstprivate";
5819           goto do_add;
5820         case OMP_CLAUSE_LASTPRIVATE:
5821           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
5822           check_non_private = "lastprivate";
5823           goto do_add;
5824         case OMP_CLAUSE_REDUCTION:
5825           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
5826           check_non_private = "reduction";
5827           goto do_add;
5828
5829         do_add:
5830           decl = OMP_CLAUSE_DECL (c);
5831           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5832             {
5833               remove = true;
5834               break;
5835             }
5836           omp_add_variable (ctx, decl, flags);
5837           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5838               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
5839             {
5840               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
5841                                 GOVD_LOCAL | GOVD_SEEN);
5842               gimplify_omp_ctxp = ctx;
5843               push_gimplify_context (&gctx);
5844
5845               OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c) = gimple_seq_alloc ();
5846               OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c) = gimple_seq_alloc ();
5847
5848               gimplify_and_add (OMP_CLAUSE_REDUCTION_INIT (c),
5849                                 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c));
5850               pop_gimplify_context
5851                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)));
5852               push_gimplify_context (&gctx);
5853               gimplify_and_add (OMP_CLAUSE_REDUCTION_MERGE (c),
5854                                 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c));
5855               pop_gimplify_context
5856                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c)));
5857               OMP_CLAUSE_REDUCTION_INIT (c) = NULL_TREE;
5858               OMP_CLAUSE_REDUCTION_MERGE (c) = NULL_TREE;
5859
5860               gimplify_omp_ctxp = outer_ctx;
5861             }
5862           else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5863                    && OMP_CLAUSE_LASTPRIVATE_STMT (c))
5864             {
5865               gimplify_omp_ctxp = ctx;
5866               push_gimplify_context (&gctx);
5867               if (TREE_CODE (OMP_CLAUSE_LASTPRIVATE_STMT (c)) != BIND_EXPR)
5868                 {
5869                   tree bind = build3 (BIND_EXPR, void_type_node, NULL,
5870                                       NULL, NULL);
5871                   TREE_SIDE_EFFECTS (bind) = 1;
5872                   BIND_EXPR_BODY (bind) = OMP_CLAUSE_LASTPRIVATE_STMT (c);
5873                   OMP_CLAUSE_LASTPRIVATE_STMT (c) = bind;
5874                 }
5875               gimplify_and_add (OMP_CLAUSE_LASTPRIVATE_STMT (c),
5876                                 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5877               pop_gimplify_context
5878                 (gimple_seq_first_stmt (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)));
5879               OMP_CLAUSE_LASTPRIVATE_STMT (c) = NULL_TREE;
5880
5881               gimplify_omp_ctxp = outer_ctx;
5882             }
5883           if (notice_outer)
5884             goto do_notice;
5885           break;
5886
5887         case OMP_CLAUSE_COPYIN:
5888         case OMP_CLAUSE_COPYPRIVATE:
5889           decl = OMP_CLAUSE_DECL (c);
5890           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
5891             {
5892               remove = true;
5893               break;
5894             }
5895         do_notice:
5896           if (outer_ctx)
5897             omp_notice_variable (outer_ctx, decl, true);
5898           if (check_non_private
5899               && region_type == ORT_WORKSHARE
5900               && omp_check_private (ctx, decl))
5901             {
5902               error ("%s variable %qE is private in outer context",
5903                      check_non_private, DECL_NAME (decl));
5904               remove = true;
5905             }
5906           break;
5907
5908         case OMP_CLAUSE_IF:
5909           OMP_CLAUSE_OPERAND (c, 0)
5910             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
5911           /* Fall through.  */
5912
5913         case OMP_CLAUSE_SCHEDULE:
5914         case OMP_CLAUSE_NUM_THREADS:
5915           if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
5916                              is_gimple_val, fb_rvalue) == GS_ERROR)
5917               remove = true;
5918           break;
5919
5920         case OMP_CLAUSE_NOWAIT:
5921         case OMP_CLAUSE_ORDERED:
5922         case OMP_CLAUSE_UNTIED:
5923         case OMP_CLAUSE_COLLAPSE:
5924           break;
5925
5926         case OMP_CLAUSE_DEFAULT:
5927           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
5928           break;
5929
5930         default:
5931           gcc_unreachable ();
5932         }
5933
5934       if (remove)
5935         *list_p = OMP_CLAUSE_CHAIN (c);
5936       else
5937         list_p = &OMP_CLAUSE_CHAIN (c);
5938     }
5939
5940   gimplify_omp_ctxp = ctx;
5941 }
5942
5943 /* For all variables that were not actually used within the context,
5944    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
5945
5946 static int
5947 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
5948 {
5949   tree *list_p = (tree *) data;
5950   tree decl = (tree) n->key;
5951   unsigned flags = n->value;
5952   enum omp_clause_code code;
5953   tree clause;
5954   bool private_debug;
5955
5956   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
5957     return 0;
5958   if ((flags & GOVD_SEEN) == 0)
5959     return 0;
5960   if (flags & GOVD_DEBUG_PRIVATE)
5961     {
5962       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
5963       private_debug = true;
5964     }
5965   else
5966     private_debug
5967       = lang_hooks.decls.omp_private_debug_clause (decl,
5968                                                    !!(flags & GOVD_SHARED));
5969   if (private_debug)
5970     code = OMP_CLAUSE_PRIVATE;
5971   else if (flags & GOVD_SHARED)
5972     {
5973       if (is_global_var (decl))
5974         {
5975           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
5976           while (ctx != NULL)
5977             {
5978               splay_tree_node on
5979                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5980               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
5981                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
5982                 break;
5983               ctx = ctx->outer_context;
5984             }
5985           if (ctx == NULL)
5986             return 0;
5987         }
5988       code = OMP_CLAUSE_SHARED;
5989     }
5990   else if (flags & GOVD_PRIVATE)
5991     code = OMP_CLAUSE_PRIVATE;
5992   else if (flags & GOVD_FIRSTPRIVATE)
5993     code = OMP_CLAUSE_FIRSTPRIVATE;
5994   else
5995     gcc_unreachable ();
5996
5997   clause = build_omp_clause (input_location, code);
5998   OMP_CLAUSE_DECL (clause) = decl;
5999   OMP_CLAUSE_CHAIN (clause) = *list_p;
6000   if (private_debug)
6001     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
6002   else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
6003     OMP_CLAUSE_PRIVATE_OUTER_REF (clause) = 1;
6004   *list_p = clause;
6005   lang_hooks.decls.omp_finish_clause (clause);
6006
6007   return 0;
6008 }
6009
6010 static void
6011 gimplify_adjust_omp_clauses (tree *list_p)
6012 {
6013   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
6014   tree c, decl;
6015
6016   while ((c = *list_p) != NULL)
6017     {
6018       splay_tree_node n;
6019       bool remove = false;
6020
6021       switch (OMP_CLAUSE_CODE (c))
6022         {
6023         case OMP_CLAUSE_PRIVATE:
6024         case OMP_CLAUSE_SHARED:
6025         case OMP_CLAUSE_FIRSTPRIVATE:
6026           decl = OMP_CLAUSE_DECL (c);
6027           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
6028           remove = !(n->value & GOVD_SEEN);
6029           if (! remove)
6030             {
6031               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
6032               if ((n->value & GOVD_DEBUG_PRIVATE)
6033                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
6034                 {
6035                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
6036                               || ((n->value & GOVD_DATA_SHARE_CLASS)
6037                                   == GOVD_PRIVATE));
6038                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
6039                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
6040                 }
6041             }
6042           break;
6043
6044         case OMP_CLAUSE_LASTPRIVATE:
6045           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
6046              accurately reflect the presence of a FIRSTPRIVATE clause.  */
6047           decl = OMP_CLAUSE_DECL (c);
6048           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
6049           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
6050             = (n->value & GOVD_FIRSTPRIVATE) != 0;
6051           break;
6052
6053         case OMP_CLAUSE_REDUCTION:
6054         case OMP_CLAUSE_COPYIN:
6055         case OMP_CLAUSE_COPYPRIVATE:
6056         case OMP_CLAUSE_IF:
6057         case OMP_CLAUSE_NUM_THREADS:
6058         case OMP_CLAUSE_SCHEDULE:
6059         case OMP_CLAUSE_NOWAIT:
6060         case OMP_CLAUSE_ORDERED:
6061         case OMP_CLAUSE_DEFAULT:
6062         case OMP_CLAUSE_UNTIED:
6063         case OMP_CLAUSE_COLLAPSE:
6064           break;
6065
6066         default:
6067           gcc_unreachable ();
6068         }
6069
6070       if (remove)
6071         *list_p = OMP_CLAUSE_CHAIN (c);
6072       else
6073         list_p = &OMP_CLAUSE_CHAIN (c);
6074     }
6075
6076   /* Add in any implicit data sharing.  */
6077   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
6078
6079   gimplify_omp_ctxp = ctx->outer_context;
6080   delete_omp_context (ctx);
6081 }
6082
6083 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
6084    gimplification of the body, as well as scanning the body for used
6085    variables.  We need to do this scan now, because variable-sized
6086    decls will be decomposed during gimplification.  */
6087
6088 static void
6089 gimplify_omp_parallel (tree *expr_p, gimple_seq *pre_p)
6090 {
6091   tree expr = *expr_p;
6092   gimple g;
6093   gimple_seq body = NULL;
6094   struct gimplify_ctx gctx;
6095
6096   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p,
6097                              OMP_PARALLEL_COMBINED (expr)
6098                              ? ORT_COMBINED_PARALLEL
6099                              : ORT_PARALLEL);
6100
6101   push_gimplify_context (&gctx);
6102
6103   g = gimplify_and_return_first (OMP_PARALLEL_BODY (expr), &body);
6104   if (gimple_code (g) == GIMPLE_BIND)
6105     pop_gimplify_context (g);
6106   else
6107     pop_gimplify_context (NULL);
6108
6109   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
6110
6111   g = gimple_build_omp_parallel (body,
6112                                  OMP_PARALLEL_CLAUSES (expr),
6113                                  NULL_TREE, NULL_TREE);
6114   if (OMP_PARALLEL_COMBINED (expr))
6115     gimple_omp_set_subcode (g, GF_OMP_PARALLEL_COMBINED);
6116   gimplify_seq_add_stmt (pre_p, g);
6117   *expr_p = NULL_TREE;
6118 }
6119
6120 /* Gimplify the contents of an OMP_TASK statement.  This involves
6121    gimplification of the body, as well as scanning the body for used
6122    variables.  We need to do this scan now, because variable-sized
6123    decls will be decomposed during gimplification.  */
6124
6125 static void
6126 gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
6127 {
6128   tree expr = *expr_p;
6129   gimple g;
6130   gimple_seq body = NULL;
6131   struct gimplify_ctx gctx;
6132
6133   gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p,
6134                              find_omp_clause (OMP_TASK_CLAUSES (expr),
6135                                               OMP_CLAUSE_UNTIED)
6136                              ? ORT_UNTIED_TASK : ORT_TASK);
6137
6138   push_gimplify_context (&gctx);
6139
6140   g = gimplify_and_return_first (OMP_TASK_BODY (expr), &body);
6141   if (gimple_code (g) == GIMPLE_BIND)
6142     pop_gimplify_context (g);
6143   else
6144     pop_gimplify_context (NULL);
6145
6146   gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
6147
6148   g = gimple_build_omp_task (body,
6149                              OMP_TASK_CLAUSES (expr),
6150                              NULL_TREE, NULL_TREE,
6151                              NULL_TREE, NULL_TREE, NULL_TREE);
6152   gimplify_seq_add_stmt (pre_p, g);
6153   *expr_p = NULL_TREE;
6154 }
6155
6156 /* Gimplify the gross structure of an OMP_FOR statement.  */
6157
6158 static enum gimplify_status
6159 gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
6160 {
6161   tree for_stmt, decl, var, t;
6162   enum gimplify_status ret = GS_ALL_DONE;
6163   enum gimplify_status tret;
6164   gimple gfor;
6165   gimple_seq for_body, for_pre_body;
6166   int i;
6167
6168   for_stmt = *expr_p;
6169
6170   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
6171                              ORT_WORKSHARE);
6172
6173   /* Handle OMP_FOR_INIT.  */
6174   for_pre_body = NULL;
6175   gimplify_and_add (OMP_FOR_PRE_BODY (for_stmt), &for_pre_body);
6176   OMP_FOR_PRE_BODY (for_stmt) = NULL_TREE;
6177
6178   for_body = gimple_seq_alloc ();
6179   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6180               == TREE_VEC_LENGTH (OMP_FOR_COND (for_stmt)));
6181   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6182               == TREE_VEC_LENGTH (OMP_FOR_INCR (for_stmt)));
6183   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6184     {
6185       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6186       gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6187       decl = TREE_OPERAND (t, 0);
6188       gcc_assert (DECL_P (decl));
6189       gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl))
6190                   || POINTER_TYPE_P (TREE_TYPE (decl)));
6191
6192       /* Make sure the iteration variable is private.  */
6193       if (omp_is_private (gimplify_omp_ctxp, decl))
6194         omp_notice_variable (gimplify_omp_ctxp, decl, true);
6195       else
6196         omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
6197
6198       /* If DECL is not a gimple register, create a temporary variable to act
6199          as an iteration counter.  This is valid, since DECL cannot be
6200          modified in the body of the loop.  */
6201       if (!is_gimple_reg (decl))
6202         {
6203           var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
6204           TREE_OPERAND (t, 0) = var;
6205
6206           gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
6207
6208           omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
6209         }
6210       else
6211         var = decl;
6212
6213       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6214                             is_gimple_val, fb_rvalue);
6215       ret = MIN (ret, tret);
6216       if (ret == GS_ERROR)
6217         return ret;
6218
6219       /* Handle OMP_FOR_COND.  */
6220       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6221       gcc_assert (COMPARISON_CLASS_P (t));
6222       gcc_assert (TREE_OPERAND (t, 0) == decl);
6223
6224       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6225                             is_gimple_val, fb_rvalue);
6226       ret = MIN (ret, tret);
6227
6228       /* Handle OMP_FOR_INCR.  */
6229       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6230       switch (TREE_CODE (t))
6231         {
6232         case PREINCREMENT_EXPR:
6233         case POSTINCREMENT_EXPR:
6234           t = build_int_cst (TREE_TYPE (decl), 1);
6235           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6236           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6237           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6238           break;
6239
6240         case PREDECREMENT_EXPR:
6241         case POSTDECREMENT_EXPR:
6242           t = build_int_cst (TREE_TYPE (decl), -1);
6243           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6244           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6245           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6246           break;
6247
6248         case MODIFY_EXPR:
6249           gcc_assert (TREE_OPERAND (t, 0) == decl);
6250           TREE_OPERAND (t, 0) = var;
6251
6252           t = TREE_OPERAND (t, 1);
6253           switch (TREE_CODE (t))
6254             {
6255             case PLUS_EXPR:
6256               if (TREE_OPERAND (t, 1) == decl)
6257                 {
6258                   TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
6259                   TREE_OPERAND (t, 0) = var;
6260                   break;
6261                 }
6262
6263               /* Fallthru.  */
6264             case MINUS_EXPR:
6265             case POINTER_PLUS_EXPR:
6266               gcc_assert (TREE_OPERAND (t, 0) == decl);
6267               TREE_OPERAND (t, 0) = var;
6268               break;
6269             default:
6270               gcc_unreachable ();
6271             }
6272
6273           tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6274                                 is_gimple_val, fb_rvalue);
6275           ret = MIN (ret, tret);
6276           break;
6277
6278         default:
6279           gcc_unreachable ();
6280         }
6281
6282       if (var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
6283         {
6284           tree c;
6285           for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
6286             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
6287                 && OMP_CLAUSE_DECL (c) == decl
6288                 && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
6289               {
6290                 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6291                 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6292                 gcc_assert (TREE_OPERAND (t, 0) == var);
6293                 t = TREE_OPERAND (t, 1);
6294                 gcc_assert (TREE_CODE (t) == PLUS_EXPR
6295                             || TREE_CODE (t) == MINUS_EXPR
6296                             || TREE_CODE (t) == POINTER_PLUS_EXPR);
6297                 gcc_assert (TREE_OPERAND (t, 0) == var);
6298                 t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
6299                             TREE_OPERAND (t, 1));
6300                 gimplify_assign (decl, t,
6301                                  &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
6302             }
6303         }
6304     }
6305
6306   gimplify_and_add (OMP_FOR_BODY (for_stmt), &for_body);
6307
6308   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
6309
6310   gfor = gimple_build_omp_for (for_body, OMP_FOR_CLAUSES (for_stmt),
6311                                TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)),
6312                                for_pre_body);
6313
6314   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6315     {
6316       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6317       gimple_omp_for_set_index (gfor, i, TREE_OPERAND (t, 0));
6318       gimple_omp_for_set_initial (gfor, i, TREE_OPERAND (t, 1));
6319       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6320       gimple_omp_for_set_cond (gfor, i, TREE_CODE (t));
6321       gimple_omp_for_set_final (gfor, i, TREE_OPERAND (t, 1));
6322       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6323       gimple_omp_for_set_incr (gfor, i, TREE_OPERAND (t, 1));
6324     }
6325
6326   gimplify_seq_add_stmt (pre_p, gfor);
6327   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
6328 }
6329
6330 /* Gimplify the gross structure of other OpenMP worksharing constructs.
6331    In particular, OMP_SECTIONS and OMP_SINGLE.  */
6332
6333 static void
6334 gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
6335 {
6336   tree expr = *expr_p;
6337   gimple stmt;
6338   gimple_seq body = NULL;
6339
6340   gimplify_scan_omp_clauses (&OMP_CLAUSES (expr), pre_p, ORT_WORKSHARE);
6341   gimplify_and_add (OMP_BODY (expr), &body);
6342   gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
6343
6344   if (TREE_CODE (expr) == OMP_SECTIONS)
6345     stmt = gimple_build_omp_sections (body, OMP_CLAUSES (expr));
6346   else if (TREE_CODE (expr) == OMP_SINGLE)
6347     stmt = gimple_build_omp_single (body, OMP_CLAUSES (expr));
6348   else
6349     gcc_unreachable ();
6350
6351   gimplify_seq_add_stmt (pre_p, stmt);
6352 }
6353
6354 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
6355    stabilized the lhs of the atomic operation as *ADDR.  Return true if
6356    EXPR is this stabilized form.  */
6357
6358 static bool
6359 goa_lhs_expr_p (tree expr, tree addr)
6360 {
6361   /* Also include casts to other type variants.  The C front end is fond
6362      of adding these for e.g. volatile variables.  This is like
6363      STRIP_TYPE_NOPS but includes the main variant lookup.  */
6364   STRIP_USELESS_TYPE_CONVERSION (expr);
6365
6366   if (TREE_CODE (expr) == INDIRECT_REF)
6367     {
6368       expr = TREE_OPERAND (expr, 0);
6369       while (expr != addr
6370              && (CONVERT_EXPR_P (expr)
6371                  || TREE_CODE (expr) == NON_LVALUE_EXPR)
6372              && TREE_CODE (expr) == TREE_CODE (addr)
6373              && types_compatible_p (TREE_TYPE (expr), TREE_TYPE (addr)))
6374         {
6375           expr = TREE_OPERAND (expr, 0);
6376           addr = TREE_OPERAND (addr, 0);
6377         }
6378       if (expr == addr)
6379         return true;
6380       return (TREE_CODE (addr) == ADDR_EXPR
6381               && TREE_CODE (expr) == ADDR_EXPR
6382               && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0));
6383     }
6384   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
6385     return true;
6386   return false;
6387 }
6388
6389 /* Walk *EXPR_P and replace
6390    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
6391    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
6392    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
6393
6394 static int
6395 goa_stabilize_expr (tree *expr_p, gimple_seq *pre_p, tree lhs_addr,
6396                     tree lhs_var)
6397 {
6398   tree expr = *expr_p;
6399   int saw_lhs;
6400
6401   if (goa_lhs_expr_p (expr, lhs_addr))
6402     {
6403       *expr_p = lhs_var;
6404       return 1;
6405     }
6406   if (is_gimple_val (expr))
6407     return 0;
6408
6409   saw_lhs = 0;
6410   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
6411     {
6412     case tcc_binary:
6413     case tcc_comparison:
6414       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p, lhs_addr,
6415                                      lhs_var);
6416     case tcc_unary:
6417       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p, lhs_addr,
6418                                      lhs_var);
6419       break;
6420     case tcc_expression:
6421       switch (TREE_CODE (expr))
6422         {
6423         case TRUTH_ANDIF_EXPR:
6424         case TRUTH_ORIF_EXPR:
6425         case TRUTH_AND_EXPR:
6426         case TRUTH_OR_EXPR:
6427         case TRUTH_XOR_EXPR:
6428           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
6429                                          lhs_addr, lhs_var);
6430         case TRUTH_NOT_EXPR:
6431           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
6432                                          lhs_addr, lhs_var);
6433           break;
6434         default:
6435           break;
6436         }
6437       break;
6438     default:
6439       break;
6440     }
6441
6442   if (saw_lhs == 0)
6443     {
6444       enum gimplify_status gs;
6445       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
6446       if (gs != GS_ALL_DONE)
6447         saw_lhs = -1;
6448     }
6449
6450   return saw_lhs;
6451 }
6452
6453
6454 /* Gimplify an OMP_ATOMIC statement.  */
6455
6456 static enum gimplify_status
6457 gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
6458 {
6459   tree addr = TREE_OPERAND (*expr_p, 0);
6460   tree rhs = TREE_OPERAND (*expr_p, 1);
6461   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
6462   tree tmp_load;
6463
6464    tmp_load = create_tmp_reg (type, NULL);
6465    if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
6466      return GS_ERROR;
6467
6468    if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
6469        != GS_ALL_DONE)
6470      return GS_ERROR;
6471
6472    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_load (tmp_load, addr));
6473    if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
6474        != GS_ALL_DONE)
6475      return GS_ERROR;
6476    gimplify_seq_add_stmt (pre_p, gimple_build_omp_atomic_store (rhs));
6477    *expr_p = NULL;
6478
6479    return GS_ALL_DONE;
6480 }
6481
6482
6483 /* Converts the GENERIC expression tree *EXPR_P to GIMPLE.  If the
6484    expression produces a value to be used as an operand inside a GIMPLE
6485    statement, the value will be stored back in *EXPR_P.  This value will
6486    be a tree of class tcc_declaration, tcc_constant, tcc_reference or
6487    an SSA_NAME.  The corresponding sequence of GIMPLE statements is
6488    emitted in PRE_P and POST_P.
6489
6490    Additionally, this process may overwrite parts of the input
6491    expression during gimplification.  Ideally, it should be
6492    possible to do non-destructive gimplification.
6493
6494    EXPR_P points to the GENERIC expression to convert to GIMPLE.  If
6495       the expression needs to evaluate to a value to be used as
6496       an operand in a GIMPLE statement, this value will be stored in
6497       *EXPR_P on exit.  This happens when the caller specifies one
6498       of fb_lvalue or fb_rvalue fallback flags.
6499
6500    PRE_P will contain the sequence of GIMPLE statements corresponding
6501        to the evaluation of EXPR and all the side-effects that must
6502        be executed before the main expression.  On exit, the last
6503        statement of PRE_P is the core statement being gimplified.  For
6504        instance, when gimplifying 'if (++a)' the last statement in
6505        PRE_P will be 'if (t.1)' where t.1 is the result of
6506        pre-incrementing 'a'.
6507
6508    POST_P will contain the sequence of GIMPLE statements corresponding
6509        to the evaluation of all the side-effects that must be executed
6510        after the main expression.  If this is NULL, the post
6511        side-effects are stored at the end of PRE_P.
6512
6513        The reason why the output is split in two is to handle post
6514        side-effects explicitly.  In some cases, an expression may have
6515        inner and outer post side-effects which need to be emitted in
6516        an order different from the one given by the recursive
6517        traversal.  For instance, for the expression (*p--)++ the post
6518        side-effects of '--' must actually occur *after* the post
6519        side-effects of '++'.  However, gimplification will first visit
6520        the inner expression, so if a separate POST sequence was not
6521        used, the resulting sequence would be:
6522
6523             1   t.1 = *p
6524             2   p = p - 1
6525             3   t.2 = t.1 + 1
6526             4   *p = t.2
6527
6528        However, the post-decrement operation in line #2 must not be
6529        evaluated until after the store to *p at line #4, so the
6530        correct sequence should be:
6531
6532             1   t.1 = *p
6533             2   t.2 = t.1 + 1
6534             3   *p = t.2
6535             4   p = p - 1
6536
6537        So, by specifying a separate post queue, it is possible
6538        to emit the post side-effects in the correct order.
6539        If POST_P is NULL, an internal queue will be used.  Before
6540        returning to the caller, the sequence POST_P is appended to
6541        the main output sequence PRE_P.
6542
6543    GIMPLE_TEST_F points to a function that takes a tree T and
6544        returns nonzero if T is in the GIMPLE form requested by the
6545        caller.  The GIMPLE predicates are in gimple.c.
6546
6547    FALLBACK tells the function what sort of a temporary we want if
6548        gimplification cannot produce an expression that complies with
6549        GIMPLE_TEST_F.
6550
6551        fb_none means that no temporary should be generated
6552        fb_rvalue means that an rvalue is OK to generate
6553        fb_lvalue means that an lvalue is OK to generate
6554        fb_either means that either is OK, but an lvalue is preferable.
6555        fb_mayfail means that gimplification may fail (in which case
6556        GS_ERROR will be returned)
6557
6558    The return value is either GS_ERROR or GS_ALL_DONE, since this
6559    function iterates until EXPR is completely gimplified or an error
6560    occurs.  */
6561
6562 enum gimplify_status
6563 gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
6564                bool (*gimple_test_f) (tree), fallback_t fallback)
6565 {
6566   tree tmp;
6567   gimple_seq internal_pre = NULL;
6568   gimple_seq internal_post = NULL;
6569   tree save_expr;
6570   bool is_statement;
6571   location_t saved_location;
6572   enum gimplify_status ret;
6573   gimple_stmt_iterator pre_last_gsi, post_last_gsi;
6574
6575   save_expr = *expr_p;
6576   if (save_expr == NULL_TREE)
6577     return GS_ALL_DONE;
6578
6579   /* If we are gimplifying a top-level statement, PRE_P must be valid.  */
6580   is_statement = gimple_test_f == is_gimple_stmt;
6581   if (is_statement)
6582     gcc_assert (pre_p);
6583
6584   /* Consistency checks.  */
6585   if (gimple_test_f == is_gimple_reg)
6586     gcc_assert (fallback & (fb_rvalue | fb_lvalue));
6587   else if (gimple_test_f == is_gimple_val
6588            || gimple_test_f == is_gimple_call_addr
6589            || gimple_test_f == is_gimple_condexpr
6590            || gimple_test_f == is_gimple_mem_rhs
6591            || gimple_test_f == is_gimple_mem_rhs_or_call
6592            || gimple_test_f == is_gimple_reg_rhs
6593            || gimple_test_f == is_gimple_reg_rhs_or_call
6594            || gimple_test_f == is_gimple_asm_val
6595            || gimple_test_f == is_gimple_mem_ref_addr)
6596     gcc_assert (fallback & fb_rvalue);
6597   else if (gimple_test_f == is_gimple_min_lval
6598            || gimple_test_f == is_gimple_lvalue)
6599     gcc_assert (fallback & fb_lvalue);
6600   else if (gimple_test_f == is_gimple_addressable)
6601     gcc_assert (fallback & fb_either);
6602   else if (gimple_test_f == is_gimple_stmt)
6603     gcc_assert (fallback == fb_none);
6604   else
6605     {
6606       /* We should have recognized the GIMPLE_TEST_F predicate to
6607          know what kind of fallback to use in case a temporary is
6608          needed to hold the value or address of *EXPR_P.  */
6609       gcc_unreachable ();
6610     }
6611
6612   /* We used to check the predicate here and return immediately if it
6613      succeeds.  This is wrong; the design is for gimplification to be
6614      idempotent, and for the predicates to only test for valid forms, not
6615      whether they are fully simplified.  */
6616   if (pre_p == NULL)
6617     pre_p = &internal_pre;
6618
6619   if (post_p == NULL)
6620     post_p = &internal_post;
6621
6622   /* Remember the last statements added to PRE_P and POST_P.  Every
6623      new statement added by the gimplification helpers needs to be
6624      annotated with location information.  To centralize the
6625      responsibility, we remember the last statement that had been
6626      added to both queues before gimplifying *EXPR_P.  If
6627      gimplification produces new statements in PRE_P and POST_P, those
6628      statements will be annotated with the same location information
6629      as *EXPR_P.  */
6630   pre_last_gsi = gsi_last (*pre_p);
6631   post_last_gsi = gsi_last (*post_p);
6632
6633   saved_location = input_location;
6634   if (save_expr != error_mark_node
6635       && EXPR_HAS_LOCATION (*expr_p))
6636     input_location = EXPR_LOCATION (*expr_p);
6637
6638   /* Loop over the specific gimplifiers until the toplevel node
6639      remains the same.  */
6640   do
6641     {
6642       /* Strip away as many useless type conversions as possible
6643          at the toplevel.  */
6644       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
6645
6646       /* Remember the expr.  */
6647       save_expr = *expr_p;
6648
6649       /* Die, die, die, my darling.  */
6650       if (save_expr == error_mark_node
6651           || (TREE_TYPE (save_expr)
6652               && TREE_TYPE (save_expr) == error_mark_node))
6653         {
6654           ret = GS_ERROR;
6655           break;
6656         }
6657
6658       /* Do any language-specific gimplification.  */
6659       ret = ((enum gimplify_status)
6660              lang_hooks.gimplify_expr (expr_p, pre_p, post_p));
6661       if (ret == GS_OK)
6662         {
6663           if (*expr_p == NULL_TREE)
6664             break;
6665           if (*expr_p != save_expr)
6666             continue;
6667         }
6668       else if (ret != GS_UNHANDLED)
6669         break;
6670
6671       /* Make sure that all the cases set 'ret' appropriately.  */
6672       ret = GS_UNHANDLED;
6673       switch (TREE_CODE (*expr_p))
6674         {
6675           /* First deal with the special cases.  */
6676
6677         case POSTINCREMENT_EXPR:
6678         case POSTDECREMENT_EXPR:
6679         case PREINCREMENT_EXPR:
6680         case PREDECREMENT_EXPR:
6681           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
6682                                         fallback != fb_none);
6683           break;
6684
6685         case ARRAY_REF:
6686         case ARRAY_RANGE_REF:
6687         case REALPART_EXPR:
6688         case IMAGPART_EXPR:
6689         case COMPONENT_REF:
6690         case VIEW_CONVERT_EXPR:
6691           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
6692                                         fallback ? fallback : fb_rvalue);
6693           break;
6694
6695         case COND_EXPR:
6696           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
6697
6698           /* C99 code may assign to an array in a structure value of a
6699              conditional expression, and this has undefined behavior
6700              only on execution, so create a temporary if an lvalue is
6701              required.  */
6702           if (fallback == fb_lvalue)
6703             {
6704               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6705               mark_addressable (*expr_p);
6706               ret = GS_OK;
6707             }
6708           break;
6709
6710         case CALL_EXPR:
6711           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
6712
6713           /* C99 code may assign to an array in a structure returned
6714              from a function, and this has undefined behavior only on
6715              execution, so create a temporary if an lvalue is
6716              required.  */
6717           if (fallback == fb_lvalue)
6718             {
6719               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6720               mark_addressable (*expr_p);
6721               ret = GS_OK;
6722             }
6723           break;
6724
6725         case TREE_LIST:
6726           gcc_unreachable ();
6727
6728         case COMPOUND_EXPR:
6729           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
6730           break;
6731
6732         case COMPOUND_LITERAL_EXPR:
6733           ret = gimplify_compound_literal_expr (expr_p, pre_p);
6734           break;
6735
6736         case MODIFY_EXPR:
6737         case INIT_EXPR:
6738           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
6739                                       fallback != fb_none);
6740           break;
6741
6742         case TRUTH_ANDIF_EXPR:
6743         case TRUTH_ORIF_EXPR:
6744           /* Pass the source location of the outer expression.  */
6745           ret = gimplify_boolean_expr (expr_p, saved_location);
6746           break;
6747
6748         case TRUTH_NOT_EXPR:
6749           if (TREE_CODE (TREE_TYPE (*expr_p)) != BOOLEAN_TYPE)
6750             {
6751               tree type = TREE_TYPE (*expr_p);
6752               *expr_p = fold_convert (type, gimple_boolify (*expr_p));
6753               ret = GS_OK;
6754               break;
6755             }
6756
6757           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6758                                is_gimple_val, fb_rvalue);
6759           recalculate_side_effects (*expr_p);
6760           break;
6761
6762         case ADDR_EXPR:
6763           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
6764           break;
6765
6766         case VA_ARG_EXPR:
6767           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
6768           break;
6769
6770         CASE_CONVERT:
6771           if (IS_EMPTY_STMT (*expr_p))
6772             {
6773               ret = GS_ALL_DONE;
6774               break;
6775             }
6776
6777           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
6778               || fallback == fb_none)
6779             {
6780               /* Just strip a conversion to void (or in void context) and
6781                  try again.  */
6782               *expr_p = TREE_OPERAND (*expr_p, 0);
6783               ret = GS_OK;
6784               break;
6785             }
6786
6787           ret = gimplify_conversion (expr_p);
6788           if (ret == GS_ERROR)
6789             break;
6790           if (*expr_p != save_expr)
6791             break;
6792           /* FALLTHRU */
6793
6794         case FIX_TRUNC_EXPR:
6795           /* unary_expr: ... | '(' cast ')' val | ...  */
6796           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6797                                is_gimple_val, fb_rvalue);
6798           recalculate_side_effects (*expr_p);
6799           break;
6800
6801         case INDIRECT_REF:
6802           {
6803             bool volatilep = TREE_THIS_VOLATILE (*expr_p);
6804             bool notrap = TREE_THIS_NOTRAP (*expr_p);
6805             tree saved_ptr_type = TREE_TYPE (TREE_OPERAND (*expr_p, 0));
6806
6807             *expr_p = fold_indirect_ref_loc (input_location, *expr_p);
6808             if (*expr_p != save_expr)
6809               {
6810                 ret = GS_OK;
6811                 break;
6812               }
6813
6814             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6815                                  is_gimple_reg, fb_rvalue);
6816             if (ret == GS_ERROR)
6817               break;
6818
6819             recalculate_side_effects (*expr_p);
6820             *expr_p = fold_build2_loc (input_location, MEM_REF,
6821                                        TREE_TYPE (*expr_p),
6822                                        TREE_OPERAND (*expr_p, 0),
6823                                        build_int_cst (saved_ptr_type, 0));
6824             TREE_THIS_VOLATILE (*expr_p) = volatilep;
6825             TREE_THIS_NOTRAP (*expr_p) = notrap;
6826             ret = GS_OK;
6827             break;
6828           }
6829
6830         /* We arrive here through the various re-gimplifcation paths.  */
6831         case MEM_REF:
6832           /* First try re-folding the whole thing.  */
6833           tmp = fold_binary (MEM_REF, TREE_TYPE (*expr_p),
6834                              TREE_OPERAND (*expr_p, 0),
6835                              TREE_OPERAND (*expr_p, 1));
6836           if (tmp)
6837             {
6838               *expr_p = tmp;
6839               recalculate_side_effects (*expr_p);
6840               ret = GS_OK;
6841               break;
6842             }
6843           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6844                                is_gimple_mem_ref_addr, fb_rvalue);
6845           if (ret == GS_ERROR)
6846             break;
6847           recalculate_side_effects (*expr_p);
6848           ret = GS_ALL_DONE;
6849           break;
6850
6851           /* Constants need not be gimplified.  */
6852         case INTEGER_CST:
6853         case REAL_CST:
6854         case FIXED_CST:
6855         case STRING_CST:
6856         case COMPLEX_CST:
6857         case VECTOR_CST:
6858           ret = GS_ALL_DONE;
6859           break;
6860
6861         case CONST_DECL:
6862           /* If we require an lvalue, such as for ADDR_EXPR, retain the
6863              CONST_DECL node.  Otherwise the decl is replaceable by its
6864              value.  */
6865           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
6866           if (fallback & fb_lvalue)
6867             ret = GS_ALL_DONE;
6868           else
6869             {
6870               *expr_p = DECL_INITIAL (*expr_p);
6871               ret = GS_OK;
6872             }
6873           break;
6874
6875         case DECL_EXPR:
6876           ret = gimplify_decl_expr (expr_p, pre_p);
6877           break;
6878
6879         case BIND_EXPR:
6880           ret = gimplify_bind_expr (expr_p, pre_p);
6881           break;
6882
6883         case LOOP_EXPR:
6884           ret = gimplify_loop_expr (expr_p, pre_p);
6885           break;
6886
6887         case SWITCH_EXPR:
6888           ret = gimplify_switch_expr (expr_p, pre_p);
6889           break;
6890
6891         case EXIT_EXPR:
6892           ret = gimplify_exit_expr (expr_p);
6893           break;
6894
6895         case GOTO_EXPR:
6896           /* If the target is not LABEL, then it is a computed jump
6897              and the target needs to be gimplified.  */
6898           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
6899             {
6900               ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
6901                                    NULL, is_gimple_val, fb_rvalue);
6902               if (ret == GS_ERROR)
6903                 break;
6904             }
6905           gimplify_seq_add_stmt (pre_p,
6906                           gimple_build_goto (GOTO_DESTINATION (*expr_p)));
6907           ret = GS_ALL_DONE;
6908           break;
6909
6910         case PREDICT_EXPR:
6911           gimplify_seq_add_stmt (pre_p,
6912                         gimple_build_predict (PREDICT_EXPR_PREDICTOR (*expr_p),
6913                                               PREDICT_EXPR_OUTCOME (*expr_p)));
6914           ret = GS_ALL_DONE;
6915           break;
6916
6917         case LABEL_EXPR:
6918           ret = GS_ALL_DONE;
6919           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
6920                       == current_function_decl);
6921           gimplify_seq_add_stmt (pre_p,
6922                           gimple_build_label (LABEL_EXPR_LABEL (*expr_p)));
6923           break;
6924
6925         case CASE_LABEL_EXPR:
6926           ret = gimplify_case_label_expr (expr_p, pre_p);
6927           break;
6928
6929         case RETURN_EXPR:
6930           ret = gimplify_return_expr (*expr_p, pre_p);
6931           break;
6932
6933         case CONSTRUCTOR:
6934           /* Don't reduce this in place; let gimplify_init_constructor work its
6935              magic.  Buf if we're just elaborating this for side effects, just
6936              gimplify any element that has side-effects.  */
6937           if (fallback == fb_none)
6938             {
6939               unsigned HOST_WIDE_INT ix;
6940               tree val;
6941               tree temp = NULL_TREE;
6942               FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (*expr_p), ix, val)
6943                 if (TREE_SIDE_EFFECTS (val))
6944                   append_to_statement_list (val, &temp);
6945
6946               *expr_p = temp;
6947               ret = temp ? GS_OK : GS_ALL_DONE;
6948             }
6949           /* C99 code may assign to an array in a constructed
6950              structure or union, and this has undefined behavior only
6951              on execution, so create a temporary if an lvalue is
6952              required.  */
6953           else if (fallback == fb_lvalue)
6954             {
6955               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6956               mark_addressable (*expr_p);
6957               ret = GS_OK;
6958             }
6959           else
6960             ret = GS_ALL_DONE;
6961           break;
6962
6963           /* The following are special cases that are not handled by the
6964              original GIMPLE grammar.  */
6965
6966           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
6967              eliminated.  */
6968         case SAVE_EXPR:
6969           ret = gimplify_save_expr (expr_p, pre_p, post_p);
6970           break;
6971
6972         case BIT_FIELD_REF:
6973           {
6974             enum gimplify_status r0, r1, r2;
6975
6976             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6977                                 post_p, is_gimple_lvalue, fb_either);
6978             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6979                                 post_p, is_gimple_val, fb_rvalue);
6980             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
6981                                 post_p, is_gimple_val, fb_rvalue);
6982             recalculate_side_effects (*expr_p);
6983
6984             ret = MIN (r0, MIN (r1, r2));
6985           }
6986           break;
6987
6988         case TARGET_MEM_REF:
6989           {
6990             enum gimplify_status r0 = GS_ALL_DONE, r1 = GS_ALL_DONE;
6991
6992             if (TMR_BASE (*expr_p))
6993               r0 = gimplify_expr (&TMR_BASE (*expr_p), pre_p,
6994                                   post_p, is_gimple_mem_ref_addr, fb_either);
6995             if (TMR_INDEX (*expr_p))
6996               r1 = gimplify_expr (&TMR_INDEX (*expr_p), pre_p,
6997                                   post_p, is_gimple_val, fb_rvalue);
6998             if (TMR_INDEX2 (*expr_p))
6999               r1 = gimplify_expr (&TMR_INDEX2 (*expr_p), pre_p,
7000                                   post_p, is_gimple_val, fb_rvalue);
7001             /* TMR_STEP and TMR_OFFSET are always integer constants.  */
7002             ret = MIN (r0, r1);
7003           }
7004           break;
7005
7006         case NON_LVALUE_EXPR:
7007           /* This should have been stripped above.  */
7008           gcc_unreachable ();
7009
7010         case ASM_EXPR:
7011           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
7012           break;
7013
7014         case TRY_FINALLY_EXPR:
7015         case TRY_CATCH_EXPR:
7016           {
7017             gimple_seq eval, cleanup;
7018             gimple try_;
7019
7020             eval = cleanup = NULL;
7021             gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
7022             gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
7023             /* Don't create bogus GIMPLE_TRY with empty cleanup.  */
7024             if (gimple_seq_empty_p (cleanup))
7025               {
7026                 gimple_seq_add_seq (pre_p, eval);
7027                 ret = GS_ALL_DONE;
7028                 break;
7029               }
7030             try_ = gimple_build_try (eval, cleanup,
7031                                      TREE_CODE (*expr_p) == TRY_FINALLY_EXPR
7032                                      ? GIMPLE_TRY_FINALLY
7033                                      : GIMPLE_TRY_CATCH);
7034             if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR)
7035               gimple_try_set_catch_is_cleanup (try_,
7036                                                TRY_CATCH_IS_CLEANUP (*expr_p));
7037             gimplify_seq_add_stmt (pre_p, try_);
7038             ret = GS_ALL_DONE;
7039             break;
7040           }
7041
7042         case CLEANUP_POINT_EXPR:
7043           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
7044           break;
7045
7046         case TARGET_EXPR:
7047           ret = gimplify_target_expr (expr_p, pre_p, post_p);
7048           break;
7049
7050         case CATCH_EXPR:
7051           {
7052             gimple c;
7053             gimple_seq handler = NULL;
7054             gimplify_and_add (CATCH_BODY (*expr_p), &handler);
7055             c = gimple_build_catch (CATCH_TYPES (*expr_p), handler);
7056             gimplify_seq_add_stmt (pre_p, c);
7057             ret = GS_ALL_DONE;
7058             break;
7059           }
7060
7061         case EH_FILTER_EXPR:
7062           {
7063             gimple ehf;
7064             gimple_seq failure = NULL;
7065
7066             gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure);
7067             ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure);
7068             gimple_set_no_warning (ehf, TREE_NO_WARNING (*expr_p));
7069             gimplify_seq_add_stmt (pre_p, ehf);
7070             ret = GS_ALL_DONE;
7071             break;
7072           }
7073
7074         case OBJ_TYPE_REF:
7075           {
7076             enum gimplify_status r0, r1;
7077             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p,
7078                                 post_p, is_gimple_val, fb_rvalue);
7079             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p,
7080                                 post_p, is_gimple_val, fb_rvalue);
7081             TREE_SIDE_EFFECTS (*expr_p) = 0;
7082             ret = MIN (r0, r1);
7083           }
7084           break;
7085
7086         case LABEL_DECL:
7087           /* We get here when taking the address of a label.  We mark
7088              the label as "forced"; meaning it can never be removed and
7089              it is a potential target for any computed goto.  */
7090           FORCED_LABEL (*expr_p) = 1;
7091           ret = GS_ALL_DONE;
7092           break;
7093
7094         case STATEMENT_LIST:
7095           ret = gimplify_statement_list (expr_p, pre_p);
7096           break;
7097
7098         case WITH_SIZE_EXPR:
7099           {
7100             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7101                            post_p == &internal_post ? NULL : post_p,
7102                            gimple_test_f, fallback);
7103             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7104                            is_gimple_val, fb_rvalue);
7105             ret = GS_ALL_DONE;
7106           }
7107           break;
7108
7109         case VAR_DECL:
7110         case PARM_DECL:
7111           ret = gimplify_var_or_parm_decl (expr_p);
7112           break;
7113
7114         case RESULT_DECL:
7115           /* When within an OpenMP context, notice uses of variables.  */
7116           if (gimplify_omp_ctxp)
7117             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
7118           ret = GS_ALL_DONE;
7119           break;
7120
7121         case SSA_NAME:
7122           /* Allow callbacks into the gimplifier during optimization.  */
7123           ret = GS_ALL_DONE;
7124           break;
7125
7126         case OMP_PARALLEL:
7127           gimplify_omp_parallel (expr_p, pre_p);
7128           ret = GS_ALL_DONE;
7129           break;
7130
7131         case OMP_TASK:
7132           gimplify_omp_task (expr_p, pre_p);
7133           ret = GS_ALL_DONE;
7134           break;
7135
7136         case OMP_FOR:
7137           ret = gimplify_omp_for (expr_p, pre_p);
7138           break;
7139
7140         case OMP_SECTIONS:
7141         case OMP_SINGLE:
7142           gimplify_omp_workshare (expr_p, pre_p);
7143           ret = GS_ALL_DONE;
7144           break;
7145
7146         case OMP_SECTION:
7147         case OMP_MASTER:
7148         case OMP_ORDERED:
7149         case OMP_CRITICAL:
7150           {
7151             gimple_seq body = NULL;
7152             gimple g;
7153
7154             gimplify_and_add (OMP_BODY (*expr_p), &body);
7155             switch (TREE_CODE (*expr_p))
7156               {
7157               case OMP_SECTION:
7158                 g = gimple_build_omp_section (body);
7159                 break;
7160               case OMP_MASTER:
7161                 g = gimple_build_omp_master (body);
7162                 break;
7163               case OMP_ORDERED:
7164                 g = gimple_build_omp_ordered (body);
7165                 break;
7166               case OMP_CRITICAL:
7167                 g = gimple_build_omp_critical (body,
7168                                                OMP_CRITICAL_NAME (*expr_p));
7169                 break;
7170               default:
7171                 gcc_unreachable ();
7172               }
7173             gimplify_seq_add_stmt (pre_p, g);
7174             ret = GS_ALL_DONE;
7175             break;
7176           }
7177
7178         case OMP_ATOMIC:
7179           ret = gimplify_omp_atomic (expr_p, pre_p);
7180           break;
7181
7182         case TRUTH_AND_EXPR:
7183         case TRUTH_OR_EXPR:
7184         case TRUTH_XOR_EXPR:
7185           /* Classified as tcc_expression.  */
7186           goto expr_2;
7187
7188         case FMA_EXPR:
7189           /* Classified as tcc_expression.  */
7190           goto expr_3;
7191
7192         case POINTER_PLUS_EXPR:
7193           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
7194              The second is gimple immediate saving a need for extra statement.
7195            */
7196           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
7197               && (tmp = maybe_fold_offset_to_address
7198                   (EXPR_LOCATION (*expr_p),
7199                    TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
7200                    TREE_TYPE (*expr_p))))
7201             {
7202               *expr_p = tmp;
7203               ret = GS_OK;
7204               break;
7205             }
7206           /* Convert (void *)&a + 4 into (void *)&a[1].  */
7207           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
7208               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
7209               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
7210                                                                         0),0)))
7211               && (tmp = maybe_fold_offset_to_address
7212                   (EXPR_LOCATION (*expr_p),
7213                    TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
7214                    TREE_OPERAND (*expr_p, 1),
7215                    TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
7216                                             0)))))
7217              {
7218                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
7219                ret = GS_OK;
7220                break;
7221              }
7222           /* FALLTHRU */
7223
7224         default:
7225           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
7226             {
7227             case tcc_comparison:
7228               /* Handle comparison of objects of non scalar mode aggregates
7229                  with a call to memcmp.  It would be nice to only have to do
7230                  this for variable-sized objects, but then we'd have to allow
7231                  the same nest of reference nodes we allow for MODIFY_EXPR and
7232                  that's too complex.
7233
7234                  Compare scalar mode aggregates as scalar mode values.  Using
7235                  memcmp for them would be very inefficient at best, and is
7236                  plain wrong if bitfields are involved.  */
7237                 {
7238                   tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
7239
7240                   if (!AGGREGATE_TYPE_P (type))
7241                     goto expr_2;
7242                   else if (TYPE_MODE (type) != BLKmode)
7243                     ret = gimplify_scalar_mode_aggregate_compare (expr_p);
7244                   else
7245                     ret = gimplify_variable_sized_compare (expr_p);
7246
7247                   break;
7248                 }
7249
7250             /* If *EXPR_P does not need to be special-cased, handle it
7251                according to its class.  */
7252             case tcc_unary:
7253               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7254                                    post_p, is_gimple_val, fb_rvalue);
7255               break;
7256
7257             case tcc_binary:
7258             expr_2:
7259               {
7260                 enum gimplify_status r0, r1;
7261
7262                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7263                                     post_p, is_gimple_val, fb_rvalue);
7264                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7265                                     post_p, is_gimple_val, fb_rvalue);
7266
7267                 ret = MIN (r0, r1);
7268                 break;
7269               }
7270
7271             expr_3:
7272               {
7273                 enum gimplify_status r0, r1, r2;
7274
7275                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7276                                     post_p, is_gimple_val, fb_rvalue);
7277                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7278                                     post_p, is_gimple_val, fb_rvalue);
7279                 r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
7280                                     post_p, is_gimple_val, fb_rvalue);
7281
7282                 ret = MIN (MIN (r0, r1), r2);
7283                 break;
7284               }
7285
7286             case tcc_declaration:
7287             case tcc_constant:
7288               ret = GS_ALL_DONE;
7289               goto dont_recalculate;
7290
7291             default:
7292               gcc_unreachable ();
7293             }
7294
7295           recalculate_side_effects (*expr_p);
7296
7297         dont_recalculate:
7298           break;
7299         }
7300
7301       gcc_assert (*expr_p || ret != GS_OK);
7302     }
7303   while (ret == GS_OK);
7304
7305   /* If we encountered an error_mark somewhere nested inside, either
7306      stub out the statement or propagate the error back out.  */
7307   if (ret == GS_ERROR)
7308     {
7309       if (is_statement)
7310         *expr_p = NULL;
7311       goto out;
7312     }
7313
7314   /* This was only valid as a return value from the langhook, which
7315      we handled.  Make sure it doesn't escape from any other context.  */
7316   gcc_assert (ret != GS_UNHANDLED);
7317
7318   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
7319     {
7320       /* We aren't looking for a value, and we don't have a valid
7321          statement.  If it doesn't have side-effects, throw it away.  */
7322       if (!TREE_SIDE_EFFECTS (*expr_p))
7323         *expr_p = NULL;
7324       else if (!TREE_THIS_VOLATILE (*expr_p))
7325         {
7326           /* This is probably a _REF that contains something nested that
7327              has side effects.  Recurse through the operands to find it.  */
7328           enum tree_code code = TREE_CODE (*expr_p);
7329
7330           switch (code)
7331             {
7332             case COMPONENT_REF:
7333             case REALPART_EXPR:
7334             case IMAGPART_EXPR:
7335             case VIEW_CONVERT_EXPR:
7336               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7337                              gimple_test_f, fallback);
7338               break;
7339
7340             case ARRAY_REF:
7341             case ARRAY_RANGE_REF:
7342               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7343                              gimple_test_f, fallback);
7344               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7345                              gimple_test_f, fallback);
7346               break;
7347
7348             default:
7349                /* Anything else with side-effects must be converted to
7350                   a valid statement before we get here.  */
7351               gcc_unreachable ();
7352             }
7353
7354           *expr_p = NULL;
7355         }
7356       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
7357                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
7358         {
7359           /* Historically, the compiler has treated a bare reference
7360              to a non-BLKmode volatile lvalue as forcing a load.  */
7361           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
7362
7363           /* Normally, we do not want to create a temporary for a
7364              TREE_ADDRESSABLE type because such a type should not be
7365              copied by bitwise-assignment.  However, we make an
7366              exception here, as all we are doing here is ensuring that
7367              we read the bytes that make up the type.  We use
7368              create_tmp_var_raw because create_tmp_var will abort when
7369              given a TREE_ADDRESSABLE type.  */
7370           tree tmp = create_tmp_var_raw (type, "vol");
7371           gimple_add_tmp_var (tmp);
7372           gimplify_assign (tmp, *expr_p, pre_p);
7373           *expr_p = NULL;
7374         }
7375       else
7376         /* We can't do anything useful with a volatile reference to
7377            an incomplete type, so just throw it away.  Likewise for
7378            a BLKmode type, since any implicit inner load should
7379            already have been turned into an explicit one by the
7380            gimplification process.  */
7381         *expr_p = NULL;
7382     }
7383
7384   /* If we are gimplifying at the statement level, we're done.  Tack
7385      everything together and return.  */
7386   if (fallback == fb_none || is_statement)
7387     {
7388       /* Since *EXPR_P has been converted into a GIMPLE tuple, clear
7389          it out for GC to reclaim it.  */
7390       *expr_p = NULL_TREE;
7391
7392       if (!gimple_seq_empty_p (internal_pre)
7393           || !gimple_seq_empty_p (internal_post))
7394         {
7395           gimplify_seq_add_seq (&internal_pre, internal_post);
7396           gimplify_seq_add_seq (pre_p, internal_pre);
7397         }
7398
7399       /* The result of gimplifying *EXPR_P is going to be the last few
7400          statements in *PRE_P and *POST_P.  Add location information
7401          to all the statements that were added by the gimplification
7402          helpers.  */
7403       if (!gimple_seq_empty_p (*pre_p))
7404         annotate_all_with_location_after (*pre_p, pre_last_gsi, input_location);
7405
7406       if (!gimple_seq_empty_p (*post_p))
7407         annotate_all_with_location_after (*post_p, post_last_gsi,
7408                                           input_location);
7409
7410       goto out;
7411     }
7412
7413 #ifdef ENABLE_GIMPLE_CHECKING
7414   if (*expr_p)
7415     {
7416       enum tree_code code = TREE_CODE (*expr_p);
7417       /* These expressions should already be in gimple IR form.  */
7418       gcc_assert (code != MODIFY_EXPR
7419                   && code != ASM_EXPR
7420                   && code != BIND_EXPR
7421                   && code != CATCH_EXPR
7422                   && (code != COND_EXPR || gimplify_ctxp->allow_rhs_cond_expr)
7423                   && code != EH_FILTER_EXPR
7424                   && code != GOTO_EXPR
7425                   && code != LABEL_EXPR
7426                   && code != LOOP_EXPR
7427                   && code != SWITCH_EXPR
7428                   && code != TRY_FINALLY_EXPR
7429                   && code != OMP_CRITICAL
7430                   && code != OMP_FOR
7431                   && code != OMP_MASTER
7432                   && code != OMP_ORDERED
7433                   && code != OMP_PARALLEL
7434                   && code != OMP_SECTIONS
7435                   && code != OMP_SECTION
7436                   && code != OMP_SINGLE);
7437     }
7438 #endif
7439
7440   /* Otherwise we're gimplifying a subexpression, so the resulting
7441      value is interesting.  If it's a valid operand that matches
7442      GIMPLE_TEST_F, we're done. Unless we are handling some
7443      post-effects internally; if that's the case, we need to copy into
7444      a temporary before adding the post-effects to POST_P.  */
7445   if (gimple_seq_empty_p (internal_post) && (*gimple_test_f) (*expr_p))
7446     goto out;
7447
7448   /* Otherwise, we need to create a new temporary for the gimplified
7449      expression.  */
7450
7451   /* We can't return an lvalue if we have an internal postqueue.  The
7452      object the lvalue refers to would (probably) be modified by the
7453      postqueue; we need to copy the value out first, which means an
7454      rvalue.  */
7455   if ((fallback & fb_lvalue)
7456       && gimple_seq_empty_p (internal_post)
7457       && is_gimple_addressable (*expr_p))
7458     {
7459       /* An lvalue will do.  Take the address of the expression, store it
7460          in a temporary, and replace the expression with an INDIRECT_REF of
7461          that temporary.  */
7462       tmp = build_fold_addr_expr_loc (input_location, *expr_p);
7463       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
7464       *expr_p = build_simple_mem_ref (tmp);
7465     }
7466   else if ((fallback & fb_rvalue) && is_gimple_reg_rhs_or_call (*expr_p))
7467     {
7468       /* An rvalue will do.  Assign the gimplified expression into a
7469          new temporary TMP and replace the original expression with
7470          TMP.  First, make sure that the expression has a type so that
7471          it can be assigned into a temporary.  */
7472       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
7473
7474       if (!gimple_seq_empty_p (internal_post) || (fallback & fb_lvalue))
7475         /* The postqueue might change the value of the expression between
7476            the initialization and use of the temporary, so we can't use a
7477            formal temp.  FIXME do we care?  */
7478         {
7479           *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7480           if (TREE_CODE (TREE_TYPE (*expr_p)) == COMPLEX_TYPE
7481               || TREE_CODE (TREE_TYPE (*expr_p)) == VECTOR_TYPE)
7482             DECL_GIMPLE_REG_P (*expr_p) = 1;
7483         }
7484       else
7485         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
7486     }
7487   else
7488     {
7489 #ifdef ENABLE_GIMPLE_CHECKING
7490       if (!(fallback & fb_mayfail))
7491         {
7492           fprintf (stderr, "gimplification failed:\n");
7493           print_generic_expr (stderr, *expr_p, 0);
7494           debug_tree (*expr_p);
7495           internal_error ("gimplification failed");
7496         }
7497 #endif
7498       gcc_assert (fallback & fb_mayfail);
7499
7500       /* If this is an asm statement, and the user asked for the
7501          impossible, don't die.  Fail and let gimplify_asm_expr
7502          issue an error.  */
7503       ret = GS_ERROR;
7504       goto out;
7505     }
7506
7507   /* Make sure the temporary matches our predicate.  */
7508   gcc_assert ((*gimple_test_f) (*expr_p));
7509
7510   if (!gimple_seq_empty_p (internal_post))
7511     {
7512       annotate_all_with_location (internal_post, input_location);
7513       gimplify_seq_add_seq (pre_p, internal_post);
7514     }
7515
7516  out:
7517   input_location = saved_location;
7518   return ret;
7519 }
7520
7521 /* Look through TYPE for variable-sized objects and gimplify each such
7522    size that we find.  Add to LIST_P any statements generated.  */
7523
7524 void
7525 gimplify_type_sizes (tree type, gimple_seq *list_p)
7526 {
7527   tree field, t;
7528
7529   if (type == NULL || type == error_mark_node)
7530     return;
7531
7532   /* We first do the main variant, then copy into any other variants.  */
7533   type = TYPE_MAIN_VARIANT (type);
7534
7535   /* Avoid infinite recursion.  */
7536   if (TYPE_SIZES_GIMPLIFIED (type))
7537     return;
7538
7539   TYPE_SIZES_GIMPLIFIED (type) = 1;
7540
7541   switch (TREE_CODE (type))
7542     {
7543     case INTEGER_TYPE:
7544     case ENUMERAL_TYPE:
7545     case BOOLEAN_TYPE:
7546     case REAL_TYPE:
7547     case FIXED_POINT_TYPE:
7548       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
7549       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
7550
7551       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7552         {
7553           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
7554           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
7555         }
7556       break;
7557
7558     case ARRAY_TYPE:
7559       /* These types may not have declarations, so handle them here.  */
7560       gimplify_type_sizes (TREE_TYPE (type), list_p);
7561       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
7562       /* Ensure VLA bounds aren't removed, for -O0 they should be variables
7563          with assigned stack slots, for -O1+ -g they should be tracked
7564          by VTA.  */
7565       if (!(TYPE_NAME (type)
7566             && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
7567             && DECL_IGNORED_P (TYPE_NAME (type)))
7568           && TYPE_DOMAIN (type)
7569           && INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
7570         {
7571           t = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
7572           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7573             DECL_IGNORED_P (t) = 0;
7574           t = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
7575           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7576             DECL_IGNORED_P (t) = 0;
7577         }
7578       break;
7579
7580     case RECORD_TYPE:
7581     case UNION_TYPE:
7582     case QUAL_UNION_TYPE:
7583       for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
7584         if (TREE_CODE (field) == FIELD_DECL)
7585           {
7586             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
7587             gimplify_one_sizepos (&DECL_SIZE (field), list_p);
7588             gimplify_one_sizepos (&DECL_SIZE_UNIT (field), list_p);
7589             gimplify_type_sizes (TREE_TYPE (field), list_p);
7590           }
7591       break;
7592
7593     case POINTER_TYPE:
7594     case REFERENCE_TYPE:
7595         /* We used to recurse on the pointed-to type here, which turned out to
7596            be incorrect because its definition might refer to variables not
7597            yet initialized at this point if a forward declaration is involved.
7598
7599            It was actually useful for anonymous pointed-to types to ensure
7600            that the sizes evaluation dominates every possible later use of the
7601            values.  Restricting to such types here would be safe since there
7602            is no possible forward declaration around, but would introduce an
7603            undesirable middle-end semantic to anonymity.  We then defer to
7604            front-ends the responsibility of ensuring that the sizes are
7605            evaluated both early and late enough, e.g. by attaching artificial
7606            type declarations to the tree.  */
7607       break;
7608
7609     default:
7610       break;
7611     }
7612
7613   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
7614   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
7615
7616   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7617     {
7618       TYPE_SIZE (t) = TYPE_SIZE (type);
7619       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
7620       TYPE_SIZES_GIMPLIFIED (t) = 1;
7621     }
7622 }
7623
7624 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
7625    a size or position, has had all of its SAVE_EXPRs evaluated.
7626    We add any required statements to *STMT_P.  */
7627
7628 void
7629 gimplify_one_sizepos (tree *expr_p, gimple_seq *stmt_p)
7630 {
7631   tree type, expr = *expr_p;
7632
7633   /* We don't do anything if the value isn't there, is constant, or contains
7634      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
7635      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
7636      will want to replace it with a new variable, but that will cause problems
7637      if this type is from outside the function.  It's OK to have that here.  */
7638   if (expr == NULL_TREE || TREE_CONSTANT (expr)
7639       || TREE_CODE (expr) == VAR_DECL
7640       || CONTAINS_PLACEHOLDER_P (expr))
7641     return;
7642
7643   type = TREE_TYPE (expr);
7644   *expr_p = unshare_expr (expr);
7645
7646   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
7647   expr = *expr_p;
7648
7649   /* Verify that we've an exact type match with the original expression.
7650      In particular, we do not wish to drop a "sizetype" in favour of a
7651      type of similar dimensions.  We don't want to pollute the generic
7652      type-stripping code with this knowledge because it doesn't matter
7653      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
7654      and friends retain their "sizetype-ness".  */
7655   if (TREE_TYPE (expr) != type
7656       && TREE_CODE (type) == INTEGER_TYPE
7657       && TYPE_IS_SIZETYPE (type))
7658     {
7659       tree tmp;
7660       gimple stmt;
7661
7662       *expr_p = create_tmp_var (type, NULL);
7663       tmp = build1 (NOP_EXPR, type, expr);
7664       stmt = gimplify_assign (*expr_p, tmp, stmt_p);
7665       gimple_set_location (stmt, EXPR_LOC_OR_HERE (expr));
7666     }
7667 }
7668
7669
7670 /* Gimplify the body of statements pointed to by BODY_P and return a
7671    GIMPLE_BIND containing the sequence of GIMPLE statements
7672    corresponding to BODY_P.  FNDECL is the function decl containing
7673    *BODY_P.  */
7674
7675 gimple
7676 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
7677 {
7678   location_t saved_location = input_location;
7679   gimple_seq parm_stmts, seq;
7680   gimple outer_bind;
7681   struct gimplify_ctx gctx;
7682
7683   timevar_push (TV_TREE_GIMPLIFY);
7684
7685   /* Initialize for optimize_insn_for_s{ize,peed}_p possibly called during
7686      gimplification.  */
7687   default_rtl_profile ();
7688
7689   gcc_assert (gimplify_ctxp == NULL);
7690   push_gimplify_context (&gctx);
7691
7692   /* Unshare most shared trees in the body and in that of any nested functions.
7693      It would seem we don't have to do this for nested functions because
7694      they are supposed to be output and then the outer function gimplified
7695      first, but the g++ front end doesn't always do it that way.  */
7696   unshare_body (body_p, fndecl);
7697   unvisit_body (body_p, fndecl);
7698
7699   if (cgraph_node (fndecl)->origin)
7700     nonlocal_vlas = pointer_set_create ();
7701
7702   /* Make sure input_location isn't set to something weird.  */
7703   input_location = DECL_SOURCE_LOCATION (fndecl);
7704
7705   /* Resolve callee-copies.  This has to be done before processing
7706      the body so that DECL_VALUE_EXPR gets processed correctly.  */
7707   parm_stmts = (do_parms) ? gimplify_parameters () : NULL;
7708
7709   /* Gimplify the function's body.  */
7710   seq = NULL;
7711   gimplify_stmt (body_p, &seq);
7712   outer_bind = gimple_seq_first_stmt (seq);
7713   if (!outer_bind)
7714     {
7715       outer_bind = gimple_build_nop ();
7716       gimplify_seq_add_stmt (&seq, outer_bind);
7717     }
7718
7719   /* The body must contain exactly one statement, a GIMPLE_BIND.  If this is
7720      not the case, wrap everything in a GIMPLE_BIND to make it so.  */
7721   if (gimple_code (outer_bind) == GIMPLE_BIND
7722       && gimple_seq_first (seq) == gimple_seq_last (seq))
7723     ;
7724   else
7725     outer_bind = gimple_build_bind (NULL_TREE, seq, NULL);
7726
7727   *body_p = NULL_TREE;
7728
7729   /* If we had callee-copies statements, insert them at the beginning
7730      of the function and clear DECL_VALUE_EXPR_P on the parameters.  */
7731   if (!gimple_seq_empty_p (parm_stmts))
7732     {
7733       tree parm;
7734
7735       gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
7736       gimple_bind_set_body (outer_bind, parm_stmts);
7737
7738       for (parm = DECL_ARGUMENTS (current_function_decl);
7739            parm; parm = DECL_CHAIN (parm))
7740         if (DECL_HAS_VALUE_EXPR_P (parm))
7741           {
7742             DECL_HAS_VALUE_EXPR_P (parm) = 0;
7743             DECL_IGNORED_P (parm) = 0;
7744           }
7745     }
7746
7747   if (nonlocal_vlas)
7748     {
7749       pointer_set_destroy (nonlocal_vlas);
7750       nonlocal_vlas = NULL;
7751     }
7752
7753   pop_gimplify_context (outer_bind);
7754   gcc_assert (gimplify_ctxp == NULL);
7755
7756 #ifdef ENABLE_TYPES_CHECKING
7757   if (!seen_error ())
7758     verify_types_in_gimple_seq (gimple_bind_body (outer_bind));
7759 #endif
7760
7761   timevar_pop (TV_TREE_GIMPLIFY);
7762   input_location = saved_location;
7763
7764   return outer_bind;
7765 }
7766
7767 typedef char *char_p; /* For DEF_VEC_P.  */
7768 DEF_VEC_P(char_p);
7769 DEF_VEC_ALLOC_P(char_p,heap);
7770
7771 /* Return whether we should exclude FNDECL from instrumentation.  */
7772
7773 static bool
7774 flag_instrument_functions_exclude_p (tree fndecl)
7775 {
7776   VEC(char_p,heap) *vec;
7777
7778   vec = (VEC(char_p,heap) *) flag_instrument_functions_exclude_functions;
7779   if (VEC_length (char_p, vec) > 0)
7780     {
7781       const char *name;
7782       int i;
7783       char *s;
7784
7785       name = lang_hooks.decl_printable_name (fndecl, 0);
7786       FOR_EACH_VEC_ELT (char_p, vec, i, s)
7787         if (strstr (name, s) != NULL)
7788           return true;
7789     }
7790
7791   vec = (VEC(char_p,heap) *) flag_instrument_functions_exclude_files;
7792   if (VEC_length (char_p, vec) > 0)
7793     {
7794       const char *name;
7795       int i;
7796       char *s;
7797
7798       name = DECL_SOURCE_FILE (fndecl);
7799       FOR_EACH_VEC_ELT (char_p, vec, i, s)
7800         if (strstr (name, s) != NULL)
7801           return true;
7802     }
7803
7804   return false;
7805 }
7806
7807 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
7808    node for the function we want to gimplify.
7809
7810    Returns the sequence of GIMPLE statements corresponding to the body
7811    of FNDECL.  */
7812
7813 void
7814 gimplify_function_tree (tree fndecl)
7815 {
7816   tree oldfn, parm, ret;
7817   gimple_seq seq;
7818   gimple bind;
7819
7820   gcc_assert (!gimple_body (fndecl));
7821
7822   oldfn = current_function_decl;
7823   current_function_decl = fndecl;
7824   if (DECL_STRUCT_FUNCTION (fndecl))
7825     push_cfun (DECL_STRUCT_FUNCTION (fndecl));
7826   else
7827     push_struct_function (fndecl);
7828
7829   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = DECL_CHAIN (parm))
7830     {
7831       /* Preliminarily mark non-addressed complex variables as eligible
7832          for promotion to gimple registers.  We'll transform their uses
7833          as we find them.  */
7834       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
7835            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
7836           && !TREE_THIS_VOLATILE (parm)
7837           && !needs_to_live_in_memory (parm))
7838         DECL_GIMPLE_REG_P (parm) = 1;
7839     }
7840
7841   ret = DECL_RESULT (fndecl);
7842   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
7843        || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
7844       && !needs_to_live_in_memory (ret))
7845     DECL_GIMPLE_REG_P (ret) = 1;
7846
7847   bind = gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
7848
7849   /* The tree body of the function is no longer needed, replace it
7850      with the new GIMPLE body.  */
7851   seq = gimple_seq_alloc ();
7852   gimple_seq_add_stmt (&seq, bind);
7853   gimple_set_body (fndecl, seq);
7854
7855   /* If we're instrumenting function entry/exit, then prepend the call to
7856      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
7857      catch the exit hook.  */
7858   /* ??? Add some way to ignore exceptions for this TFE.  */
7859   if (flag_instrument_function_entry_exit
7860       && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
7861       && !flag_instrument_functions_exclude_p (fndecl))
7862     {
7863       tree x;
7864       gimple new_bind;
7865       gimple tf;
7866       gimple_seq cleanup = NULL, body = NULL;
7867       tree tmp_var;
7868       gimple call;
7869
7870       x = implicit_built_in_decls[BUILT_IN_RETURN_ADDRESS];
7871       call = gimple_build_call (x, 0);
7872       tmp_var = create_tmp_var (ptr_type_node, "return_addr");
7873       gimple_call_set_lhs (call, tmp_var);
7874       gimplify_seq_add_stmt (&cleanup, call);
7875       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
7876       call = gimple_build_call (x, 2,
7877                                 build_fold_addr_expr (current_function_decl),
7878                                 tmp_var);
7879       gimplify_seq_add_stmt (&cleanup, call);
7880       tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
7881
7882       x = implicit_built_in_decls[BUILT_IN_RETURN_ADDRESS];
7883       call = gimple_build_call (x, 0);
7884       tmp_var = create_tmp_var (ptr_type_node, "return_addr");
7885       gimple_call_set_lhs (call, tmp_var);
7886       gimplify_seq_add_stmt (&body, call);
7887       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
7888       call = gimple_build_call (x, 2,
7889                                 build_fold_addr_expr (current_function_decl),
7890                                 tmp_var);
7891       gimplify_seq_add_stmt (&body, call);
7892       gimplify_seq_add_stmt (&body, tf);
7893       new_bind = gimple_build_bind (NULL, body, gimple_bind_block (bind));
7894       /* Clear the block for BIND, since it is no longer directly inside
7895          the function, but within a try block.  */
7896       gimple_bind_set_block (bind, NULL);
7897
7898       /* Replace the current function body with the body
7899          wrapped in the try/finally TF.  */
7900       seq = gimple_seq_alloc ();
7901       gimple_seq_add_stmt (&seq, new_bind);
7902       gimple_set_body (fndecl, seq);
7903     }
7904
7905   DECL_SAVED_TREE (fndecl) = NULL_TREE;
7906   cfun->curr_properties = PROP_gimple_any;
7907
7908   current_function_decl = oldfn;
7909   pop_cfun ();
7910 }
7911
7912
7913 /* Some transformations like inlining may invalidate the GIMPLE form
7914    for operands.  This function traverses all the operands in STMT and
7915    gimplifies anything that is not a valid gimple operand.  Any new
7916    GIMPLE statements are inserted before *GSI_P.  */
7917
7918 void
7919 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
7920 {
7921   size_t i, num_ops;
7922   tree orig_lhs = NULL_TREE, lhs, t;
7923   gimple_seq pre = NULL;
7924   gimple post_stmt = NULL;
7925   struct gimplify_ctx gctx;
7926
7927   push_gimplify_context (&gctx);
7928   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
7929
7930   switch (gimple_code (stmt))
7931     {
7932     case GIMPLE_COND:
7933       gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
7934                      is_gimple_val, fb_rvalue);
7935       gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
7936                      is_gimple_val, fb_rvalue);
7937       break;
7938     case GIMPLE_SWITCH:
7939       gimplify_expr (gimple_switch_index_ptr (stmt), &pre, NULL,
7940                      is_gimple_val, fb_rvalue);
7941       break;
7942     case GIMPLE_OMP_ATOMIC_LOAD:
7943       gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
7944                      is_gimple_val, fb_rvalue);
7945       break;
7946     case GIMPLE_ASM:
7947       {
7948         size_t i, noutputs = gimple_asm_noutputs (stmt);
7949         const char *constraint, **oconstraints;
7950         bool allows_mem, allows_reg, is_inout;
7951
7952         oconstraints
7953           = (const char **) alloca ((noutputs) * sizeof (const char *));
7954         for (i = 0; i < noutputs; i++)
7955           {
7956             tree op = gimple_asm_output_op (stmt, i);
7957             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7958             oconstraints[i] = constraint;
7959             parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
7960                                      &allows_reg, &is_inout);
7961             gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7962                            is_inout ? is_gimple_min_lval : is_gimple_lvalue,
7963                            fb_lvalue | fb_mayfail);
7964           }
7965         for (i = 0; i < gimple_asm_ninputs (stmt); i++)
7966           {
7967             tree op = gimple_asm_input_op (stmt, i);
7968             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
7969             parse_input_constraint (&constraint, 0, 0, noutputs, 0,
7970                                     oconstraints, &allows_mem, &allows_reg);
7971             if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
7972               allows_reg = 0;
7973             if (!allows_reg && allows_mem)
7974               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7975                              is_gimple_lvalue, fb_lvalue | fb_mayfail);
7976             else
7977               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
7978                              is_gimple_asm_val, fb_rvalue);
7979           }
7980       }
7981       break;
7982     default:
7983       /* NOTE: We start gimplifying operands from last to first to
7984          make sure that side-effects on the RHS of calls, assignments
7985          and ASMs are executed before the LHS.  The ordering is not
7986          important for other statements.  */
7987       num_ops = gimple_num_ops (stmt);
7988       orig_lhs = gimple_get_lhs (stmt);
7989       for (i = num_ops; i > 0; i--)
7990         {
7991           tree op = gimple_op (stmt, i - 1);
7992           if (op == NULL_TREE)
7993             continue;
7994           if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
7995             gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
7996           else if (i == 2
7997                    && is_gimple_assign (stmt)
7998                    && num_ops == 2
7999                    && get_gimple_rhs_class (gimple_expr_code (stmt))
8000                       == GIMPLE_SINGLE_RHS)
8001             gimplify_expr (&op, &pre, NULL,
8002                            rhs_predicate_for (gimple_assign_lhs (stmt)),
8003                            fb_rvalue);
8004           else if (i == 2 && is_gimple_call (stmt))
8005             {
8006               if (TREE_CODE (op) == FUNCTION_DECL)
8007                 continue;
8008               gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
8009             }
8010           else
8011             gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
8012           gimple_set_op (stmt, i - 1, op);
8013         }
8014
8015       lhs = gimple_get_lhs (stmt);
8016       /* If the LHS changed it in a way that requires a simple RHS,
8017          create temporary.  */
8018       if (lhs && !is_gimple_reg (lhs))
8019         {
8020           bool need_temp = false;
8021
8022           if (is_gimple_assign (stmt)
8023               && num_ops == 2
8024               && get_gimple_rhs_class (gimple_expr_code (stmt))
8025                  == GIMPLE_SINGLE_RHS)
8026             gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
8027                            rhs_predicate_for (gimple_assign_lhs (stmt)),
8028                            fb_rvalue);
8029           else if (is_gimple_reg (lhs))
8030             {
8031               if (is_gimple_reg_type (TREE_TYPE (lhs)))
8032                 {
8033                   if (is_gimple_call (stmt))
8034                     {
8035                       i = gimple_call_flags (stmt);
8036                       if ((i & ECF_LOOPING_CONST_OR_PURE)
8037                           || !(i & (ECF_CONST | ECF_PURE)))
8038                         need_temp = true;
8039                     }
8040                   if (stmt_can_throw_internal (stmt))
8041                     need_temp = true;
8042                 }
8043             }
8044           else
8045             {
8046               if (is_gimple_reg_type (TREE_TYPE (lhs)))
8047                 need_temp = true;
8048               else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
8049                 {
8050                   if (is_gimple_call (stmt))
8051                     {
8052                       tree fndecl = gimple_call_fndecl (stmt);
8053
8054                       if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
8055                           && !(fndecl && DECL_RESULT (fndecl)
8056                                && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
8057                         need_temp = true;
8058                     }
8059                   else
8060                     need_temp = true;
8061                 }
8062             }
8063           if (need_temp)
8064             {
8065               tree temp = create_tmp_reg (TREE_TYPE (lhs), NULL);
8066
8067               if (TREE_CODE (orig_lhs) == SSA_NAME)
8068                 orig_lhs = SSA_NAME_VAR (orig_lhs);
8069
8070               if (gimple_in_ssa_p (cfun))
8071                 temp = make_ssa_name (temp, NULL);
8072               gimple_set_lhs (stmt, temp);
8073               post_stmt = gimple_build_assign (lhs, temp);
8074               if (TREE_CODE (lhs) == SSA_NAME)
8075                 SSA_NAME_DEF_STMT (lhs) = post_stmt;
8076             }
8077         }
8078       break;
8079     }
8080
8081   if (gimple_referenced_vars (cfun))
8082     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
8083       add_referenced_var (t);
8084
8085   if (!gimple_seq_empty_p (pre))
8086     {
8087       if (gimple_in_ssa_p (cfun))
8088         {
8089           gimple_stmt_iterator i;
8090
8091           for (i = gsi_start (pre); !gsi_end_p (i); gsi_next (&i))
8092             mark_symbols_for_renaming (gsi_stmt (i));
8093         }
8094       gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
8095     }
8096   if (post_stmt)
8097     gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
8098
8099   pop_gimplify_context (NULL);
8100 }
8101
8102
8103 /* Expands EXPR to list of gimple statements STMTS.  GIMPLE_TEST_F specifies
8104    the predicate that will hold for the result.  If VAR is not NULL, make the
8105    base variable of the final destination be VAR if suitable.  */
8106
8107 tree
8108 force_gimple_operand_1 (tree expr, gimple_seq *stmts,
8109                         gimple_predicate gimple_test_f, tree var)
8110 {
8111   tree t;
8112   enum gimplify_status ret;
8113   struct gimplify_ctx gctx;
8114
8115   *stmts = NULL;
8116
8117   /* gimple_test_f might be more strict than is_gimple_val, make
8118      sure we pass both.  Just checking gimple_test_f doesn't work
8119      because most gimple predicates do not work recursively.  */
8120   if (is_gimple_val (expr)
8121       && (*gimple_test_f) (expr))
8122     return expr;
8123
8124   push_gimplify_context (&gctx);
8125   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
8126   gimplify_ctxp->allow_rhs_cond_expr = true;
8127
8128   if (var)
8129     expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
8130
8131   if (TREE_CODE (expr) != MODIFY_EXPR
8132       && TREE_TYPE (expr) == void_type_node)
8133     {
8134       gimplify_and_add (expr, stmts);
8135       expr = NULL_TREE;
8136     }
8137   else
8138     {
8139       ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
8140       gcc_assert (ret != GS_ERROR);
8141     }
8142
8143   if (gimple_referenced_vars (cfun))
8144     for (t = gimplify_ctxp->temps; t ; t = DECL_CHAIN (t))
8145       add_referenced_var (t);
8146
8147   pop_gimplify_context (NULL);
8148
8149   return expr;
8150 }
8151
8152 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
8153    force the result to be either ssa_name or an invariant, otherwise
8154    just force it to be a rhs expression.  If VAR is not NULL, make the
8155    base variable of the final destination be VAR if suitable.  */
8156
8157 tree
8158 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
8159 {
8160   return force_gimple_operand_1 (expr, stmts,
8161                                  simple ? is_gimple_val : is_gimple_reg_rhs,
8162                                  var);
8163 }
8164
8165 /* Invokes force_gimple_operand_1 for EXPR with parameters GIMPLE_TEST_F
8166    and VAR.  If some statements are produced, emits them at GSI.
8167    If BEFORE is true.  the statements are appended before GSI, otherwise
8168    they are appended after it.  M specifies the way GSI moves after
8169    insertion (GSI_SAME_STMT or GSI_CONTINUE_LINKING are the usual values).  */
8170
8171 tree
8172 force_gimple_operand_gsi_1 (gimple_stmt_iterator *gsi, tree expr,
8173                             gimple_predicate gimple_test_f,
8174                             tree var, bool before,
8175                             enum gsi_iterator_update m)
8176 {
8177   gimple_seq stmts;
8178
8179   expr = force_gimple_operand_1 (expr, &stmts, gimple_test_f, var);
8180
8181   if (!gimple_seq_empty_p (stmts))
8182     {
8183       if (gimple_in_ssa_p (cfun))
8184         {
8185           gimple_stmt_iterator i;
8186
8187           for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
8188             mark_symbols_for_renaming (gsi_stmt (i));
8189         }
8190
8191       if (before)
8192         gsi_insert_seq_before (gsi, stmts, m);
8193       else
8194         gsi_insert_seq_after (gsi, stmts, m);
8195     }
8196
8197   return expr;
8198 }
8199
8200 /* Invokes force_gimple_operand_1 for EXPR with parameter VAR.
8201    If SIMPLE is true, force the result to be either ssa_name or an invariant,
8202    otherwise just force it to be a rhs expression.  If some statements are
8203    produced, emits them at GSI.  If BEFORE is true, the statements are
8204    appended before GSI, otherwise they are appended after it.  M specifies
8205    the way GSI moves after insertion (GSI_SAME_STMT or GSI_CONTINUE_LINKING
8206    are the usual values).  */
8207
8208 tree
8209 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
8210                           bool simple_p, tree var, bool before,
8211                           enum gsi_iterator_update m)
8212 {
8213   return force_gimple_operand_gsi_1 (gsi, expr,
8214                                      simple_p
8215                                      ? is_gimple_val : is_gimple_reg_rhs,
8216                                      var, before, m);
8217 }
8218
8219
8220 #include "gt-gimplify.h"