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