OSDN Git Service

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