OSDN Git Service

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