OSDN Git Service

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