OSDN Git Service

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