OSDN Git Service

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