OSDN Git Service

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