OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / gimplify.c
1 /* Tree lowering pass.  This pass converts the GENERIC functions-as-trees
2    tree representation into the GIMPLE form.
3    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5    Major work done by Sebastian Pop <s.pop@laposte.net>,
6    Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "gimple.h"
30 #include "tree-iterator.h"
31 #include "tree-inline.h"
32 #include "tree-pretty-print.h"
33 #include "langhooks.h"
34 #include "tree-flow.h"
35 #include "cgraph.h"
36 #include "timevar.h"
37 #include "hashtab.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "output.h"
41 #include "ggc.h"
42 #include "diagnostic-core.h"
43 #include "target.h"
44 #include "pointer-set.h"
45 #include "splay-tree.h"
46 #include "vec.h"
47 #include "gimple.h"
48 #include "tree-pass.h"
49
50 #include "langhooks-def.h"      /* FIXME: for lhd_set_decl_assembler_name.  */
51 #include "expr.h"               /* FIXME: for can_move_by_pieces
52                                    and STACK_CHECK_MAX_VAR_SIZE.  */
53
54 enum gimplify_omp_var_data
55 {
56   GOVD_SEEN = 1,
57   GOVD_EXPLICIT = 2,
58   GOVD_SHARED = 4,
59   GOVD_PRIVATE = 8,
60   GOVD_FIRSTPRIVATE = 16,
61   GOVD_LASTPRIVATE = 32,
62   GOVD_REDUCTION = 64,
63   GOVD_LOCAL = 128,
64   GOVD_DEBUG_PRIVATE = 256,
65   GOVD_PRIVATE_OUTER_REF = 512,
66   GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
67                            | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LOCAL)
68 };
69
70
71 enum omp_region_type
72 {
73   ORT_WORKSHARE = 0,
74   ORT_PARALLEL = 2,
75   ORT_COMBINED_PARALLEL = 3,
76   ORT_TASK = 4,
77   ORT_UNTIED_TASK = 5
78 };
79
80 struct gimplify_omp_ctx
81 {
82   struct gimplify_omp_ctx *outer_context;
83   splay_tree variables;
84   struct pointer_set_t *privatized_types;
85   location_t location;
86   enum omp_clause_default_kind default_kind;
87   enum omp_region_type region_type;
88 };
89
90 static struct gimplify_ctx *gimplify_ctxp;
91 static struct gimplify_omp_ctx *gimplify_omp_ctxp;
92
93
94 /* Formal (expression) temporary table handling: multiple occurrences of
95    the same scalar expression are evaluated into the same temporary.  */
96
97 typedef struct gimple_temp_hash_elt
98 {
99   tree val;   /* Key */
100   tree temp;  /* Value */
101 } elt_t;
102
103 /* Forward declaration.  */
104 static enum gimplify_status gimplify_compound_expr (tree *, gimple_seq *, bool);
105
106 /* Mark X addressable.  Unlike the langhook we expect X to be in gimple
107    form and we don't do any syntax checking.  */
108
109 void
110 mark_addressable (tree x)
111 {
112   while (handled_component_p (x))
113     x = TREE_OPERAND (x, 0);
114   if (TREE_CODE (x) == MEM_REF
115       && TREE_CODE (TREE_OPERAND (x, 0)) == ADDR_EXPR)
116     x = TREE_OPERAND (TREE_OPERAND (x, 0), 0);
117   if (TREE_CODE (x) != VAR_DECL
118       && TREE_CODE (x) != PARM_DECL
119       && TREE_CODE (x) != RESULT_DECL)
120     return;
121   TREE_ADDRESSABLE (x) = 1;
122 }
123
124 /* Return a hash value for a formal temporary table entry.  */
125
126 static hashval_t
127 gimple_tree_hash (const void *p)
128 {
129   tree t = ((const elt_t *) p)->val;
130   return iterative_hash_expr (t, 0);
131 }
132
133 /* Compare two formal temporary table entries.  */
134
135 static int
136 gimple_tree_eq (const void *p1, const void *p2)
137 {
138   tree t1 = ((const elt_t *) p1)->val;
139   tree t2 = ((const elt_t *) p2)->val;
140   enum tree_code code = TREE_CODE (t1);
141
142   if (TREE_CODE (t2) != code
143       || TREE_TYPE (t1) != TREE_TYPE (t2))
144     return 0;
145
146   if (!operand_equal_p (t1, t2, 0))
147     return 0;
148
149 #ifdef ENABLE_CHECKING
150   /* Only allow them to compare equal if they also hash equal; otherwise
151      results are nondeterminate, and we fail bootstrap comparison.  */
152   gcc_assert (gimple_tree_hash (p1) == gimple_tree_hash (p2));
153 #endif
154
155   return 1;
156 }
157
158 /* Link gimple statement GS to the end of the sequence *SEQ_P.  If
159    *SEQ_P is NULL, a new sequence is allocated.  This function is
160    similar to gimple_seq_add_stmt, but does not scan the operands.
161    During gimplification, we need to manipulate statement sequences
162    before the def/use vectors have been constructed.  */
163
164 void
165 gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
166 {
167   gimple_stmt_iterator si;
168
169   if (gs == NULL)
170     return;
171
172   if (*seq_p == NULL)
173     *seq_p = gimple_seq_alloc ();
174
175   si = gsi_last (*seq_p);
176
177   gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
178 }
179
180 /* Append sequence SRC to the end of sequence *DST_P.  If *DST_P is
181    NULL, a new sequence is allocated.   This function is
182    similar to gimple_seq_add_seq, but does not scan the operands.
183    During gimplification, we need to manipulate statement sequences
184    before the def/use vectors have been constructed.  */
185
186 static void
187 gimplify_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
188 {
189   gimple_stmt_iterator si;
190
191   if (src == NULL)
192     return;
193
194   if (*dst_p == NULL)
195     *dst_p = gimple_seq_alloc ();
196
197   si = gsi_last (*dst_p);
198   gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
199 }
200
201 /* Set up a context for the gimplifier.  */
202
203 void
204 push_gimplify_context (struct gimplify_ctx *c)
205 {
206   memset (c, '\0', sizeof (*c));
207   c->prev_context = gimplify_ctxp;
208   gimplify_ctxp = c;
209 }
210
211 /* Tear down a context for the gimplifier.  If BODY is non-null, then
212    put the temporaries into the outer BIND_EXPR.  Otherwise, put them
213    in the local_decls.
214
215    BODY is not a sequence, but the first tuple in a sequence.  */
216
217 void
218 pop_gimplify_context (gimple body)
219 {
220   struct gimplify_ctx *c = gimplify_ctxp;
221
222   gcc_assert (c && (c->bind_expr_stack == NULL
223                     || VEC_empty (gimple, c->bind_expr_stack)));
224   VEC_free (gimple, heap, c->bind_expr_stack);
225   gimplify_ctxp = c->prev_context;
226
227   if (body)
228     declare_vars (c->temps, body, false);
229   else
230     record_vars (c->temps);
231
232   if (c->temp_htab)
233     htab_delete (c->temp_htab);
234 }
235
236 /* Push a GIMPLE_BIND tuple onto the stack of bindings.  */
237
238 static void
239 gimple_push_bind_expr (gimple gimple_bind)
240 {
241   if (gimplify_ctxp->bind_expr_stack == NULL)
242     gimplify_ctxp->bind_expr_stack = VEC_alloc (gimple, heap, 8);
243   VEC_safe_push (gimple, heap, gimplify_ctxp->bind_expr_stack, gimple_bind);
244 }
245
246 /* Pop the first element off the stack of bindings.  */
247
248 static void
249 gimple_pop_bind_expr (void)
250 {
251   VEC_pop (gimple, gimplify_ctxp->bind_expr_stack);
252 }
253
254 /* Return the first element of the stack of bindings.  */
255
256 gimple
257 gimple_current_bind_expr (void)
258 {
259   return VEC_last (gimple, gimplify_ctxp->bind_expr_stack);
260 }
261
262 /* Return the stack of bindings created during gimplification.  */
263
264 VEC(gimple, heap) *
265 gimple_bind_expr_stack (void)
266 {
267   return gimplify_ctxp->bind_expr_stack;
268 }
269
270 /* Return true iff there is a COND_EXPR between us and the innermost
271    CLEANUP_POINT_EXPR.  This info is used by gimple_push_cleanup.  */
272
273 static bool
274 gimple_conditional_context (void)
275 {
276   return gimplify_ctxp->conditions > 0;
277 }
278
279 /* Note that we've entered a COND_EXPR.  */
280
281 static void
282 gimple_push_condition (void)
283 {
284 #ifdef ENABLE_GIMPLE_CHECKING
285   if (gimplify_ctxp->conditions == 0)
286     gcc_assert (gimple_seq_empty_p (gimplify_ctxp->conditional_cleanups));
287 #endif
288   ++(gimplify_ctxp->conditions);
289 }
290
291 /* Note that we've left a COND_EXPR.  If we're back at unconditional scope
292    now, add any conditional cleanups we've seen to the prequeue.  */
293
294 static void
295 gimple_pop_condition (gimple_seq *pre_p)
296 {
297   int conds = --(gimplify_ctxp->conditions);
298
299   gcc_assert (conds >= 0);
300   if (conds == 0)
301     {
302       gimplify_seq_add_seq (pre_p, gimplify_ctxp->conditional_cleanups);
303       gimplify_ctxp->conditional_cleanups = NULL;
304     }
305 }
306
307 /* A stable comparison routine for use with splay trees and DECLs.  */
308
309 static int
310 splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb)
311 {
312   tree a = (tree) xa;
313   tree b = (tree) xb;
314
315   return DECL_UID (a) - DECL_UID (b);
316 }
317
318 /* Create a new omp construct that deals with variable remapping.  */
319
320 static struct gimplify_omp_ctx *
321 new_omp_context (enum omp_region_type region_type)
322 {
323   struct gimplify_omp_ctx *c;
324
325   c = XCNEW (struct gimplify_omp_ctx);
326   c->outer_context = gimplify_omp_ctxp;
327   c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
328   c->privatized_types = pointer_set_create ();
329   c->location = input_location;
330   c->region_type = region_type;
331   if ((region_type & ORT_TASK) == 0)
332     c->default_kind = OMP_CLAUSE_DEFAULT_SHARED;
333   else
334     c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
335
336   return c;
337 }
338
339 /* Destroy an omp construct that deals with variable remapping.  */
340
341 static void
342 delete_omp_context (struct gimplify_omp_ctx *c)
343 {
344   splay_tree_delete (c->variables);
345   pointer_set_destroy (c->privatized_types);
346   XDELETE (c);
347 }
348
349 static void omp_add_variable (struct gimplify_omp_ctx *, tree, unsigned int);
350 static bool omp_notice_variable (struct gimplify_omp_ctx *, tree, bool);
351
352 /* Both gimplify the statement T and append it to *SEQ_P.  This function
353    behaves exactly as gimplify_stmt, but you don't have to pass T as a
354    reference.  */
355
356 void
357 gimplify_and_add (tree t, gimple_seq *seq_p)
358 {
359   gimplify_stmt (&t, seq_p);
360 }
361
362 /* Gimplify statement T into sequence *SEQ_P, and return the first
363    tuple in the sequence of generated tuples for this statement.
364    Return NULL if gimplifying T produced no tuples.  */
365
366 static gimple
367 gimplify_and_return_first (tree t, gimple_seq *seq_p)
368 {
369   gimple_stmt_iterator last = gsi_last (*seq_p);
370
371   gimplify_and_add (t, seq_p);
372
373   if (!gsi_end_p (last))
374     {
375       gsi_next (&last);
376       return gsi_stmt (last);
377     }
378   else
379     return gimple_seq_first_stmt (*seq_p);
380 }
381
382 /* Strip off a legitimate source ending from the input string NAME of
383    length LEN.  Rather than having to know the names used by all of
384    our front ends, we strip off an ending of a period followed by
385    up to five characters.  (Java uses ".class".)  */
386
387 static inline void
388 remove_suffix (char *name, int len)
389 {
390   int i;
391
392   for (i = 2;  i < 8 && len > i;  i++)
393     {
394       if (name[len - i] == '.')
395         {
396           name[len - i] = '\0';
397           break;
398         }
399     }
400 }
401
402 /* Create a new temporary name with PREFIX.  Return an identifier.  */
403
404 static GTY(()) unsigned int tmp_var_id_num;
405
406 tree
407 create_tmp_var_name (const char *prefix)
408 {
409   char *tmp_name;
410
411   if (prefix)
412     {
413       char *preftmp = ASTRDUP (prefix);
414
415       remove_suffix (preftmp, strlen (preftmp));
416       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           SET_EXPR_LOCATION (*expr_p, EXPR_LOCATION (call));
2453           TREE_BLOCK (*expr_p) = TREE_BLOCK (call);
2454
2455           /* Set CALL_EXPR_VA_ARG_PACK.  */
2456           CALL_EXPR_VA_ARG_PACK (*expr_p) = 1;
2457         }
2458     }
2459
2460   /* Finally, gimplify the function arguments.  */
2461   if (nargs > 0)
2462     {
2463       for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
2464            PUSH_ARGS_REVERSED ? i >= 0 : i < nargs;
2465            PUSH_ARGS_REVERSED ? i-- : i++)
2466         {
2467           enum gimplify_status t;
2468
2469           /* Avoid gimplifying the second argument to va_start, which needs to
2470              be the plain PARM_DECL.  */
2471           if ((i != 1) || !builtin_va_start_p)
2472             {
2473               t = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p,
2474                                 EXPR_LOCATION (*expr_p));
2475
2476               if (t == GS_ERROR)
2477                 ret = GS_ERROR;
2478             }
2479         }
2480     }
2481
2482   /* Verify the function result.  */
2483   if (want_value && fndecl
2484       && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fnptrtype))))
2485     {
2486       error_at (loc, "using result of function returning %<void%>");
2487       ret = GS_ERROR;
2488     }
2489
2490   /* Try this again in case gimplification exposed something.  */
2491   if (ret != GS_ERROR)
2492     {
2493       tree new_tree = fold_call_expr (input_location, *expr_p, !want_value);
2494
2495       if (new_tree && new_tree != *expr_p)
2496         {
2497           /* There was a transformation of this call which computes the
2498              same value, but in a more efficient way.  Return and try
2499              again.  */
2500           *expr_p = new_tree;
2501           return GS_OK;
2502         }
2503     }
2504   else
2505     {
2506       *expr_p = error_mark_node;
2507       return GS_ERROR;
2508     }
2509
2510   /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
2511      decl.  This allows us to eliminate redundant or useless
2512      calls to "const" functions.  */
2513   if (TREE_CODE (*expr_p) == CALL_EXPR)
2514     {
2515       int flags = call_expr_flags (*expr_p);
2516       if (flags & (ECF_CONST | ECF_PURE)
2517           /* An infinite loop is considered a side effect.  */
2518           && !(flags & (ECF_LOOPING_CONST_OR_PURE)))
2519         TREE_SIDE_EFFECTS (*expr_p) = 0;
2520     }
2521
2522   /* If the value is not needed by the caller, emit a new GIMPLE_CALL
2523      and clear *EXPR_P.  Otherwise, leave *EXPR_P in its gimplified
2524      form and delegate the creation of a GIMPLE_CALL to
2525      gimplify_modify_expr.  This is always possible because when
2526      WANT_VALUE is true, the caller wants the result of this call into
2527      a temporary, which means that we will emit an INIT_EXPR in
2528      internal_get_tmp_var which will then be handled by
2529      gimplify_modify_expr.  */
2530   if (!want_value)
2531     {
2532       /* The CALL_EXPR in *EXPR_P is already in GIMPLE form, so all we
2533          have to do is replicate it as a GIMPLE_CALL tuple.  */
2534       gimple_stmt_iterator gsi;
2535       call = gimple_build_call_from_tree (*expr_p);
2536       gimple_call_set_fntype (call, TREE_TYPE (fnptrtype));
2537       gimplify_seq_add_stmt (pre_p, call);
2538       gsi = gsi_last (*pre_p);
2539       fold_stmt (&gsi);
2540       *expr_p = NULL_TREE;
2541     }
2542   else
2543     /* Remember the original function type.  */
2544     CALL_EXPR_FN (*expr_p) = build1 (NOP_EXPR, fnptrtype,
2545                                      CALL_EXPR_FN (*expr_p));
2546
2547   return ret;
2548 }
2549
2550 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
2551    rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
2552
2553    TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
2554    condition is true or false, respectively.  If null, we should generate
2555    our own to skip over the evaluation of this specific expression.
2556
2557    LOCUS is the source location of the COND_EXPR.
2558
2559    This function is the tree equivalent of do_jump.
2560
2561    shortcut_cond_r should only be called by shortcut_cond_expr.  */
2562
2563 static tree
2564 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p,
2565                  location_t locus)
2566 {
2567   tree local_label = NULL_TREE;
2568   tree t, expr = NULL;
2569
2570   /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
2571      retain the shortcut semantics.  Just insert the gotos here;
2572      shortcut_cond_expr will append the real blocks later.  */
2573   if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2574     {
2575       location_t new_locus;
2576
2577       /* Turn if (a && b) into
2578
2579          if (a); else goto no;
2580          if (b) goto yes; else goto no;
2581          (no:) */
2582
2583       if (false_label_p == NULL)
2584         false_label_p = &local_label;
2585
2586       /* Keep the original source location on the first 'if'.  */
2587       t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p, locus);
2588       append_to_statement_list (t, &expr);
2589
2590       /* Set the source location of the && on the second 'if'.  */
2591       new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2592       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p, false_label_p,
2593                            new_locus);
2594       append_to_statement_list (t, &expr);
2595     }
2596   else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2597     {
2598       location_t new_locus;
2599
2600       /* Turn if (a || b) into
2601
2602          if (a) goto yes;
2603          if (b) goto yes; else goto no;
2604          (yes:) */
2605
2606       if (true_label_p == NULL)
2607         true_label_p = &local_label;
2608
2609       /* Keep the original source location on the first 'if'.  */
2610       t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL, locus);
2611       append_to_statement_list (t, &expr);
2612
2613       /* Set the source location of the || on the second 'if'.  */
2614       new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2615       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p, false_label_p,
2616                            new_locus);
2617       append_to_statement_list (t, &expr);
2618     }
2619   else if (TREE_CODE (pred) == COND_EXPR
2620            && !VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (pred, 1)))
2621            && !VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (pred, 2))))
2622     {
2623       location_t new_locus;
2624
2625       /* As long as we're messing with gotos, turn if (a ? b : c) into
2626          if (a)
2627            if (b) goto yes; else goto no;
2628          else
2629            if (c) goto yes; else goto no;
2630
2631          Don't do this if one of the arms has void type, which can happen
2632          in C++ when the arm is throw.  */
2633
2634       /* Keep the original source location on the first 'if'.  Set the source
2635          location of the ? on the second 'if'.  */
2636       new_locus = EXPR_HAS_LOCATION (pred) ? EXPR_LOCATION (pred) : locus;
2637       expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
2638                      shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2639                                       false_label_p, locus),
2640                      shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
2641                                       false_label_p, new_locus));
2642     }
2643   else
2644     {
2645       expr = build3 (COND_EXPR, void_type_node, pred,
2646                      build_and_jump (true_label_p),
2647                      build_and_jump (false_label_p));
2648       SET_EXPR_LOCATION (expr, locus);
2649     }
2650
2651   if (local_label)
2652     {
2653       t = build1 (LABEL_EXPR, void_type_node, local_label);
2654       append_to_statement_list (t, &expr);
2655     }
2656
2657   return expr;
2658 }
2659
2660 /* Given a conditional expression EXPR with short-circuit boolean
2661    predicates using TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR, break the
2662    predicate appart into the equivalent sequence of conditionals.  */
2663
2664 static tree
2665 shortcut_cond_expr (tree expr)
2666 {
2667   tree pred = TREE_OPERAND (expr, 0);
2668   tree then_ = TREE_OPERAND (expr, 1);
2669   tree else_ = TREE_OPERAND (expr, 2);
2670   tree true_label, false_label, end_label, t;
2671   tree *true_label_p;
2672   tree *false_label_p;
2673   bool emit_end, emit_false, jump_over_else;
2674   bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2675   bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2676
2677   /* First do simple transformations.  */
2678   if (!else_se)
2679     {
2680       /* If there is no 'else', turn
2681            if (a && b) then c
2682          into
2683            if (a) if (b) then c.  */
2684       while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2685         {
2686           /* Keep the original source location on the first 'if'.  */
2687           location_t locus = EXPR_LOC_OR_HERE (expr);
2688           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2689           /* Set the source location of the && on the second 'if'.  */
2690           if (EXPR_HAS_LOCATION (pred))
2691             SET_EXPR_LOCATION (expr, EXPR_LOCATION (pred));
2692           then_ = shortcut_cond_expr (expr);
2693           then_se = then_ && TREE_SIDE_EFFECTS (then_);
2694           pred = TREE_OPERAND (pred, 0);
2695           expr = build3 (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2696           SET_EXPR_LOCATION (expr, locus);
2697         }
2698     }
2699
2700   if (!then_se)
2701     {
2702       /* If there is no 'then', turn
2703            if (a || b); else d
2704          into
2705            if (a); else if (b); else d.  */
2706       while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2707         {
2708           /* Keep the original source location on the first 'if'.  */
2709           location_t locus = EXPR_LOC_OR_HERE (expr);
2710           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2711           /* Set the source location of the || on the second 'if'.  */
2712           if (EXPR_HAS_LOCATION (pred))
2713             SET_EXPR_LOCATION (expr, EXPR_LOCATION (pred));
2714           else_ = shortcut_cond_expr (expr);
2715           else_se = else_ && TREE_SIDE_EFFECTS (else_);
2716           pred = TREE_OPERAND (pred, 0);
2717           expr = build3 (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2718           SET_EXPR_LOCATION (expr, locus);
2719         }
2720     }
2721
2722   /* If we're done, great.  */
2723   if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2724       && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2725     return expr;
2726
2727   /* Otherwise we need to mess with gotos.  Change
2728        if (a) c; else d;
2729      to
2730        if (a); else goto no;
2731        c; goto end;
2732        no: d; end:
2733      and recursively gimplify the condition.  */
2734
2735   true_label = false_label = end_label = NULL_TREE;
2736
2737   /* If our arms just jump somewhere, hijack those labels so we don't
2738      generate jumps to jumps.  */
2739
2740   if (then_
2741       && TREE_CODE (then_) == GOTO_EXPR
2742       && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2743     {
2744       true_label = GOTO_DESTINATION (then_);
2745       then_ = NULL;
2746       then_se = false;
2747     }
2748
2749   if (else_
2750       && TREE_CODE (else_) == GOTO_EXPR
2751       && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2752     {
2753       false_label = GOTO_DESTINATION (else_);
2754       else_ = NULL;
2755       else_se = false;
2756     }
2757
2758   /* If we aren't hijacking a label for the 'then' branch, it falls through.  */
2759   if (true_label)
2760     true_label_p = &true_label;
2761   else
2762     true_label_p = NULL;
2763
2764   /* The 'else' branch also needs a label if it contains interesting code.  */
2765   if (false_label || else_se)
2766     false_label_p = &false_label;
2767   else
2768     false_label_p = NULL;
2769
2770   /* If there was nothing else in our arms, just forward the label(s).  */
2771   if (!then_se && !else_se)
2772     return shortcut_cond_r (pred, true_label_p, false_label_p,
2773                             EXPR_LOC_OR_HERE (expr));
2774
2775   /* If our last subexpression already has a terminal label, reuse it.  */
2776   if (else_se)
2777     t = expr_last (else_);
2778   else if (then_se)
2779     t = expr_last (then_);
2780   else
2781     t = NULL;
2782   if (t && TREE_CODE (t) == LABEL_EXPR)
2783     end_label = LABEL_EXPR_LABEL (t);
2784
2785   /* If we don't care about jumping to the 'else' branch, jump to the end
2786      if the condition is false.  */
2787   if (!false_label_p)
2788     false_label_p = &end_label;
2789
2790   /* We only want to emit these labels if we aren't hijacking them.  */
2791   emit_end = (end_label == NULL_TREE);
2792   emit_false = (false_label == NULL_TREE);
2793
2794   /* We only emit the jump over the else clause if we have to--if the
2795      then clause may fall through.  Otherwise we can wind up with a
2796      useless jump and a useless label at the end of gimplified code,
2797      which will cause us to think that this conditional as a whole
2798      falls through even if it doesn't.  If we then inline a function
2799      which ends with such a condition, that can cause us to issue an
2800      inappropriate warning about control reaching the end of a
2801      non-void function.  */
2802   jump_over_else = block_may_fallthru (then_);
2803
2804   pred = shortcut_cond_r (pred, true_label_p, false_label_p,
2805                           EXPR_LOC_OR_HERE (expr));
2806
2807   expr = NULL;
2808   append_to_statement_list (pred, &expr);
2809
2810   append_to_statement_list (then_, &expr);
2811   if (else_se)
2812     {
2813       if (jump_over_else)
2814         {
2815           tree last = expr_last (expr);
2816           t = build_and_jump (&end_label);
2817           if (EXPR_HAS_LOCATION (last))
2818             SET_EXPR_LOCATION (t, EXPR_LOCATION (last));
2819           append_to_statement_list (t, &expr);
2820         }
2821       if (emit_false)
2822         {
2823           t = build1 (LABEL_EXPR, void_type_node, false_label);
2824           append_to_statement_list (t, &expr);
2825         }
2826       append_to_statement_list (else_, &expr);
2827     }
2828   if (emit_end && end_label)
2829     {
2830       t = build1 (LABEL_EXPR, void_type_node, end_label);
2831       append_to_statement_list (t, &expr);
2832     }
2833
2834   return expr;
2835 }
2836
2837 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE.  */
2838
2839 tree
2840 gimple_boolify (tree expr)
2841 {
2842   tree type = TREE_TYPE (expr);
2843   location_t loc = EXPR_LOCATION (expr);
2844
2845   if (TREE_CODE (expr) == NE_EXPR
2846       && TREE_CODE (TREE_OPERAND (expr, 0)) == CALL_EXPR
2847       && integer_zerop (TREE_OPERAND (expr, 1)))
2848     {
2849       tree call = TREE_OPERAND (expr, 0);
2850       tree fn = get_callee_fndecl (call);
2851
2852       /* For __builtin_expect ((long) (x), y) recurse into x as well
2853          if x is truth_value_p.  */
2854       if (fn
2855           && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL
2856           && DECL_FUNCTION_CODE (fn) == BUILT_IN_EXPECT
2857           && call_expr_nargs (call) == 2)
2858         {
2859           tree arg = CALL_EXPR_ARG (call, 0);
2860           if (arg)
2861             {
2862               if (TREE_CODE (arg) == NOP_EXPR
2863                   && TREE_TYPE (arg) == TREE_TYPE (call))
2864                 arg = TREE_OPERAND (arg, 0);
2865               if (truth_value_p (TREE_CODE (arg)))
2866                 {
2867                   arg = gimple_boolify (arg);
2868                   CALL_EXPR_ARG (call, 0)
2869                     = fold_convert_loc (loc, TREE_TYPE (call), arg);
2870                 }
2871             }
2872         }
2873     }
2874
2875   switch (TREE_CODE (expr))
2876     {
2877     case TRUTH_AND_EXPR:
2878     case TRUTH_OR_EXPR:
2879     case TRUTH_XOR_EXPR:
2880     case TRUTH_ANDIF_EXPR:
2881     case TRUTH_ORIF_EXPR:
2882       /* Also boolify the arguments of truth exprs.  */
2883       TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2884       /* FALLTHRU */
2885
2886     case TRUTH_NOT_EXPR:
2887       TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2888
2889       /* These expressions always produce boolean results.  */
2890       if (TREE_CODE (type) != BOOLEAN_TYPE)
2891         TREE_TYPE (expr) = boolean_type_node;
2892       return expr;
2893
2894     default:
2895       if (COMPARISON_CLASS_P (expr))
2896         {
2897           /* There expressions always prduce boolean results.  */
2898           if (TREE_CODE (type) != BOOLEAN_TYPE)
2899             TREE_TYPE (expr) = boolean_type_node;
2900           return expr;
2901         }
2902       /* Other expressions that get here must have boolean values, but
2903          might need to be converted to the appropriate mode.  */
2904       if (TREE_CODE (type) == BOOLEAN_TYPE)
2905         return expr;
2906       return fold_convert_loc (loc, boolean_type_node, expr);
2907     }
2908 }
2909
2910 /* Given a conditional expression *EXPR_P without side effects, gimplify
2911    its operands.  New statements are inserted to PRE_P.  */
2912
2913 static enum gimplify_status
2914 gimplify_pure_cond_expr (tree *expr_p, gimple_seq *pre_p)
2915 {
2916   tree expr = *expr_p, cond;
2917   enum gimplify_status ret, tret;
2918   enum tree_code code;
2919
2920   cond = gimple_boolify (COND_EXPR_COND (expr));
2921
2922   /* We need to handle && and || specially, as their gimplification
2923      creates pure cond_expr, thus leading to an infinite cycle otherwise.  */
2924   code = TREE_CODE (cond);
2925   if (code == TRUTH_ANDIF_EXPR)
2926     TREE_SET_CODE (cond, TRUTH_AND_EXPR);
2927   else if (code == TRUTH_ORIF_EXPR)
2928     TREE_SET_CODE (cond, TRUTH_OR_EXPR);
2929   ret = gimplify_expr (&cond, pre_p, NULL, is_gimple_condexpr, fb_rvalue);
2930   COND_EXPR_COND (*expr_p) = cond;
2931
2932   tret = gimplify_expr (&COND_EXPR_THEN (expr), pre_p, NULL,
2933                                    is_gimple_val, fb_rvalue);
2934   ret = MIN (ret, tret);
2935   tret = gimplify_expr (&COND_EXPR_ELSE (expr), pre_p, NULL,
2936                                    is_gimple_val, fb_rvalue);
2937
2938   return MIN (ret, tret);
2939 }
2940
2941 /* Return true if evaluating EXPR could trap.
2942    EXPR is GENERIC, while tree_could_trap_p can be called
2943    only on GIMPLE.  */
2944
2945 static bool
2946 generic_expr_could_trap_p (tree expr)
2947 {
2948   unsigned i, n;
2949
2950   if (!expr || is_gimple_val (expr))
2951     return false;
2952
2953   if (!EXPR_P (expr) || tree_could_trap_p (expr))
2954     return true;
2955
2956   n = TREE_OPERAND_LENGTH (expr);
2957   for (i = 0; i < n; i++)
2958     if (generic_expr_could_trap_p (TREE_OPERAND (expr, i)))
2959       return true;
2960
2961   return false;
2962 }
2963
2964 /*  Convert the conditional expression pointed to by EXPR_P '(p) ? a : b;'
2965     into
2966
2967     if (p)                      if (p)
2968       t1 = a;                     a;
2969     else                or      else
2970       t1 = b;                     b;
2971     t1;
2972
2973     The second form is used when *EXPR_P is of type void.
2974
2975     PRE_P points to the list where side effects that must happen before
2976       *EXPR_P should be stored.  */
2977
2978 static enum gimplify_status
2979 gimplify_cond_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback)
2980 {
2981   tree expr = *expr_p;
2982   tree type = TREE_TYPE (expr);
2983   location_t loc = EXPR_LOCATION (expr);
2984   tree tmp, arm1, arm2;
2985   enum gimplify_status ret;
2986   tree label_true, label_false, label_cont;
2987   bool have_then_clause_p, have_else_clause_p;
2988   gimple gimple_cond;
2989   enum tree_code pred_code;
2990   gimple_seq seq = NULL;
2991
2992   /* If this COND_EXPR has a value, copy the values into a temporary within
2993      the arms.  */
2994   if (!VOID_TYPE_P (type))
2995     {
2996       tree then_ = TREE_OPERAND (expr, 1), else_ = TREE_OPERAND (expr, 2);
2997       tree result;
2998
2999       /* If either an rvalue is ok or we do not require an lvalue, create the
3000          temporary.  But we cannot do that if the type is addressable.  */
3001       if (((fallback & fb_rvalue) || !(fallback & fb_lvalue))
3002           && !TREE_ADDRESSABLE (type))
3003         {
3004           if (gimplify_ctxp->allow_rhs_cond_expr
3005               /* If either branch has side effects or could trap, it can't be
3006                  evaluated unconditionally.  */
3007               && !TREE_SIDE_EFFECTS (then_)
3008               && !generic_expr_could_trap_p (then_)
3009               && !TREE_SIDE_EFFECTS (else_)
3010               && !generic_expr_could_trap_p (else_))
3011             return gimplify_pure_cond_expr (expr_p, pre_p);
3012
3013           tmp = create_tmp_var (type, "iftmp");
3014           result = tmp;
3015         }
3016
3017       /* Otherwise, only create and copy references to the values.  */
3018       else
3019         {
3020           type = build_pointer_type (type);
3021
3022           if (!VOID_TYPE_P (TREE_TYPE (then_)))
3023             then_ = build_fold_addr_expr_loc (loc, then_);
3024
3025           if (!VOID_TYPE_P (TREE_TYPE (else_)))
3026             else_ = build_fold_addr_expr_loc (loc, else_);
3027  
3028           expr
3029             = build3 (COND_EXPR, type, TREE_OPERAND (expr, 0), then_, else_);
3030
3031           tmp = create_tmp_var (type, "iftmp");
3032           result = build_simple_mem_ref_loc (loc, tmp);
3033         }
3034
3035       /* Build the new then clause, `tmp = then_;'.  But don't build the
3036          assignment if the value is void; in C++ it can be if it's a throw.  */
3037       if (!VOID_TYPE_P (TREE_TYPE (then_)))
3038         TREE_OPERAND (expr, 1) = build2 (MODIFY_EXPR, type, tmp, then_);
3039
3040       /* Similarly, build the new else clause, `tmp = else_;'.  */
3041       if (!VOID_TYPE_P (TREE_TYPE (else_)))
3042         TREE_OPERAND (expr, 2) = build2 (MODIFY_EXPR, type, tmp, else_);
3043
3044       TREE_TYPE (expr) = void_type_node;
3045       recalculate_side_effects (expr);
3046
3047       /* Move the COND_EXPR to the prequeue.  */
3048       gimplify_stmt (&expr, pre_p);
3049
3050       *expr_p = result;
3051       return GS_ALL_DONE;
3052     }
3053
3054   /* Remove any COMPOUND_EXPR so the following cases will be caught.  */
3055   STRIP_TYPE_NOPS (TREE_OPERAND (expr, 0));
3056   if (TREE_CODE (TREE_OPERAND (expr, 0)) == COMPOUND_EXPR)
3057     gimplify_compound_expr (&TREE_OPERAND (expr, 0), pre_p, true);
3058
3059   /* Make sure the condition has BOOLEAN_TYPE.  */
3060   TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
3061
3062   /* Break apart && and || conditions.  */
3063   if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
3064       || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
3065     {
3066       expr = shortcut_cond_expr (expr);
3067
3068       if (expr != *expr_p)
3069         {
3070           *expr_p = expr;
3071
3072           /* We can't rely on gimplify_expr to re-gimplify the expanded
3073              form properly, as cleanups might cause the target labels to be
3074              wrapped in a TRY_FINALLY_EXPR.  To prevent that, we need to
3075              set up a conditional context.  */
3076           gimple_push_condition ();
3077           gimplify_stmt (expr_p, &seq);
3078           gimple_pop_condition (pre_p);
3079           gimple_seq_add_seq (pre_p, seq);
3080
3081           return GS_ALL_DONE;
3082         }
3083     }
3084
3085   /* Now do the normal gimplification.  */
3086
3087   /* Gimplify condition.  */
3088   ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL, is_gimple_condexpr,
3089                        fb_rvalue);
3090   if (ret == GS_ERROR)
3091     return GS_ERROR;
3092   gcc_assert (TREE_OPERAND (expr, 0) != NULL_TREE);
3093
3094   gimple_push_condition ();
3095
3096   have_then_clause_p = have_else_clause_p = false;
3097   if (TREE_OPERAND (expr, 1) != NULL
3098       && TREE_CODE (TREE_OPERAND (expr, 1)) == GOTO_EXPR
3099       && TREE_CODE (GOTO_DESTINATION (TREE_OPERAND (expr, 1))) == LABEL_DECL
3100       && (DECL_CONTEXT (GOTO_DESTINATION (TREE_OPERAND (expr, 1)))
3101           == current_function_decl)
3102       /* For -O0 avoid this optimization if the COND_EXPR and GOTO_EXPR
3103          have different locations, otherwise we end up with incorrect
3104          location information on the branches.  */
3105       && (optimize
3106           || !EXPR_HAS_LOCATION (expr)
3107           || !EXPR_HAS_LOCATION (TREE_OPERAND (expr, 1))
3108           || EXPR_LOCATION (expr) == EXPR_LOCATION (TREE_OPERAND (expr, 1))))
3109     {
3110       label_true = GOTO_DESTINATION (TREE_OPERAND (expr, 1));
3111       have_then_clause_p = true;
3112     }
3113   else
3114     label_true = create_artificial_label (UNKNOWN_LOCATION);
3115   if (TREE_OPERAND (expr, 2) != NULL
3116       && TREE_CODE (TREE_OPERAND (expr, 2)) == GOTO_EXPR
3117       && TREE_CODE (GOTO_DESTINATION (TREE_OPERAND (expr, 2))) == LABEL_DECL
3118       && (DECL_CONTEXT (GOTO_DESTINATION (TREE_OPERAND (expr, 2)))
3119           == current_function_decl)
3120       /* For -O0 avoid this optimization if the COND_EXPR and GOTO_EXPR
3121          have different locations, otherwise we end up with incorrect
3122          location information on the branches.  */
3123       && (optimize
3124           || !EXPR_HAS_LOCATION (expr)
3125           || !EXPR_HAS_LOCATION (TREE_OPERAND (expr, 2))
3126           || EXPR_LOCATION (expr) == EXPR_LOCATION (TREE_OPERAND (expr, 2))))
3127     {
3128       label_false = GOTO_DESTINATION (TREE_OPERAND (expr, 2));
3129       have_else_clause_p = true;
3130     }
3131   else
3132     label_false = create_artificial_label (UNKNOWN_LOCATION);
3133
3134   gimple_cond_get_ops_from_tree (COND_EXPR_COND (expr), &pred_code, &arm1,
3135                                  &arm2);
3136
3137   gimple_cond = gimple_build_cond (pred_code, arm1, arm2, label_true,
3138                                    label_false);
3139
3140   gimplify_seq_add_stmt (&seq, gimple_cond);
3141   label_cont = NULL_TREE;
3142   if (!have_then_clause_p)
3143     {
3144       /* For if (...) {} else { code; } put label_true after
3145          the else block.  */
3146       if (TREE_OPERAND (expr, 1) == NULL_TREE
3147           && !have_else_clause_p
3148           && TREE_OPERAND (expr, 2) != NULL_TREE)
3149         label_cont = label_true;
3150       else
3151         {
3152           gimplify_seq_add_stmt (&seq, gimple_build_label (label_true));
3153           have_then_clause_p = gimplify_stmt (&TREE_OPERAND (expr, 1), &seq);
3154           /* For if (...) { code; } else {} or
3155              if (...) { code; } else goto label; or
3156              if (...) { code; return; } else { ... }
3157              label_cont isn't needed.  */
3158           if (!have_else_clause_p
3159               && TREE_OPERAND (expr, 2) != NULL_TREE
3160               && gimple_seq_may_fallthru (seq))
3161             {
3162               gimple g;
3163               label_cont = create_artificial_label (UNKNOWN_LOCATION);
3164
3165               g = gimple_build_goto (label_cont);
3166
3167               /* GIMPLE_COND's are very low level; they have embedded
3168                  gotos.  This particular embedded goto should not be marked
3169                  with the location of the original COND_EXPR, as it would
3170                  correspond to the COND_EXPR's condition, not the ELSE or the
3171                  THEN arms.  To avoid marking it with the wrong location, flag
3172                  it as "no location".  */
3173               gimple_set_do_not_emit_location (g);
3174
3175               gimplify_seq_add_stmt (&seq, g);
3176             }
3177         }
3178     }
3179   if (!have_else_clause_p)
3180     {
3181       gimplify_seq_add_stmt (&seq, gimple_build_label (label_false));
3182       have_else_clause_p = gimplify_stmt (&TREE_OPERAND (expr, 2), &seq);
3183     }
3184   if (label_cont)
3185     gimplify_seq_add_stmt (&seq, gimple_build_label (label_cont));
3186
3187   gimple_pop_condition (pre_p);
3188   gimple_seq_add_seq (pre_p, seq);
3189
3190   if (ret == GS_ERROR)
3191     ; /* Do nothing.  */
3192   else if (have_then_clause_p || have_else_clause_p)
3193     ret = GS_ALL_DONE;
3194   else
3195     {
3196       /* Both arms are empty; replace the COND_EXPR with its predicate.  */
3197       expr = TREE_OPERAND (expr, 0);
3198       gimplify_stmt (&expr, pre_p);
3199     }
3200
3201   *expr_p = NULL;
3202   return ret;
3203 }
3204
3205 /* Prepare the node pointed to by EXPR_P, an is_gimple_addressable expression,
3206    to be marked addressable.
3207
3208    We cannot rely on such an expression being directly markable if a temporary
3209    has been created by the gimplification.  In this case, we create another
3210    temporary and initialize it with a copy, which will become a store after we
3211    mark it addressable.  This can happen if the front-end passed us something
3212    that it could not mark addressable yet, like a Fortran pass-by-reference
3213    parameter (int) floatvar.  */
3214
3215 static void
3216 prepare_gimple_addressable (tree *expr_p, gimple_seq *seq_p)
3217 {
3218   while (handled_component_p (*expr_p))
3219     expr_p = &TREE_OPERAND (*expr_p, 0);
3220   if (is_gimple_reg (*expr_p))
3221     *expr_p = get_initialized_tmp_var (*expr_p, seq_p, NULL);
3222 }
3223
3224 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
3225    a call to __builtin_memcpy.  */
3226
3227 static enum gimplify_status
3228 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value,
3229                                 gimple_seq *seq_p)
3230 {
3231   tree t, to, to_ptr, from, from_ptr;
3232   gimple gs;
3233   location_t loc = EXPR_LOCATION (*expr_p);
3234
3235   to = TREE_OPERAND (*expr_p, 0);
3236   from = TREE_OPERAND (*expr_p, 1);
3237
3238   /* Mark the RHS addressable.  Beware that it may not be possible to do so
3239      directly if a temporary has been created by the gimplification.  */
3240   prepare_gimple_addressable (&from, seq_p);
3241
3242   mark_addressable (from);
3243   from_ptr = build_fold_addr_expr_loc (loc, from);
3244   gimplify_arg (&from_ptr, seq_p, loc);
3245
3246   mark_addressable (to);
3247   to_ptr = build_fold_addr_expr_loc (loc, to);
3248   gimplify_arg (&to_ptr, seq_p, loc);
3249
3250   t = builtin_decl_implicit (BUILT_IN_MEMCPY);
3251
3252   gs = gimple_build_call (t, 3, to_ptr, from_ptr, size);
3253
3254   if (want_value)
3255     {
3256       /* tmp = memcpy() */
3257       t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3258       gimple_call_set_lhs (gs, t);
3259       gimplify_seq_add_stmt (seq_p, gs);
3260
3261       *expr_p = build_simple_mem_ref (t);
3262       return GS_ALL_DONE;
3263     }
3264
3265   gimplify_seq_add_stmt (seq_p, gs);
3266   *expr_p = NULL;
3267   return GS_ALL_DONE;
3268 }
3269
3270 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
3271    a call to __builtin_memset.  In this case we know that the RHS is
3272    a CONSTRUCTOR with an empty element list.  */
3273
3274 static enum gimplify_status
3275 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value,
3276                                 gimple_seq *seq_p)
3277 {
3278   tree t, from, to, to_ptr;
3279   gimple gs;
3280   location_t loc = EXPR_LOCATION (*expr_p);
3281
3282   /* Assert our assumptions, to abort instead of producing wrong code
3283      silently if they are not met.  Beware that the RHS CONSTRUCTOR might
3284      not be immediately exposed.  */
3285   from = TREE_OPERAND (*expr_p, 1);
3286   if (TREE_CODE (from) == WITH_SIZE_EXPR)
3287     from = TREE_OPERAND (from, 0);
3288
3289   gcc_assert (TREE_CODE (from) == CONSTRUCTOR
3290               && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (from)));
3291
3292   /* Now proceed.  */
3293   to = TREE_OPERAND (*expr_p, 0);
3294
3295   to_ptr = build_fold_addr_expr_loc (loc, to);
3296   gimplify_arg (&to_ptr, seq_p, loc);
3297   t = builtin_decl_implicit (BUILT_IN_MEMSET);
3298
3299   gs = gimple_build_call (t, 3, to_ptr, integer_zero_node, size);
3300
3301   if (want_value)
3302     {
3303       /* tmp = memset() */
3304       t = create_tmp_var (TREE_TYPE (to_ptr), NULL);
3305       gimple_call_set_lhs (gs, t);
3306       gimplify_seq_add_stmt (seq_p, gs);
3307
3308       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (to), t);
3309       return GS_ALL_DONE;
3310     }
3311
3312   gimplify_seq_add_stmt (seq_p, gs);
3313   *expr_p = NULL;
3314   return GS_ALL_DONE;
3315 }
3316
3317 /* A subroutine of gimplify_init_ctor_preeval.  Called via walk_tree,
3318    determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
3319    assignment.  Return non-null if we detect a potential overlap.  */
3320
3321 struct gimplify_init_ctor_preeval_data
3322 {
3323   /* The base decl of the lhs object.  May be NULL, in which case we
3324      have to assume the lhs is indirect.  */
3325   tree lhs_base_decl;
3326
3327   /* The alias set of the lhs object.  */
3328   alias_set_type lhs_alias_set;
3329 };
3330
3331 static tree
3332 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
3333 {
3334   struct gimplify_init_ctor_preeval_data *data
3335     = (struct gimplify_init_ctor_preeval_data *) xdata;
3336   tree t = *tp;
3337
3338   /* If we find the base object, obviously we have overlap.  */
3339   if (data->lhs_base_decl == t)
3340     return t;
3341
3342   /* If the constructor component is indirect, determine if we have a
3343      potential overlap with the lhs.  The only bits of information we
3344      have to go on at this point are addressability and alias sets.  */
3345   if ((INDIRECT_REF_P (t)
3346        || TREE_CODE (t) == MEM_REF)
3347       && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3348       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
3349     return t;
3350
3351   /* If the constructor component is a call, determine if it can hide a
3352      potential overlap with the lhs through an INDIRECT_REF like above.
3353      ??? Ugh - this is completely broken.  In fact this whole analysis
3354      doesn't look conservative.  */
3355   if (TREE_CODE (t) == CALL_EXPR)
3356     {
3357       tree type, fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (t)));
3358
3359       for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
3360         if (POINTER_TYPE_P (TREE_VALUE (type))
3361             && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
3362             && alias_sets_conflict_p (data->lhs_alias_set,
3363                                       get_alias_set
3364                                         (TREE_TYPE (TREE_VALUE (type)))))
3365           return t;
3366     }
3367
3368   if (IS_TYPE_OR_DECL_P (t))
3369     *walk_subtrees = 0;
3370   return NULL;
3371 }
3372
3373 /* A subroutine of gimplify_init_constructor.  Pre-evaluate EXPR,
3374    force values that overlap with the lhs (as described by *DATA)
3375    into temporaries.  */
3376
3377 static void
3378 gimplify_init_ctor_preeval (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3379                             struct gimplify_init_ctor_preeval_data *data)
3380 {
3381   enum gimplify_status one;
3382
3383   /* If the value is constant, then there's nothing to pre-evaluate.  */
3384   if (TREE_CONSTANT (*expr_p))
3385     {
3386       /* Ensure it does not have side effects, it might contain a reference to
3387          the object we're initializing.  */
3388       gcc_assert (!TREE_SIDE_EFFECTS (*expr_p));
3389       return;
3390     }
3391
3392   /* If the type has non-trivial constructors, we can't pre-evaluate.  */
3393   if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
3394     return;
3395
3396   /* Recurse for nested constructors.  */
3397   if (TREE_CODE (*expr_p) == CONSTRUCTOR)
3398     {
3399       unsigned HOST_WIDE_INT ix;
3400       constructor_elt *ce;
3401       VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
3402
3403       FOR_EACH_VEC_ELT (constructor_elt, v, ix, ce)
3404         gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
3405
3406       return;
3407     }
3408
3409   /* If this is a variable sized type, we must remember the size.  */
3410   maybe_with_size_expr (expr_p);
3411
3412   /* Gimplify the constructor element to something appropriate for the rhs
3413      of a MODIFY_EXPR.  Given that we know the LHS is an aggregate, we know
3414      the gimplifier will consider this a store to memory.  Doing this
3415      gimplification now means that we won't have to deal with complicated
3416      language-specific trees, nor trees like SAVE_EXPR that can induce
3417      exponential search behavior.  */
3418   one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
3419   if (one == GS_ERROR)
3420     {
3421       *expr_p = NULL;
3422       return;
3423     }
3424
3425   /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
3426      with the lhs, since "a = { .x=a }" doesn't make sense.  This will
3427      always be true for all scalars, since is_gimple_mem_rhs insists on a
3428      temporary variable for them.  */
3429   if (DECL_P (*expr_p))
3430     return;
3431
3432   /* If this is of variable size, we have no choice but to assume it doesn't
3433      overlap since we can't make a temporary for it.  */
3434   if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
3435     return;
3436
3437   /* Otherwise, we must search for overlap ...  */
3438   if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
3439     return;
3440
3441   /* ... and if found, force the value into a temporary.  */
3442   *expr_p = get_formal_tmp_var (*expr_p, pre_p);
3443 }
3444
3445 /* A subroutine of gimplify_init_ctor_eval.  Create a loop for
3446    a RANGE_EXPR in a CONSTRUCTOR for an array.
3447
3448       var = lower;
3449     loop_entry:
3450       object[var] = value;
3451       if (var == upper)
3452         goto loop_exit;
3453       var = var + 1;
3454       goto loop_entry;
3455     loop_exit:
3456
3457    We increment var _after_ the loop exit check because we might otherwise
3458    fail if upper == TYPE_MAX_VALUE (type for upper).
3459
3460    Note that we never have to deal with SAVE_EXPRs here, because this has
3461    already been taken care of for us, in gimplify_init_ctor_preeval().  */
3462
3463 static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
3464                                      gimple_seq *, bool);
3465
3466 static void
3467 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
3468                                tree value, tree array_elt_type,
3469                                gimple_seq *pre_p, bool cleared)
3470 {
3471   tree loop_entry_label, loop_exit_label, fall_thru_label;
3472   tree var, var_type, cref, tmp;
3473
3474   loop_entry_label = create_artificial_label (UNKNOWN_LOCATION);
3475   loop_exit_label = create_artificial_label (UNKNOWN_LOCATION);
3476   fall_thru_label = create_artificial_label (UNKNOWN_LOCATION);
3477
3478   /* Create and initialize the index variable.  */
3479   var_type = TREE_TYPE (upper);
3480   var = create_tmp_var (var_type, NULL);
3481   gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, lower));
3482
3483   /* Add the loop entry label.  */
3484   gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_entry_label));
3485
3486   /* Build the reference.  */
3487   cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3488                  var, NULL_TREE, NULL_TREE);
3489
3490   /* If we are a constructor, just call gimplify_init_ctor_eval to do
3491      the store.  Otherwise just assign value to the reference.  */
3492
3493   if (TREE_CODE (value) == CONSTRUCTOR)
3494     /* NB we might have to call ourself recursively through
3495        gimplify_init_ctor_eval if the value is a constructor.  */
3496     gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3497                              pre_p, cleared);
3498   else
3499     gimplify_seq_add_stmt (pre_p, gimple_build_assign (cref, value));
3500
3501   /* We exit the loop when the index var is equal to the upper bound.  */
3502   gimplify_seq_add_stmt (pre_p,
3503                          gimple_build_cond (EQ_EXPR, var, upper,
3504                                             loop_exit_label, fall_thru_label));
3505
3506   gimplify_seq_add_stmt (pre_p, gimple_build_label (fall_thru_label));
3507
3508   /* Otherwise, increment the index var...  */
3509   tmp = build2 (PLUS_EXPR, var_type, var,
3510                 fold_convert (var_type, integer_one_node));
3511   gimplify_seq_add_stmt (pre_p, gimple_build_assign (var, tmp));
3512
3513   /* ...and jump back to the loop entry.  */
3514   gimplify_seq_add_stmt (pre_p, gimple_build_goto (loop_entry_label));
3515
3516   /* Add the loop exit label.  */
3517   gimplify_seq_add_stmt (pre_p, gimple_build_label (loop_exit_label));
3518 }
3519
3520 /* Return true if FDECL is accessing a field that is zero sized.  */
3521
3522 static bool
3523 zero_sized_field_decl (const_tree fdecl)
3524 {
3525   if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl)
3526       && integer_zerop (DECL_SIZE (fdecl)))
3527     return true;
3528   return false;
3529 }
3530
3531 /* Return true if TYPE is zero sized.  */
3532
3533 static bool
3534 zero_sized_type (const_tree type)
3535 {
3536   if (AGGREGATE_TYPE_P (type) && TYPE_SIZE (type)
3537       && integer_zerop (TYPE_SIZE (type)))
3538     return true;
3539   return false;
3540 }
3541
3542 /* A subroutine of gimplify_init_constructor.  Generate individual
3543    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
3544    assignments should happen.  ELTS is the CONSTRUCTOR_ELTS of the
3545    CONSTRUCTOR.  CLEARED is true if the entire LHS object has been
3546    zeroed first.  */
3547
3548 static void
3549 gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
3550                          gimple_seq *pre_p, bool cleared)
3551 {
3552   tree array_elt_type = NULL;
3553   unsigned HOST_WIDE_INT ix;
3554   tree purpose, value;
3555
3556   if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
3557     array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
3558
3559   FOR_EACH_CONSTRUCTOR_ELT (elts, ix, purpose, value)
3560     {
3561       tree cref;
3562
3563       /* NULL values are created above for gimplification errors.  */
3564       if (value == NULL)
3565         continue;
3566
3567       if (cleared && initializer_zerop (value))
3568         continue;
3569
3570       /* ??? Here's to hoping the front end fills in all of the indices,
3571          so we don't have to figure out what's missing ourselves.  */
3572       gcc_assert (purpose);
3573
3574       /* Skip zero-sized fields, unless value has side-effects.  This can
3575          happen with calls to functions returning a zero-sized type, which
3576          we shouldn't discard.  As a number of downstream passes don't
3577          expect sets of zero-sized fields, we rely on the gimplification of
3578          the MODIFY_EXPR we make below to drop the assignment statement.  */
3579       if (! TREE_SIDE_EFFECTS (value) && zero_sized_field_decl (purpose))
3580         continue;
3581
3582       /* If we have a RANGE_EXPR, we have to build a loop to assign the
3583          whole range.  */
3584       if (TREE_CODE (purpose) == RANGE_EXPR)
3585         {
3586           tree lower = TREE_OPERAND (purpose, 0);
3587           tree upper = TREE_OPERAND (purpose, 1);
3588
3589           /* If the lower bound is equal to upper, just treat it as if
3590              upper was the index.  */
3591           if (simple_cst_equal (lower, upper))
3592             purpose = upper;
3593           else
3594             {
3595               gimplify_init_ctor_eval_range (object, lower, upper, value,
3596                                              array_elt_type, pre_p, cleared);
3597               continue;
3598             }
3599         }
3600
3601       if (array_elt_type)
3602         {
3603           /* Do not use bitsizetype for ARRAY_REF indices.  */
3604           if (TYPE_DOMAIN (TREE_TYPE (object)))
3605             purpose
3606               = fold_convert (TREE_TYPE (TYPE_DOMAIN (TREE_TYPE (object))),
3607                               purpose);
3608           cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
3609                          purpose, NULL_TREE, NULL_TREE);
3610         }
3611       else
3612         {
3613           gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
3614           cref = build3 (COMPONENT_REF, TREE_TYPE (purpose),
3615                          unshare_expr (object), purpose, NULL_TREE);
3616         }
3617
3618       if (TREE_CODE (value) == CONSTRUCTOR
3619           && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
3620         gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
3621                                  pre_p, cleared);
3622       else
3623         {
3624           tree init = build2 (INIT_EXPR, TREE_TYPE (cref), cref, value);
3625           gimplify_and_add (init, pre_p);
3626           ggc_free (init);
3627         }
3628     }
3629 }
3630
3631 /* Return the appropriate RHS predicate for this LHS.  */
3632
3633 gimple_predicate
3634 rhs_predicate_for (tree lhs)
3635 {
3636   if (is_gimple_reg (lhs))
3637     return is_gimple_reg_rhs_or_call;
3638   else
3639     return is_gimple_mem_rhs_or_call;
3640 }
3641
3642 /* Gimplify a C99 compound literal expression.  This just means adding
3643    the DECL_EXPR before the current statement and using its anonymous
3644    decl instead.  */
3645
3646 static enum gimplify_status
3647 gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p)
3648 {
3649   tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p);
3650   tree decl = DECL_EXPR_DECL (decl_s);
3651   /* Mark the decl as addressable if the compound literal
3652      expression is addressable now, otherwise it is marked too late
3653      after we gimplify the initialization expression.  */
3654   if (TREE_ADDRESSABLE (*expr_p))
3655     TREE_ADDRESSABLE (decl) = 1;
3656
3657   /* Preliminarily mark non-addressed complex variables as eligible
3658      for promotion to gimple registers.  We'll transform their uses
3659      as we find them.  */
3660   if ((TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE
3661        || TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE)
3662       && !TREE_THIS_VOLATILE (decl)
3663       && !needs_to_live_in_memory (decl))
3664     DECL_GIMPLE_REG_P (decl) = 1;
3665
3666   /* This decl isn't mentioned in the enclosing block, so add it to the
3667      list of temps.  FIXME it seems a bit of a kludge to say that
3668      anonymous artificial vars aren't pushed, but everything else is.  */
3669   if (DECL_NAME (decl) == NULL_TREE && !DECL_SEEN_IN_BIND_EXPR_P (decl))
3670     gimple_add_tmp_var (decl);
3671
3672   gimplify_and_add (decl_s, pre_p);
3673   *expr_p = decl;
3674   return GS_OK;
3675 }
3676
3677 /* Optimize embedded COMPOUND_LITERAL_EXPRs within a CONSTRUCTOR,
3678    return a new CONSTRUCTOR if something changed.  */
3679
3680 static tree
3681 optimize_compound_literals_in_ctor (tree orig_ctor)
3682 {
3683   tree ctor = orig_ctor;
3684   VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (ctor);
3685   unsigned int idx, num = VEC_length (constructor_elt, elts);
3686
3687   for (idx = 0; idx < num; idx++)
3688     {
3689       tree value = VEC_index (constructor_elt, elts, idx)->value;
3690       tree newval = value;
3691       if (TREE_CODE (value) == CONSTRUCTOR)
3692         newval = optimize_compound_literals_in_ctor (value);
3693       else if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR)
3694         {
3695           tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (value);
3696           tree decl = DECL_EXPR_DECL (decl_s);
3697           tree init = DECL_INITIAL (decl);
3698
3699           if (!TREE_ADDRESSABLE (value)
3700               && !TREE_ADDRESSABLE (decl)
3701               && init)
3702             newval = optimize_compound_literals_in_ctor (init);
3703         }
3704       if (newval == value)
3705         continue;
3706
3707       if (ctor == orig_ctor)
3708         {
3709           ctor = copy_node (orig_ctor);
3710           CONSTRUCTOR_ELTS (ctor) = VEC_copy (constructor_elt, gc, elts);
3711           elts = CONSTRUCTOR_ELTS (ctor);
3712         }
3713       VEC_index (constructor_elt, elts, idx)->value = newval;
3714     }
3715   return ctor;
3716 }
3717
3718 /* A subroutine of gimplify_modify_expr.  Break out elements of a
3719    CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
3720
3721    Note that we still need to clear any elements that don't have explicit
3722    initializers, so if not all elements are initialized we keep the
3723    original MODIFY_EXPR, we just remove all of the constructor elements.
3724
3725    If NOTIFY_TEMP_CREATION is true, do not gimplify, just return
3726    GS_ERROR if we would have to create a temporary when gimplifying
3727    this constructor.  Otherwise, return GS_OK.
3728
3729    If NOTIFY_TEMP_CREATION is false, just do the gimplification.  */
3730
3731 static enum gimplify_status
3732 gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
3733                            bool want_value, bool notify_temp_creation)
3734 {
3735   tree object, ctor, type;
3736   enum gimplify_status ret;
3737   VEC(constructor_elt,gc) *elts;
3738
3739   gcc_assert (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == CONSTRUCTOR);
3740
3741   if (!notify_temp_creation)
3742     {
3743       ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3744                            is_gimple_lvalue, fb_lvalue);
3745       if (ret == GS_ERROR)
3746         return ret;
3747     }
3748
3749   object = TREE_OPERAND (*expr_p, 0);
3750   ctor = TREE_OPERAND (*expr_p, 1) =
3751     optimize_compound_literals_in_ctor (TREE_OPERAND (*expr_p, 1));
3752   type = TREE_TYPE (ctor);
3753   elts = CONSTRUCTOR_ELTS (ctor);
3754   ret = GS_ALL_DONE;
3755
3756   switch (TREE_CODE (type))
3757     {
3758     case RECORD_TYPE:
3759     case UNION_TYPE:
3760     case QUAL_UNION_TYPE:
3761     case ARRAY_TYPE:
3762       {
3763         struct gimplify_init_ctor_preeval_data preeval_data;
3764         HOST_WIDE_INT num_ctor_elements, num_nonzero_elements;
3765         bool cleared, complete_p, valid_const_initializer;
3766
3767         /* Aggregate types must lower constructors to initialization of
3768            individual elements.  The exception is that a CONSTRUCTOR node
3769            with no elements indicates zero-initialization of the whole.  */
3770         if (VEC_empty (constructor_elt, elts))
3771           {
3772             if (notify_temp_creation)
3773               return GS_OK;
3774             break;
3775           }
3776
3777         /* Fetch information about the constructor to direct later processing.
3778            We might want to make static versions of it in various cases, and
3779            can only do so if it known to be a valid constant initializer.  */
3780         valid_const_initializer
3781           = categorize_ctor_elements (ctor, &num_nonzero_elements,
3782                                       &num_ctor_elements, &complete_p);
3783
3784         /* If a const aggregate variable is being initialized, then it
3785            should never be a lose to promote the variable to be static.  */
3786         if (valid_const_initializer
3787             && num_nonzero_elements > 1
3788             && TREE_READONLY (object)
3789             && TREE_CODE (object) == VAR_DECL
3790             && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object)))
3791           {
3792             if (notify_temp_creation)
3793               return GS_ERROR;
3794             DECL_INITIAL (object) = ctor;
3795             TREE_STATIC (object) = 1;
3796             if (!DECL_NAME (object))
3797               DECL_NAME (object) = create_tmp_var_name ("C");
3798             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
3799
3800             /* ??? C++ doesn't automatically append a .<number> to the
3801                assembler name, and even when it does, it looks a FE private
3802                data structures to figure out what that number should be,
3803                which are not set for this variable.  I suppose this is
3804                important for local statics for inline functions, which aren't
3805                "local" in the object file sense.  So in order to get a unique
3806                TU-local symbol, we must invoke the lhd version now.  */
3807             lhd_set_decl_assembler_name (object);
3808
3809             *expr_p = NULL_TREE;
3810             break;
3811           }
3812
3813         /* If there are "lots" of initialized elements, even discounting
3814            those that are not address constants (and thus *must* be
3815            computed at runtime), then partition the constructor into
3816            constant and non-constant parts.  Block copy the constant
3817            parts in, then generate code for the non-constant parts.  */
3818         /* TODO.  There's code in cp/typeck.c to do this.  */
3819
3820         if (int_size_in_bytes (TREE_TYPE (ctor)) < 0)
3821           /* store_constructor will ignore the clearing of variable-sized
3822              objects.  Initializers for such objects must explicitly set
3823              every field that needs to be set.  */
3824           cleared = false;
3825         else if (!complete_p)
3826           /* If the constructor isn't complete, clear the whole object
3827              beforehand.
3828
3829              ??? This ought not to be needed.  For any element not present
3830              in the initializer, we should simply set them to zero.  Except
3831              we'd need to *find* the elements that are not present, and that
3832              requires trickery to avoid quadratic compile-time behavior in
3833              large cases or excessive memory use in small cases.  */
3834           cleared = true;
3835         else if (num_ctor_elements - num_nonzero_elements
3836                  > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
3837                  && num_nonzero_elements < num_ctor_elements / 4)
3838           /* If there are "lots" of zeros, it's more efficient to clear
3839              the memory and then set the nonzero elements.  */
3840           cleared = true;
3841         else
3842           cleared = false;
3843
3844         /* If there are "lots" of initialized elements, and all of them
3845            are valid address constants, then the entire initializer can
3846            be dropped to memory, and then memcpy'd out.  Don't do this
3847            for sparse arrays, though, as it's more efficient to follow
3848            the standard CONSTRUCTOR behavior of memset followed by
3849            individual element initialization.  Also don't do this for small
3850            all-zero initializers (which aren't big enough to merit
3851            clearing), and don't try to make bitwise copies of
3852            TREE_ADDRESSABLE types.  */
3853         if (valid_const_initializer
3854             && !(cleared || num_nonzero_elements == 0)
3855             && !TREE_ADDRESSABLE (type))
3856           {
3857             HOST_WIDE_INT size = int_size_in_bytes (type);
3858             unsigned int align;
3859
3860             /* ??? We can still get unbounded array types, at least
3861                from the C++ front end.  This seems wrong, but attempt
3862                to work around it for now.  */
3863             if (size < 0)
3864               {
3865                 size = int_size_in_bytes (TREE_TYPE (object));
3866                 if (size >= 0)
3867                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
3868               }
3869
3870             /* Find the maximum alignment we can assume for the object.  */
3871             /* ??? Make use of DECL_OFFSET_ALIGN.  */
3872             if (DECL_P (object))
3873               align = DECL_ALIGN (object);
3874             else
3875               align = TYPE_ALIGN (type);
3876
3877             if (size > 0
3878                 && num_nonzero_elements > 1
3879                 && !can_move_by_pieces (size, align))
3880               {
3881                 if (notify_temp_creation)
3882                   return GS_ERROR;
3883
3884                 walk_tree (&ctor, force_labels_r, NULL, NULL);
3885                 ctor = tree_output_constant_def (ctor);
3886                 if (!useless_type_conversion_p (type, TREE_TYPE (ctor)))
3887                   ctor = build1 (VIEW_CONVERT_EXPR, type, ctor);
3888                 TREE_OPERAND (*expr_p, 1) = ctor;
3889
3890                 /* This is no longer an assignment of a CONSTRUCTOR, but
3891                    we still may have processing to do on the LHS.  So
3892                    pretend we didn't do anything here to let that happen.  */
3893                 return GS_UNHANDLED;
3894               }
3895           }
3896
3897         /* If the target is volatile, we have non-zero elements and more than
3898            one field to assign, initialize the target from a temporary.  */
3899         if (TREE_THIS_VOLATILE (object)
3900             && !TREE_ADDRESSABLE (type)
3901             && num_nonzero_elements > 0
3902             && VEC_length (constructor_elt, elts) > 1)
3903           {
3904             tree temp = create_tmp_var (TYPE_MAIN_VARIANT (type), NULL);
3905             TREE_OPERAND (*expr_p, 0) = temp;
3906             *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p),
3907                               *expr_p,
3908                               build2 (MODIFY_EXPR, void_type_node,
3909                                       object, temp));
3910             return GS_OK;
3911           }
3912
3913         if (notify_temp_creation)
3914           return GS_OK;
3915
3916         /* If there are nonzero elements and if needed, pre-evaluate to capture
3917            elements overlapping with the lhs into temporaries.  We must do this
3918            before clearing to fetch the values before they are zeroed-out.  */
3919         if (num_nonzero_elements > 0 && TREE_CODE (*expr_p) != INIT_EXPR)
3920           {
3921             preeval_data.lhs_base_decl = get_base_address (object);
3922             if (!DECL_P (preeval_data.lhs_base_decl))
3923               preeval_data.lhs_base_decl = NULL;
3924             preeval_data.lhs_alias_set = get_alias_set (object);
3925
3926             gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
3927                                         pre_p, post_p, &preeval_data);
3928           }
3929
3930         if (cleared)
3931           {
3932             /* Zap the CONSTRUCTOR element list, which simplifies this case.
3933                Note that we still have to gimplify, in order to handle the
3934                case of variable sized types.  Avoid shared tree structures.  */
3935             CONSTRUCTOR_ELTS (ctor) = NULL;
3936             TREE_SIDE_EFFECTS (ctor) = 0;
3937             object = unshare_expr (object);
3938             gimplify_stmt (expr_p, pre_p);
3939           }
3940
3941         /* If we have not block cleared the object, or if there are nonzero
3942            elements in the constructor, add assignments to the individual
3943            scalar fields of the object.  */
3944         if (!cleared || num_nonzero_elements > 0)
3945           gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3946
3947         *expr_p = NULL_TREE;
3948       }
3949       break;
3950
3951     case COMPLEX_TYPE:
3952       {
3953         tree r, i;
3954
3955         if (notify_temp_creation)
3956           return GS_OK;
3957
3958         /* Extract the real and imaginary parts out of the ctor.  */
3959         gcc_assert (VEC_length (constructor_elt, elts) == 2);
3960         r = VEC_index (constructor_elt, elts, 0)->value;
3961         i = VEC_index (constructor_elt, elts, 1)->value;
3962         if (r == NULL || i == NULL)
3963           {
3964             tree zero = build_zero_cst (TREE_TYPE (type));
3965             if (r == NULL)
3966               r = zero;
3967             if (i == NULL)
3968               i = zero;
3969           }
3970
3971         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3972            represent creation of a complex value.  */
3973         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3974           {
3975             ctor = build_complex (type, r, i);
3976             TREE_OPERAND (*expr_p, 1) = ctor;
3977           }
3978         else
3979           {
3980             ctor = build2 (COMPLEX_EXPR, type, r, i);
3981             TREE_OPERAND (*expr_p, 1) = ctor;
3982             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1),
3983                                  pre_p,
3984                                  post_p,
3985                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3986                                  fb_rvalue);
3987           }
3988       }
3989       break;
3990
3991     case VECTOR_TYPE:
3992       {
3993         unsigned HOST_WIDE_INT ix;
3994         constructor_elt *ce;
3995
3996         if (notify_temp_creation)
3997           return GS_OK;
3998
3999         /* Go ahead and simplify constant constructors to VECTOR_CST.  */
4000         if (TREE_CONSTANT (ctor))
4001           {
4002             bool constant_p = true;
4003             tree value;
4004
4005             /* Even when ctor is constant, it might contain non-*_CST
4006                elements, such as addresses or trapping values like
4007                1.0/0.0 - 1.0/0.0.  Such expressions don't belong
4008                in VECTOR_CST nodes.  */
4009             FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
4010               if (!CONSTANT_CLASS_P (value))
4011                 {
4012                   constant_p = false;
4013                   break;
4014                 }
4015
4016             if (constant_p)
4017               {
4018                 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
4019                 break;
4020               }
4021
4022             /* Don't reduce an initializer constant even if we can't
4023                make a VECTOR_CST.  It won't do anything for us, and it'll
4024                prevent us from representing it as a single constant.  */
4025             if (initializer_constant_valid_p (ctor, type))
4026               break;
4027
4028             TREE_CONSTANT (ctor) = 0;
4029           }
4030
4031         /* Vector types use CONSTRUCTOR all the way through gimple
4032           compilation as a general initializer.  */
4033         FOR_EACH_VEC_ELT (constructor_elt, elts, ix, ce)
4034           {
4035             enum gimplify_status tret;
4036             tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val,
4037                                   fb_rvalue);
4038             if (tret == GS_ERROR)
4039               ret = GS_ERROR;
4040           }
4041         if (!is_gimple_reg (TREE_OPERAND (*expr_p, 0)))
4042           TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
4043       }
4044       break;
4045
4046     default:
4047       /* So how did we get a CONSTRUCTOR for a scalar type?  */
4048       gcc_unreachable ();
4049     }
4050
4051   if (ret == GS_ERROR)
4052     return GS_ERROR;
4053   else if (want_value)
4054     {
4055       *expr_p = object;
4056       return GS_OK;
4057     }
4058   else
4059     {
4060       /* If we have gimplified both sides of the initializer but have
4061          not emitted an assignment, do so now.  */
4062       if (*expr_p)
4063         {
4064           tree lhs = TREE_OPERAND (*expr_p, 0);
4065           tree rhs = TREE_OPERAND (*expr_p, 1);
4066           gimple init = gimple_build_assign (lhs, rhs);
4067           gimplify_seq_add_stmt (pre_p, init);
4068           *expr_p = NULL;
4069         }
4070
4071       return GS_ALL_DONE;
4072     }
4073 }
4074
4075 /* Given a pointer value OP0, return a simplified version of an
4076    indirection through OP0, or NULL_TREE if no simplification is
4077    possible.  Note that the resulting type may be different from
4078    the type pointed to in the sense that it is still compatible
4079    from the langhooks point of view. */
4080
4081 tree
4082 gimple_fold_indirect_ref (tree t)
4083 {
4084   tree ptype = TREE_TYPE (t), type = TREE_TYPE (ptype);
4085   tree sub = t;
4086   tree subtype;
4087
4088   STRIP_NOPS (sub);
4089   subtype = TREE_TYPE (sub);
4090   if (!POINTER_TYPE_P (subtype))
4091     return NULL_TREE;
4092
4093   if (TREE_CODE (sub) == ADDR_EXPR)
4094     {
4095       tree op = TREE_OPERAND (sub, 0);
4096       tree optype = TREE_TYPE (op);
4097       /* *&p => p */
4098       if (useless_type_conversion_p (type, optype))
4099         return op;
4100
4101       /* *(foo *)&fooarray => fooarray[0] */
4102       if (TREE_CODE (optype) == ARRAY_TYPE
4103           && TREE_CODE (TYPE_SIZE (TREE_TYPE (optype))) == INTEGER_CST
4104           && useless_type_conversion_p (type, TREE_TYPE (optype)))
4105        {
4106          tree type_domain = TYPE_DOMAIN (optype);
4107          tree min_val = size_zero_node;
4108          if (type_domain && TYPE_MIN_VALUE (type_domain))
4109            min_val = TYPE_MIN_VALUE (type_domain);
4110          if (TREE_CODE (min_val) == INTEGER_CST)
4111            return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
4112        }
4113       /* *(foo *)&complexfoo => __real__ complexfoo */
4114       else if (TREE_CODE (optype) == COMPLEX_TYPE
4115                && useless_type_conversion_p (type, TREE_TYPE (optype)))
4116         return fold_build1 (REALPART_EXPR, type, op);
4117       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
4118       else if (TREE_CODE (optype) == VECTOR_TYPE
4119                && useless_type_conversion_p (type, TREE_TYPE (optype)))
4120         {
4121           tree part_width = TYPE_SIZE (type);
4122           tree index = bitsize_int (0);
4123           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
4124         }
4125     }
4126
4127   /* *(p + CST) -> ...  */
4128   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
4129       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
4130     {
4131       tree addr = TREE_OPERAND (sub, 0);
4132       tree off = TREE_OPERAND (sub, 1);
4133       tree addrtype;
4134
4135       STRIP_NOPS (addr);
4136       addrtype = TREE_TYPE (addr);
4137
4138       /* ((foo*)&vectorfoo)[1] -> BIT_FIELD_REF<vectorfoo,...> */
4139       if (TREE_CODE (addr) == ADDR_EXPR
4140           && TREE_CODE (TREE_TYPE (addrtype)) == VECTOR_TYPE
4141           && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (addrtype)))
4142           && host_integerp (off, 1))
4143         {
4144           unsigned HOST_WIDE_INT offset = tree_low_cst (off, 1);
4145           tree part_width = TYPE_SIZE (type);
4146           unsigned HOST_WIDE_INT part_widthi
4147             = tree_low_cst (part_width, 0) / BITS_PER_UNIT;
4148           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
4149           tree index = bitsize_int (indexi);
4150           if (offset / part_widthi
4151               <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (addrtype)))
4152             return fold_build3 (BIT_FIELD_REF, type, TREE_OPERAND (addr, 0),
4153                                 part_width, index);
4154         }
4155
4156       /* ((foo*)&complexfoo)[1] -> __imag__ complexfoo */
4157       if (TREE_CODE (addr) == ADDR_EXPR
4158           && TREE_CODE (TREE_TYPE (addrtype)) == COMPLEX_TYPE
4159           && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (addrtype))))
4160         {
4161           tree size = TYPE_SIZE_UNIT (type);
4162           if (tree_int_cst_equal (size, off))
4163             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (addr, 0));
4164         }
4165
4166       /* *(p + CST) -> MEM_REF <p, CST>.  */
4167       if (TREE_CODE (addr) != ADDR_EXPR
4168           || DECL_P (TREE_OPERAND (addr, 0)))
4169         return fold_build2 (MEM_REF, type,
4170                             addr,
4171                             build_int_cst_wide (ptype,
4172                                                 TREE_INT_CST_LOW (off),
4173                                                 TREE_INT_CST_HIGH (off)));
4174     }
4175
4176   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
4177   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
4178       && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (subtype)))) == INTEGER_CST
4179       && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
4180     {
4181       tree type_domain;
4182       tree min_val = size_zero_node;
4183       tree osub = sub;
4184       sub = gimple_fold_indirect_ref (sub);
4185       if (! sub)
4186         sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
4187       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
4188       if (type_domain && TYPE_MIN_VALUE (type_domain))
4189         min_val = TYPE_MIN_VALUE (type_domain);
4190       if (TREE_CODE (min_val) == INTEGER_CST)
4191         return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
4192     }
4193
4194   return NULL_TREE;
4195 }
4196
4197 /* Given a pointer value OP0, return a simplified version of an
4198    indirection through OP0, or NULL_TREE if no simplification is
4199    possible.  This may only be applied to a rhs of an expression.
4200    Note that the resulting type may be different from the type pointed
4201    to in the sense that it is still compatible from the langhooks
4202    point of view. */
4203
4204 static tree
4205 gimple_fold_indirect_ref_rhs (tree t)
4206 {
4207   return gimple_fold_indirect_ref (t);
4208 }
4209
4210 /* Subroutine of gimplify_modify_expr to do simplifications of
4211    MODIFY_EXPRs based on the code of the RHS.  We loop for as long as
4212    something changes.  */
4213
4214 static enum gimplify_status
4215 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
4216                           gimple_seq *pre_p, gimple_seq *post_p,
4217                           bool want_value)
4218 {
4219   enum gimplify_status ret = GS_UNHANDLED;
4220   bool changed;
4221
4222   do
4223     {
4224       changed = false;
4225       switch (TREE_CODE (*from_p))
4226         {
4227         case VAR_DECL:
4228           /* If we're assigning from a read-only variable initialized with
4229              a constructor, do the direct assignment from the constructor,
4230              but only if neither source nor target are volatile since this
4231              latter assignment might end up being done on a per-field basis.  */
4232           if (DECL_INITIAL (*from_p)
4233               && TREE_READONLY (*from_p)
4234               && !TREE_THIS_VOLATILE (*from_p)
4235               && !TREE_THIS_VOLATILE (*to_p)
4236               && TREE_CODE (DECL_INITIAL (*from_p)) == CONSTRUCTOR)
4237             {
4238               tree old_from = *from_p;
4239               enum gimplify_status subret;
4240
4241               /* Move the constructor into the RHS.  */
4242               *from_p = unshare_expr (DECL_INITIAL (*from_p));
4243
4244               /* Let's see if gimplify_init_constructor will need to put
4245                  it in memory.  */
4246               subret = gimplify_init_constructor (expr_p, NULL, NULL,
4247                                                   false, true);
4248               if (subret == GS_ERROR)
4249                 {
4250                   /* If so, revert the change.  */
4251                   *from_p = old_from;
4252                 }
4253               else
4254                 {
4255                   ret = GS_OK;
4256                   changed = true;
4257                 }
4258             }
4259           break;
4260         case INDIRECT_REF:
4261           {
4262             /* If we have code like
4263
4264              *(const A*)(A*)&x
4265
4266              where the type of "x" is a (possibly cv-qualified variant
4267              of "A"), treat the entire expression as identical to "x".
4268              This kind of code arises in C++ when an object is bound
4269              to a const reference, and if "x" is a TARGET_EXPR we want
4270              to take advantage of the optimization below.  */
4271             bool volatile_p = TREE_THIS_VOLATILE (*from_p);
4272             tree t = gimple_fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
4273             if (t)
4274               {
4275                 if (TREE_THIS_VOLATILE (t) != volatile_p)
4276                   {
4277                     if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
4278                       t = build_simple_mem_ref_loc (EXPR_LOCATION (*from_p),
4279                                                     build_fold_addr_expr (t));
4280                     if (REFERENCE_CLASS_P (t))
4281                       TREE_THIS_VOLATILE (t) = volatile_p;
4282                   }
4283                 *from_p = t;
4284                 ret = GS_OK;
4285                 changed = true;
4286               }
4287             break;
4288           }
4289
4290         case TARGET_EXPR:
4291           {
4292             /* If we are initializing something from a TARGET_EXPR, strip the
4293                TARGET_EXPR and initialize it directly, if possible.  This can't
4294                be done if the initializer is void, since that implies that the
4295                temporary is set in some non-trivial way.
4296
4297                ??? What about code that pulls out the temp and uses it
4298                elsewhere? I think that such code never uses the TARGET_EXPR as
4299                an initializer.  If I'm wrong, we'll die because the temp won't
4300                have any RTL.  In that case, I guess we'll need to replace
4301                references somehow.  */
4302             tree init = TARGET_EXPR_INITIAL (*from_p);
4303
4304             if (init
4305                 && !VOID_TYPE_P (TREE_TYPE (init)))
4306               {
4307                 *from_p = init;
4308                 ret = GS_OK;
4309                 changed = true;
4310               }
4311           }
4312           break;
4313
4314         case COMPOUND_EXPR:
4315           /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
4316              caught.  */
4317           gimplify_compound_expr (from_p, pre_p, true);
4318           ret = GS_OK;
4319           changed = true;
4320           break;
4321
4322         case CONSTRUCTOR:
4323           /* If we already made some changes, let the front end have a
4324              crack at this before we break it down.  */
4325           if (ret != GS_UNHANDLED)
4326             break;
4327           /* If we're initializing from a CONSTRUCTOR, break this into
4328              individual MODIFY_EXPRs.  */
4329           return gimplify_init_constructor (expr_p, pre_p, post_p, want_value,
4330                                             false);
4331
4332         case COND_EXPR:
4333           /* If we're assigning to a non-register type, push the assignment
4334              down into the branches.  This is mandatory for ADDRESSABLE types,
4335              since we cannot generate temporaries for such, but it saves a
4336              copy in other cases as well.  */
4337           if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
4338             {
4339               /* This code should mirror the code in gimplify_cond_expr. */
4340               enum tree_code code = TREE_CODE (*expr_p);
4341               tree cond = *from_p;
4342               tree result = *to_p;
4343
4344               ret = gimplify_expr (&result, pre_p, post_p,
4345                                    is_gimple_lvalue, fb_lvalue);
4346               if (ret != GS_ERROR)
4347                 ret = GS_OK;
4348
4349               if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
4350                 TREE_OPERAND (cond, 1)
4351                   = build2 (code, void_type_node, result,
4352                             TREE_OPERAND (cond, 1));
4353               if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
4354                 TREE_OPERAND (cond, 2)
4355                   = build2 (code, void_type_node, unshare_expr (result),
4356                             TREE_OPERAND (cond, 2));
4357
4358               TREE_TYPE (cond) = void_type_node;
4359               recalculate_side_effects (cond);
4360
4361               if (want_value)
4362                 {
4363                   gimplify_and_add (cond, pre_p);
4364                   *expr_p = unshare_expr (result);
4365                 }
4366               else
4367                 *expr_p = cond;
4368               return ret;
4369             }
4370           break;
4371
4372         case CALL_EXPR:
4373           /* For calls that return in memory, give *to_p as the CALL_EXPR's
4374              return slot so that we don't generate a temporary.  */
4375           if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
4376               && aggregate_value_p (*from_p, *from_p))
4377             {
4378               bool use_target;
4379
4380               if (!(rhs_predicate_for (*to_p))(*from_p))
4381                 /* If we need a temporary, *to_p isn't accurate.  */
4382                 use_target = false;
4383               /* It's OK to use the return slot directly unless it's an NRV. */
4384               else if (TREE_CODE (*to_p) == RESULT_DECL
4385                        && DECL_NAME (*to_p) == NULL_TREE
4386                        && needs_to_live_in_memory (*to_p))
4387                 use_target = true;
4388               else if (is_gimple_reg_type (TREE_TYPE (*to_p))
4389                        || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
4390                 /* Don't force regs into memory.  */
4391                 use_target = false;
4392               else if (TREE_CODE (*expr_p) == INIT_EXPR)
4393                 /* It's OK to use the target directly if it's being
4394                    initialized. */
4395                 use_target = true;
4396               else if (!is_gimple_non_addressable (*to_p))
4397                 /* Don't use the original target if it's already addressable;
4398                    if its address escapes, and the called function uses the
4399                    NRV optimization, a conforming program could see *to_p
4400                    change before the called function returns; see c++/19317.
4401                    When optimizing, the return_slot pass marks more functions
4402                    as safe after we have escape info.  */
4403                 use_target = false;
4404               else
4405                 use_target = true;
4406
4407               if (use_target)
4408                 {
4409                   CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
4410                   mark_addressable (*to_p);
4411                 }
4412             }
4413           break;
4414
4415         case WITH_SIZE_EXPR:
4416           /* Likewise for calls that return an aggregate of non-constant size,
4417              since we would not be able to generate a temporary at all.  */
4418           if (TREE_CODE (TREE_OPERAND (*from_p, 0)) == CALL_EXPR)
4419             {
4420               *from_p = TREE_OPERAND (*from_p, 0);
4421               /* We don't change ret in this case because the
4422                  WITH_SIZE_EXPR might have been added in
4423                  gimplify_modify_expr, so returning GS_OK would lead to an
4424                  infinite loop.  */
4425               changed = true;
4426             }
4427           break;
4428
4429           /* If we're initializing from a container, push the initialization
4430              inside it.  */
4431         case CLEANUP_POINT_EXPR:
4432         case BIND_EXPR:
4433         case STATEMENT_LIST:
4434           {
4435             tree wrap = *from_p;
4436             tree t;
4437
4438             ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_min_lval,
4439                                  fb_lvalue);
4440             if (ret != GS_ERROR)
4441               ret = GS_OK;
4442
4443             t = voidify_wrapper_expr (wrap, *expr_p);
4444             gcc_assert (t == *expr_p);
4445
4446             if (want_value)
4447               {
4448                 gimplify_and_add (wrap, pre_p);
4449                 *expr_p = unshare_expr (*to_p);
4450               }
4451             else
4452               *expr_p = wrap;
4453             return GS_OK;
4454           }
4455
4456         case COMPOUND_LITERAL_EXPR:
4457           {
4458             tree complit = TREE_OPERAND (*expr_p, 1);
4459             tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (complit);
4460             tree decl = DECL_EXPR_DECL (decl_s);
4461             tree init = DECL_INITIAL (decl);
4462
4463             /* struct T x = (struct T) { 0, 1, 2 } can be optimized
4464                into struct T x = { 0, 1, 2 } if the address of the
4465                compound literal has never been taken.  */
4466             if (!TREE_ADDRESSABLE (complit)
4467                 && !TREE_ADDRESSABLE (decl)
4468                 && init)
4469               {
4470                 *expr_p = copy_node (*expr_p);
4471                 TREE_OPERAND (*expr_p, 1) = init;
4472                 return GS_OK;
4473               }
4474           }
4475
4476         default:
4477           break;
4478         }
4479     }
4480   while (changed);
4481
4482   return ret;
4483 }
4484
4485 /* Promote partial stores to COMPLEX variables to total stores.  *EXPR_P is
4486    a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
4487    DECL_GIMPLE_REG_P set.
4488
4489    IMPORTANT NOTE: This promotion is performed by introducing a load of the
4490    other, unmodified part of the complex object just before the total store.
4491    As a consequence, if the object is still uninitialized, an undefined value
4492    will be loaded into a register, which may result in a spurious exception
4493    if the register is floating-point and the value happens to be a signaling
4494    NaN for example.  Then the fully-fledged complex operations lowering pass
4495    followed by a DCE pass are necessary in order to fix things up.  */
4496
4497 static enum gimplify_status
4498 gimplify_modify_expr_complex_part (tree *expr_p, gimple_seq *pre_p,
4499                                    bool want_value)
4500 {
4501   enum tree_code code, ocode;
4502   tree lhs, rhs, new_rhs, other, realpart, imagpart;
4503
4504   lhs = TREE_OPERAND (*expr_p, 0);
4505   rhs = TREE_OPERAND (*expr_p, 1);
4506   code = TREE_CODE (lhs);
4507   lhs = TREE_OPERAND (lhs, 0);
4508
4509   ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
4510   other = build1 (ocode, TREE_TYPE (rhs), lhs);
4511   TREE_NO_WARNING (other) = 1;
4512   other = get_formal_tmp_var (other, pre_p);
4513
4514   realpart = code == REALPART_EXPR ? rhs : other;
4515   imagpart = code == REALPART_EXPR ? other : rhs;
4516
4517   if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
4518     new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
4519   else
4520     new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
4521
4522   gimplify_seq_add_stmt (pre_p, gimple_build_assign (lhs, new_rhs));
4523   *expr_p = (want_value) ? rhs : NULL_TREE;
4524
4525   return GS_ALL_DONE;
4526 }
4527
4528 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
4529
4530       modify_expr
4531               : varname '=' rhs
4532               | '*' ID '=' rhs
4533
4534     PRE_P points to the list where side effects that must happen before
4535         *EXPR_P should be stored.
4536
4537     POST_P points to the list where side effects that must happen after
4538         *EXPR_P should be stored.
4539
4540     WANT_VALUE is nonzero iff we want to use the value of this expression
4541         in another expression.  */
4542
4543 static enum gimplify_status
4544 gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
4545                       bool want_value)
4546 {
4547   tree *from_p = &TREE_OPERAND (*expr_p, 1);
4548   tree *to_p = &TREE_OPERAND (*expr_p, 0);
4549   enum gimplify_status ret = GS_UNHANDLED;
4550   gimple assign;
4551   location_t loc = EXPR_LOCATION (*expr_p);
4552
4553   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
4554               || TREE_CODE (*expr_p) == INIT_EXPR);
4555
4556   /* Trying to simplify a clobber using normal logic doesn't work,
4557      so handle it here.  */
4558   if (TREE_CLOBBER_P (*from_p))
4559     {
4560       gcc_assert (!want_value && TREE_CODE (*to_p) == VAR_DECL);
4561       gimplify_seq_add_stmt (pre_p, gimple_build_assign (*to_p, *from_p));
4562       *expr_p = NULL;
4563       return GS_ALL_DONE;
4564     }
4565
4566   /* Insert pointer conversions required by the middle-end that are not
4567      required by the frontend.  This fixes middle-end type checking for
4568      for example gcc.dg/redecl-6.c.  */
4569   if (POINTER_TYPE_P (TREE_TYPE (*to_p)))
4570     {
4571       STRIP_USELESS_TYPE_CONVERSION (*from_p);
4572       if (!useless_type_conversion_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
4573         *from_p = fold_convert_loc (loc, TREE_TYPE (*to_p), *from_p);
4574     }
4575
4576   /* See if any simplifications can be done based on what the RHS is.  */
4577   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4578                                   want_value);
4579   if (ret != GS_UNHANDLED)
4580     return ret;
4581
4582   /* For zero sized types only gimplify the left hand side and right hand
4583      side as statements and throw away the assignment.  Do this after
4584      gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
4585      types properly.  */
4586   if (zero_sized_type (TREE_TYPE (*from_p)) && !want_value)
4587     {
4588       gimplify_stmt (from_p, pre_p);
4589       gimplify_stmt (to_p, pre_p);
4590       *expr_p = NULL_TREE;
4591       return GS_ALL_DONE;
4592     }
4593
4594   /* If the value being copied is of variable width, compute the length
4595      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
4596      before gimplifying any of the operands so that we can resolve any
4597      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
4598      the size of the expression to be copied, not of the destination, so
4599      that is what we must do here.  */
4600   maybe_with_size_expr (from_p);
4601
4602   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
4603   if (ret == GS_ERROR)
4604     return ret;
4605
4606   /* As a special case, we have to temporarily allow for assignments
4607      with a CALL_EXPR on the RHS.  Since in GIMPLE a function call is
4608      a toplevel statement, when gimplifying the GENERIC expression
4609      MODIFY_EXPR <a, CALL_EXPR <foo>>, we cannot create the tuple
4610      GIMPLE_ASSIGN <a, GIMPLE_CALL <foo>>.
4611
4612      Instead, we need to create the tuple GIMPLE_CALL <a, foo>.  To
4613      prevent gimplify_expr from trying to create a new temporary for
4614      foo's LHS, we tell it that it should only gimplify until it
4615      reaches the CALL_EXPR.  On return from gimplify_expr, the newly
4616      created GIMPLE_CALL <foo> will be the last statement in *PRE_P
4617      and all we need to do here is set 'a' to be its LHS.  */
4618   ret = gimplify_expr (from_p, pre_p, post_p, rhs_predicate_for (*to_p),
4619                        fb_rvalue);
4620   if (ret == GS_ERROR)
4621     return ret;
4622
4623   /* Now see if the above changed *from_p to something we handle specially.  */
4624   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
4625                                   want_value);
4626   if (ret != GS_UNHANDLED)
4627     return ret;
4628
4629   /* If we've got a variable sized assignment between two lvalues (i.e. does
4630      not involve a call), then we can make things a bit more straightforward
4631      by converting the assignment to memcpy or memset.  */
4632   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
4633     {
4634       tree from = TREE_OPERAND (*from_p, 0);
4635       tree size = TREE_OPERAND (*from_p, 1);
4636
4637       if (TREE_CODE (from) == CONSTRUCTOR)
4638         return gimplify_modify_expr_to_memset (expr_p, size, want_value, pre_p);
4639
4640       if (is_gimple_addressable (from))
4641         {
4642           *from_p = from;
4643           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value,
4644                                                  pre_p);
4645         }
4646     }
4647
4648   /* Transform partial stores to non-addressable complex variables into
4649      total stores.  This allows us to use real instead of virtual operands
4650      for these variables, which improves optimization.  */
4651   if ((TREE_CODE (*to_p) == REALPART_EXPR
4652        || TREE_CODE (*to_p) == IMAGPART_EXPR)
4653       && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
4654     return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
4655
4656   /* Try to alleviate the effects of the gimplification creating artificial
4657      temporaries (see for example is_gimple_reg_rhs) on the debug info.  */
4658   if (!gimplify_ctxp->into_ssa
4659       && TREE_CODE (*from_p) == VAR_DECL
4660       && DECL_IGNORED_P (*from_p)
4661       && DECL_P (*to_p)
4662       && !DECL_IGNORED_P (*to_p))
4663     {
4664       if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
4665         DECL_NAME (*from_p)
4666           = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
4667       DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
4668       SET_DECL_DEBUG_EXPR (*from_p, *to_p);
4669    }
4670
4671   if (want_value && TREE_THIS_VOLATILE (*to_p))
4672     *from_p = get_initialized_tmp_var (*from_p, pre_p, post_p);
4673
4674   if (TREE_CODE (*from_p) == CALL_EXPR)
4675     {
4676       /* Since the RHS is a CALL_EXPR, we need to create a GIMPLE_CALL
4677          instead of a GIMPLE_ASSIGN.  */
4678       tree fnptrtype = TREE_TYPE (CALL_EXPR_FN (*from_p));
4679       CALL_EXPR_FN (*from_p) = TREE_OPERAND (CALL_EXPR_FN (*from_p), 0);
4680       STRIP_USELESS_TYPE_CONVERSION (CALL_EXPR_FN (*from_p));
4681       assign = gimple_build_call_from_tree (*from_p);
4682       gimple_call_set_fntype (assign, TREE_TYPE (fnptrtype));
4683       if (!gimple_call_noreturn_p (assign))
4684         gimple_call_set_lhs (assign, *to_p);
4685     }
4686   else
4687     {
4688       assign = gimple_build_assign (*to_p, *from_p);
4689       gimple_set_location (assign, EXPR_LOCATION (*expr_p));
4690     }
4691
4692   gimplify_seq_add_stmt (pre_p, assign);
4693
4694   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
4695     {
4696       /* If we've somehow already got an SSA_NAME on the LHS, then
4697          we've probably modified it twice.  Not good.  */
4698       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
4699       *to_p = make_ssa_name (*to_p, assign);
4700       gimple_set_lhs (assign, *to_p);
4701     }
4702
4703   if (want_value)
4704     {
4705       *expr_p = TREE_THIS_VOLATILE (*to_p) ? *from_p : unshare_expr (*to_p);
4706       return GS_OK;
4707     }
4708   else
4709     *expr_p = NULL;
4710
4711   return GS_ALL_DONE;
4712 }
4713
4714 /* Gimplify a comparison between two variable-sized objects.  Do this
4715    with a call to BUILT_IN_MEMCMP.  */
4716
4717 static enum gimplify_status
4718 gimplify_variable_sized_compare (tree *expr_p)
4719 {
4720   location_t loc = EXPR_LOCATION (*expr_p);
4721   tree op0 = TREE_OPERAND (*expr_p, 0);
4722   tree op1 = TREE_OPERAND (*expr_p, 1);
4723   tree t, arg, dest, src, expr;
4724
4725   arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
4726   arg = unshare_expr (arg);
4727   arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
4728   src = build_fold_addr_expr_loc (loc, op1);
4729   dest = build_fold_addr_expr_loc (loc, op0);
4730   t = builtin_decl_implicit (BUILT_IN_MEMCMP);
4731   t = build_call_expr_loc (loc, t, 3, dest, src, arg);
4732
4733   expr
4734     = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
4735   SET_EXPR_LOCATION (expr, loc);
4736   *expr_p = expr;
4737
4738   return GS_OK;
4739 }
4740
4741 /* Gimplify a comparison between two aggregate objects of integral scalar
4742    mode as a comparison between the bitwise equivalent scalar values.  */
4743
4744 static enum gimplify_status
4745 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
4746 {
4747   location_t loc = EXPR_LOCATION (*expr_p);
4748   tree op0 = TREE_OPERAND (*expr_p, 0);
4749   tree op1 = TREE_OPERAND (*expr_p, 1);
4750
4751   tree type = TREE_TYPE (op0);
4752   tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
4753
4754   op0 = fold_build1_loc (loc, VIEW_CONVERT_EXPR, scalar_type, op0);
4755   op1 = fold_build1_loc (loc, VIEW_CONVERT_EXPR, scalar_type, op1);
4756
4757   *expr_p
4758     = fold_build2_loc (loc, TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
4759
4760   return GS_OK;
4761 }
4762
4763 /* Gimplify an expression sequence.  This function gimplifies each
4764    expression and rewrites the original expression with the last
4765    expression of the sequence in GIMPLE form.
4766
4767    PRE_P points to the list where the side effects for all the
4768        expressions in the sequence will be emitted.
4769
4770    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
4771
4772 static enum gimplify_status
4773 gimplify_compound_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
4774 {
4775   tree t = *expr_p;
4776
4777   do
4778     {
4779       tree *sub_p = &TREE_OPERAND (t, 0);
4780
4781       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
4782         gimplify_compound_expr (sub_p, pre_p, false);
4783       else
4784         gimplify_stmt (sub_p, pre_p);
4785
4786       t = TREE_OPERAND (t, 1);
4787     }
4788   while (TREE_CODE (t) == COMPOUND_EXPR);
4789
4790   *expr_p = t;
4791   if (want_value)
4792     return GS_OK;
4793   else
4794     {
4795       gimplify_stmt (expr_p, pre_p);
4796       return GS_ALL_DONE;
4797     }
4798 }
4799
4800 /* Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
4801    gimplify.  After gimplification, EXPR_P will point to a new temporary
4802    that holds the original value of the SAVE_EXPR node.
4803
4804    PRE_P points to the list where side effects that must happen before
4805    *EXPR_P should be stored.  */
4806
4807 static enum gimplify_status
4808 gimplify_save_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4809 {
4810   enum gimplify_status ret = GS_ALL_DONE;
4811   tree val;
4812
4813   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
4814   val = TREE_OPERAND (*expr_p, 0);
4815
4816   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
4817   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
4818     {
4819       /* The operand may be a void-valued expression such as SAVE_EXPRs
4820          generated by the Java frontend for class initialization.  It is
4821          being executed only for its side-effects.  */
4822       if (TREE_TYPE (val) == void_type_node)
4823         {
4824           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
4825                                is_gimple_stmt, fb_none);
4826           val = NULL;
4827         }
4828       else
4829         val = get_initialized_tmp_var (val, pre_p, post_p);
4830
4831       TREE_OPERAND (*expr_p, 0) = val;
4832       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
4833     }
4834
4835   *expr_p = val;
4836
4837   return ret;
4838 }
4839
4840 /* Rewrite the ADDR_EXPR node pointed to by EXPR_P
4841
4842       unary_expr
4843               : ...
4844               | '&' varname
4845               ...
4846
4847     PRE_P points to the list where side effects that must happen before
4848         *EXPR_P should be stored.
4849
4850     POST_P points to the list where side effects that must happen after
4851         *EXPR_P should be stored.  */
4852
4853 static enum gimplify_status
4854 gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4855 {
4856   tree expr = *expr_p;
4857   tree op0 = TREE_OPERAND (expr, 0);
4858   enum gimplify_status ret;
4859   location_t loc = EXPR_LOCATION (*expr_p);
4860
4861   switch (TREE_CODE (op0))
4862     {
4863     case INDIRECT_REF:
4864     do_indirect_ref:
4865       /* Check if we are dealing with an expression of the form '&*ptr'.
4866          While the front end folds away '&*ptr' into 'ptr', these
4867          expressions may be generated internally by the compiler (e.g.,
4868          builtins like __builtin_va_end).  */
4869       /* Caution: the silent array decomposition semantics we allow for
4870          ADDR_EXPR means we can't always discard the pair.  */
4871       /* Gimplification of the ADDR_EXPR operand may drop
4872          cv-qualification conversions, so make sure we add them if
4873          needed.  */
4874       {
4875         tree op00 = TREE_OPERAND (op0, 0);
4876         tree t_expr = TREE_TYPE (expr);
4877         tree t_op00 = TREE_TYPE (op00);
4878
4879         if (!useless_type_conversion_p (t_expr, t_op00))
4880           op00 = fold_convert_loc (loc, TREE_TYPE (expr), op00);
4881         *expr_p = op00;
4882         ret = GS_OK;
4883       }
4884       break;
4885
4886     case VIEW_CONVERT_EXPR:
4887       /* Take the address of our operand and then convert it to the type of
4888          this ADDR_EXPR.
4889
4890          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4891          all clear.  The impact of this transformation is even less clear.  */
4892
4893       /* If the operand is a useless conversion, look through it.  Doing so
4894          guarantees that the ADDR_EXPR and its operand will remain of the
4895          same type.  */
4896       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4897         op0 = TREE_OPERAND (op0, 0);
4898
4899       *expr_p = fold_convert_loc (loc, TREE_TYPE (expr),
4900                                   build_fold_addr_expr_loc (loc,
4901                                                         TREE_OPERAND (op0, 0)));
4902       ret = GS_OK;
4903       break;
4904
4905     default:
4906       /* We use fb_either here because the C frontend sometimes takes
4907          the address of a call that returns a struct; see
4908          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
4909          the implied temporary explicit.  */
4910
4911       /* Make the operand addressable.  */
4912       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4913                            is_gimple_addressable, fb_either);
4914       if (ret == GS_ERROR)
4915         break;
4916
4917       /* Then mark it.  Beware that it may not be possible to do so directly
4918          if a temporary has been created by the gimplification.  */
4919       prepare_gimple_addressable (&TREE_OPERAND (expr, 0), pre_p);
4920
4921       op0 = TREE_OPERAND (expr, 0);
4922
4923       /* For various reasons, the gimplification of the expression
4924          may have made a new INDIRECT_REF.  */
4925       if (TREE_CODE (op0) == INDIRECT_REF)
4926         goto do_indirect_ref;
4927
4928       mark_addressable (TREE_OPERAND (expr, 0));
4929
4930       /* The FEs may end up building ADDR_EXPRs early on a decl with
4931          an incomplete type.  Re-build ADDR_EXPRs in canonical form
4932          here.  */
4933       if (!types_compatible_p (TREE_TYPE (op0), TREE_TYPE (TREE_TYPE (expr))))
4934         *expr_p = build_fold_addr_expr (op0);
4935
4936       /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly.  */
4937       recompute_tree_invariant_for_addr_expr (*expr_p);
4938
4939       /* If we re-built the ADDR_EXPR add a conversion to the original type
4940          if required.  */
4941       if (!useless_type_conversion_p (TREE_TYPE (expr), TREE_TYPE (*expr_p)))
4942         *expr_p = fold_convert (TREE_TYPE (expr), *expr_p);
4943
4944       break;
4945     }
4946
4947   return ret;
4948 }
4949
4950 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
4951    value; output operands should be a gimple lvalue.  */
4952
4953 static enum gimplify_status
4954 gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4955 {
4956   tree expr;
4957   int noutputs;
4958   const char **oconstraints;
4959   int i;
4960   tree link;
4961   const char *constraint;
4962   bool allows_mem, allows_reg, is_inout;
4963   enum gimplify_status ret, tret;
4964   gimple stmt;
4965   VEC(tree, gc) *inputs;
4966   VEC(tree, gc) *outputs;
4967   VEC(tree, gc) *clobbers;
4968   VEC(tree, gc) *labels;
4969   tree link_next;
4970
4971   expr = *expr_p;
4972   noutputs = list_length (ASM_OUTPUTS (expr));
4973   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
4974
4975   inputs = outputs = clobbers = labels = NULL;
4976
4977   ret = GS_ALL_DONE;
4978   link_next = NULL_TREE;
4979   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = link_next)
4980     {
4981       bool ok;
4982       size_t constraint_len;
4983
4984       link_next = TREE_CHAIN (link);
4985
4986       oconstraints[i]
4987         = constraint
4988         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4989       constraint_len = strlen (constraint);
4990       if (constraint_len == 0)
4991         continue;
4992
4993       ok = parse_output_constraint (&constraint, i, 0, 0,
4994                                     &allows_mem, &allows_reg, &is_inout);
4995       if (!ok)
4996         {
4997           ret = GS_ERROR;
4998           is_inout = false;
4999         }
5000
5001       if (!allows_reg && allows_mem)
5002         mark_addressable (TREE_VALUE (link));
5003
5004       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
5005                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
5006                             fb_lvalue | fb_mayfail);
5007       if (tret == GS_ERROR)
5008         {
5009           error ("invalid lvalue in asm output %d", i);
5010           ret = tret;
5011         }
5012
5013       VEC_safe_push (tree, gc, outputs, link);
5014       TREE_CHAIN (link) = NULL_TREE;
5015
5016       if (is_inout)
5017         {
5018           /* An input/output operand.  To give the optimizers more
5019              flexibility, split it into separate input and output
5020              operands.  */
5021           tree input;
5022           char buf[10];
5023
5024           /* Turn the in/out constraint into an output constraint.  */
5025           char *p = xstrdup (constraint);
5026           p[0] = '=';
5027           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
5028
5029           /* And add a matching input constraint.  */
5030           if (allows_reg)
5031             {
5032               sprintf (buf, "%d", i);
5033
5034               /* If there are multiple alternatives in the constraint,
5035                  handle each of them individually.  Those that allow register
5036                  will be replaced with operand number, the others will stay
5037                  unchanged.  */
5038               if (strchr (p, ',') != NULL)
5039                 {
5040                   size_t len = 0, buflen = strlen (buf);
5041                   char *beg, *end, *str, *dst;
5042
5043                   for (beg = p + 1;;)
5044                     {
5045                       end = strchr (beg, ',');
5046                       if (end == NULL)
5047                         end = strchr (beg, '\0');
5048                       if ((size_t) (end - beg) < buflen)
5049                         len += buflen + 1;
5050                       else
5051                         len += end - beg + 1;
5052                       if (*end)
5053                         beg = end + 1;
5054                       else
5055                         break;
5056                     }
5057
5058                   str = (char *) alloca (len);
5059                   for (beg = p + 1, dst = str;;)
5060                     {
5061                       const char *tem;
5062                       bool mem_p, reg_p, inout_p;
5063
5064                       end = strchr (beg, ',');
5065                       if (end)
5066                         *end = '\0';
5067                       beg[-1] = '=';
5068                       tem = beg - 1;
5069                       parse_output_constraint (&tem, i, 0, 0,
5070                                                &mem_p, &reg_p, &inout_p);
5071                       if (dst != str)
5072                         *dst++ = ',';
5073                       if (reg_p)
5074                         {
5075                           memcpy (dst, buf, buflen);
5076                           dst += buflen;
5077                         }
5078                       else
5079                         {
5080                           if (end)
5081                             len = end - beg;
5082                           else
5083                             len = strlen (beg);
5084                           memcpy (dst, beg, len);
5085                           dst += len;
5086                         }
5087                       if (end)
5088                         beg = end + 1;
5089                       else
5090                         break;
5091                     }
5092                   *dst = '\0';
5093                   input = build_string (dst - str, str);
5094                 }
5095               else
5096                 input = build_string (strlen (buf), buf);
5097             }
5098           else
5099             input = build_string (constraint_len - 1, constraint + 1);
5100
5101           free (p);
5102
5103           input = build_tree_list (build_tree_list (NULL_TREE, input),
5104                                    unshare_expr (TREE_VALUE (link)));
5105           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
5106         }
5107     }
5108
5109   link_next = NULL_TREE;
5110   for (link = ASM_INPUTS (expr); link; ++i, link = link_next)
5111     {
5112       link_next = TREE_CHAIN (link);
5113       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
5114       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
5115                               oconstraints, &allows_mem, &allows_reg);
5116
5117       /* If we can't make copies, we can only accept memory.  */
5118       if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
5119         {
5120           if (allows_mem)
5121             allows_reg = 0;
5122           else
5123             {
5124               error ("impossible constraint in %<asm%>");
5125               error ("non-memory input %d must stay in memory", i);
5126               return GS_ERROR;
5127             }
5128         }
5129
5130       /* If the operand is a memory input, it should be an lvalue.  */
5131       if (!allows_reg && allows_mem)
5132         {
5133           tree inputv = TREE_VALUE (link);
5134           STRIP_NOPS (inputv);
5135           if (TREE_CODE (inputv) == PREDECREMENT_EXPR
5136               || TREE_CODE (inputv) == PREINCREMENT_EXPR
5137               || TREE_CODE (inputv) == POSTDECREMENT_EXPR
5138               || TREE_CODE (inputv) == POSTINCREMENT_EXPR)
5139             TREE_VALUE (link) = error_mark_node;
5140           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
5141                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
5142           mark_addressable (TREE_VALUE (link));
5143           if (tret == GS_ERROR)
5144             {
5145               if (EXPR_HAS_LOCATION (TREE_VALUE (link)))
5146                 input_location = EXPR_LOCATION (TREE_VALUE (link));
5147               error ("memory input %d is not directly addressable", i);
5148               ret = tret;
5149             }
5150         }
5151       else
5152         {
5153           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
5154                                 is_gimple_asm_val, fb_rvalue);
5155           if (tret == GS_ERROR)
5156             ret = tret;
5157         }
5158
5159       TREE_CHAIN (link) = NULL_TREE;
5160       VEC_safe_push (tree, gc, inputs, link);
5161     }
5162
5163   for (link = ASM_CLOBBERS (expr); link; ++i, link = TREE_CHAIN (link))
5164     VEC_safe_push (tree, gc, clobbers, link);
5165
5166   for (link = ASM_LABELS (expr); link; ++i, link = TREE_CHAIN (link))
5167     VEC_safe_push (tree, gc, labels, link);
5168
5169   /* Do not add ASMs with errors to the gimple IL stream.  */
5170   if (ret != GS_ERROR)
5171     {
5172       stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
5173                                    inputs, outputs, clobbers, labels);
5174
5175       gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr));
5176       gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
5177
5178       gimplify_seq_add_stmt (pre_p, stmt);
5179     }
5180
5181   return ret;
5182 }
5183
5184 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
5185    GIMPLE_WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
5186    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
5187    return to this function.
5188
5189    FIXME should we complexify the prequeue handling instead?  Or use flags
5190    for all the cleanups and let the optimizer tighten them up?  The current
5191    code seems pretty fragile; it will break on a cleanup within any
5192    non-conditional nesting.  But any such nesting would be broken, anyway;
5193    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
5194    and continues out of it.  We can do that at the RTL level, though, so
5195    having an optimizer to tighten up try/finally regions would be a Good
5196    Thing.  */
5197
5198 static enum gimplify_status
5199 gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p)
5200 {
5201   gimple_stmt_iterator iter;
5202   gimple_seq body_sequence = NULL;
5203
5204   tree temp = voidify_wrapper_expr (*expr_p, NULL);
5205
5206   /* We only care about the number of conditions between the innermost
5207      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count and
5208      any cleanups collected outside the CLEANUP_POINT_EXPR.  */
5209   int old_conds = gimplify_ctxp->conditions;
5210   gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups;
5211   gimplify_ctxp->conditions = 0;
5212   gimplify_ctxp->conditional_cleanups = NULL;
5213
5214   gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence);
5215
5216   gimplify_ctxp->conditions = old_conds;
5217   gimplify_ctxp->conditional_cleanups = old_cleanups;
5218
5219   for (iter = gsi_start (body_sequence); !gsi_end_p (iter); )
5220     {
5221       gimple wce = gsi_stmt (iter);
5222
5223       if (gimple_code (wce) == GIMPLE_WITH_CLEANUP_EXPR)
5224         {
5225           if (gsi_one_before_end_p (iter))
5226             {
5227               /* Note that gsi_insert_seq_before and gsi_remove do not
5228                  scan operands, unlike some other sequence mutators.  */
5229               if (!gimple_wce_cleanup_eh_only (wce))
5230                 gsi_insert_seq_before_without_update (&iter,
5231                                                       gimple_wce_cleanup (wce),
5232                                                       GSI_SAME_STMT);
5233               gsi_remove (&iter, true);
5234               break;
5235             }
5236           else
5237             {
5238               gimple gtry;
5239               gimple_seq seq;
5240               enum gimple_try_flags kind;
5241
5242               if (gimple_wce_cleanup_eh_only (wce))
5243                 kind = GIMPLE_TRY_CATCH;
5244               else
5245                 kind = GIMPLE_TRY_FINALLY;
5246               seq = gsi_split_seq_after (iter);
5247
5248               gtry = gimple_build_try (seq, gimple_wce_cleanup (wce), kind);
5249               /* Do not use gsi_replace here, as it may scan operands.
5250                  We want to do a simple structural modification only.  */
5251               *gsi_stmt_ptr (&iter) = gtry;
5252               iter = gsi_start (seq);
5253             }
5254         }
5255       else
5256         gsi_next (&iter);
5257     }
5258
5259   gimplify_seq_add_seq (pre_p, body_sequence);
5260   if (temp)
5261     {
5262       *expr_p = temp;
5263       return GS_OK;
5264     }
5265   else
5266     {
5267       *expr_p = NULL;
5268       return GS_ALL_DONE;
5269     }
5270 }
5271
5272 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
5273    is the cleanup action required.  EH_ONLY is true if the cleanup should
5274    only be executed if an exception is thrown, not on normal exit.  */
5275
5276 static void
5277 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p)
5278 {
5279   gimple wce;
5280   gimple_seq cleanup_stmts = NULL;
5281
5282   /* Errors can result in improperly nested cleanups.  Which results in
5283      confusion when trying to resolve the GIMPLE_WITH_CLEANUP_EXPR.  */
5284   if (seen_error ())
5285     return;
5286
5287   if (gimple_conditional_context ())
5288     {
5289       /* If we're in a conditional context, this is more complex.  We only
5290          want to run the cleanup if we actually ran the initialization that
5291          necessitates it, but we want to run it after the end of the
5292          conditional context.  So we wrap the try/finally around the
5293          condition and use a flag to determine whether or not to actually
5294          run the destructor.  Thus
5295
5296            test ? f(A()) : 0
5297
5298          becomes (approximately)
5299
5300            flag = 0;
5301            try {
5302              if (test) { A::A(temp); flag = 1; val = f(temp); }
5303              else { val = 0; }
5304            } finally {
5305              if (flag) A::~A(temp);
5306            }
5307            val
5308       */
5309       tree flag = create_tmp_var (boolean_type_node, "cleanup");
5310       gimple ffalse = gimple_build_assign (flag, boolean_false_node);
5311       gimple ftrue = gimple_build_assign (flag, boolean_true_node);
5312
5313       cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
5314       gimplify_stmt (&cleanup, &cleanup_stmts);
5315       wce = gimple_build_wce (cleanup_stmts);
5316
5317       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
5318       gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
5319       gimplify_seq_add_stmt (pre_p, ftrue);
5320
5321       /* Because of this manipulation, and the EH edges that jump
5322          threading cannot redirect, the temporary (VAR) will appear
5323          to be used uninitialized.  Don't warn.  */
5324       TREE_NO_WARNING (var) = 1;
5325     }
5326   else
5327     {
5328       gimplify_stmt (&cleanup, &cleanup_stmts);
5329       wce = gimple_build_wce (cleanup_stmts);
5330       gimple_wce_set_cleanup_eh_only (wce, eh_only);
5331       gimplify_seq_add_stmt (pre_p, wce);
5332     }
5333 }
5334
5335 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
5336
5337 static enum gimplify_status
5338 gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
5339 {
5340   tree targ = *expr_p;
5341   tree temp = TARGET_EXPR_SLOT (targ);
5342   tree init = TARGET_EXPR_INITIAL (targ);
5343   enum gimplify_status ret;
5344
5345   if (init)
5346     {
5347       tree cleanup = NULL_TREE;
5348
5349       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
5350          to the temps list.  Handle also variable length TARGET_EXPRs.  */
5351       if (TREE_CODE (DECL_SIZE (temp)) != INTEGER_CST)
5352         {
5353           if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (temp)))
5354             gimplify_type_sizes (TREE_TYPE (temp), pre_p);
5355           gimplify_vla_decl (temp, pre_p);
5356         }
5357       else
5358         gimple_add_tmp_var (temp);
5359
5360       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
5361          expression is supposed to initialize the slot.  */
5362       if (VOID_TYPE_P (TREE_TYPE (init)))
5363         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5364       else
5365         {
5366           tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
5367           init = init_expr;
5368           ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
5369           init = NULL;
5370           ggc_free (init_expr);
5371         }
5372       if (ret == GS_ERROR)
5373         {
5374           /* PR c++/28266 Make sure this is expanded only once. */
5375           TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5376           return GS_ERROR;
5377         }
5378       if (init)
5379         gimplify_and_add (init, pre_p);
5380
5381       /* If needed, push the cleanup for the temp.  */
5382       if (TARGET_EXPR_CLEANUP (targ))
5383         {
5384           if (CLEANUP_EH_ONLY (targ))
5385             gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
5386                                  CLEANUP_EH_ONLY (targ), pre_p);
5387           else
5388             cleanup = TARGET_EXPR_CLEANUP (targ);
5389         }
5390
5391       /* Add a clobber for the temporary going out of scope, like
5392          gimplify_bind_expr.  */
5393       if (needs_to_live_in_memory (temp))
5394         {
5395           tree clobber = build_constructor (TREE_TYPE (temp), NULL);
5396           TREE_THIS_VOLATILE (clobber) = true;
5397           clobber = build2 (MODIFY_EXPR, TREE_TYPE (temp), temp, clobber);
5398           if (cleanup)
5399             cleanup = build2 (COMPOUND_EXPR, void_type_node, cleanup,
5400                               clobber);
5401           else
5402             cleanup = clobber;
5403         }
5404
5405       if (cleanup)
5406         gimple_push_cleanup (temp, cleanup, false, pre_p);
5407
5408       /* Only expand this once.  */
5409       TREE_OPERAND (targ, 3) = init;
5410       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
5411     }
5412   else
5413     /* We should have expanded this before.  */
5414     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
5415
5416   *expr_p = temp;
5417   return GS_OK;
5418 }
5419
5420 /* Gimplification of expression trees.  */
5421
5422 /* Gimplify an expression which appears at statement context.  The
5423    corresponding GIMPLE statements are added to *SEQ_P.  If *SEQ_P is
5424    NULL, a new sequence is allocated.
5425
5426    Return true if we actually added a statement to the queue.  */
5427
5428 bool
5429 gimplify_stmt (tree *stmt_p, gimple_seq *seq_p)
5430 {
5431   gimple_seq_node last;
5432
5433   if (!*seq_p)
5434     *seq_p = gimple_seq_alloc ();
5435
5436   last = gimple_seq_last (*seq_p);
5437   gimplify_expr (stmt_p, seq_p, NULL, is_gimple_stmt, fb_none);
5438   return last != gimple_seq_last (*seq_p);
5439 }
5440
5441 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
5442    to CTX.  If entries already exist, force them to be some flavor of private.
5443    If there is no enclosing parallel, do nothing.  */
5444
5445 void
5446 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
5447 {
5448   splay_tree_node n;
5449
5450   if (decl == NULL || !DECL_P (decl))
5451     return;
5452
5453   do
5454     {
5455       n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5456       if (n != NULL)
5457         {
5458           if (n->value & GOVD_SHARED)
5459             n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
5460           else
5461             return;
5462         }
5463       else if (ctx->region_type != ORT_WORKSHARE)
5464         omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
5465
5466       ctx = ctx->outer_context;
5467     }
5468   while (ctx);
5469 }
5470
5471 /* Similarly for each of the type sizes of TYPE.  */
5472
5473 static void
5474 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
5475 {
5476   if (type == NULL || type == error_mark_node)
5477     return;
5478   type = TYPE_MAIN_VARIANT (type);
5479
5480   if (pointer_set_insert (ctx->privatized_types, type))
5481     return;
5482
5483   switch (TREE_CODE (type))
5484     {
5485     case INTEGER_TYPE:
5486     case ENUMERAL_TYPE:
5487     case BOOLEAN_TYPE:
5488     case REAL_TYPE:
5489     case FIXED_POINT_TYPE:
5490       omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
5491       omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
5492       break;
5493
5494     case ARRAY_TYPE:
5495       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5496       omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
5497       break;
5498
5499     case RECORD_TYPE:
5500     case UNION_TYPE:
5501     case QUAL_UNION_TYPE:
5502       {
5503         tree field;
5504         for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5505           if (TREE_CODE (field) == FIELD_DECL)
5506             {
5507               omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
5508               omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
5509             }
5510       }
5511       break;
5512
5513     case POINTER_TYPE:
5514     case REFERENCE_TYPE:
5515       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
5516       break;
5517
5518     default:
5519       break;
5520     }
5521
5522   omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
5523   omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
5524   lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
5525 }
5526
5527 /* Add an entry for DECL in the OpenMP context CTX with FLAGS.  */
5528
5529 static void
5530 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
5531 {
5532   splay_tree_node n;
5533   unsigned int nflags;
5534   tree t;
5535
5536   if (error_operand_p (decl))
5537     return;
5538
5539   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
5540      there are constructors involved somewhere.  */
5541   if (TREE_ADDRESSABLE (TREE_TYPE (decl))
5542       || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
5543     flags |= GOVD_SEEN;
5544
5545   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5546   if (n != NULL)
5547     {
5548       /* We shouldn't be re-adding the decl with the same data
5549          sharing class.  */
5550       gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
5551       /* The only combination of data sharing classes we should see is
5552          FIRSTPRIVATE and LASTPRIVATE.  */
5553       nflags = n->value | flags;
5554       gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
5555                   == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
5556       n->value = nflags;
5557       return;
5558     }
5559
5560   /* When adding a variable-sized variable, we have to handle all sorts
5561      of additional bits of data: the pointer replacement variable, and
5562      the parameters of the type.  */
5563   if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5564     {
5565       /* Add the pointer replacement variable as PRIVATE if the variable
5566          replacement is private, else FIRSTPRIVATE since we'll need the
5567          address of the original variable either for SHARED, or for the
5568          copy into or out of the context.  */
5569       if (!(flags & GOVD_LOCAL))
5570         {
5571           nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
5572           nflags |= flags & GOVD_SEEN;
5573           t = DECL_VALUE_EXPR (decl);
5574           gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5575           t = TREE_OPERAND (t, 0);
5576           gcc_assert (DECL_P (t));
5577           omp_add_variable (ctx, t, nflags);
5578         }
5579
5580       /* Add all of the variable and type parameters (which should have
5581          been gimplified to a formal temporary) as FIRSTPRIVATE.  */
5582       omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
5583       omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
5584       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5585
5586       /* The variable-sized variable itself is never SHARED, only some form
5587          of PRIVATE.  The sharing would take place via the pointer variable
5588          which we remapped above.  */
5589       if (flags & GOVD_SHARED)
5590         flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
5591                 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
5592
5593       /* We're going to make use of the TYPE_SIZE_UNIT at least in the
5594          alloca statement we generate for the variable, so make sure it
5595          is available.  This isn't automatically needed for the SHARED
5596          case, since we won't be allocating local storage then.
5597          For local variables TYPE_SIZE_UNIT might not be gimplified yet,
5598          in this case omp_notice_variable will be called later
5599          on when it is gimplified.  */
5600       else if (! (flags & GOVD_LOCAL)
5601                && DECL_P (TYPE_SIZE_UNIT (TREE_TYPE (decl))))
5602         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
5603     }
5604   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
5605     {
5606       gcc_assert ((flags & GOVD_LOCAL) == 0);
5607       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
5608
5609       /* Similar to the direct variable sized case above, we'll need the
5610          size of references being privatized.  */
5611       if ((flags & GOVD_SHARED) == 0)
5612         {
5613           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
5614           if (TREE_CODE (t) != INTEGER_CST)
5615             omp_notice_variable (ctx, t, true);
5616         }
5617     }
5618
5619   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
5620 }
5621
5622 /* Notice a threadprivate variable DECL used in OpenMP context CTX.
5623    This just prints out diagnostics about threadprivate variable uses
5624    in untied tasks.  If DECL2 is non-NULL, prevent this warning
5625    on that variable.  */
5626
5627 static bool
5628 omp_notice_threadprivate_variable (struct gimplify_omp_ctx *ctx, tree decl,
5629                                    tree decl2)
5630 {
5631   splay_tree_node n;
5632
5633   if (ctx->region_type != ORT_UNTIED_TASK)
5634     return false;
5635   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5636   if (n == NULL)
5637     {
5638       error ("threadprivate variable %qE used in untied task",
5639              DECL_NAME (decl));
5640       error_at (ctx->location, "enclosing task");
5641       splay_tree_insert (ctx->variables, (splay_tree_key)decl, 0);
5642     }
5643   if (decl2)
5644     splay_tree_insert (ctx->variables, (splay_tree_key)decl2, 0);
5645   return false;
5646 }
5647
5648 /* Record the fact that DECL was used within the OpenMP context CTX.
5649    IN_CODE is true when real code uses DECL, and false when we should
5650    merely emit default(none) errors.  Return true if DECL is going to
5651    be remapped and thus DECL shouldn't be gimplified into its
5652    DECL_VALUE_EXPR (if any).  */
5653
5654 static bool
5655 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
5656 {
5657   splay_tree_node n;
5658   unsigned flags = in_code ? GOVD_SEEN : 0;
5659   bool ret = false, shared;
5660
5661   if (error_operand_p (decl))
5662     return false;
5663
5664   /* Threadprivate variables are predetermined.  */
5665   if (is_global_var (decl))
5666     {
5667       if (DECL_THREAD_LOCAL_P (decl))
5668         return omp_notice_threadprivate_variable (ctx, decl, NULL_TREE);
5669
5670       if (DECL_HAS_VALUE_EXPR_P (decl))
5671         {
5672           tree value = get_base_address (DECL_VALUE_EXPR (decl));
5673
5674           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
5675             return omp_notice_threadprivate_variable (ctx, decl, value);
5676         }
5677     }
5678
5679   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5680   if (n == NULL)
5681     {
5682       enum omp_clause_default_kind default_kind, kind;
5683       struct gimplify_omp_ctx *octx;
5684
5685       if (ctx->region_type == ORT_WORKSHARE)
5686         goto do_outer;
5687
5688       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
5689          remapped firstprivate instead of shared.  To some extent this is
5690          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
5691       default_kind = ctx->default_kind;
5692       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
5693       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
5694         default_kind = kind;
5695
5696       switch (default_kind)
5697         {
5698         case OMP_CLAUSE_DEFAULT_NONE:
5699           error ("%qE not specified in enclosing parallel",
5700                  DECL_NAME (lang_hooks.decls.omp_report_decl (decl)));
5701           if ((ctx->region_type & ORT_TASK) != 0)
5702             error_at (ctx->location, "enclosing task");
5703           else
5704             error_at (ctx->location, "enclosing parallel");
5705           /* FALLTHRU */
5706         case OMP_CLAUSE_DEFAULT_SHARED:
5707           flags |= GOVD_SHARED;
5708           break;
5709         case OMP_CLAUSE_DEFAULT_PRIVATE:
5710           flags |= GOVD_PRIVATE;
5711           break;
5712         case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
5713           flags |= GOVD_FIRSTPRIVATE;
5714           break;
5715         case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
5716           /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED.  */
5717           gcc_assert ((ctx->region_type & ORT_TASK) != 0);
5718           if (ctx->outer_context)
5719             omp_notice_variable (ctx->outer_context, decl, in_code);
5720           for (octx = ctx->outer_context; octx; octx = octx->outer_context)
5721             {
5722               splay_tree_node n2;
5723
5724               n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
5725               if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED)
5726                 {
5727                   flags |= GOVD_FIRSTPRIVATE;
5728                   break;
5729                 }
5730               if ((octx->region_type & ORT_PARALLEL) != 0)
5731                 break;
5732             }
5733           if (flags & GOVD_FIRSTPRIVATE)
5734             break;
5735           if (octx == NULL
5736               && (TREE_CODE (decl) == PARM_DECL
5737                   || (!is_global_var (decl)
5738                       && DECL_CONTEXT (decl) == current_function_decl)))
5739             {
5740               flags |= GOVD_FIRSTPRIVATE;
5741               break;
5742             }
5743           flags |= GOVD_SHARED;
5744           break;
5745         default:
5746           gcc_unreachable ();
5747         }
5748
5749       if ((flags & GOVD_PRIVATE)
5750           && lang_hooks.decls.omp_private_outer_ref (decl))
5751         flags |= GOVD_PRIVATE_OUTER_REF;
5752
5753       omp_add_variable (ctx, decl, flags);
5754
5755       shared = (flags & GOVD_SHARED) != 0;
5756       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5757       goto do_outer;
5758     }
5759
5760   if ((n->value & (GOVD_SEEN | GOVD_LOCAL)) == 0
5761       && (flags & (GOVD_SEEN | GOVD_LOCAL)) == GOVD_SEEN
5762       && DECL_SIZE (decl)
5763       && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
5764     {
5765       splay_tree_node n2;
5766       tree t = DECL_VALUE_EXPR (decl);
5767       gcc_assert (TREE_CODE (t) == INDIRECT_REF);
5768       t = TREE_OPERAND (t, 0);
5769       gcc_assert (DECL_P (t));
5770       n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
5771       n2->value |= GOVD_SEEN;
5772     }
5773
5774   shared = ((flags | n->value) & GOVD_SHARED) != 0;
5775   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
5776
5777   /* If nothing changed, there's nothing left to do.  */
5778   if ((n->value & flags) == flags)
5779     return ret;
5780   flags |= n->value;
5781   n->value = flags;
5782
5783  do_outer:
5784   /* If the variable is private in the current context, then we don't
5785      need to propagate anything to an outer context.  */
5786   if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF))
5787     return ret;
5788   if (ctx->outer_context
5789       && omp_notice_variable (ctx->outer_context, decl, in_code))
5790     return true;
5791   return ret;
5792 }
5793
5794 /* Verify that DECL is private within CTX.  If there's specific information
5795    to the contrary in the innermost scope, generate an error.  */
5796
5797 static bool
5798 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
5799 {
5800   splay_tree_node n;
5801
5802   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
5803   if (n != NULL)
5804     {
5805       if (n->value & GOVD_SHARED)
5806         {
5807           if (ctx == gimplify_omp_ctxp)
5808             {
5809               error ("iteration variable %qE should be private",
5810                      DECL_NAME (decl));
5811               n->value = GOVD_PRIVATE;
5812               return true;
5813             }
5814           else
5815             return false;
5816         }
5817       else if ((n->value & GOVD_EXPLICIT) != 0
5818                && (ctx == gimplify_omp_ctxp
5819                    || (ctx->region_type == ORT_COMBINED_PARALLEL
5820                        && gimplify_omp_ctxp->outer_context == ctx)))
5821         {
5822           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
5823             error ("iteration variable %qE should not be firstprivate",
5824                    DECL_NAME (decl));
5825           else if ((n->value & GOVD_REDUCTION) != 0)
5826             error ("iteration variable %qE should not be reduction",
5827                    DECL_NAME (decl));
5828         }
5829       return (ctx == gimplify_omp_ctxp
5830               || (ctx->region_type == ORT_COMBINED_PARALLEL
5831                   && gimplify_omp_ctxp->outer_context == ctx));
5832     }
5833
5834   if (ctx->region_type != ORT_WORKSHARE)
5835     return false;
5836   else if (ctx->outer_context)
5837     return omp_is_private (ctx->outer_context, decl);
5838   return false;
5839 }
5840
5841 /* Return true if DECL is private within a parallel region
5842    that binds to the current construct's context or in parallel
5843    region's REDUCTION clause.  */
5844
5845 static bool
5846 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
5847 {
5848   splay_tree_node n;
5849
5850   do
5851     {
5852       ctx = ctx->outer_context;
5853       if (ctx == NULL)
5854         return !(is_global_var (decl)
5855                  /* References might be private, but might be shared too.  */
5856                  || lang_hooks.decls.omp_privatize_by_reference (decl));
5857
5858       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5859       if (n != NULL)
5860         return (n->value & GOVD_SHARED) == 0;
5861     }
5862   while (ctx->region_type == ORT_WORKSHARE);
5863   return false;
5864 }
5865
5866 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
5867    and previous omp contexts.  */
5868
5869 static void
5870 gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
5871                            enum omp_region_type region_type)
5872 {
5873   struct gimplify_omp_ctx *ctx, *outer_ctx;
5874   struct gimplify_ctx gctx;
5875   tree c;
5876
5877   ctx = new_omp_context (region_type);
5878   outer_ctx = ctx->outer_context;
5879
5880   while ((c = *list_p) != NULL)
5881     {
5882       bool remove = false;
5883       bool notice_outer = true;
5884       const char *check_non_private = NULL;
5885       unsigned int flags;
5886       tree decl;
5887
5888       switch (OMP_CLAUSE_CODE (c))
5889         {
5890         case OMP_CLAUSE_PRIVATE:
5891           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
5892           if (lang_hooks.decls.omp_private_outer_ref (OMP_CLAUSE_DECL (c)))
5893             {
5894               flags |= GOVD_PRIVATE_OUTER_REF;
5895               OMP_CLAUSE_PRIVATE_OUTER_REF (c) = 1;
5896             }
5897           else
5898             notice_outer = false;
5899           goto do_add;
5900         case OMP_CLAUSE_SHARED:
5901           flags = GOVD_SHARED | GOVD_EXPLICIT;
5902           goto do_add;
5903         case OMP_CLAUSE_FIRSTPRIVATE:
5904           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
5905           check_non_private = "firstprivate";
5906           goto do_add;
5907         case OMP_CLAUSE_LASTPRIVATE:
5908           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
5909           check_non_private = "lastprivate";
5910           goto do_add;
5911         case OMP_CLAUSE_REDUCTION:
5912           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
5913           check_non_private = "reduction";
5914           goto do_add;
5915
5916         do_add:
5917           decl = OMP_CLAUSE_DECL (c);
5918           if (error_operand_p (decl))
5919             {
5920               remove = true;
5921               break;
5922             }
5923           omp_add_variable (ctx, decl, flags);
5924           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5925               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
5926             {
5927               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
5928                                 GOVD_LOCAL | GOVD_SEEN);
5929               gimplify_omp_ctxp = ctx;
5930               push_gimplify_context (&gctx);
5931
5932               OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c) = gimple_seq_alloc ();
5933               OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c) = gimple_seq_alloc ();
5934
5935               gimplify_and_add (OMP_CLAUSE_REDUCTION_INIT (c),
5936                                 &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c));
5937               pop_gimplify_context
5938                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c)));
5939               push_gimplify_context (&gctx);
5940               gimplify_and_add (OMP_CLAUSE_REDUCTION_MERGE (c),
5941                                 &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c));
5942               pop_gimplify_context
5943                 (gimple_seq_first_stmt (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (c)));
5944               OMP_CLAUSE_REDUCTION_INIT (c) = NULL_TREE;
5945               OMP_CLAUSE_REDUCTION_MERGE (c) = NULL_TREE;
5946
5947               gimplify_omp_ctxp = outer_ctx;
5948             }
5949           else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
5950                    && OMP_CLAUSE_LASTPRIVATE_STMT (c))
5951             {
5952               gimplify_omp_ctxp = ctx;
5953               push_gimplify_context (&gctx);
5954               if (TREE_CODE (OMP_CLAUSE_LASTPRIVATE_STMT (c)) != BIND_EXPR)
5955                 {
5956                   tree bind = build3 (BIND_EXPR, void_type_node, NULL,
5957                                       NULL, NULL);
5958                   TREE_SIDE_EFFECTS (bind) = 1;
5959                   BIND_EXPR_BODY (bind) = OMP_CLAUSE_LASTPRIVATE_STMT (c);
5960                   OMP_CLAUSE_LASTPRIVATE_STMT (c) = bind;
5961                 }
5962               gimplify_and_add (OMP_CLAUSE_LASTPRIVATE_STMT (c),
5963                                 &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
5964               pop_gimplify_context
5965                 (gimple_seq_first_stmt (OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)));
5966               OMP_CLAUSE_LASTPRIVATE_STMT (c) = NULL_TREE;
5967
5968               gimplify_omp_ctxp = outer_ctx;
5969             }
5970           if (notice_outer)
5971             goto do_notice;
5972           break;
5973
5974         case OMP_CLAUSE_COPYIN:
5975         case OMP_CLAUSE_COPYPRIVATE:
5976           decl = OMP_CLAUSE_DECL (c);
5977           if (error_operand_p (decl))
5978             {
5979               remove = true;
5980               break;
5981             }
5982         do_notice:
5983           if (outer_ctx)
5984             omp_notice_variable (outer_ctx, decl, true);
5985           if (check_non_private
5986               && region_type == ORT_WORKSHARE
5987               && omp_check_private (ctx, decl))
5988             {
5989               error ("%s variable %qE is private in outer context",
5990                      check_non_private, DECL_NAME (decl));
5991               remove = true;
5992             }
5993           break;
5994
5995         case OMP_CLAUSE_FINAL:
5996         case OMP_CLAUSE_IF:
5997           OMP_CLAUSE_OPERAND (c, 0)
5998             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
5999           /* Fall through.  */
6000
6001         case OMP_CLAUSE_SCHEDULE:
6002         case OMP_CLAUSE_NUM_THREADS:
6003           if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
6004                              is_gimple_val, fb_rvalue) == GS_ERROR)
6005               remove = true;
6006           break;
6007
6008         case OMP_CLAUSE_NOWAIT:
6009         case OMP_CLAUSE_ORDERED:
6010         case OMP_CLAUSE_UNTIED:
6011         case OMP_CLAUSE_COLLAPSE:
6012         case OMP_CLAUSE_MERGEABLE:
6013           break;
6014
6015         case OMP_CLAUSE_DEFAULT:
6016           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
6017           break;
6018
6019         default:
6020           gcc_unreachable ();
6021         }
6022
6023       if (remove)
6024         *list_p = OMP_CLAUSE_CHAIN (c);
6025       else
6026         list_p = &OMP_CLAUSE_CHAIN (c);
6027     }
6028
6029   gimplify_omp_ctxp = ctx;
6030 }
6031
6032 /* For all variables that were not actually used within the context,
6033    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
6034
6035 static int
6036 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
6037 {
6038   tree *list_p = (tree *) data;
6039   tree decl = (tree) n->key;
6040   unsigned flags = n->value;
6041   enum omp_clause_code code;
6042   tree clause;
6043   bool private_debug;
6044
6045   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
6046     return 0;
6047   if ((flags & GOVD_SEEN) == 0)
6048     return 0;
6049   if (flags & GOVD_DEBUG_PRIVATE)
6050     {
6051       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
6052       private_debug = true;
6053     }
6054   else
6055     private_debug
6056       = lang_hooks.decls.omp_private_debug_clause (decl,
6057                                                    !!(flags & GOVD_SHARED));
6058   if (private_debug)
6059     code = OMP_CLAUSE_PRIVATE;
6060   else if (flags & GOVD_SHARED)
6061     {
6062       if (is_global_var (decl))
6063         {
6064           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
6065           while (ctx != NULL)
6066             {
6067               splay_tree_node on
6068                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
6069               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
6070                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
6071                 break;
6072               ctx = ctx->outer_context;
6073             }
6074           if (ctx == NULL)
6075             return 0;
6076         }
6077       code = OMP_CLAUSE_SHARED;
6078     }
6079   else if (flags & GOVD_PRIVATE)
6080     code = OMP_CLAUSE_PRIVATE;
6081   else if (flags & GOVD_FIRSTPRIVATE)
6082     code = OMP_CLAUSE_FIRSTPRIVATE;
6083   else
6084     gcc_unreachable ();
6085
6086   clause = build_omp_clause (input_location, code);
6087   OMP_CLAUSE_DECL (clause) = decl;
6088   OMP_CLAUSE_CHAIN (clause) = *list_p;
6089   if (private_debug)
6090     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
6091   else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
6092     OMP_CLAUSE_PRIVATE_OUTER_REF (clause) = 1;
6093   *list_p = clause;
6094   lang_hooks.decls.omp_finish_clause (clause);
6095
6096   return 0;
6097 }
6098
6099 static void
6100 gimplify_adjust_omp_clauses (tree *list_p)
6101 {
6102   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
6103   tree c, decl;
6104
6105   while ((c = *list_p) != NULL)
6106     {
6107       splay_tree_node n;
6108       bool remove = false;
6109
6110       switch (OMP_CLAUSE_CODE (c))
6111         {
6112         case OMP_CLAUSE_PRIVATE:
6113         case OMP_CLAUSE_SHARED:
6114         case OMP_CLAUSE_FIRSTPRIVATE:
6115           decl = OMP_CLAUSE_DECL (c);
6116           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
6117           remove = !(n->value & GOVD_SEEN);
6118           if (! remove)
6119             {
6120               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
6121               if ((n->value & GOVD_DEBUG_PRIVATE)
6122                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
6123                 {
6124                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
6125                               || ((n->value & GOVD_DATA_SHARE_CLASS)
6126                                   == GOVD_PRIVATE));
6127                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
6128                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
6129                 }
6130             }
6131           break;
6132
6133         case OMP_CLAUSE_LASTPRIVATE:
6134           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
6135              accurately reflect the presence of a FIRSTPRIVATE clause.  */
6136           decl = OMP_CLAUSE_DECL (c);
6137           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
6138           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
6139             = (n->value & GOVD_FIRSTPRIVATE) != 0;
6140           break;
6141
6142         case OMP_CLAUSE_REDUCTION:
6143         case OMP_CLAUSE_COPYIN:
6144         case OMP_CLAUSE_COPYPRIVATE:
6145         case OMP_CLAUSE_IF:
6146         case OMP_CLAUSE_NUM_THREADS:
6147         case OMP_CLAUSE_SCHEDULE:
6148         case OMP_CLAUSE_NOWAIT:
6149         case OMP_CLAUSE_ORDERED:
6150         case OMP_CLAUSE_DEFAULT:
6151         case OMP_CLAUSE_UNTIED:
6152         case OMP_CLAUSE_COLLAPSE:
6153         case OMP_CLAUSE_FINAL:
6154         case OMP_CLAUSE_MERGEABLE:
6155           break;
6156
6157         default:
6158           gcc_unreachable ();
6159         }
6160
6161       if (remove)
6162         *list_p = OMP_CLAUSE_CHAIN (c);
6163       else
6164         list_p = &OMP_CLAUSE_CHAIN (c);
6165     }
6166
6167   /* Add in any implicit data sharing.  */
6168   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
6169
6170   gimplify_omp_ctxp = ctx->outer_context;
6171   delete_omp_context (ctx);
6172 }
6173
6174 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
6175    gimplification of the body, as well as scanning the body for used
6176    variables.  We need to do this scan now, because variable-sized
6177    decls will be decomposed during gimplification.  */
6178
6179 static void
6180 gimplify_omp_parallel (tree *expr_p, gimple_seq *pre_p)
6181 {
6182   tree expr = *expr_p;
6183   gimple g;
6184   gimple_seq body = NULL;
6185   struct gimplify_ctx gctx;
6186
6187   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p,
6188                              OMP_PARALLEL_COMBINED (expr)
6189                              ? ORT_COMBINED_PARALLEL
6190                              : ORT_PARALLEL);
6191
6192   push_gimplify_context (&gctx);
6193
6194   g = gimplify_and_return_first (OMP_PARALLEL_BODY (expr), &body);
6195   if (gimple_code (g) == GIMPLE_BIND)
6196     pop_gimplify_context (g);
6197   else
6198     pop_gimplify_context (NULL);
6199
6200   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
6201
6202   g = gimple_build_omp_parallel (body,
6203                                  OMP_PARALLEL_CLAUSES (expr),
6204                                  NULL_TREE, NULL_TREE);
6205   if (OMP_PARALLEL_COMBINED (expr))
6206     gimple_omp_set_subcode (g, GF_OMP_PARALLEL_COMBINED);
6207   gimplify_seq_add_stmt (pre_p, g);
6208   *expr_p = NULL_TREE;
6209 }
6210
6211 /* Gimplify the contents of an OMP_TASK statement.  This involves
6212    gimplification of the body, as well as scanning the body for used
6213    variables.  We need to do this scan now, because variable-sized
6214    decls will be decomposed during gimplification.  */
6215
6216 static void
6217 gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
6218 {
6219   tree expr = *expr_p;
6220   gimple g;
6221   gimple_seq body = NULL;
6222   struct gimplify_ctx gctx;
6223
6224   gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p,
6225                              find_omp_clause (OMP_TASK_CLAUSES (expr),
6226                                               OMP_CLAUSE_UNTIED)
6227                              ? ORT_UNTIED_TASK : ORT_TASK);
6228
6229   push_gimplify_context (&gctx);
6230
6231   g = gimplify_and_return_first (OMP_TASK_BODY (expr), &body);
6232   if (gimple_code (g) == GIMPLE_BIND)
6233     pop_gimplify_context (g);
6234   else
6235     pop_gimplify_context (NULL);
6236
6237   gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
6238
6239   g = gimple_build_omp_task (body,
6240                              OMP_TASK_CLAUSES (expr),
6241                              NULL_TREE, NULL_TREE,
6242                              NULL_TREE, NULL_TREE, NULL_TREE);
6243   gimplify_seq_add_stmt (pre_p, g);
6244   *expr_p = NULL_TREE;
6245 }
6246
6247 /* Gimplify the gross structure of an OMP_FOR statement.  */
6248
6249 static enum gimplify_status
6250 gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
6251 {
6252   tree for_stmt, decl, var, t;
6253   enum gimplify_status ret = GS_ALL_DONE;
6254   enum gimplify_status tret;
6255   gimple gfor;
6256   gimple_seq for_body, for_pre_body;
6257   int i;
6258
6259   for_stmt = *expr_p;
6260
6261   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
6262                              ORT_WORKSHARE);
6263
6264   /* Handle OMP_FOR_INIT.  */
6265   for_pre_body = NULL;
6266   gimplify_and_add (OMP_FOR_PRE_BODY (for_stmt), &for_pre_body);
6267   OMP_FOR_PRE_BODY (for_stmt) = NULL_TREE;
6268
6269   for_body = gimple_seq_alloc ();
6270   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6271               == TREE_VEC_LENGTH (OMP_FOR_COND (for_stmt)));
6272   gcc_assert (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
6273               == TREE_VEC_LENGTH (OMP_FOR_INCR (for_stmt)));
6274   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6275     {
6276       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6277       gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6278       decl = TREE_OPERAND (t, 0);
6279       gcc_assert (DECL_P (decl));
6280       gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl))
6281                   || POINTER_TYPE_P (TREE_TYPE (decl)));
6282
6283       /* Make sure the iteration variable is private.  */
6284       if (omp_is_private (gimplify_omp_ctxp, decl))
6285         omp_notice_variable (gimplify_omp_ctxp, decl, true);
6286       else
6287         omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
6288
6289       /* If DECL is not a gimple register, create a temporary variable to act
6290          as an iteration counter.  This is valid, since DECL cannot be
6291          modified in the body of the loop.  */
6292       if (!is_gimple_reg (decl))
6293         {
6294           var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
6295           TREE_OPERAND (t, 0) = var;
6296
6297           gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
6298
6299           omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
6300         }
6301       else
6302         var = decl;
6303
6304       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6305                             is_gimple_val, fb_rvalue);
6306       ret = MIN (ret, tret);
6307       if (ret == GS_ERROR)
6308         return ret;
6309
6310       /* Handle OMP_FOR_COND.  */
6311       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6312       gcc_assert (COMPARISON_CLASS_P (t));
6313       gcc_assert (TREE_OPERAND (t, 0) == decl);
6314
6315       tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6316                             is_gimple_val, fb_rvalue);
6317       ret = MIN (ret, tret);
6318
6319       /* Handle OMP_FOR_INCR.  */
6320       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6321       switch (TREE_CODE (t))
6322         {
6323         case PREINCREMENT_EXPR:
6324         case POSTINCREMENT_EXPR:
6325           t = build_int_cst (TREE_TYPE (decl), 1);
6326           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6327           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6328           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6329           break;
6330
6331         case PREDECREMENT_EXPR:
6332         case POSTDECREMENT_EXPR:
6333           t = build_int_cst (TREE_TYPE (decl), -1);
6334           t = build2 (PLUS_EXPR, TREE_TYPE (decl), var, t);
6335           t = build2 (MODIFY_EXPR, TREE_TYPE (var), var, t);
6336           TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i) = t;
6337           break;
6338
6339         case MODIFY_EXPR:
6340           gcc_assert (TREE_OPERAND (t, 0) == decl);
6341           TREE_OPERAND (t, 0) = var;
6342
6343           t = TREE_OPERAND (t, 1);
6344           switch (TREE_CODE (t))
6345             {
6346             case PLUS_EXPR:
6347               if (TREE_OPERAND (t, 1) == decl)
6348                 {
6349                   TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
6350                   TREE_OPERAND (t, 0) = var;
6351                   break;
6352                 }
6353
6354               /* Fallthru.  */
6355             case MINUS_EXPR:
6356             case POINTER_PLUS_EXPR:
6357               gcc_assert (TREE_OPERAND (t, 0) == decl);
6358               TREE_OPERAND (t, 0) = var;
6359               break;
6360             default:
6361               gcc_unreachable ();
6362             }
6363
6364           tret = gimplify_expr (&TREE_OPERAND (t, 1), &for_pre_body, NULL,
6365                                 is_gimple_val, fb_rvalue);
6366           ret = MIN (ret, tret);
6367           break;
6368
6369         default:
6370           gcc_unreachable ();
6371         }
6372
6373       if (var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
6374         {
6375           tree c;
6376           for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
6377             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
6378                 && OMP_CLAUSE_DECL (c) == decl
6379                 && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
6380               {
6381                 t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6382                 gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
6383                 gcc_assert (TREE_OPERAND (t, 0) == var);
6384                 t = TREE_OPERAND (t, 1);
6385                 gcc_assert (TREE_CODE (t) == PLUS_EXPR
6386                             || TREE_CODE (t) == MINUS_EXPR
6387                             || TREE_CODE (t) == POINTER_PLUS_EXPR);
6388                 gcc_assert (TREE_OPERAND (t, 0) == var);
6389                 t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
6390                             TREE_OPERAND (t, 1));
6391                 gimplify_assign (decl, t,
6392                                  &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
6393             }
6394         }
6395     }
6396
6397   gimplify_and_add (OMP_FOR_BODY (for_stmt), &for_body);
6398
6399   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
6400
6401   gfor = gimple_build_omp_for (for_body, OMP_FOR_CLAUSES (for_stmt),
6402                                TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)),
6403                                for_pre_body);
6404
6405   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)); i++)
6406     {
6407       t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
6408       gimple_omp_for_set_index (gfor, i, TREE_OPERAND (t, 0));
6409       gimple_omp_for_set_initial (gfor, i, TREE_OPERAND (t, 1));
6410       t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
6411       gimple_omp_for_set_cond (gfor, i, TREE_CODE (t));
6412       gimple_omp_for_set_final (gfor, i, TREE_OPERAND (t, 1));
6413       t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
6414       gimple_omp_for_set_incr (gfor, i, TREE_OPERAND (t, 1));
6415     }
6416
6417   gimplify_seq_add_stmt (pre_p, gfor);
6418   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
6419 }
6420
6421 /* Gimplify the gross structure of other OpenMP worksharing constructs.
6422    In particular, OMP_SECTIONS and OMP_SINGLE.  */
6423
6424 static void
6425 gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
6426 {
6427   tree expr = *expr_p;
6428   gimple stmt;
6429   gimple_seq body = NULL;
6430
6431   gimplify_scan_omp_clauses (&OMP_CLAUSES (expr), pre_p, ORT_WORKSHARE);
6432   gimplify_and_add (OMP_BODY (expr), &body);
6433   gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
6434
6435   if (TREE_CODE (expr) == OMP_SECTIONS)
6436     stmt = gimple_build_omp_sections (body, OMP_CLAUSES (expr));
6437   else if (TREE_CODE (expr) == OMP_SINGLE)
6438     stmt = gimple_build_omp_single (body, OMP_CLAUSES (expr));
6439   else
6440     gcc_unreachable ();
6441
6442   gimplify_seq_add_stmt (pre_p, stmt);
6443 }
6444
6445 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
6446    stabilized the lhs of the atomic operation as *ADDR.  Return true if
6447    EXPR is this stabilized form.  */
6448
6449 static bool
6450 goa_lhs_expr_p (tree expr, tree addr)
6451 {
6452   /* Also include casts to other type variants.  The C front end is fond
6453      of adding these for e.g. volatile variables.  This is like
6454      STRIP_TYPE_NOPS but includes the main variant lookup.  */
6455   STRIP_USELESS_TYPE_CONVERSION (expr);
6456
6457   if (TREE_CODE (expr) == INDIRECT_REF)
6458     {
6459       expr = TREE_OPERAND (expr, 0);
6460       while (expr != addr
6461              && (CONVERT_EXPR_P (expr)
6462                  || TREE_CODE (expr) == NON_LVALUE_EXPR)
6463              && TREE_CODE (expr) == TREE_CODE (addr)
6464              && types_compatible_p (TREE_TYPE (expr), TREE_TYPE (addr)))
6465         {
6466           expr = TREE_OPERAND (expr, 0);
6467           addr = TREE_OPERAND (addr, 0);
6468         }
6469       if (expr == addr)
6470         return true;
6471       return (TREE_CODE (addr) == ADDR_EXPR
6472               && TREE_CODE (expr) == ADDR_EXPR
6473               && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0));
6474     }
6475   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
6476     return true;
6477   return false;
6478 }
6479
6480 /* Walk *EXPR_P and replace appearances of *LHS_ADDR with LHS_VAR.  If an
6481    expression does not involve the lhs, evaluate it into a temporary.
6482    Return 1 if the lhs appeared as a subexpression, 0 if it did not,
6483    or -1 if an error was encountered.  */
6484
6485 static int
6486 goa_stabilize_expr (tree *expr_p, gimple_seq *pre_p, tree lhs_addr,
6487                     tree lhs_var)
6488 {
6489   tree expr = *expr_p;
6490   int saw_lhs;
6491
6492   if (goa_lhs_expr_p (expr, lhs_addr))
6493     {
6494       *expr_p = lhs_var;
6495       return 1;
6496     }
6497   if (is_gimple_val (expr))
6498     return 0;
6499
6500   saw_lhs = 0;
6501   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
6502     {
6503     case tcc_binary:
6504     case tcc_comparison:
6505       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p, lhs_addr,
6506                                      lhs_var);
6507     case tcc_unary:
6508       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p, lhs_addr,
6509                                      lhs_var);
6510       break;
6511     case tcc_expression:
6512       switch (TREE_CODE (expr))
6513         {
6514         case TRUTH_ANDIF_EXPR:
6515         case TRUTH_ORIF_EXPR:
6516         case TRUTH_AND_EXPR:
6517         case TRUTH_OR_EXPR:
6518         case TRUTH_XOR_EXPR:
6519           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
6520                                          lhs_addr, lhs_var);
6521         case TRUTH_NOT_EXPR:
6522           saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
6523                                          lhs_addr, lhs_var);
6524           break;
6525         case COMPOUND_EXPR:
6526           /* Break out any preevaluations from cp_build_modify_expr.  */
6527           for (; TREE_CODE (expr) == COMPOUND_EXPR;
6528                expr = TREE_OPERAND (expr, 1))
6529             gimplify_stmt (&TREE_OPERAND (expr, 0), pre_p);
6530           *expr_p = expr;
6531           return goa_stabilize_expr (expr_p, pre_p, lhs_addr, lhs_var);
6532         default:
6533           break;
6534         }
6535       break;
6536     default:
6537       break;
6538     }
6539
6540   if (saw_lhs == 0)
6541     {
6542       enum gimplify_status gs;
6543       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
6544       if (gs != GS_ALL_DONE)
6545         saw_lhs = -1;
6546     }
6547
6548   return saw_lhs;
6549 }
6550
6551 /* Gimplify an OMP_ATOMIC statement.  */
6552
6553 static enum gimplify_status
6554 gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
6555 {
6556   tree addr = TREE_OPERAND (*expr_p, 0);
6557   tree rhs = TREE_CODE (*expr_p) == OMP_ATOMIC_READ
6558              ? NULL : TREE_OPERAND (*expr_p, 1);
6559   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
6560   tree tmp_load;
6561   gimple loadstmt, storestmt;
6562
6563   tmp_load = create_tmp_reg (type, NULL);
6564   if (rhs && goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
6565     return GS_ERROR;
6566
6567   if (gimplify_expr (&addr, pre_p, NULL, is_gimple_val, fb_rvalue)
6568       != GS_ALL_DONE)
6569     return GS_ERROR;
6570
6571   loadstmt = gimple_build_omp_atomic_load (tmp_load, addr);
6572   gimplify_seq_add_stmt (pre_p, loadstmt);
6573   if (rhs && gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue)
6574       != GS_ALL_DONE)
6575     return GS_ERROR;
6576
6577   if (TREE_CODE (*expr_p) == OMP_ATOMIC_READ)
6578     rhs = tmp_load;
6579   storestmt = gimple_build_omp_atomic_store (rhs);
6580   gimplify_seq_add_stmt (pre_p, storestmt);
6581   switch (TREE_CODE (*expr_p))
6582     {
6583     case OMP_ATOMIC_READ:
6584     case OMP_ATOMIC_CAPTURE_OLD:
6585       *expr_p = tmp_load;
6586       gimple_omp_atomic_set_need_value (loadstmt);
6587       break;
6588     case OMP_ATOMIC_CAPTURE_NEW:
6589       *expr_p = rhs;
6590       gimple_omp_atomic_set_need_value (storestmt);
6591       break;
6592     default:
6593       *expr_p = NULL;
6594       break;
6595     }
6596
6597    return GS_ALL_DONE;
6598 }
6599
6600 /* Gimplify a TRANSACTION_EXPR.  This involves gimplification of the
6601    body, and adding some EH bits.  */
6602
6603 static enum gimplify_status
6604 gimplify_transaction (tree *expr_p, gimple_seq *pre_p)
6605 {
6606   tree expr = *expr_p, temp, tbody = TRANSACTION_EXPR_BODY (expr);
6607   gimple g;
6608   gimple_seq body = NULL;
6609   struct gimplify_ctx gctx;
6610   int subcode = 0;
6611
6612   /* Wrap the transaction body in a BIND_EXPR so we have a context
6613      where to put decls for OpenMP.  */
6614   if (TREE_CODE (tbody) != BIND_EXPR)
6615     {
6616       tree bind = build3 (BIND_EXPR, void_type_node, NULL, tbody, NULL);
6617       TREE_SIDE_EFFECTS (bind) = 1;
6618       SET_EXPR_LOCATION (bind, EXPR_LOCATION (tbody));
6619       TRANSACTION_EXPR_BODY (expr) = bind;
6620     }
6621
6622   push_gimplify_context (&gctx);
6623   temp = voidify_wrapper_expr (*expr_p, NULL);
6624
6625   g = gimplify_and_return_first (TRANSACTION_EXPR_BODY (expr), &body);
6626   pop_gimplify_context (g);
6627
6628   g = gimple_build_transaction (body, NULL);
6629   if (TRANSACTION_EXPR_OUTER (expr))
6630     subcode = GTMA_IS_OUTER;
6631   else if (TRANSACTION_EXPR_RELAXED (expr))
6632     subcode = GTMA_IS_RELAXED;
6633   gimple_transaction_set_subcode (g, subcode);
6634
6635   gimplify_seq_add_stmt (pre_p, g);
6636
6637   if (temp)
6638     {
6639       *expr_p = temp;
6640       return GS_OK;
6641     }
6642
6643   *expr_p = NULL_TREE;
6644   return GS_ALL_DONE;
6645 }
6646
6647 /* Convert the GENERIC expression tree *EXPR_P to GIMPLE.  If the
6648    expression produces a value to be used as an operand inside a GIMPLE
6649    statement, the value will be stored back in *EXPR_P.  This value will
6650    be a tree of class tcc_declaration, tcc_constant, tcc_reference or
6651    an SSA_NAME.  The corresponding sequence of GIMPLE statements is
6652    emitted in PRE_P and POST_P.
6653
6654    Additionally, this process may overwrite parts of the input
6655    expression during gimplification.  Ideally, it should be
6656    possible to do non-destructive gimplification.
6657
6658    EXPR_P points to the GENERIC expression to convert to GIMPLE.  If
6659       the expression needs to evaluate to a value to be used as
6660       an operand in a GIMPLE statement, this value will be stored in
6661       *EXPR_P on exit.  This happens when the caller specifies one
6662       of fb_lvalue or fb_rvalue fallback flags.
6663
6664    PRE_P will contain the sequence of GIMPLE statements corresponding
6665        to the evaluation of EXPR and all the side-effects that must
6666        be executed before the main expression.  On exit, the last
6667        statement of PRE_P is the core statement being gimplified.  For
6668        instance, when gimplifying 'if (++a)' the last statement in
6669        PRE_P will be 'if (t.1)' where t.1 is the result of
6670        pre-incrementing 'a'.
6671
6672    POST_P will contain the sequence of GIMPLE statements corresponding
6673        to the evaluation of all the side-effects that must be executed
6674        after the main expression.  If this is NULL, the post
6675        side-effects are stored at the end of PRE_P.
6676
6677        The reason why the output is split in two is to handle post
6678        side-effects explicitly.  In some cases, an expression may have
6679        inner and outer post side-effects which need to be emitted in
6680        an order different from the one given by the recursive
6681        traversal.  For instance, for the expression (*p--)++ the post
6682        side-effects of '--' must actually occur *after* the post
6683        side-effects of '++'.  However, gimplification will first visit
6684        the inner expression, so if a separate POST sequence was not
6685        used, the resulting sequence would be:
6686
6687             1   t.1 = *p
6688             2   p = p - 1
6689             3   t.2 = t.1 + 1
6690             4   *p = t.2
6691
6692        However, the post-decrement operation in line #2 must not be
6693        evaluated until after the store to *p at line #4, so the
6694        correct sequence should be:
6695
6696             1   t.1 = *p
6697             2   t.2 = t.1 + 1
6698             3   *p = t.2
6699             4   p = p - 1
6700
6701        So, by specifying a separate post queue, it is possible
6702        to emit the post side-effects in the correct order.
6703        If POST_P is NULL, an internal queue will be used.  Before
6704        returning to the caller, the sequence POST_P is appended to
6705        the main output sequence PRE_P.
6706
6707    GIMPLE_TEST_F points to a function that takes a tree T and
6708        returns nonzero if T is in the GIMPLE form requested by the
6709        caller.  The GIMPLE predicates are in gimple.c.
6710
6711    FALLBACK tells the function what sort of a temporary we want if
6712        gimplification cannot produce an expression that complies with
6713        GIMPLE_TEST_F.
6714
6715        fb_none means that no temporary should be generated
6716        fb_rvalue means that an rvalue is OK to generate
6717        fb_lvalue means that an lvalue is OK to generate
6718        fb_either means that either is OK, but an lvalue is preferable.
6719        fb_mayfail means that gimplification may fail (in which case
6720        GS_ERROR will be returned)
6721
6722    The return value is either GS_ERROR or GS_ALL_DONE, since this
6723    function iterates until EXPR is completely gimplified or an error
6724    occurs.  */
6725
6726 enum gimplify_status
6727 gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
6728                bool (*gimple_test_f) (tree), fallback_t fallback)
6729 {
6730   tree tmp;
6731   gimple_seq internal_pre = NULL;
6732   gimple_seq internal_post = NULL;
6733   tree save_expr;
6734   bool is_statement;
6735   location_t saved_location;
6736   enum gimplify_status ret;
6737   gimple_stmt_iterator pre_last_gsi, post_last_gsi;
6738
6739   save_expr = *expr_p;
6740   if (save_expr == NULL_TREE)
6741     return GS_ALL_DONE;
6742
6743   /* If we are gimplifying a top-level statement, PRE_P must be valid.  */
6744   is_statement = gimple_test_f == is_gimple_stmt;
6745   if (is_statement)
6746     gcc_assert (pre_p);
6747
6748   /* Consistency checks.  */
6749   if (gimple_test_f == is_gimple_reg)
6750     gcc_assert (fallback & (fb_rvalue | fb_lvalue));
6751   else if (gimple_test_f == is_gimple_val
6752            || gimple_test_f == is_gimple_call_addr
6753            || gimple_test_f == is_gimple_condexpr
6754            || gimple_test_f == is_gimple_mem_rhs
6755            || gimple_test_f == is_gimple_mem_rhs_or_call
6756            || gimple_test_f == is_gimple_reg_rhs
6757            || gimple_test_f == is_gimple_reg_rhs_or_call
6758            || gimple_test_f == is_gimple_asm_val
6759            || gimple_test_f == is_gimple_mem_ref_addr)
6760     gcc_assert (fallback & fb_rvalue);
6761   else if (gimple_test_f == is_gimple_min_lval
6762            || gimple_test_f == is_gimple_lvalue)
6763     gcc_assert (fallback & fb_lvalue);
6764   else if (gimple_test_f == is_gimple_addressable)
6765     gcc_assert (fallback & fb_either);
6766   else if (gimple_test_f == is_gimple_stmt)
6767     gcc_assert (fallback == fb_none);
6768   else
6769     {
6770       /* We should have recognized the GIMPLE_TEST_F predicate to
6771          know what kind of fallback to use in case a temporary is
6772          needed to hold the value or address of *EXPR_P.  */
6773       gcc_unreachable ();
6774     }
6775
6776   /* We used to check the predicate here and return immediately if it
6777      succeeds.  This is wrong; the design is for gimplification to be
6778      idempotent, and for the predicates to only test for valid forms, not
6779      whether they are fully simplified.  */
6780   if (pre_p == NULL)
6781     pre_p = &internal_pre;
6782
6783   if (post_p == NULL)
6784     post_p = &internal_post;
6785
6786   /* Remember the last statements added to PRE_P and POST_P.  Every
6787      new statement added by the gimplification helpers needs to be
6788      annotated with location information.  To centralize the
6789      responsibility, we remember the last statement that had been
6790      added to both queues before gimplifying *EXPR_P.  If
6791      gimplification produces new statements in PRE_P and POST_P, those
6792      statements will be annotated with the same location information
6793      as *EXPR_P.  */
6794   pre_last_gsi = gsi_last (*pre_p);
6795   post_last_gsi = gsi_last (*post_p);
6796
6797   saved_location = input_location;
6798   if (save_expr != error_mark_node
6799       && EXPR_HAS_LOCATION (*expr_p))
6800     input_location = EXPR_LOCATION (*expr_p);
6801
6802   /* Loop over the specific gimplifiers until the toplevel node
6803      remains the same.  */
6804   do
6805     {
6806       /* Strip away as many useless type conversions as possible
6807          at the toplevel.  */
6808       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
6809
6810       /* Remember the expr.  */
6811       save_expr = *expr_p;
6812
6813       /* Die, die, die, my darling.  */
6814       if (save_expr == error_mark_node
6815           || (TREE_TYPE (save_expr)
6816               && TREE_TYPE (save_expr) == error_mark_node))
6817         {
6818           ret = GS_ERROR;
6819           break;
6820         }
6821
6822       /* Do any language-specific gimplification.  */
6823       ret = ((enum gimplify_status)
6824              lang_hooks.gimplify_expr (expr_p, pre_p, post_p));
6825       if (ret == GS_OK)
6826         {
6827           if (*expr_p == NULL_TREE)
6828             break;
6829           if (*expr_p != save_expr)
6830             continue;
6831         }
6832       else if (ret != GS_UNHANDLED)
6833         break;
6834
6835       /* Make sure that all the cases set 'ret' appropriately.  */
6836       ret = GS_UNHANDLED;
6837       switch (TREE_CODE (*expr_p))
6838         {
6839           /* First deal with the special cases.  */
6840
6841         case POSTINCREMENT_EXPR:
6842         case POSTDECREMENT_EXPR:
6843         case PREINCREMENT_EXPR:
6844         case PREDECREMENT_EXPR:
6845           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
6846                                         fallback != fb_none);
6847           break;
6848
6849         case ARRAY_REF:
6850         case ARRAY_RANGE_REF:
6851         case REALPART_EXPR:
6852         case IMAGPART_EXPR:
6853         case COMPONENT_REF:
6854         case VIEW_CONVERT_EXPR:
6855           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
6856                                         fallback ? fallback : fb_rvalue);
6857           break;
6858
6859         case COND_EXPR:
6860           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
6861
6862           /* C99 code may assign to an array in a structure value of a
6863              conditional expression, and this has undefined behavior
6864              only on execution, so create a temporary if an lvalue is
6865              required.  */
6866           if (fallback == fb_lvalue)
6867             {
6868               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6869               mark_addressable (*expr_p);
6870               ret = GS_OK;
6871             }
6872           break;
6873
6874         case CALL_EXPR:
6875           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
6876
6877           /* C99 code may assign to an array in a structure returned
6878              from a function, and this has undefined behavior only on
6879              execution, so create a temporary if an lvalue is
6880              required.  */
6881           if (fallback == fb_lvalue)
6882             {
6883               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6884               mark_addressable (*expr_p);
6885               ret = GS_OK;
6886             }
6887           break;
6888
6889         case TREE_LIST:
6890           gcc_unreachable ();
6891
6892         case COMPOUND_EXPR:
6893           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
6894           break;
6895
6896         case COMPOUND_LITERAL_EXPR:
6897           ret = gimplify_compound_literal_expr (expr_p, pre_p);
6898           break;
6899
6900         case MODIFY_EXPR:
6901         case INIT_EXPR:
6902           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
6903                                       fallback != fb_none);
6904           break;
6905
6906         case TRUTH_ANDIF_EXPR:
6907         case TRUTH_ORIF_EXPR:
6908           {
6909             /* Preserve the original type of the expression and the
6910                source location of the outer expression.  */
6911             tree org_type = TREE_TYPE (*expr_p);
6912             *expr_p = gimple_boolify (*expr_p);
6913             *expr_p = build3_loc (input_location, COND_EXPR,
6914                                   org_type, *expr_p,
6915                                   fold_convert_loc
6916                                     (input_location,
6917                                      org_type, boolean_true_node),
6918                                   fold_convert_loc
6919                                     (input_location,
6920                                      org_type, boolean_false_node));
6921             ret = GS_OK;
6922             break;
6923           }
6924
6925         case TRUTH_NOT_EXPR:
6926           {
6927             tree type = TREE_TYPE (*expr_p);
6928             /* The parsers are careful to generate TRUTH_NOT_EXPR
6929                only with operands that are always zero or one.
6930                We do not fold here but handle the only interesting case
6931                manually, as fold may re-introduce the TRUTH_NOT_EXPR.  */
6932             *expr_p = gimple_boolify (*expr_p);
6933             if (TYPE_PRECISION (TREE_TYPE (*expr_p)) == 1)
6934               *expr_p = build1_loc (input_location, BIT_NOT_EXPR,
6935                                     TREE_TYPE (*expr_p),
6936                                     TREE_OPERAND (*expr_p, 0));
6937             else
6938               *expr_p = build2_loc (input_location, BIT_XOR_EXPR,
6939                                     TREE_TYPE (*expr_p),
6940                                     TREE_OPERAND (*expr_p, 0),
6941                                     build_int_cst (TREE_TYPE (*expr_p), 1));
6942             if (!useless_type_conversion_p (type, TREE_TYPE (*expr_p)))
6943               *expr_p = fold_convert_loc (input_location, type, *expr_p);
6944             ret = GS_OK;
6945             break;
6946           }
6947
6948         case ADDR_EXPR:
6949           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
6950           break;
6951
6952         case VA_ARG_EXPR:
6953           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
6954           break;
6955
6956         CASE_CONVERT:
6957           if (IS_EMPTY_STMT (*expr_p))
6958             {
6959               ret = GS_ALL_DONE;
6960               break;
6961             }
6962
6963           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
6964               || fallback == fb_none)
6965             {
6966               /* Just strip a conversion to void (or in void context) and
6967                  try again.  */
6968               *expr_p = TREE_OPERAND (*expr_p, 0);
6969               ret = GS_OK;
6970               break;
6971             }
6972
6973           ret = gimplify_conversion (expr_p);
6974           if (ret == GS_ERROR)
6975             break;
6976           if (*expr_p != save_expr)
6977             break;
6978           /* FALLTHRU */
6979
6980         case FIX_TRUNC_EXPR:
6981           /* unary_expr: ... | '(' cast ')' val | ...  */
6982           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6983                                is_gimple_val, fb_rvalue);
6984           recalculate_side_effects (*expr_p);
6985           break;
6986
6987         case INDIRECT_REF:
6988           {
6989             bool volatilep = TREE_THIS_VOLATILE (*expr_p);
6990             bool notrap = TREE_THIS_NOTRAP (*expr_p);
6991             tree saved_ptr_type = TREE_TYPE (TREE_OPERAND (*expr_p, 0));
6992
6993             *expr_p = fold_indirect_ref_loc (input_location, *expr_p);
6994             if (*expr_p != save_expr)
6995               {
6996                 ret = GS_OK;
6997                 break;
6998               }
6999
7000             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7001                                  is_gimple_reg, fb_rvalue);
7002             if (ret == GS_ERROR)
7003               break;
7004
7005             recalculate_side_effects (*expr_p);
7006             *expr_p = fold_build2_loc (input_location, MEM_REF,
7007                                        TREE_TYPE (*expr_p),
7008                                        TREE_OPERAND (*expr_p, 0),
7009                                        build_int_cst (saved_ptr_type, 0));
7010             TREE_THIS_VOLATILE (*expr_p) = volatilep;
7011             TREE_THIS_NOTRAP (*expr_p) = notrap;
7012             ret = GS_OK;
7013             break;
7014           }
7015
7016         /* We arrive here through the various re-gimplifcation paths.  */
7017         case MEM_REF:
7018           /* First try re-folding the whole thing.  */
7019           tmp = fold_binary (MEM_REF, TREE_TYPE (*expr_p),
7020                              TREE_OPERAND (*expr_p, 0),
7021                              TREE_OPERAND (*expr_p, 1));
7022           if (tmp)
7023             {
7024               *expr_p = tmp;
7025               recalculate_side_effects (*expr_p);
7026               ret = GS_OK;
7027               break;
7028             }
7029           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7030                                is_gimple_mem_ref_addr, fb_rvalue);
7031           if (ret == GS_ERROR)
7032             break;
7033           recalculate_side_effects (*expr_p);
7034           ret = GS_ALL_DONE;
7035           break;
7036
7037           /* Constants need not be gimplified.  */
7038         case INTEGER_CST:
7039         case REAL_CST:
7040         case FIXED_CST:
7041         case STRING_CST:
7042         case COMPLEX_CST:
7043         case VECTOR_CST:
7044           ret = GS_ALL_DONE;
7045           break;
7046
7047         case CONST_DECL:
7048           /* If we require an lvalue, such as for ADDR_EXPR, retain the
7049              CONST_DECL node.  Otherwise the decl is replaceable by its
7050              value.  */
7051           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
7052           if (fallback & fb_lvalue)
7053             ret = GS_ALL_DONE;
7054           else
7055             {
7056               *expr_p = DECL_INITIAL (*expr_p);
7057               ret = GS_OK;
7058             }
7059           break;
7060
7061         case DECL_EXPR:
7062           ret = gimplify_decl_expr (expr_p, pre_p);
7063           break;
7064
7065         case BIND_EXPR:
7066           ret = gimplify_bind_expr (expr_p, pre_p);
7067           break;
7068
7069         case LOOP_EXPR:
7070           ret = gimplify_loop_expr (expr_p, pre_p);
7071           break;
7072
7073         case SWITCH_EXPR:
7074           ret = gimplify_switch_expr (expr_p, pre_p);
7075           break;
7076
7077         case EXIT_EXPR:
7078           ret = gimplify_exit_expr (expr_p);
7079           break;
7080
7081         case GOTO_EXPR:
7082           /* If the target is not LABEL, then it is a computed jump
7083              and the target needs to be gimplified.  */
7084           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
7085             {
7086               ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
7087                                    NULL, is_gimple_val, fb_rvalue);
7088               if (ret == GS_ERROR)
7089                 break;
7090             }
7091           gimplify_seq_add_stmt (pre_p,
7092                           gimple_build_goto (GOTO_DESTINATION (*expr_p)));
7093           ret = GS_ALL_DONE;
7094           break;
7095
7096         case PREDICT_EXPR:
7097           gimplify_seq_add_stmt (pre_p,
7098                         gimple_build_predict (PREDICT_EXPR_PREDICTOR (*expr_p),
7099                                               PREDICT_EXPR_OUTCOME (*expr_p)));
7100           ret = GS_ALL_DONE;
7101           break;
7102
7103         case LABEL_EXPR:
7104           ret = GS_ALL_DONE;
7105           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
7106                       == current_function_decl);
7107           gimplify_seq_add_stmt (pre_p,
7108                           gimple_build_label (LABEL_EXPR_LABEL (*expr_p)));
7109           break;
7110
7111         case CASE_LABEL_EXPR:
7112           ret = gimplify_case_label_expr (expr_p, pre_p);
7113           break;
7114
7115         case RETURN_EXPR:
7116           ret = gimplify_return_expr (*expr_p, pre_p);
7117           break;
7118
7119         case CONSTRUCTOR:
7120           /* Don't reduce this in place; let gimplify_init_constructor work its
7121              magic.  Buf if we're just elaborating this for side effects, just
7122              gimplify any element that has side-effects.  */
7123           if (fallback == fb_none)
7124             {
7125               unsigned HOST_WIDE_INT ix;
7126               tree val;
7127               tree temp = NULL_TREE;
7128               FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (*expr_p), ix, val)
7129                 if (TREE_SIDE_EFFECTS (val))
7130                   append_to_statement_list (val, &temp);
7131
7132               *expr_p = temp;
7133               ret = temp ? GS_OK : GS_ALL_DONE;
7134             }
7135           /* C99 code may assign to an array in a constructed
7136              structure or union, and this has undefined behavior only
7137              on execution, so create a temporary if an lvalue is
7138              required.  */
7139           else if (fallback == fb_lvalue)
7140             {
7141               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7142               mark_addressable (*expr_p);
7143               ret = GS_OK;
7144             }
7145           else
7146             ret = GS_ALL_DONE;
7147           break;
7148
7149           /* The following are special cases that are not handled by the
7150              original GIMPLE grammar.  */
7151
7152           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
7153              eliminated.  */
7154         case SAVE_EXPR:
7155           ret = gimplify_save_expr (expr_p, pre_p, post_p);
7156           break;
7157
7158         case BIT_FIELD_REF:
7159           {
7160             enum gimplify_status r0, r1, r2;
7161
7162             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7163                                 post_p, is_gimple_lvalue, fb_either);
7164             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7165                                 post_p, is_gimple_val, fb_rvalue);
7166             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
7167                                 post_p, is_gimple_val, fb_rvalue);
7168             recalculate_side_effects (*expr_p);
7169
7170             ret = MIN (r0, MIN (r1, r2));
7171           }
7172           break;
7173
7174         case TARGET_MEM_REF:
7175           {
7176             enum gimplify_status r0 = GS_ALL_DONE, r1 = GS_ALL_DONE;
7177
7178             if (TMR_BASE (*expr_p))
7179               r0 = gimplify_expr (&TMR_BASE (*expr_p), pre_p,
7180                                   post_p, is_gimple_mem_ref_addr, fb_either);
7181             if (TMR_INDEX (*expr_p))
7182               r1 = gimplify_expr (&TMR_INDEX (*expr_p), pre_p,
7183                                   post_p, is_gimple_val, fb_rvalue);
7184             if (TMR_INDEX2 (*expr_p))
7185               r1 = gimplify_expr (&TMR_INDEX2 (*expr_p), pre_p,
7186                                   post_p, is_gimple_val, fb_rvalue);
7187             /* TMR_STEP and TMR_OFFSET are always integer constants.  */
7188             ret = MIN (r0, r1);
7189           }
7190           break;
7191
7192         case NON_LVALUE_EXPR:
7193           /* This should have been stripped above.  */
7194           gcc_unreachable ();
7195
7196         case ASM_EXPR:
7197           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
7198           break;
7199
7200         case TRY_FINALLY_EXPR:
7201         case TRY_CATCH_EXPR:
7202           {
7203             gimple_seq eval, cleanup;
7204             gimple try_;
7205
7206             eval = cleanup = NULL;
7207             gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
7208             gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
7209             /* Don't create bogus GIMPLE_TRY with empty cleanup.  */
7210             if (gimple_seq_empty_p (cleanup))
7211               {
7212                 gimple_seq_add_seq (pre_p, eval);
7213                 ret = GS_ALL_DONE;
7214                 break;
7215               }
7216             try_ = gimple_build_try (eval, cleanup,
7217                                      TREE_CODE (*expr_p) == TRY_FINALLY_EXPR
7218                                      ? GIMPLE_TRY_FINALLY
7219                                      : GIMPLE_TRY_CATCH);
7220             if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR)
7221               gimple_try_set_catch_is_cleanup (try_,
7222                                                TRY_CATCH_IS_CLEANUP (*expr_p));
7223             gimplify_seq_add_stmt (pre_p, try_);
7224             ret = GS_ALL_DONE;
7225             break;
7226           }
7227
7228         case CLEANUP_POINT_EXPR:
7229           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
7230           break;
7231
7232         case TARGET_EXPR:
7233           ret = gimplify_target_expr (expr_p, pre_p, post_p);
7234           break;
7235
7236         case CATCH_EXPR:
7237           {
7238             gimple c;
7239             gimple_seq handler = NULL;
7240             gimplify_and_add (CATCH_BODY (*expr_p), &handler);
7241             c = gimple_build_catch (CATCH_TYPES (*expr_p), handler);
7242             gimplify_seq_add_stmt (pre_p, c);
7243             ret = GS_ALL_DONE;
7244             break;
7245           }
7246
7247         case EH_FILTER_EXPR:
7248           {
7249             gimple ehf;
7250             gimple_seq failure = NULL;
7251
7252             gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure);
7253             ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure);
7254             gimple_set_no_warning (ehf, TREE_NO_WARNING (*expr_p));
7255             gimplify_seq_add_stmt (pre_p, ehf);
7256             ret = GS_ALL_DONE;
7257             break;
7258           }
7259
7260         case OBJ_TYPE_REF:
7261           {
7262             enum gimplify_status r0, r1;
7263             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p,
7264                                 post_p, is_gimple_val, fb_rvalue);
7265             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p,
7266                                 post_p, is_gimple_val, fb_rvalue);
7267             TREE_SIDE_EFFECTS (*expr_p) = 0;
7268             ret = MIN (r0, r1);
7269           }
7270           break;
7271
7272         case LABEL_DECL:
7273           /* We get here when taking the address of a label.  We mark
7274              the label as "forced"; meaning it can never be removed and
7275              it is a potential target for any computed goto.  */
7276           FORCED_LABEL (*expr_p) = 1;
7277           ret = GS_ALL_DONE;
7278           break;
7279
7280         case STATEMENT_LIST:
7281           ret = gimplify_statement_list (expr_p, pre_p);
7282           break;
7283
7284         case WITH_SIZE_EXPR:
7285           {
7286             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7287                            post_p == &internal_post ? NULL : post_p,
7288                            gimple_test_f, fallback);
7289             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7290                            is_gimple_val, fb_rvalue);
7291             ret = GS_ALL_DONE;
7292           }
7293           break;
7294
7295         case VAR_DECL:
7296         case PARM_DECL:
7297           ret = gimplify_var_or_parm_decl (expr_p);
7298           break;
7299
7300         case RESULT_DECL:
7301           /* When within an OpenMP context, notice uses of variables.  */
7302           if (gimplify_omp_ctxp)
7303             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
7304           ret = GS_ALL_DONE;
7305           break;
7306
7307         case SSA_NAME:
7308           /* Allow callbacks into the gimplifier during optimization.  */
7309           ret = GS_ALL_DONE;
7310           break;
7311
7312         case OMP_PARALLEL:
7313           gimplify_omp_parallel (expr_p, pre_p);
7314           ret = GS_ALL_DONE;
7315           break;
7316
7317         case OMP_TASK:
7318           gimplify_omp_task (expr_p, pre_p);
7319           ret = GS_ALL_DONE;
7320           break;
7321
7322         case OMP_FOR:
7323           ret = gimplify_omp_for (expr_p, pre_p);
7324           break;
7325
7326         case OMP_SECTIONS:
7327         case OMP_SINGLE:
7328           gimplify_omp_workshare (expr_p, pre_p);
7329           ret = GS_ALL_DONE;
7330           break;
7331
7332         case OMP_SECTION:
7333         case OMP_MASTER:
7334         case OMP_ORDERED:
7335         case OMP_CRITICAL:
7336           {
7337             gimple_seq body = NULL;
7338             gimple g;
7339
7340             gimplify_and_add (OMP_BODY (*expr_p), &body);
7341             switch (TREE_CODE (*expr_p))
7342               {
7343               case OMP_SECTION:
7344                 g = gimple_build_omp_section (body);
7345                 break;
7346               case OMP_MASTER:
7347                 g = gimple_build_omp_master (body);
7348                 break;
7349               case OMP_ORDERED:
7350                 g = gimple_build_omp_ordered (body);
7351                 break;
7352               case OMP_CRITICAL:
7353                 g = gimple_build_omp_critical (body,
7354                                                OMP_CRITICAL_NAME (*expr_p));
7355                 break;
7356               default:
7357                 gcc_unreachable ();
7358               }
7359             gimplify_seq_add_stmt (pre_p, g);
7360             ret = GS_ALL_DONE;
7361             break;
7362           }
7363
7364         case OMP_ATOMIC:
7365         case OMP_ATOMIC_READ:
7366         case OMP_ATOMIC_CAPTURE_OLD:
7367         case OMP_ATOMIC_CAPTURE_NEW:
7368           ret = gimplify_omp_atomic (expr_p, pre_p);
7369           break;
7370
7371         case TRANSACTION_EXPR:
7372           ret = gimplify_transaction (expr_p, pre_p);
7373           break;
7374
7375         case TRUTH_AND_EXPR:
7376         case TRUTH_OR_EXPR:
7377         case TRUTH_XOR_EXPR:
7378           {
7379             tree orig_type = TREE_TYPE (*expr_p);
7380             tree new_type, xop0, xop1;
7381             *expr_p = gimple_boolify (*expr_p);
7382             new_type = TREE_TYPE (*expr_p);
7383             if (!useless_type_conversion_p (orig_type, new_type))
7384               {
7385                 *expr_p = fold_convert_loc (input_location, orig_type, *expr_p);
7386                 ret = GS_OK;
7387                 break;
7388               }
7389
7390           /* Boolified binary truth expressions are semantically equivalent
7391              to bitwise binary expressions.  Canonicalize them to the
7392              bitwise variant.  */
7393             switch (TREE_CODE (*expr_p))
7394               {
7395               case TRUTH_AND_EXPR:
7396                 TREE_SET_CODE (*expr_p, BIT_AND_EXPR);
7397                 break;
7398               case TRUTH_OR_EXPR:
7399                 TREE_SET_CODE (*expr_p, BIT_IOR_EXPR);
7400                 break;
7401               case TRUTH_XOR_EXPR:
7402                 TREE_SET_CODE (*expr_p, BIT_XOR_EXPR);
7403                 break;
7404               default:
7405                 break;
7406               }
7407             /* Now make sure that operands have compatible type to
7408                expression's new_type.  */
7409             xop0 = TREE_OPERAND (*expr_p, 0);
7410             xop1 = TREE_OPERAND (*expr_p, 1);
7411             if (!useless_type_conversion_p (new_type, TREE_TYPE (xop0)))
7412               TREE_OPERAND (*expr_p, 0) = fold_convert_loc (input_location,
7413                                                             new_type,
7414                                                             xop0);
7415             if (!useless_type_conversion_p (new_type, TREE_TYPE (xop1)))
7416               TREE_OPERAND (*expr_p, 1) = fold_convert_loc (input_location,
7417                                                             new_type,
7418                                                             xop1);
7419             /* Continue classified as tcc_binary.  */
7420             goto expr_2;
7421           }
7422
7423         case FMA_EXPR:
7424         case VEC_PERM_EXPR:
7425           /* Classified as tcc_expression.  */
7426           goto expr_3;
7427
7428         case POINTER_PLUS_EXPR:
7429           {
7430             enum gimplify_status r0, r1;
7431             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7432                                 post_p, is_gimple_val, fb_rvalue);
7433             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7434                                 post_p, is_gimple_val, fb_rvalue);
7435             recalculate_side_effects (*expr_p);
7436             ret = MIN (r0, r1);
7437             /* Convert &X + CST to invariant &MEM[&X, CST].  Do this
7438                after gimplifying operands - this is similar to how
7439                it would be folding all gimplified stmts on creation
7440                to have them canonicalized, which is what we eventually
7441                should do anyway.  */
7442             if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
7443                 && is_gimple_min_invariant (TREE_OPERAND (*expr_p, 0)))
7444               {
7445                 *expr_p = build_fold_addr_expr_with_type_loc
7446                    (input_location,
7447                     fold_build2 (MEM_REF, TREE_TYPE (TREE_TYPE (*expr_p)),
7448                                  TREE_OPERAND (*expr_p, 0),
7449                                  fold_convert (ptr_type_node,
7450                                                TREE_OPERAND (*expr_p, 1))),
7451                     TREE_TYPE (*expr_p));
7452                 ret = MIN (ret, GS_OK);
7453               }
7454             break;
7455           }
7456
7457         default:
7458           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
7459             {
7460             case tcc_comparison:
7461               /* Handle comparison of objects of non scalar mode aggregates
7462                  with a call to memcmp.  It would be nice to only have to do
7463                  this for variable-sized objects, but then we'd have to allow
7464                  the same nest of reference nodes we allow for MODIFY_EXPR and
7465                  that's too complex.
7466
7467                  Compare scalar mode aggregates as scalar mode values.  Using
7468                  memcmp for them would be very inefficient at best, and is
7469                  plain wrong if bitfields are involved.  */
7470                 {
7471                   tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
7472
7473                   /* Vector comparisons need no boolification.  */
7474                   if (TREE_CODE (type) == VECTOR_TYPE)
7475                     goto expr_2;
7476                   else if (!AGGREGATE_TYPE_P (type))
7477                     {
7478                       tree org_type = TREE_TYPE (*expr_p);
7479                       *expr_p = gimple_boolify (*expr_p);
7480                       if (!useless_type_conversion_p (org_type,
7481                                                       TREE_TYPE (*expr_p)))
7482                         {
7483                           *expr_p = fold_convert_loc (input_location,
7484                                                       org_type, *expr_p);
7485                           ret = GS_OK;
7486                         }
7487                       else
7488                         goto expr_2;
7489                     }
7490                   else if (TYPE_MODE (type) != BLKmode)
7491                     ret = gimplify_scalar_mode_aggregate_compare (expr_p);
7492                   else
7493                     ret = gimplify_variable_sized_compare (expr_p);
7494
7495                   break;
7496                 }
7497
7498             /* If *EXPR_P does not need to be special-cased, handle it
7499                according to its class.  */
7500             case tcc_unary:
7501               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7502                                    post_p, is_gimple_val, fb_rvalue);
7503               break;
7504
7505             case tcc_binary:
7506             expr_2:
7507               {
7508                 enum gimplify_status r0, r1;
7509
7510                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7511                                     post_p, is_gimple_val, fb_rvalue);
7512                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7513                                     post_p, is_gimple_val, fb_rvalue);
7514
7515                 ret = MIN (r0, r1);
7516                 break;
7517               }
7518
7519             expr_3:
7520               {
7521                 enum gimplify_status r0, r1, r2;
7522
7523                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
7524                                     post_p, is_gimple_val, fb_rvalue);
7525                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
7526                                     post_p, is_gimple_val, fb_rvalue);
7527                 r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
7528                                     post_p, is_gimple_val, fb_rvalue);
7529
7530                 ret = MIN (MIN (r0, r1), r2);
7531                 break;
7532               }
7533
7534             case tcc_declaration:
7535             case tcc_constant:
7536               ret = GS_ALL_DONE;
7537               goto dont_recalculate;
7538
7539             default:
7540               gcc_unreachable ();
7541             }
7542
7543           recalculate_side_effects (*expr_p);
7544
7545         dont_recalculate:
7546           break;
7547         }
7548
7549       gcc_assert (*expr_p || ret != GS_OK);
7550     }
7551   while (ret == GS_OK);
7552
7553   /* If we encountered an error_mark somewhere nested inside, either
7554      stub out the statement or propagate the error back out.  */
7555   if (ret == GS_ERROR)
7556     {
7557       if (is_statement)
7558         *expr_p = NULL;
7559       goto out;
7560     }
7561
7562   /* This was only valid as a return value from the langhook, which
7563      we handled.  Make sure it doesn't escape from any other context.  */
7564   gcc_assert (ret != GS_UNHANDLED);
7565
7566   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
7567     {
7568       /* We aren't looking for a value, and we don't have a valid
7569          statement.  If it doesn't have side-effects, throw it away.  */
7570       if (!TREE_SIDE_EFFECTS (*expr_p))
7571         *expr_p = NULL;
7572       else if (!TREE_THIS_VOLATILE (*expr_p))
7573         {
7574           /* This is probably a _REF that contains something nested that
7575              has side effects.  Recurse through the operands to find it.  */
7576           enum tree_code code = TREE_CODE (*expr_p);
7577
7578           switch (code)
7579             {
7580             case COMPONENT_REF:
7581             case REALPART_EXPR:
7582             case IMAGPART_EXPR:
7583             case VIEW_CONVERT_EXPR:
7584               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7585                              gimple_test_f, fallback);
7586               break;
7587
7588             case ARRAY_REF:
7589             case ARRAY_RANGE_REF:
7590               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
7591                              gimple_test_f, fallback);
7592               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
7593                              gimple_test_f, fallback);
7594               break;
7595
7596             default:
7597                /* Anything else with side-effects must be converted to
7598                   a valid statement before we get here.  */
7599               gcc_unreachable ();
7600             }
7601
7602           *expr_p = NULL;
7603         }
7604       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
7605                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
7606         {
7607           /* Historically, the compiler has treated a bare reference
7608              to a non-BLKmode volatile lvalue as forcing a load.  */
7609           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
7610
7611           /* Normally, we do not want to create a temporary for a
7612              TREE_ADDRESSABLE type because such a type should not be
7613              copied by bitwise-assignment.  However, we make an
7614              exception here, as all we are doing here is ensuring that
7615              we read the bytes that make up the type.  We use
7616              create_tmp_var_raw because create_tmp_var will abort when
7617              given a TREE_ADDRESSABLE type.  */
7618           tree tmp = create_tmp_var_raw (type, "vol");
7619           gimple_add_tmp_var (tmp);
7620           gimplify_assign (tmp, *expr_p, pre_p);
7621           *expr_p = NULL;
7622         }
7623       else
7624         /* We can't do anything useful with a volatile reference to
7625            an incomplete type, so just throw it away.  Likewise for
7626            a BLKmode type, since any implicit inner load should
7627            already have been turned into an explicit one by the
7628            gimplification process.  */
7629         *expr_p = NULL;
7630     }
7631
7632   /* If we are gimplifying at the statement level, we're done.  Tack
7633      everything together and return.  */
7634   if (fallback == fb_none || is_statement)
7635     {
7636       /* Since *EXPR_P has been converted into a GIMPLE tuple, clear
7637          it out for GC to reclaim it.  */
7638       *expr_p = NULL_TREE;
7639
7640       if (!gimple_seq_empty_p (internal_pre)
7641           || !gimple_seq_empty_p (internal_post))
7642         {
7643           gimplify_seq_add_seq (&internal_pre, internal_post);
7644           gimplify_seq_add_seq (pre_p, internal_pre);
7645         }
7646
7647       /* The result of gimplifying *EXPR_P is going to be the last few
7648          statements in *PRE_P and *POST_P.  Add location information
7649          to all the statements that were added by the gimplification
7650          helpers.  */
7651       if (!gimple_seq_empty_p (*pre_p))
7652         annotate_all_with_location_after (*pre_p, pre_last_gsi, input_location);
7653
7654       if (!gimple_seq_empty_p (*post_p))
7655         annotate_all_with_location_after (*post_p, post_last_gsi,
7656                                           input_location);
7657
7658       goto out;
7659     }
7660
7661 #ifdef ENABLE_GIMPLE_CHECKING
7662   if (*expr_p)
7663     {
7664       enum tree_code code = TREE_CODE (*expr_p);
7665       /* These expressions should already be in gimple IR form.  */
7666       gcc_assert (code != MODIFY_EXPR
7667                   && code != ASM_EXPR
7668                   && code != BIND_EXPR
7669                   && code != CATCH_EXPR
7670                   && (code != COND_EXPR || gimplify_ctxp->allow_rhs_cond_expr)
7671                   && code != EH_FILTER_EXPR
7672                   && code != GOTO_EXPR
7673                   && code != LABEL_EXPR
7674                   && code != LOOP_EXPR
7675                   && code != SWITCH_EXPR
7676                   && code != TRY_FINALLY_EXPR
7677                   && code != OMP_CRITICAL
7678                   && code != OMP_FOR
7679                   && code != OMP_MASTER
7680                   && code != OMP_ORDERED
7681                   && code != OMP_PARALLEL
7682                   && code != OMP_SECTIONS
7683                   && code != OMP_SECTION
7684                   && code != OMP_SINGLE);
7685     }
7686 #endif
7687
7688   /* Otherwise we're gimplifying a subexpression, so the resulting
7689      value is interesting.  If it's a valid operand that matches
7690      GIMPLE_TEST_F, we're done. Unless we are handling some
7691      post-effects internally; if that's the case, we need to copy into
7692      a temporary before adding the post-effects to POST_P.  */
7693   if (gimple_seq_empty_p (internal_post) && (*gimple_test_f) (*expr_p))
7694     goto out;
7695
7696   /* Otherwise, we need to create a new temporary for the gimplified
7697      expression.  */
7698
7699   /* We can't return an lvalue if we have an internal postqueue.  The
7700      object the lvalue refers to would (probably) be modified by the
7701      postqueue; we need to copy the value out first, which means an
7702      rvalue.  */
7703   if ((fallback & fb_lvalue)
7704       && gimple_seq_empty_p (internal_post)
7705       && is_gimple_addressable (*expr_p))
7706     {
7707       /* An lvalue will do.  Take the address of the expression, store it
7708          in a temporary, and replace the expression with an INDIRECT_REF of
7709          that temporary.  */
7710       tmp = build_fold_addr_expr_loc (input_location, *expr_p);
7711       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
7712       *expr_p = build_simple_mem_ref (tmp);
7713     }
7714   else if ((fallback & fb_rvalue) && is_gimple_reg_rhs_or_call (*expr_p))
7715     {
7716       /* An rvalue will do.  Assign the gimplified expression into a
7717          new temporary TMP and replace the original expression with
7718          TMP.  First, make sure that the expression has a type so that
7719          it can be assigned into a temporary.  */
7720       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
7721
7722       if (!gimple_seq_empty_p (internal_post) || (fallback & fb_lvalue))
7723         /* The postqueue might change the value of the expression between
7724            the initialization and use of the temporary, so we can't use a
7725            formal temp.  FIXME do we care?  */
7726         {
7727           *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
7728           if (TREE_CODE (TREE_TYPE (*expr_p)) == COMPLEX_TYPE
7729               || TREE_CODE (TREE_TYPE (*expr_p)) == VECTOR_TYPE)
7730             DECL_GIMPLE_REG_P (*expr_p) = 1;
7731         }
7732       else
7733         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
7734     }
7735   else
7736     {
7737 #ifdef ENABLE_GIMPLE_CHECKING
7738       if (!(fallback & fb_mayfail))
7739         {
7740           fprintf (stderr, "gimplification failed:\n");
7741           print_generic_expr (stderr, *expr_p, 0);
7742           debug_tree (*expr_p);
7743           internal_error ("gimplification failed");
7744         }
7745 #endif
7746       gcc_assert (fallback & fb_mayfail);
7747
7748       /* If this is an asm statement, and the user asked for the
7749          impossible, don't die.  Fail and let gimplify_asm_expr
7750          issue an error.  */
7751       ret = GS_ERROR;
7752       goto out;
7753     }
7754
7755   /* Make sure the temporary matches our predicate.  */
7756   gcc_assert ((*gimple_test_f) (*expr_p));
7757
7758   if (!gimple_seq_empty_p (internal_post))
7759     {
7760       annotate_all_with_location (internal_post, input_location);
7761       gimplify_seq_add_seq (pre_p, internal_post);
7762     }
7763
7764  out:
7765   input_location = saved_location;
7766   return ret;
7767 }
7768
7769 /* Look through TYPE for variable-sized objects and gimplify each such
7770    size that we find.  Add to LIST_P any statements generated.  */
7771
7772 void
7773 gimplify_type_sizes (tree type, gimple_seq *list_p)
7774 {
7775   tree field, t;
7776
7777   if (type == NULL || type == error_mark_node)
7778     return;
7779
7780   /* We first do the main variant, then copy into any other variants.  */
7781   type = TYPE_MAIN_VARIANT (type);
7782
7783   /* Avoid infinite recursion.  */
7784   if (TYPE_SIZES_GIMPLIFIED (type))
7785     return;
7786
7787   TYPE_SIZES_GIMPLIFIED (type) = 1;
7788
7789   switch (TREE_CODE (type))
7790     {
7791     case INTEGER_TYPE:
7792     case ENUMERAL_TYPE:
7793     case BOOLEAN_TYPE:
7794     case REAL_TYPE:
7795     case FIXED_POINT_TYPE:
7796       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
7797       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
7798
7799       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7800         {
7801           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
7802           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
7803         }
7804       break;
7805
7806     case ARRAY_TYPE:
7807       /* These types may not have declarations, so handle them here.  */
7808       gimplify_type_sizes (TREE_TYPE (type), list_p);
7809       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
7810       /* Ensure VLA bounds aren't removed, for -O0 they should be variables
7811          with assigned stack slots, for -O1+ -g they should be tracked
7812          by VTA.  */
7813       if (!(TYPE_NAME (type)
7814             && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
7815             && DECL_IGNORED_P (TYPE_NAME (type)))
7816           && TYPE_DOMAIN (type)
7817           && INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
7818         {
7819           t = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
7820           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7821             DECL_IGNORED_P (t) = 0;
7822           t = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
7823           if (t && TREE_CODE (t) == VAR_DECL && DECL_ARTIFICIAL (t))
7824             DECL_IGNORED_P (t) = 0;
7825         }
7826       break;
7827
7828     case RECORD_TYPE:
7829     case UNION_TYPE:
7830     case QUAL_UNION_TYPE:
7831       for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
7832         if (TREE_CODE (field) == FIELD_DECL)
7833           {
7834             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
7835             gimplify_one_sizepos (&DECL_SIZE (field), list_p);
7836             gimplify_one_sizepos (&DECL_SIZE_UNIT (field), list_p);
7837             gimplify_type_sizes (TREE_TYPE (field), list_p);
7838           }
7839       break;
7840
7841     case POINTER_TYPE:
7842     case REFERENCE_TYPE:
7843         /* We used to recurse on the pointed-to type here, which turned out to
7844            be incorrect because its definition might refer to variables not
7845            yet initialized at this point if a forward declaration is involved.
7846
7847            It was actually useful for anonymous pointed-to types to ensure
7848            that the sizes evaluation dominates every possible later use of the
7849            values.  Restricting to such types here would be safe since there
7850            is no possible forward declaration around, but would introduce an
7851            undesirable middle-end semantic to anonymity.  We then defer to
7852            front-ends the responsibility of ensuring that the sizes are
7853            evaluated both early and late enough, e.g. by attaching artificial
7854            type declarations to the tree.  */
7855       break;
7856
7857     default:
7858       break;
7859     }
7860
7861   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
7862   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
7863
7864   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
7865     {
7866       TYPE_SIZE (t) = TYPE_SIZE (type);
7867       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
7868       TYPE_SIZES_GIMPLIFIED (t) = 1;
7869     }
7870 }
7871
7872 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
7873    a size or position, has had all of its SAVE_EXPRs evaluated.
7874    We add any required statements to *STMT_P.  */
7875
7876 void
7877 gimplify_one_sizepos (tree *expr_p, gimple_seq *stmt_p)
7878 {
7879   tree type, expr = *expr_p;
7880
7881   /* We don't do anything if the value isn't there, is constant, or contains
7882      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
7883      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
7884      will want to replace it with a new variable, but that will cause problems
7885      if this type is from outside the function.  It's OK to have that here.  */
7886   if (expr == NULL_TREE || TREE_CONSTANT (expr)
7887       || TREE_CODE (expr) == VAR_DECL
7888       || CONTAINS_PLACEHOLDER_P (expr))
7889     return;
7890
7891   type = TREE_TYPE (expr);
7892   *expr_p = unshare_expr (expr);
7893
7894   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
7895   expr = *expr_p;
7896
7897   /* Verify that we've an exact type match with the original expression.
7898      In particular, we do not wish to drop a "sizetype" in favour of a
7899      type of similar dimensions.  We don't want to pollute the generic
7900      type-stripping code with this knowledge because it doesn't matter
7901      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
7902      and friends retain their "sizetype-ness".  */
7903   if (TREE_TYPE (expr) != type
7904       && TREE_CODE (type) == INTEGER_TYPE
7905       && TYPE_IS_SIZETYPE (type))
7906     {
7907       tree tmp;
7908       gimple stmt;
7909
7910       *expr_p = create_tmp_var (type, NULL);
7911       tmp = build1 (NOP_EXPR, type, expr);
7912       stmt = gimplify_assign (*expr_p, tmp, stmt_p);
7913       gimple_set_location (stmt, EXPR_LOC_OR_HERE (expr));
7914     }
7915 }
7916
7917 /* Gimplify the body of statements pointed to by BODY_P and return a
7918    GIMPLE_BIND containing the sequence of GIMPLE statements
7919    corresponding to BODY_P.  FNDECL is the function decl containing
7920    *BODY_P.  */
7921
7922 gimple
7923 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
7924 {
7925   location_t saved_location = input_location;
7926   gimple_seq parm_stmts, seq;
7927   gimple outer_bind;
7928   struct gimplify_ctx gctx;
7929   struct cgraph_node *cgn;
7930
7931   timevar_push (TV_TREE_GIMPLIFY);
7932
7933   /* Initialize for optimize_insn_for_s{ize,peed}_p possibly called during
7934      gimplification.  */
7935   default_rtl_profile ();
7936
7937   gcc_assert (gimplify_ctxp == NULL);
7938   push_gimplify_context (&gctx);
7939
7940   /* Unshare most shared trees in the body and in that of any nested functions.
7941      It would seem we don't have to do this for nested functions because
7942      they are supposed to be output and then the outer function gimplified
7943      first, but the g++ front end doesn't always do it that way.  */
7944   unshare_body (body_p, fndecl);
7945   unvisit_body (body_p, fndecl);
7946
7947   cgn = cgraph_get_node (fndecl);
7948   if (cgn && cgn->origin)
7949     nonlocal_vlas = pointer_set_create ();
7950
7951   /* Make sure input_location isn't set to something weird.  */
7952   input_location = DECL_SOURCE_LOCATION (fndecl);
7953
7954   /* Resolve callee-copies.  This has to be done before processing
7955      the body so that DECL_VALUE_EXPR gets processed correctly.  */
7956   parm_stmts = (do_parms) ? gimplify_parameters () : NULL;
7957
7958   /* Gimplify the function's body.  */
7959   seq = NULL;
7960   gimplify_stmt (body_p, &seq);
7961   outer_bind = gimple_seq_first_stmt (seq);
7962   if (!outer_bind)
7963     {
7964       outer_bind = gimple_build_nop ();
7965       gimplify_seq_add_stmt (&seq, outer_bind);
7966     }
7967
7968   /* The body must contain exactly one statement, a GIMPLE_BIND.  If this is
7969      not the case, wrap everything in a GIMPLE_BIND to make it so.  */
7970   if (gimple_code (outer_bind) == GIMPLE_BIND
7971       && gimple_seq_first (seq) == gimple_seq_last (seq))
7972     ;
7973   else
7974     outer_bind = gimple_build_bind (NULL_TREE, seq, NULL);
7975
7976   *body_p = NULL_TREE;
7977
7978   /* If we had callee-copies statements, insert them at the beginning
7979      of the function and clear DECL_VALUE_EXPR_P on the parameters.  */
7980   if (!gimple_seq_empty_p (parm_stmts))
7981     {
7982       tree parm;
7983
7984       gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
7985       gimple_bind_set_body (outer_bind, parm_stmts);
7986
7987       for (parm = DECL_ARGUMENTS (current_function_decl);
7988            parm; parm = DECL_CHAIN (parm))
7989         if (DECL_HAS_VALUE_EXPR_P (parm))
7990           {
7991             DECL_HAS_VALUE_EXPR_P (parm) = 0;
7992             DECL_IGNORED_P (parm) = 0;
7993           }
7994     }
7995
7996   if (nonlocal_vlas)
7997     {
7998       pointer_set_destroy (nonlocal_vlas);
7999       nonlocal_vlas = NULL;
8000     }
8001
8002   pop_gimplify_context (outer_bind);
8003   gcc_assert (gimplify_ctxp == NULL);
8004
8005   if (!seen_error ())
8006     verify_gimple_in_seq (gimple_bind_body (outer_bind));
8007
8008   timevar_pop (TV_TREE_GIMPLIFY);
8009   input_location = saved_location;
8010
8011   return outer_bind;
8012 }
8013
8014 typedef char *char_p; /* For DEF_VEC_P.  */
8015 DEF_VEC_P(char_p);
8016 DEF_VEC_ALLOC_P(char_p,heap);
8017
8018 /* Return whether we should exclude FNDECL from instrumentation.  */
8019
8020 static bool
8021 flag_instrument_functions_exclude_p (tree fndecl)
8022 {
8023   VEC(char_p,heap) *vec;
8024
8025   vec = (VEC(char_p,heap) *) flag_instrument_functions_exclude_functions;
8026   if (VEC_length (char_p, vec) > 0)
8027     {
8028       const char *name;
8029       int i;
8030       char *s;
8031
8032       name = lang_hooks.decl_printable_name (fndecl, 0);
8033       FOR_EACH_VEC_ELT (char_p, vec, i, s)
8034         if (strstr (name, s) != NULL)
8035           return true;
8036     }
8037
8038   vec = (VEC(char_p,heap) *) flag_instrument_functions_exclude_files;
8039   if (VEC_length (char_p, vec) > 0)
8040     {
8041       const char *name;
8042       int i;
8043       char *s;
8044
8045       name = DECL_SOURCE_FILE (fndecl);
8046       FOR_EACH_VEC_ELT (char_p, vec, i, s)
8047         if (strstr (name, s) != NULL)
8048           return true;
8049     }
8050
8051   return false;
8052 }
8053
8054 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
8055    node for the function we want to gimplify.
8056
8057    Return the sequence of GIMPLE statements corresponding to the body
8058    of FNDECL.  */
8059
8060 void
8061 gimplify_function_tree (tree fndecl)
8062 {
8063   tree oldfn, parm, ret;
8064   gimple_seq seq;
8065   gimple bind;
8066
8067   gcc_assert (!gimple_body (fndecl));
8068
8069   oldfn = current_function_decl;
8070   current_function_decl = fndecl;
8071   if (DECL_STRUCT_FUNCTION (fndecl))
8072     push_cfun (DECL_STRUCT_FUNCTION (fndecl));
8073   else
8074     push_struct_function (fndecl);
8075
8076   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = DECL_CHAIN (parm))
8077     {
8078       /* Preliminarily mark non-addressed complex variables as eligible
8079          for promotion to gimple registers.  We'll transform their uses
8080          as we find them.  */
8081       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
8082            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
8083           && !TREE_THIS_VOLATILE (parm)
8084           && !needs_to_live_in_memory (parm))
8085         DECL_GIMPLE_REG_P (parm) = 1;
8086     }
8087
8088   ret = DECL_RESULT (fndecl);
8089   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
8090        || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
8091       && !needs_to_live_in_memory (ret))
8092     DECL_GIMPLE_REG_P (ret) = 1;
8093
8094   bind = gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
8095
8096   /* The tree body of the function is no longer needed, replace it
8097      with the new GIMPLE body.  */
8098   seq = gimple_seq_alloc ();
8099   gimple_seq_add_stmt (&seq, bind);
8100   gimple_set_body (fndecl, seq);
8101
8102   /* If we're instrumenting function entry/exit, then prepend the call to
8103      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
8104      catch the exit hook.  */
8105   /* ??? Add some way to ignore exceptions for this TFE.  */
8106   if (flag_instrument_function_entry_exit
8107       && !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
8108       && !flag_instrument_functions_exclude_p (fndecl))
8109     {
8110       tree x;
8111       gimple new_bind;
8112       gimple tf;
8113       gimple_seq cleanup = NULL, body = NULL;
8114       tree tmp_var;
8115       gimple call;
8116
8117       x = builtin_decl_implicit (BUILT_IN_RETURN_ADDRESS);
8118       call = gimple_build_call (x, 1, integer_zero_node);
8119       tmp_var = create_tmp_var (ptr_type_node, "return_addr");
8120       gimple_call_set_lhs (call, tmp_var);
8121       gimplify_seq_add_stmt (&cleanup, call);
8122       x = builtin_decl_implicit (BUILT_IN_PROFILE_FUNC_EXIT);
8123       call = gimple_build_call (x, 2,
8124                                 build_fold_addr_expr (current_function_decl),
8125                                 tmp_var);
8126       gimplify_seq_add_stmt (&cleanup, call);
8127       tf = gimple_build_try (seq, cleanup, GIMPLE_TRY_FINALLY);
8128
8129       x = builtin_decl_implicit (BUILT_IN_RETURN_ADDRESS);
8130       call = gimple_build_call (x, 1, integer_zero_node);
8131       tmp_var = create_tmp_var (ptr_type_node, "return_addr");
8132       gimple_call_set_lhs (call, tmp_var);
8133       gimplify_seq_add_stmt (&body, call);
8134       x = builtin_decl_implicit (BUILT_IN_PROFILE_FUNC_ENTER);
8135       call = gimple_build_call (x, 2,
8136                                 build_fold_addr_expr (current_function_decl),
8137                                 tmp_var);
8138       gimplify_seq_add_stmt (&body, call);
8139       gimplify_seq_add_stmt (&body, tf);
8140       new_bind = gimple_build_bind (NULL, body, gimple_bind_block (bind));
8141       /* Clear the block for BIND, since it is no longer directly inside
8142          the function, but within a try block.  */
8143       gimple_bind_set_block (bind, NULL);
8144
8145       /* Replace the current function body with the body
8146          wrapped in the try/finally TF.  */
8147       seq = gimple_seq_alloc ();
8148       gimple_seq_add_stmt (&seq, new_bind);
8149       gimple_set_body (fndecl, seq);
8150     }
8151
8152   DECL_SAVED_TREE (fndecl) = NULL_TREE;
8153   cfun->curr_properties = PROP_gimple_any;
8154
8155   current_function_decl = oldfn;
8156   pop_cfun ();
8157 }
8158
8159 /* Some transformations like inlining may invalidate the GIMPLE form
8160    for operands.  This function traverses all the operands in STMT and
8161    gimplifies anything that is not a valid gimple operand.  Any new
8162    GIMPLE statements are inserted before *GSI_P.  */
8163
8164 void
8165 gimple_regimplify_operands (gimple stmt, gimple_stmt_iterator *gsi_p)
8166 {
8167   size_t i, num_ops;
8168   tree orig_lhs = NULL_TREE, lhs, t;
8169   gimple_seq pre = NULL;
8170   gimple post_stmt = NULL;
8171   struct gimplify_ctx gctx;
8172
8173   push_gimplify_context (&gctx);
8174   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
8175
8176   switch (gimple_code (stmt))
8177     {
8178     case GIMPLE_COND:
8179       gimplify_expr (gimple_cond_lhs_ptr (stmt), &pre, NULL,
8180                      is_gimple_val, fb_rvalue);
8181       gimplify_expr (gimple_cond_rhs_ptr (stmt), &pre, NULL,
8182                      is_gimple_val, fb_rvalue);
8183       break;
8184     case GIMPLE_SWITCH:
8185       gimplify_expr (gimple_switch_index_ptr (stmt), &pre, NULL,
8186                      is_gimple_val, fb_rvalue);
8187       break;
8188     case GIMPLE_OMP_ATOMIC_LOAD:
8189       gimplify_expr (gimple_omp_atomic_load_rhs_ptr (stmt), &pre, NULL,
8190                      is_gimple_val, fb_rvalue);
8191       break;
8192     case GIMPLE_ASM:
8193       {
8194         size_t i, noutputs = gimple_asm_noutputs (stmt);
8195         const char *constraint, **oconstraints;
8196         bool allows_mem, allows_reg, is_inout;
8197
8198         oconstraints
8199           = (const char **) alloca ((noutputs) * sizeof (const char *));
8200         for (i = 0; i < noutputs; i++)
8201           {
8202             tree op = gimple_asm_output_op (stmt, i);
8203             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
8204             oconstraints[i] = constraint;
8205             parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
8206                                      &allows_reg, &is_inout);
8207             gimplify_expr (&TREE_VALUE (op), &pre, NULL,
8208                            is_inout ? is_gimple_min_lval : is_gimple_lvalue,
8209                            fb_lvalue | fb_mayfail);
8210           }
8211         for (i = 0; i < gimple_asm_ninputs (stmt); i++)
8212           {
8213             tree op = gimple_asm_input_op (stmt, i);
8214             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
8215             parse_input_constraint (&constraint, 0, 0, noutputs, 0,
8216                                     oconstraints, &allows_mem, &allows_reg);
8217             if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (op))) && allows_mem)
8218               allows_reg = 0;
8219             if (!allows_reg && allows_mem)
8220               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
8221                              is_gimple_lvalue, fb_lvalue | fb_mayfail);
8222             else
8223               gimplify_expr (&TREE_VALUE (op), &pre, NULL,
8224                              is_gimple_asm_val, fb_rvalue);
8225           }
8226       }
8227       break;
8228     default:
8229       /* NOTE: We start gimplifying operands from last to first to
8230          make sure that side-effects on the RHS of calls, assignments
8231          and ASMs are executed before the LHS.  The ordering is not
8232          important for other statements.  */
8233       num_ops = gimple_num_ops (stmt);
8234       orig_lhs = gimple_get_lhs (stmt);
8235       for (i = num_ops; i > 0; i--)
8236         {
8237           tree op = gimple_op (stmt, i - 1);
8238           if (op == NULL_TREE)
8239             continue;
8240           if (i == 1 && (is_gimple_call (stmt) || is_gimple_assign (stmt)))
8241             gimplify_expr (&op, &pre, NULL, is_gimple_lvalue, fb_lvalue);
8242           else if (i == 2
8243                    && is_gimple_assign (stmt)
8244                    && num_ops == 2
8245                    && get_gimple_rhs_class (gimple_expr_code (stmt))
8246                       == GIMPLE_SINGLE_RHS)
8247             gimplify_expr (&op, &pre, NULL,
8248                            rhs_predicate_for (gimple_assign_lhs (stmt)),
8249                            fb_rvalue);
8250           else if (i == 2 && is_gimple_call (stmt))
8251             {
8252               if (TREE_CODE (op) == FUNCTION_DECL)
8253                 continue;
8254               gimplify_expr (&op, &pre, NULL, is_gimple_call_addr, fb_rvalue);
8255             }
8256           else
8257             gimplify_expr (&op, &pre, NULL, is_gimple_val, fb_rvalue);
8258           gimple_set_op (stmt, i - 1, op);
8259         }
8260
8261       lhs = gimple_get_lhs (stmt);
8262       /* If the LHS changed it in a way that requires a simple RHS,
8263          create temporary.  */
8264       if (lhs && !is_gimple_reg (lhs))
8265         {
8266           bool need_temp = false;
8267
8268           if (is_gimple_assign (stmt)
8269               && num_ops == 2
8270               && get_gimple_rhs_class (gimple_expr_code (stmt))
8271                  == GIMPLE_SINGLE_RHS)
8272             gimplify_expr (gimple_assign_rhs1_ptr (stmt), &pre, NULL,
8273                            rhs_predicate_for (gimple_assign_lhs (stmt)),
8274                            fb_rvalue);
8275           else if (is_gimple_reg (lhs))
8276             {
8277               if (is_gimple_reg_type (TREE_TYPE (lhs)))
8278                 {
8279                   if (is_gimple_call (stmt))
8280                     {
8281                       i = gimple_call_flags (stmt);
8282                       if ((i & ECF_LOOPING_CONST_OR_PURE)
8283                           || !(i & (ECF_CONST | ECF_PURE)))
8284                         need_temp = true;
8285                     }
8286                   if (stmt_can_throw_internal (stmt))
8287                     need_temp = true;
8288                 }
8289             }
8290           else
8291             {
8292               if (is_gimple_reg_type (TREE_TYPE (lhs)))
8293                 need_temp = true;
8294               else if (TYPE_MODE (TREE_TYPE (lhs)) != BLKmode)
8295                 {
8296                   if (is_gimple_call (stmt))
8297                     {
8298                       tree fndecl = gimple_call_fndecl (stmt);
8299
8300                       if (!aggregate_value_p (TREE_TYPE (lhs), fndecl)
8301                           && !(fndecl && DECL_RESULT (fndecl)
8302                                && DECL_BY_REFERENCE (DECL_RESULT (fndecl))))
8303                         need_temp = true;
8304                     }
8305                   else
8306                     need_temp = true;
8307                 }
8308             }
8309           if (need_temp)
8310             {
8311               tree temp = create_tmp_reg (TREE_TYPE (lhs), NULL);
8312
8313               if (TREE_CODE (orig_lhs) == SSA_NAME)
8314                 orig_lhs = SSA_NAME_VAR (orig_lhs);
8315
8316               if (gimple_in_ssa_p (cfun))
8317                 temp = make_ssa_name (temp, NULL);
8318               gimple_set_lhs (stmt, temp);
8319               post_stmt = gimple_build_assign (lhs, temp);
8320               if (TREE_CODE (lhs) == SSA_NAME)
8321                 SSA_NAME_DEF_STMT (lhs) = post_stmt;
8322             }
8323         }
8324       break;
8325     }
8326
8327   if (gimple_referenced_vars (cfun))
8328     for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
8329       add_referenced_var (t);
8330
8331   if (!gimple_seq_empty_p (pre))
8332     {
8333       if (gimple_in_ssa_p (cfun))
8334         {
8335           gimple_stmt_iterator i;
8336
8337           for (i = gsi_start (pre); !gsi_end_p (i); gsi_next (&i))
8338             mark_symbols_for_renaming (gsi_stmt (i));
8339         }
8340       gsi_insert_seq_before (gsi_p, pre, GSI_SAME_STMT);
8341     }
8342   if (post_stmt)
8343     gsi_insert_after (gsi_p, post_stmt, GSI_NEW_STMT);
8344
8345   pop_gimplify_context (NULL);
8346 }
8347
8348 /* Expand EXPR to list of gimple statements STMTS.  GIMPLE_TEST_F specifies
8349    the predicate that will hold for the result.  If VAR is not NULL, make the
8350    base variable of the final destination be VAR if suitable.  */
8351
8352 tree
8353 force_gimple_operand_1 (tree expr, gimple_seq *stmts,
8354                         gimple_predicate gimple_test_f, tree var)
8355 {
8356   tree t;
8357   enum gimplify_status ret;
8358   struct gimplify_ctx gctx;
8359
8360   *stmts = NULL;
8361
8362   /* gimple_test_f might be more strict than is_gimple_val, make
8363      sure we pass both.  Just checking gimple_test_f doesn't work
8364      because most gimple predicates do not work recursively.  */
8365   if (is_gimple_val (expr)
8366       && (*gimple_test_f) (expr))
8367     return expr;
8368
8369   push_gimplify_context (&gctx);
8370   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
8371   gimplify_ctxp->allow_rhs_cond_expr = true;
8372
8373   if (var)
8374     expr = build2 (MODIFY_EXPR, TREE_TYPE (var), var, expr);
8375
8376   if (TREE_CODE (expr) != MODIFY_EXPR
8377       && TREE_TYPE (expr) == void_type_node)
8378     {
8379       gimplify_and_add (expr, stmts);
8380       expr = NULL_TREE;
8381     }
8382   else
8383     {
8384       ret = gimplify_expr (&expr, stmts, NULL, gimple_test_f, fb_rvalue);
8385       gcc_assert (ret != GS_ERROR);
8386     }
8387
8388   if (gimple_referenced_vars (cfun))
8389     for (t = gimplify_ctxp->temps; t ; t = DECL_CHAIN (t))
8390       add_referenced_var (t);
8391
8392   pop_gimplify_context (NULL);
8393
8394   return expr;
8395 }
8396
8397 /* Expand EXPR to list of gimple statements STMTS.  If SIMPLE is true,
8398    force the result to be either ssa_name or an invariant, otherwise
8399    just force it to be a rhs expression.  If VAR is not NULL, make the
8400    base variable of the final destination be VAR if suitable.  */
8401
8402 tree
8403 force_gimple_operand (tree expr, gimple_seq *stmts, bool simple, tree var)
8404 {
8405   return force_gimple_operand_1 (expr, stmts,
8406                                  simple ? is_gimple_val : is_gimple_reg_rhs,
8407                                  var);
8408 }
8409
8410 /* Invoke force_gimple_operand_1 for EXPR with parameters GIMPLE_TEST_F
8411    and VAR.  If some statements are produced, emits them at GSI.
8412    If BEFORE is true.  the statements are appended before GSI, otherwise
8413    they are appended after it.  M specifies the way GSI moves after
8414    insertion (GSI_SAME_STMT or GSI_CONTINUE_LINKING are the usual values).  */
8415
8416 tree
8417 force_gimple_operand_gsi_1 (gimple_stmt_iterator *gsi, tree expr,
8418                             gimple_predicate gimple_test_f,
8419                             tree var, bool before,
8420                             enum gsi_iterator_update m)
8421 {
8422   gimple_seq stmts;
8423
8424   expr = force_gimple_operand_1 (expr, &stmts, gimple_test_f, var);
8425
8426   if (!gimple_seq_empty_p (stmts))
8427     {
8428       if (gimple_in_ssa_p (cfun))
8429         {
8430           gimple_stmt_iterator i;
8431
8432           for (i = gsi_start (stmts); !gsi_end_p (i); gsi_next (&i))
8433             mark_symbols_for_renaming (gsi_stmt (i));
8434         }
8435
8436       if (before)
8437         gsi_insert_seq_before (gsi, stmts, m);
8438       else
8439         gsi_insert_seq_after (gsi, stmts, m);
8440     }
8441
8442   return expr;
8443 }
8444
8445 /* Invoke force_gimple_operand_1 for EXPR with parameter VAR.
8446    If SIMPLE is true, force the result to be either ssa_name or an invariant,
8447    otherwise just force it to be a rhs expression.  If some statements are
8448    produced, emits them at GSI.  If BEFORE is true, the statements are
8449    appended before GSI, otherwise they are appended after it.  M specifies
8450    the way GSI moves after insertion (GSI_SAME_STMT or GSI_CONTINUE_LINKING
8451    are the usual values).  */
8452
8453 tree
8454 force_gimple_operand_gsi (gimple_stmt_iterator *gsi, tree expr,
8455                           bool simple_p, tree var, bool before,
8456                           enum gsi_iterator_update m)
8457 {
8458   return force_gimple_operand_gsi_1 (gsi, expr,
8459                                      simple_p
8460                                      ? is_gimple_val : is_gimple_reg_rhs,
8461                                      var, before, m);
8462 }
8463
8464
8465 #include "gt-gimplify.h"