OSDN Git Service

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