OSDN Git Service

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