OSDN Git Service

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