OSDN Git Service

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