OSDN Git Service

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