OSDN Git Service

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