OSDN Git Service

2007-07-01 Daniel Berlin <dberlin@dberlin.org>
[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
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 2, 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 COPYING.  If not, write to the Free
22 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
23 02110-1301, USA.  */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tm.h"
29 #include "tree.h"
30 #include "rtl.h"
31 #include "varray.h"
32 #include "tree-gimple.h"
33 #include "tree-inline.h"
34 #include "diagnostic.h"
35 #include "langhooks.h"
36 #include "langhooks-def.h"
37 #include "tree-flow.h"
38 #include "cgraph.h"
39 #include "timevar.h"
40 #include "except.h"
41 #include "hashtab.h"
42 #include "flags.h"
43 #include "real.h"
44 #include "function.h"
45 #include "output.h"
46 #include "expr.h"
47 #include "ggc.h"
48 #include "toplev.h"
49 #include "target.h"
50 #include "optabs.h"
51 #include "pointer-set.h"
52 #include "splay-tree.h"
53
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_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
67                            | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LOCAL)
68 };
69
70 struct gimplify_omp_ctx
71 {
72   struct gimplify_omp_ctx *outer_context;
73   splay_tree variables;
74   struct pointer_set_t *privatized_types;
75   location_t location;
76   enum omp_clause_default_kind default_kind;
77   bool is_parallel;
78   bool is_combined_parallel;
79 };
80
81 struct gimplify_ctx
82 {
83   struct gimplify_ctx *prev_context;
84
85   tree current_bind_expr;
86   tree temps;
87   tree conditional_cleanups;
88   tree exit_label;
89   tree return_temp;
90   
91   VEC(tree,heap) *case_labels;
92   /* The formal temporary table.  Should this be persistent?  */
93   htab_t temp_htab;
94
95   int conditions;
96   bool save_stack;
97   bool into_ssa;
98 };
99
100 static struct gimplify_ctx *gimplify_ctxp;
101 static struct gimplify_omp_ctx *gimplify_omp_ctxp;
102
103
104
105 /* Formal (expression) temporary table handling: Multiple occurrences of
106    the same scalar expression are evaluated into the same temporary.  */
107
108 typedef struct gimple_temp_hash_elt
109 {
110   tree val;   /* Key */
111   tree temp;  /* Value */
112 } elt_t;
113
114 /* Forward declarations.  */
115 static enum gimplify_status gimplify_compound_expr (tree *, tree *, bool);
116 #ifdef ENABLE_CHECKING
117 static bool cpt_same_type (tree a, tree b);
118 #endif
119
120 /* Mark X addressable.  Unlike the langhook we expect X to be in gimple
121    form and we don't do any syntax checking.  */
122 static void
123 mark_addressable (tree x)
124 {
125   while (handled_component_p (x))
126     x = TREE_OPERAND (x, 0);
127   if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
128     return ;
129   TREE_ADDRESSABLE (x) = 1;
130 }
131
132 /* Return a hash value for a formal temporary table entry.  */
133
134 static hashval_t
135 gimple_tree_hash (const void *p)
136 {
137   tree t = ((const elt_t *) p)->val;
138   return iterative_hash_expr (t, 0);
139 }
140
141 /* Compare two formal temporary table entries.  */
142
143 static int
144 gimple_tree_eq (const void *p1, const void *p2)
145 {
146   tree t1 = ((const elt_t *) p1)->val;
147   tree t2 = ((const elt_t *) p2)->val;
148   enum tree_code code = TREE_CODE (t1);
149
150   if (TREE_CODE (t2) != code
151       || TREE_TYPE (t1) != TREE_TYPE (t2))
152     return 0;
153
154   if (!operand_equal_p (t1, t2, 0))
155     return 0;
156
157   /* Only allow them to compare equal if they also hash equal; otherwise
158      results are nondeterminate, and we fail bootstrap comparison.  */
159   gcc_assert (gimple_tree_hash (p1) == gimple_tree_hash (p2));
160
161   return 1;
162 }
163
164 /* Set up a context for the gimplifier.  */
165
166 void
167 push_gimplify_context (void)
168 {
169   struct gimplify_ctx *c;
170
171   c = (struct gimplify_ctx *) xcalloc (1, sizeof (struct gimplify_ctx));
172   c->prev_context = gimplify_ctxp;
173   if (optimize)
174     c->temp_htab = htab_create (1000, gimple_tree_hash, gimple_tree_eq, free);
175
176   gimplify_ctxp = c;
177 }
178
179 /* Tear down a context for the gimplifier.  If BODY is non-null, then
180    put the temporaries into the outer BIND_EXPR.  Otherwise, put them
181    in the unexpanded_var_list.  */
182
183 void
184 pop_gimplify_context (tree body)
185 {
186   struct gimplify_ctx *c = gimplify_ctxp;
187   tree t;
188
189   gcc_assert (c && !c->current_bind_expr);
190   gimplify_ctxp = c->prev_context;
191
192   for (t = c->temps; t ; t = TREE_CHAIN (t))
193     DECL_GIMPLE_FORMAL_TEMP_P (t) = 0;
194
195   if (body)
196     declare_vars (c->temps, body, false);
197   else
198     record_vars (c->temps);
199
200   if (optimize)
201     htab_delete (c->temp_htab);
202   free (c);
203 }
204
205 static void
206 gimple_push_bind_expr (tree bind)
207 {
208   TREE_CHAIN (bind) = gimplify_ctxp->current_bind_expr;
209   gimplify_ctxp->current_bind_expr = bind;
210 }
211
212 static void
213 gimple_pop_bind_expr (void)
214 {
215   gimplify_ctxp->current_bind_expr
216     = TREE_CHAIN (gimplify_ctxp->current_bind_expr);
217 }
218
219 tree
220 gimple_current_bind_expr (void)
221 {
222   return gimplify_ctxp->current_bind_expr;
223 }
224
225 /* Returns true iff there is a COND_EXPR between us and the innermost
226    CLEANUP_POINT_EXPR.  This info is used by gimple_push_cleanup.  */
227
228 static bool
229 gimple_conditional_context (void)
230 {
231   return gimplify_ctxp->conditions > 0;
232 }
233
234 /* Note that we've entered a COND_EXPR.  */
235
236 static void
237 gimple_push_condition (void)
238 {
239 #ifdef ENABLE_CHECKING
240   if (gimplify_ctxp->conditions == 0)
241     gcc_assert (!gimplify_ctxp->conditional_cleanups);
242 #endif
243   ++(gimplify_ctxp->conditions);
244 }
245
246 /* Note that we've left a COND_EXPR.  If we're back at unconditional scope
247    now, add any conditional cleanups we've seen to the prequeue.  */
248
249 static void
250 gimple_pop_condition (tree *pre_p)
251 {
252   int conds = --(gimplify_ctxp->conditions);
253
254   gcc_assert (conds >= 0);
255   if (conds == 0)
256     {
257       append_to_statement_list (gimplify_ctxp->conditional_cleanups, pre_p);
258       gimplify_ctxp->conditional_cleanups = NULL_TREE;
259     }
260 }
261
262 /* A stable comparison routine for use with splay trees and DECLs.  */
263
264 static int
265 splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb)
266 {
267   tree a = (tree) xa;
268   tree b = (tree) xb;
269
270   return DECL_UID (a) - DECL_UID (b);
271 }
272
273 /* Create a new omp construct that deals with variable remapping.  */
274
275 static struct gimplify_omp_ctx *
276 new_omp_context (bool is_parallel, bool is_combined_parallel)
277 {
278   struct gimplify_omp_ctx *c;
279
280   c = XCNEW (struct gimplify_omp_ctx);
281   c->outer_context = gimplify_omp_ctxp;
282   c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
283   c->privatized_types = pointer_set_create ();
284   c->location = input_location;
285   c->is_parallel = is_parallel;
286   c->is_combined_parallel = is_combined_parallel;
287   c->default_kind = OMP_CLAUSE_DEFAULT_SHARED;
288
289   return c;
290 }
291
292 /* Destroy an omp construct that deals with variable remapping.  */
293
294 static void
295 delete_omp_context (struct gimplify_omp_ctx *c)
296 {
297   splay_tree_delete (c->variables);
298   pointer_set_destroy (c->privatized_types);
299   XDELETE (c);
300 }
301
302 static void omp_add_variable (struct gimplify_omp_ctx *, tree, unsigned int);
303 static bool omp_notice_variable (struct gimplify_omp_ctx *, tree, bool);
304
305 /* A subroutine of append_to_statement_list{,_force}.  T is not NULL.  */
306
307 static void
308 append_to_statement_list_1 (tree t, tree *list_p)
309 {
310   tree list = *list_p;
311   tree_stmt_iterator i;
312
313   if (!list)
314     {
315       if (t && TREE_CODE (t) == STATEMENT_LIST)
316         {
317           *list_p = t;
318           return;
319         }
320       *list_p = list = alloc_stmt_list ();
321     }
322
323   i = tsi_last (list);
324   tsi_link_after (&i, t, TSI_CONTINUE_LINKING);
325 }
326
327 /* Add T to the end of the list container pointed to by LIST_P.
328    If T is an expression with no effects, it is ignored.  */
329
330 void
331 append_to_statement_list (tree t, tree *list_p)
332 {
333   if (t && TREE_SIDE_EFFECTS (t))
334     append_to_statement_list_1 (t, list_p);
335 }
336
337 /* Similar, but the statement is always added, regardless of side effects.  */
338
339 void
340 append_to_statement_list_force (tree t, tree *list_p)
341 {
342   if (t != NULL_TREE)
343     append_to_statement_list_1 (t, list_p);
344 }
345
346 /* Both gimplify the statement T and append it to LIST_P.  */
347
348 void
349 gimplify_and_add (tree t, tree *list_p)
350 {
351   gimplify_stmt (&t);
352   append_to_statement_list (t, list_p);
353 }
354
355 /* Strip off a legitimate source ending from the input string NAME of
356    length LEN.  Rather than having to know the names used by all of
357    our front ends, we strip off an ending of a period followed by
358    up to five characters.  (Java uses ".class".)  */
359
360 static inline void
361 remove_suffix (char *name, int len)
362 {
363   int i;
364
365   for (i = 2;  i < 8 && len > i;  i++)
366     {
367       if (name[len - i] == '.')
368         {
369           name[len - i] = '\0';
370           break;
371         }
372     }
373 }
374
375 /* Create a nameless artificial label and put it in the current function
376    context.  Returns the newly created label.  */
377
378 tree
379 create_artificial_label (void)
380 {
381   tree lab = build_decl (LABEL_DECL, NULL_TREE, void_type_node);
382
383   DECL_ARTIFICIAL (lab) = 1;
384   DECL_IGNORED_P (lab) = 1;
385   DECL_CONTEXT (lab) = current_function_decl;
386   return lab;
387 }
388
389 /* Subroutine for find_single_pointer_decl.  */
390
391 static tree
392 find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
393                             void *data)
394 {
395   tree *pdecl = (tree *) data;
396
397   if (DECL_P (*tp) && POINTER_TYPE_P (TREE_TYPE (*tp)))
398     {
399       if (*pdecl)
400         {
401           /* We already found a pointer decl; return anything other
402              than NULL_TREE to unwind from walk_tree signalling that
403              we have a duplicate.  */
404           return *tp;
405         }
406       *pdecl = *tp;
407     }
408
409   return NULL_TREE;
410 }
411
412 /* Find the single DECL of pointer type in the tree T and return it.
413    If there are zero or more than one such DECLs, return NULL.  */
414
415 static tree
416 find_single_pointer_decl (tree t)
417 {
418   tree decl = NULL_TREE;
419
420   if (walk_tree (&t, find_single_pointer_decl_1, &decl, NULL))
421     {
422       /* find_single_pointer_decl_1 returns a nonzero value, causing
423          walk_tree to return a nonzero value, to indicate that it
424          found more than one pointer DECL.  */
425       return NULL_TREE;
426     }
427
428   return decl;
429 }
430
431 /* Create a new temporary name with PREFIX.  Returns an identifier.  */
432
433 static GTY(()) unsigned int tmp_var_id_num;
434
435 tree
436 create_tmp_var_name (const char *prefix)
437 {
438   char *tmp_name;
439
440   if (prefix)
441     {
442       char *preftmp = ASTRDUP (prefix);
443
444       remove_suffix (preftmp, strlen (preftmp));
445       prefix = preftmp;
446     }
447
448   ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
449   return get_identifier (tmp_name);
450 }
451
452
453 /* Create a new temporary variable declaration of type TYPE.
454    Does NOT push it into the current binding.  */
455
456 tree
457 create_tmp_var_raw (tree type, const char *prefix)
458 {
459   tree tmp_var;
460   tree new_type;
461
462   /* Make the type of the variable writable.  */
463   new_type = build_type_variant (type, 0, 0);
464   TYPE_ATTRIBUTES (new_type) = TYPE_ATTRIBUTES (type);
465
466   tmp_var = build_decl (VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
467                         type);
468
469   /* The variable was declared by the compiler.  */
470   DECL_ARTIFICIAL (tmp_var) = 1;
471   /* And we don't want debug info for it.  */
472   DECL_IGNORED_P (tmp_var) = 1;
473
474   /* Make the variable writable.  */
475   TREE_READONLY (tmp_var) = 0;
476
477   DECL_EXTERNAL (tmp_var) = 0;
478   TREE_STATIC (tmp_var) = 0;
479   TREE_USED (tmp_var) = 1;
480
481   return tmp_var;
482 }
483
484 /* Create a new temporary variable declaration of type TYPE.  DOES push the
485    variable into the current binding.  Further, assume that this is called
486    only from gimplification or optimization, at which point the creation of
487    certain types are bugs.  */
488
489 tree
490 create_tmp_var (tree type, const char *prefix)
491 {
492   tree tmp_var;
493
494   /* We don't allow types that are addressable (meaning we can't make copies),
495      or incomplete.  We also used to reject every variable size objects here,
496      but now support those for which a constant upper bound can be obtained.
497      The processing for variable sizes is performed in gimple_add_tmp_var,
498      point at which it really matters and possibly reached via paths not going
499      through this function, e.g. after direct calls to create_tmp_var_raw.  */
500   gcc_assert (!TREE_ADDRESSABLE (type) && COMPLETE_TYPE_P (type));
501
502   tmp_var = create_tmp_var_raw (type, prefix);
503   gimple_add_tmp_var (tmp_var);
504   return tmp_var;
505 }
506
507 /*  Given a tree, try to return a useful variable name that we can use
508     to prefix a temporary that is being assigned the value of the tree.
509     I.E. given  <temp> = &A, return A.  */
510
511 const char *
512 get_name (tree t)
513 {
514   tree stripped_decl;
515
516   stripped_decl = t;
517   STRIP_NOPS (stripped_decl);
518   if (DECL_P (stripped_decl) && DECL_NAME (stripped_decl))
519     return IDENTIFIER_POINTER (DECL_NAME (stripped_decl));
520   else
521     {
522       switch (TREE_CODE (stripped_decl))
523         {
524         case ADDR_EXPR:
525           return get_name (TREE_OPERAND (stripped_decl, 0));
526         default:
527           return NULL;
528         }
529     }
530 }
531
532 /* Create a temporary with a name derived from VAL.  Subroutine of
533    lookup_tmp_var; nobody else should call this function.  */
534
535 static inline tree
536 create_tmp_from_val (tree val)
537 {
538   return create_tmp_var (TYPE_MAIN_VARIANT (TREE_TYPE (val)), get_name (val));
539 }
540
541 /* Create a temporary to hold the value of VAL.  If IS_FORMAL, try to reuse
542    an existing expression temporary.  */
543
544 static tree
545 lookup_tmp_var (tree val, bool is_formal)
546 {
547   tree ret;
548
549   /* If not optimizing, never really reuse a temporary.  local-alloc
550      won't allocate any variable that is used in more than one basic
551      block, which means it will go into memory, causing much extra
552      work in reload and final and poorer code generation, outweighing
553      the extra memory allocation here.  */
554   if (!optimize || !is_formal || TREE_SIDE_EFFECTS (val))
555     ret = create_tmp_from_val (val);
556   else
557     {
558       elt_t elt, *elt_p;
559       void **slot;
560
561       elt.val = val;
562       slot = htab_find_slot (gimplify_ctxp->temp_htab, (void *)&elt, INSERT);
563       if (*slot == NULL)
564         {
565           elt_p = XNEW (elt_t);
566           elt_p->val = val;
567           elt_p->temp = ret = create_tmp_from_val (val);
568           *slot = (void *) elt_p;
569         }
570       else
571         {
572           elt_p = (elt_t *) *slot;
573           ret = elt_p->temp;
574         }
575     }
576
577   if (is_formal)
578     DECL_GIMPLE_FORMAL_TEMP_P (ret) = 1;
579
580   return ret;
581 }
582
583 /* Returns a formal temporary variable initialized with VAL.  PRE_P is as
584    in gimplify_expr.  Only use this function if:
585
586    1) The value of the unfactored expression represented by VAL will not
587       change between the initialization and use of the temporary, and
588    2) The temporary will not be otherwise modified.
589
590    For instance, #1 means that this is inappropriate for SAVE_EXPR temps,
591    and #2 means it is inappropriate for && temps.
592
593    For other cases, use get_initialized_tmp_var instead.  */
594
595 static tree
596 internal_get_tmp_var (tree val, tree *pre_p, tree *post_p, bool is_formal)
597 {
598   tree t, mod;
599
600   gimplify_expr (&val, pre_p, post_p, is_gimple_formal_tmp_rhs, fb_rvalue);
601
602   t = lookup_tmp_var (val, is_formal);
603
604   if (is_formal)
605     {
606       tree u = find_single_pointer_decl (val);
607
608       if (u && TREE_CODE (u) == VAR_DECL && DECL_BASED_ON_RESTRICT_P (u))
609         u = DECL_GET_RESTRICT_BASE (u);
610       if (u && TYPE_RESTRICT (TREE_TYPE (u)))
611         {
612           if (DECL_BASED_ON_RESTRICT_P (t))
613             gcc_assert (u == DECL_GET_RESTRICT_BASE (t));
614           else
615             {
616               DECL_BASED_ON_RESTRICT_P (t) = 1;
617               SET_DECL_RESTRICT_BASE (t, u);
618             }
619         }
620     }
621
622   if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
623       || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
624     DECL_GIMPLE_REG_P (t) = 1;
625
626   mod = build2 (INIT_EXPR, TREE_TYPE (t), t, unshare_expr (val));
627
628   if (EXPR_HAS_LOCATION (val))
629     SET_EXPR_LOCUS (mod, EXPR_LOCUS (val));
630   else
631     SET_EXPR_LOCATION (mod, input_location);
632
633   /* gimplify_modify_expr might want to reduce this further.  */
634   gimplify_and_add (mod, pre_p);
635
636   /* If we're gimplifying into ssa, gimplify_modify_expr will have
637      given our temporary an ssa name.  Find and return it.  */
638   if (gimplify_ctxp->into_ssa)
639     t = TREE_OPERAND (mod, 0);
640
641   return t;
642 }
643
644 /* Returns a formal temporary variable initialized with VAL.  PRE_P
645    points to a statement list where side-effects needed to compute VAL
646    should be stored.  */
647
648 tree
649 get_formal_tmp_var (tree val, tree *pre_p)
650 {
651   return internal_get_tmp_var (val, pre_p, NULL, true);
652 }
653
654 /* Returns a temporary variable initialized with VAL.  PRE_P and POST_P
655    are as in gimplify_expr.  */
656
657 tree
658 get_initialized_tmp_var (tree val, tree *pre_p, tree *post_p)
659 {
660   return internal_get_tmp_var (val, pre_p, post_p, false);
661 }
662
663 /* Declares all the variables in VARS in SCOPE.  If DEBUG_INFO is
664    true, generate debug info for them; otherwise don't.  */
665
666 void
667 declare_vars (tree vars, tree scope, bool debug_info)
668 {
669   tree last = vars;
670   if (last)
671     {
672       tree temps, block;
673
674       /* C99 mode puts the default 'return 0;' for main outside the outer
675          braces.  So drill down until we find an actual scope.  */
676       while (TREE_CODE (scope) == COMPOUND_EXPR)
677         scope = TREE_OPERAND (scope, 0);
678
679       gcc_assert (TREE_CODE (scope) == BIND_EXPR);
680
681       temps = nreverse (last);
682
683       block = BIND_EXPR_BLOCK (scope);
684       if (!block || !debug_info)
685         {
686           TREE_CHAIN (last) = BIND_EXPR_VARS (scope);
687           BIND_EXPR_VARS (scope) = temps;
688         }
689       else
690         {
691           /* We need to attach the nodes both to the BIND_EXPR and to its
692              associated BLOCK for debugging purposes.  The key point here
693              is that the BLOCK_VARS of the BIND_EXPR_BLOCK of a BIND_EXPR
694              is a subchain of the BIND_EXPR_VARS of the BIND_EXPR.  */
695           if (BLOCK_VARS (block))
696             BLOCK_VARS (block) = chainon (BLOCK_VARS (block), temps);
697           else
698             {
699               BIND_EXPR_VARS (scope) = chainon (BIND_EXPR_VARS (scope), temps);
700               BLOCK_VARS (block) = temps;
701             }
702         }
703     }
704 }
705
706 /* For VAR a VAR_DECL of variable size, try to find a constant upper bound
707    for the size and adjust DECL_SIZE/DECL_SIZE_UNIT accordingly.  Abort if
708    no such upper bound can be obtained.  */
709
710 static void
711 force_constant_size (tree var)
712 {
713   /* The only attempt we make is by querying the maximum size of objects
714      of the variable's type.  */
715
716   HOST_WIDE_INT max_size;
717
718   gcc_assert (TREE_CODE (var) == VAR_DECL);
719
720   max_size = max_int_size_in_bytes (TREE_TYPE (var));
721
722   gcc_assert (max_size >= 0);
723
724   DECL_SIZE_UNIT (var)
725     = build_int_cst (TREE_TYPE (DECL_SIZE_UNIT (var)), max_size);
726   DECL_SIZE (var)
727     = build_int_cst (TREE_TYPE (DECL_SIZE (var)), max_size * BITS_PER_UNIT);
728 }
729
730 void
731 gimple_add_tmp_var (tree tmp)
732 {
733   gcc_assert (!TREE_CHAIN (tmp) && !DECL_SEEN_IN_BIND_EXPR_P (tmp));
734
735   /* Later processing assumes that the object size is constant, which might
736      not be true at this point.  Force the use of a constant upper bound in
737      this case.  */
738   if (!host_integerp (DECL_SIZE_UNIT (tmp), 1))
739     force_constant_size (tmp);
740
741   DECL_CONTEXT (tmp) = current_function_decl;
742   DECL_SEEN_IN_BIND_EXPR_P (tmp) = 1;
743
744   if (gimplify_ctxp)
745     {
746       TREE_CHAIN (tmp) = gimplify_ctxp->temps;
747       gimplify_ctxp->temps = tmp;
748
749       /* Mark temporaries local within the nearest enclosing parallel.  */
750       if (gimplify_omp_ctxp)
751         {
752           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
753           while (ctx && !ctx->is_parallel)
754             ctx = ctx->outer_context;
755           if (ctx)
756             omp_add_variable (ctx, tmp, GOVD_LOCAL | GOVD_SEEN);
757         }
758     }
759   else if (cfun)
760     record_vars (tmp);
761   else
762     declare_vars (tmp, DECL_SAVED_TREE (current_function_decl), false);
763 }
764
765 /* Determines whether to assign a locus to the statement STMT.  */
766
767 static bool
768 should_carry_locus_p (tree stmt)
769 {
770   /* Don't emit a line note for a label.  We particularly don't want to
771      emit one for the break label, since it doesn't actually correspond
772      to the beginning of the loop/switch.  */
773   if (TREE_CODE (stmt) == LABEL_EXPR)
774     return false;
775
776   /* Do not annotate empty statements, since it confuses gcov.  */
777   if (!TREE_SIDE_EFFECTS (stmt))
778     return false;
779
780   return true;
781 }
782
783 static void
784 annotate_one_with_locus (tree t, location_t locus)
785 {
786   if (CAN_HAVE_LOCATION_P (t)
787       && ! EXPR_HAS_LOCATION (t) && should_carry_locus_p (t))
788     SET_EXPR_LOCATION (t, locus);
789 }
790
791 void
792 annotate_all_with_locus (tree *stmt_p, location_t locus)
793 {
794   tree_stmt_iterator i;
795
796   if (!*stmt_p)
797     return;
798
799   for (i = tsi_start (*stmt_p); !tsi_end_p (i); tsi_next (&i))
800     {
801       tree t = tsi_stmt (i);
802
803       /* Assuming we've already been gimplified, we shouldn't
804           see nested chaining constructs anymore.  */
805       gcc_assert (TREE_CODE (t) != STATEMENT_LIST
806                   && TREE_CODE (t) != COMPOUND_EXPR);
807
808       annotate_one_with_locus (t, locus);
809     }
810 }
811
812 /* Similar to copy_tree_r() but do not copy SAVE_EXPR or TARGET_EXPR nodes.
813    These nodes model computations that should only be done once.  If we
814    were to unshare something like SAVE_EXPR(i++), the gimplification
815    process would create wrong code.  */
816
817 static tree
818 mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
819 {
820   enum tree_code code = TREE_CODE (*tp);
821   /* Don't unshare types, decls, constants and SAVE_EXPR nodes.  */
822   if (TREE_CODE_CLASS (code) == tcc_type
823       || TREE_CODE_CLASS (code) == tcc_declaration
824       || TREE_CODE_CLASS (code) == tcc_constant
825       || code == SAVE_EXPR || code == TARGET_EXPR
826       /* We can't do anything sensible with a BLOCK used as an expression,
827          but we also can't just die when we see it because of non-expression
828          uses.  So just avert our eyes and cross our fingers.  Silly Java.  */
829       || code == BLOCK)
830     *walk_subtrees = 0;
831   else
832     {
833       gcc_assert (code != BIND_EXPR);
834       copy_tree_r (tp, walk_subtrees, data);
835     }
836
837   return NULL_TREE;
838 }
839
840 /* Callback for walk_tree to unshare most of the shared trees rooted at
841    *TP.  If *TP has been visited already (i.e., TREE_VISITED (*TP) == 1),
842    then *TP is deep copied by calling copy_tree_r.
843
844    This unshares the same trees as copy_tree_r with the exception of
845    SAVE_EXPR nodes.  These nodes model computations that should only be
846    done once.  If we were to unshare something like SAVE_EXPR(i++), the
847    gimplification process would create wrong code.  */
848
849 static tree
850 copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
851                   void *data ATTRIBUTE_UNUSED)
852 {
853   tree t = *tp;
854   enum tree_code code = TREE_CODE (t);
855
856   /* Skip types, decls, and constants.  But we do want to look at their
857      types and the bounds of types.  Mark them as visited so we properly
858      unmark their subtrees on the unmark pass.  If we've already seen them,
859      don't look down further.  */
860   if (TREE_CODE_CLASS (code) == tcc_type
861       || TREE_CODE_CLASS (code) == tcc_declaration
862       || TREE_CODE_CLASS (code) == tcc_constant)
863     {
864       if (TREE_VISITED (t))
865         *walk_subtrees = 0;
866       else
867         TREE_VISITED (t) = 1;
868     }
869
870   /* If this node has been visited already, unshare it and don't look
871      any deeper.  */
872   else if (TREE_VISITED (t))
873     {
874       walk_tree (tp, mostly_copy_tree_r, NULL, NULL);
875       *walk_subtrees = 0;
876     }
877
878   /* Otherwise, mark the tree as visited and keep looking.  */
879   else
880     TREE_VISITED (t) = 1;
881
882   return NULL_TREE;
883 }
884
885 static tree
886 unmark_visited_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
887                   void *data ATTRIBUTE_UNUSED)
888 {
889   if (TREE_VISITED (*tp))
890     TREE_VISITED (*tp) = 0;
891   else
892     *walk_subtrees = 0;
893
894   return NULL_TREE;
895 }
896
897 /* Unshare all the trees in BODY_P, a pointer into the body of FNDECL, and the
898    bodies of any nested functions if we are unsharing the entire body of
899    FNDECL.  */
900
901 static void
902 unshare_body (tree *body_p, tree fndecl)
903 {
904   struct cgraph_node *cgn = cgraph_node (fndecl);
905
906   walk_tree (body_p, copy_if_shared_r, NULL, NULL);
907   if (body_p == &DECL_SAVED_TREE (fndecl))
908     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
909       unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
910 }
911
912 /* Likewise, but mark all trees as not visited.  */
913
914 static void
915 unvisit_body (tree *body_p, tree fndecl)
916 {
917   struct cgraph_node *cgn = cgraph_node (fndecl);
918
919   walk_tree (body_p, unmark_visited_r, NULL, NULL);
920   if (body_p == &DECL_SAVED_TREE (fndecl))
921     for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
922       unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl);
923 }
924
925 /* Unshare T and all the trees reached from T via TREE_CHAIN.  */
926
927 static void
928 unshare_all_trees (tree t)
929 {
930   walk_tree (&t, copy_if_shared_r, NULL, NULL);
931   walk_tree (&t, unmark_visited_r, NULL, NULL);
932 }
933
934 /* Unconditionally make an unshared copy of EXPR.  This is used when using
935    stored expressions which span multiple functions, such as BINFO_VTABLE,
936    as the normal unsharing process can't tell that they're shared.  */
937
938 tree
939 unshare_expr (tree expr)
940 {
941   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
942   return expr;
943 }
944
945 /* A terser interface for building a representation of an exception
946    specification.  */
947
948 tree
949 gimple_build_eh_filter (tree body, tree allowed, tree failure)
950 {
951   tree t;
952
953   /* FIXME should the allowed types go in TREE_TYPE?  */
954   t = build2 (EH_FILTER_EXPR, void_type_node, allowed, NULL_TREE);
955   append_to_statement_list (failure, &EH_FILTER_FAILURE (t));
956
957   t = build2 (TRY_CATCH_EXPR, void_type_node, NULL_TREE, t);
958   append_to_statement_list (body, &TREE_OPERAND (t, 0));
959
960   return t;
961 }
962
963 \f
964 /* WRAPPER is a code such as BIND_EXPR or CLEANUP_POINT_EXPR which can both
965    contain statements and have a value.  Assign its value to a temporary
966    and give it void_type_node.  Returns the temporary, or NULL_TREE if
967    WRAPPER was already void.  */
968
969 tree
970 voidify_wrapper_expr (tree wrapper, tree temp)
971 {
972   tree type = TREE_TYPE (wrapper);
973   if (type && !VOID_TYPE_P (type))
974     {
975       tree *p;
976
977       /* Set p to point to the body of the wrapper.  Loop until we find
978          something that isn't a wrapper.  */
979       for (p = &wrapper; p && *p; )
980         {
981           switch (TREE_CODE (*p))
982             {
983             case BIND_EXPR:
984               TREE_SIDE_EFFECTS (*p) = 1;
985               TREE_TYPE (*p) = void_type_node;
986               /* For a BIND_EXPR, the body is operand 1.  */
987               p = &BIND_EXPR_BODY (*p);
988               break;
989
990             case CLEANUP_POINT_EXPR:
991             case TRY_FINALLY_EXPR:
992             case TRY_CATCH_EXPR:
993               TREE_SIDE_EFFECTS (*p) = 1;
994               TREE_TYPE (*p) = void_type_node;
995               p = &TREE_OPERAND (*p, 0);
996               break;
997
998             case STATEMENT_LIST:
999               {
1000                 tree_stmt_iterator i = tsi_last (*p);
1001                 TREE_SIDE_EFFECTS (*p) = 1;
1002                 TREE_TYPE (*p) = void_type_node;
1003                 p = tsi_end_p (i) ? NULL : tsi_stmt_ptr (i);
1004               }
1005               break;
1006
1007             case COMPOUND_EXPR:
1008               /* Advance to the last statement.  Set all container types to void.  */
1009               for (; TREE_CODE (*p) == COMPOUND_EXPR; p = &TREE_OPERAND (*p, 1))
1010                 {
1011                   TREE_SIDE_EFFECTS (*p) = 1;
1012                   TREE_TYPE (*p) = void_type_node;
1013                 }
1014               break;
1015
1016             default:
1017               goto out;
1018             }
1019         }
1020
1021     out:
1022       if (p == NULL || IS_EMPTY_STMT (*p))
1023         temp = NULL_TREE;
1024       else if (temp)
1025         {
1026           /* The wrapper is on the RHS of an assignment that we're pushing
1027              down.  */
1028           gcc_assert (TREE_CODE (temp) == INIT_EXPR
1029                       || TREE_CODE (temp) == GIMPLE_MODIFY_STMT
1030                       || TREE_CODE (temp) == MODIFY_EXPR);
1031           GENERIC_TREE_OPERAND (temp, 1) = *p;
1032           *p = temp;
1033         }
1034       else
1035         {
1036           temp = create_tmp_var (type, "retval");
1037           *p = build2 (INIT_EXPR, type, temp, *p);
1038         }
1039
1040       return temp;
1041     }
1042
1043   return NULL_TREE;
1044 }
1045
1046 /* Prepare calls to builtins to SAVE and RESTORE the stack as well as
1047    a temporary through which they communicate.  */
1048
1049 static void
1050 build_stack_save_restore (tree *save, tree *restore)
1051 {
1052   tree save_call, tmp_var;
1053
1054   save_call =
1055     build_call_expr (implicit_built_in_decls[BUILT_IN_STACK_SAVE], 0);
1056   tmp_var = create_tmp_var (ptr_type_node, "saved_stack");
1057
1058   *save = build_gimple_modify_stmt (tmp_var, save_call);
1059   *restore =
1060     build_call_expr (implicit_built_in_decls[BUILT_IN_STACK_RESTORE],
1061                      1, tmp_var);
1062 }
1063
1064 /* Gimplify a BIND_EXPR.  Just voidify and recurse.  */
1065
1066 static enum gimplify_status
1067 gimplify_bind_expr (tree *expr_p, tree *pre_p)
1068 {
1069   tree bind_expr = *expr_p;
1070   bool old_save_stack = gimplify_ctxp->save_stack;
1071   tree t;
1072
1073   tree temp = voidify_wrapper_expr (bind_expr, NULL);
1074
1075   /* Mark variables seen in this bind expr.  */
1076   for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
1077     {
1078       if (TREE_CODE (t) == VAR_DECL)
1079         {
1080           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
1081
1082           /* Mark variable as local.  */
1083           if (ctx && !is_global_var (t)
1084               && (! DECL_SEEN_IN_BIND_EXPR_P (t)
1085                   || splay_tree_lookup (ctx->variables,
1086                                         (splay_tree_key) t) == NULL))
1087             omp_add_variable (gimplify_omp_ctxp, t, GOVD_LOCAL | GOVD_SEEN);
1088
1089           DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
1090         }
1091
1092       /* Preliminarily mark non-addressed complex variables as eligible
1093          for promotion to gimple registers.  We'll transform their uses
1094          as we find them.  */
1095       if ((TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
1096            || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
1097           && !TREE_THIS_VOLATILE (t)
1098           && (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
1099           && !needs_to_live_in_memory (t))
1100         DECL_GIMPLE_REG_P (t) = 1;
1101     }
1102
1103   gimple_push_bind_expr (bind_expr);
1104   gimplify_ctxp->save_stack = false;
1105
1106   gimplify_to_stmt_list (&BIND_EXPR_BODY (bind_expr));
1107
1108   if (gimplify_ctxp->save_stack)
1109     {
1110       tree stack_save, stack_restore;
1111
1112       /* Save stack on entry and restore it on exit.  Add a try_finally
1113          block to achieve this.  Note that mudflap depends on the
1114          format of the emitted code: see mx_register_decls().  */
1115       build_stack_save_restore (&stack_save, &stack_restore);
1116
1117       t = build2 (TRY_FINALLY_EXPR, void_type_node,
1118                   BIND_EXPR_BODY (bind_expr), NULL_TREE);
1119       append_to_statement_list (stack_restore, &TREE_OPERAND (t, 1));
1120
1121       BIND_EXPR_BODY (bind_expr) = NULL_TREE;
1122       append_to_statement_list (stack_save, &BIND_EXPR_BODY (bind_expr));
1123       append_to_statement_list (t, &BIND_EXPR_BODY (bind_expr));
1124     }
1125
1126   gimplify_ctxp->save_stack = old_save_stack;
1127   gimple_pop_bind_expr ();
1128
1129   if (temp)
1130     {
1131       *expr_p = temp;
1132       append_to_statement_list (bind_expr, pre_p);
1133       return GS_OK;
1134     }
1135   else
1136     return GS_ALL_DONE;
1137 }
1138
1139 /* Gimplify a RETURN_EXPR.  If the expression to be returned is not a
1140    GIMPLE value, it is assigned to a new temporary and the statement is
1141    re-written to return the temporary.
1142
1143    PRE_P points to the list where side effects that must happen before
1144    STMT should be stored.  */
1145
1146 static enum gimplify_status
1147 gimplify_return_expr (tree stmt, tree *pre_p)
1148 {
1149   tree ret_expr = TREE_OPERAND (stmt, 0);
1150   tree result_decl, result;
1151
1152   if (!ret_expr || TREE_CODE (ret_expr) == RESULT_DECL
1153       || ret_expr == error_mark_node)
1154     return GS_ALL_DONE;
1155
1156   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
1157     result_decl = NULL_TREE;
1158   else
1159     {
1160       result_decl = GENERIC_TREE_OPERAND (ret_expr, 0);
1161       if (TREE_CODE (result_decl) == INDIRECT_REF)
1162         /* See through a return by reference.  */
1163         result_decl = TREE_OPERAND (result_decl, 0);
1164
1165       gcc_assert ((TREE_CODE (ret_expr) == MODIFY_EXPR
1166                    || TREE_CODE (ret_expr) == GIMPLE_MODIFY_STMT
1167                    || TREE_CODE (ret_expr) == INIT_EXPR)
1168                   && TREE_CODE (result_decl) == RESULT_DECL);
1169     }
1170
1171   /* If aggregate_value_p is true, then we can return the bare RESULT_DECL.
1172      Recall that aggregate_value_p is FALSE for any aggregate type that is
1173      returned in registers.  If we're returning values in registers, then
1174      we don't want to extend the lifetime of the RESULT_DECL, particularly
1175      across another call.  In addition, for those aggregates for which
1176      hard_function_value generates a PARALLEL, we'll die during normal
1177      expansion of structure assignments; there's special code in expand_return
1178      to handle this case that does not exist in expand_expr.  */
1179   if (!result_decl
1180       || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl)))
1181     result = result_decl;
1182   else if (gimplify_ctxp->return_temp)
1183     result = gimplify_ctxp->return_temp;
1184   else
1185     {
1186       result = create_tmp_var (TREE_TYPE (result_decl), NULL);
1187       if (TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE
1188           || TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE)
1189         DECL_GIMPLE_REG_P (result) = 1;
1190
1191       /* ??? With complex control flow (usually involving abnormal edges),
1192          we can wind up warning about an uninitialized value for this.  Due
1193          to how this variable is constructed and initialized, this is never
1194          true.  Give up and never warn.  */
1195       TREE_NO_WARNING (result) = 1;
1196
1197       gimplify_ctxp->return_temp = result;
1198     }
1199
1200   /* Smash the lhs of the GIMPLE_MODIFY_STMT to the temporary we plan to use.
1201      Then gimplify the whole thing.  */
1202   if (result != result_decl)
1203     GENERIC_TREE_OPERAND (ret_expr, 0) = result;
1204
1205   gimplify_and_add (TREE_OPERAND (stmt, 0), pre_p);
1206
1207   /* If we didn't use a temporary, then the result is just the result_decl.
1208      Otherwise we need a simple copy.  This should already be gimple.  */
1209   if (result == result_decl)
1210     ret_expr = result;
1211   else
1212     ret_expr = build_gimple_modify_stmt (result_decl, result);
1213   TREE_OPERAND (stmt, 0) = ret_expr;
1214
1215   return GS_ALL_DONE;
1216 }
1217
1218 /* Gimplifies a DECL_EXPR node *STMT_P by making any necessary allocation
1219    and initialization explicit.  */
1220
1221 static enum gimplify_status
1222 gimplify_decl_expr (tree *stmt_p)
1223 {
1224   tree stmt = *stmt_p;
1225   tree decl = DECL_EXPR_DECL (stmt);
1226
1227   *stmt_p = NULL_TREE;
1228
1229   if (TREE_TYPE (decl) == error_mark_node)
1230     return GS_ERROR;
1231
1232   if ((TREE_CODE (decl) == TYPE_DECL
1233        || TREE_CODE (decl) == VAR_DECL)
1234       && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
1235     gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
1236
1237   if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
1238     {
1239       tree init = DECL_INITIAL (decl);
1240
1241       if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
1242         {
1243           /* This is a variable-sized decl.  Simplify its size and mark it
1244              for deferred expansion.  Note that mudflap depends on the format
1245              of the emitted code: see mx_register_decls().  */
1246           tree t, addr, ptr_type;
1247
1248           gimplify_one_sizepos (&DECL_SIZE (decl), stmt_p);
1249           gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), stmt_p);
1250
1251           /* All occurrences of this decl in final gimplified code will be
1252              replaced by indirection.  Setting DECL_VALUE_EXPR does two
1253              things: First, it lets the rest of the gimplifier know what
1254              replacement to use.  Second, it lets the debug info know
1255              where to find the value.  */
1256           ptr_type = build_pointer_type (TREE_TYPE (decl));
1257           addr = create_tmp_var (ptr_type, get_name (decl));
1258           DECL_IGNORED_P (addr) = 0;
1259           t = build_fold_indirect_ref (addr);
1260           SET_DECL_VALUE_EXPR (decl, t);
1261           DECL_HAS_VALUE_EXPR_P (decl) = 1;
1262
1263           t = built_in_decls[BUILT_IN_ALLOCA];
1264           t = build_call_expr (t, 1, DECL_SIZE_UNIT (decl));
1265           t = fold_convert (ptr_type, t);
1266           t = build_gimple_modify_stmt (addr, t);
1267
1268           gimplify_and_add (t, stmt_p);
1269
1270           /* Indicate that we need to restore the stack level when the
1271              enclosing BIND_EXPR is exited.  */
1272           gimplify_ctxp->save_stack = true;
1273         }
1274
1275       if (init && init != error_mark_node)
1276         {
1277           if (!TREE_STATIC (decl))
1278             {
1279               DECL_INITIAL (decl) = NULL_TREE;
1280               init = build2 (INIT_EXPR, void_type_node, decl, init);
1281               gimplify_and_add (init, stmt_p);
1282             }
1283           else
1284             /* We must still examine initializers for static variables
1285                as they may contain a label address.  */
1286             walk_tree (&init, force_labels_r, NULL, NULL);
1287         }
1288
1289       /* Some front ends do not explicitly declare all anonymous
1290          artificial variables.  We compensate here by declaring the
1291          variables, though it would be better if the front ends would
1292          explicitly declare them.  */
1293       if (!DECL_SEEN_IN_BIND_EXPR_P (decl)
1294           && DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
1295         gimple_add_tmp_var (decl);
1296     }
1297
1298   return GS_ALL_DONE;
1299 }
1300
1301 /* Gimplify a LOOP_EXPR.  Normally this just involves gimplifying the body
1302    and replacing the LOOP_EXPR with goto, but if the loop contains an
1303    EXIT_EXPR, we need to append a label for it to jump to.  */
1304
1305 static enum gimplify_status
1306 gimplify_loop_expr (tree *expr_p, tree *pre_p)
1307 {
1308   tree saved_label = gimplify_ctxp->exit_label;
1309   tree start_label = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
1310   tree jump_stmt = build_and_jump (&LABEL_EXPR_LABEL (start_label));
1311
1312   append_to_statement_list (start_label, pre_p);
1313
1314   gimplify_ctxp->exit_label = NULL_TREE;
1315
1316   gimplify_and_add (LOOP_EXPR_BODY (*expr_p), pre_p);
1317
1318   if (gimplify_ctxp->exit_label)
1319     {
1320       append_to_statement_list (jump_stmt, pre_p);
1321       *expr_p = build1 (LABEL_EXPR, void_type_node, gimplify_ctxp->exit_label);
1322     }
1323   else
1324     *expr_p = jump_stmt;
1325
1326   gimplify_ctxp->exit_label = saved_label;
1327
1328   return GS_ALL_DONE;
1329 }
1330
1331 /* Compare two case labels.  Because the front end should already have
1332    made sure that case ranges do not overlap, it is enough to only compare
1333    the CASE_LOW values of each case label.  */
1334
1335 static int
1336 compare_case_labels (const void *p1, const void *p2)
1337 {
1338   tree case1 = *(tree *)p1;
1339   tree case2 = *(tree *)p2;
1340
1341   return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
1342 }
1343
1344 /* Sort the case labels in LABEL_VEC in place in ascending order.  */
1345
1346 void
1347 sort_case_labels (tree label_vec)
1348 {
1349   size_t len = TREE_VEC_LENGTH (label_vec);
1350   tree default_case = TREE_VEC_ELT (label_vec, len - 1);
1351
1352   if (CASE_LOW (default_case))
1353     {
1354       size_t i;
1355
1356       /* The last label in the vector should be the default case
1357          but it is not.  */
1358       for (i = 0; i < len; ++i)
1359         {
1360           tree t = TREE_VEC_ELT (label_vec, i);
1361           if (!CASE_LOW (t))
1362             {
1363               default_case = t;
1364               TREE_VEC_ELT (label_vec, i) = TREE_VEC_ELT (label_vec, len - 1);
1365               TREE_VEC_ELT (label_vec, len - 1) = default_case;
1366               break;
1367             }
1368         }
1369     }
1370
1371   qsort (&TREE_VEC_ELT (label_vec, 0), len - 1, sizeof (tree),
1372          compare_case_labels);
1373 }
1374
1375 /* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
1376    branch to.  */
1377
1378 static enum gimplify_status
1379 gimplify_switch_expr (tree *expr_p, tree *pre_p)
1380 {
1381   tree switch_expr = *expr_p;
1382   enum gimplify_status ret;
1383
1384   ret = gimplify_expr (&SWITCH_COND (switch_expr), pre_p, NULL,
1385                        is_gimple_val, fb_rvalue);
1386
1387   if (SWITCH_BODY (switch_expr))
1388     {
1389       VEC(tree,heap) *labels, *saved_labels;
1390       tree label_vec, default_case = NULL_TREE;
1391       size_t i, len;
1392
1393       /* If someone can be bothered to fill in the labels, they can
1394          be bothered to null out the body too.  */
1395       gcc_assert (!SWITCH_LABELS (switch_expr));
1396
1397       saved_labels = gimplify_ctxp->case_labels;
1398       gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
1399
1400       gimplify_to_stmt_list (&SWITCH_BODY (switch_expr));
1401
1402       labels = gimplify_ctxp->case_labels;
1403       gimplify_ctxp->case_labels = saved_labels;
1404
1405       i = 0;
1406       while (i < VEC_length (tree, labels))
1407         {
1408           tree elt = VEC_index (tree, labels, i);
1409           tree low = CASE_LOW (elt);
1410           bool remove_element = FALSE;
1411
1412           if (low)
1413             {
1414               /* Discard empty ranges.  */
1415               tree high = CASE_HIGH (elt);
1416               if (high && INT_CST_LT (high, low))
1417                 remove_element = TRUE;
1418             }
1419           else
1420             {
1421               /* The default case must be the last label in the list.  */
1422               gcc_assert (!default_case);
1423               default_case = elt;
1424               remove_element = TRUE;
1425             }
1426
1427           if (remove_element)
1428             VEC_ordered_remove (tree, labels, i);
1429           else
1430             i++;
1431         }
1432       len = i;
1433
1434       label_vec = make_tree_vec (len + 1);
1435       SWITCH_LABELS (*expr_p) = label_vec;
1436       append_to_statement_list (switch_expr, pre_p);
1437
1438       if (! default_case)
1439         {
1440           /* If the switch has no default label, add one, so that we jump
1441              around the switch body.  */
1442           default_case = build3 (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
1443                                  NULL_TREE, create_artificial_label ());
1444           append_to_statement_list (SWITCH_BODY (switch_expr), pre_p);
1445           *expr_p = build1 (LABEL_EXPR, void_type_node,
1446                             CASE_LABEL (default_case));
1447         }
1448       else
1449         *expr_p = SWITCH_BODY (switch_expr);
1450
1451       for (i = 0; i < len; ++i)
1452         TREE_VEC_ELT (label_vec, i) = VEC_index (tree, labels, i);
1453       TREE_VEC_ELT (label_vec, len) = default_case;
1454
1455       VEC_free (tree, heap, labels);
1456
1457       sort_case_labels (label_vec);
1458
1459       SWITCH_BODY (switch_expr) = NULL;
1460     }
1461   else
1462     gcc_assert (SWITCH_LABELS (switch_expr));
1463
1464   return ret;
1465 }
1466
1467 static enum gimplify_status
1468 gimplify_case_label_expr (tree *expr_p)
1469 {
1470   tree expr = *expr_p;
1471   struct gimplify_ctx *ctxp;
1472
1473   /* Invalid OpenMP programs can play Duff's Device type games with
1474      #pragma omp parallel.  At least in the C front end, we don't
1475      detect such invalid branches until after gimplification.  */
1476   for (ctxp = gimplify_ctxp; ; ctxp = ctxp->prev_context)
1477     if (ctxp->case_labels)
1478       break;
1479
1480   VEC_safe_push (tree, heap, ctxp->case_labels, expr);
1481   *expr_p = build1 (LABEL_EXPR, void_type_node, CASE_LABEL (expr));
1482   return GS_ALL_DONE;
1483 }
1484
1485 /* Build a GOTO to the LABEL_DECL pointed to by LABEL_P, building it first
1486    if necessary.  */
1487
1488 tree
1489 build_and_jump (tree *label_p)
1490 {
1491   if (label_p == NULL)
1492     /* If there's nowhere to jump, just fall through.  */
1493     return NULL_TREE;
1494
1495   if (*label_p == NULL_TREE)
1496     {
1497       tree label = create_artificial_label ();
1498       *label_p = label;
1499     }
1500
1501   return build1 (GOTO_EXPR, void_type_node, *label_p);
1502 }
1503
1504 /* Gimplify an EXIT_EXPR by converting to a GOTO_EXPR inside a COND_EXPR.
1505    This also involves building a label to jump to and communicating it to
1506    gimplify_loop_expr through gimplify_ctxp->exit_label.  */
1507
1508 static enum gimplify_status
1509 gimplify_exit_expr (tree *expr_p)
1510 {
1511   tree cond = TREE_OPERAND (*expr_p, 0);
1512   tree expr;
1513
1514   expr = build_and_jump (&gimplify_ctxp->exit_label);
1515   expr = build3 (COND_EXPR, void_type_node, cond, expr, NULL_TREE);
1516   *expr_p = expr;
1517
1518   return GS_OK;
1519 }
1520
1521 /* A helper function to be called via walk_tree.  Mark all labels under *TP
1522    as being forced.  To be called for DECL_INITIAL of static variables.  */
1523
1524 tree
1525 force_labels_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1526 {
1527   if (TYPE_P (*tp))
1528     *walk_subtrees = 0;
1529   if (TREE_CODE (*tp) == LABEL_DECL)
1530     FORCED_LABEL (*tp) = 1;
1531
1532   return NULL_TREE;
1533 }
1534
1535 /* *EXPR_P is a COMPONENT_REF being used as an rvalue.  If its type is
1536    different from its canonical type, wrap the whole thing inside a
1537    NOP_EXPR and force the type of the COMPONENT_REF to be the canonical
1538    type.
1539
1540    The canonical type of a COMPONENT_REF is the type of the field being
1541    referenced--unless the field is a bit-field which can be read directly
1542    in a smaller mode, in which case the canonical type is the
1543    sign-appropriate type corresponding to that mode.  */
1544
1545 static void
1546 canonicalize_component_ref (tree *expr_p)
1547 {
1548   tree expr = *expr_p;
1549   tree type;
1550
1551   gcc_assert (TREE_CODE (expr) == COMPONENT_REF);
1552
1553   if (INTEGRAL_TYPE_P (TREE_TYPE (expr)))
1554     type = TREE_TYPE (get_unwidened (expr, NULL_TREE));
1555   else
1556     type = TREE_TYPE (TREE_OPERAND (expr, 1));
1557
1558   if (TREE_TYPE (expr) != type)
1559     {
1560       tree old_type = TREE_TYPE (expr);
1561
1562       /* Set the type of the COMPONENT_REF to the underlying type.  */
1563       TREE_TYPE (expr) = type;
1564
1565       /* And wrap the whole thing inside a NOP_EXPR.  */
1566       expr = build1 (NOP_EXPR, old_type, expr);
1567
1568       *expr_p = expr;
1569     }
1570 }
1571
1572 /* If a NOP conversion is changing a pointer to array of foo to a pointer
1573    to foo, embed that change in the ADDR_EXPR by converting
1574       T array[U];
1575       (T *)&array
1576    ==>
1577       &array[L]
1578    where L is the lower bound.  For simplicity, only do this for constant
1579    lower bound.  */
1580
1581 static void
1582 canonicalize_addr_expr (tree *expr_p)
1583 {
1584   tree expr = *expr_p;
1585   tree ctype = TREE_TYPE (expr);
1586   tree addr_expr = TREE_OPERAND (expr, 0);
1587   tree atype = TREE_TYPE (addr_expr);
1588   tree dctype, datype, ddatype, otype, obj_expr;
1589
1590   /* Both cast and addr_expr types should be pointers.  */
1591   if (!POINTER_TYPE_P (ctype) || !POINTER_TYPE_P (atype))
1592     return;
1593
1594   /* The addr_expr type should be a pointer to an array.  */
1595   datype = TREE_TYPE (atype);
1596   if (TREE_CODE (datype) != ARRAY_TYPE)
1597     return;
1598
1599   /* Both cast and addr_expr types should address the same object type.  */
1600   dctype = TREE_TYPE (ctype);
1601   ddatype = TREE_TYPE (datype);
1602   if (!lang_hooks.types_compatible_p (ddatype, dctype))
1603     return;
1604
1605   /* The addr_expr and the object type should match.  */
1606   obj_expr = TREE_OPERAND (addr_expr, 0);
1607   otype = TREE_TYPE (obj_expr);
1608   if (!lang_hooks.types_compatible_p (otype, datype))
1609     return;
1610
1611   /* The lower bound and element sizes must be constant.  */
1612   if (!TYPE_SIZE_UNIT (dctype)
1613       || TREE_CODE (TYPE_SIZE_UNIT (dctype)) != INTEGER_CST
1614       || !TYPE_DOMAIN (datype) || !TYPE_MIN_VALUE (TYPE_DOMAIN (datype))
1615       || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (datype))) != INTEGER_CST)
1616     return;
1617
1618   /* All checks succeeded.  Build a new node to merge the cast.  */
1619   *expr_p = build4 (ARRAY_REF, dctype, obj_expr,
1620                     TYPE_MIN_VALUE (TYPE_DOMAIN (datype)),
1621                     NULL_TREE, NULL_TREE);
1622   *expr_p = build1 (ADDR_EXPR, ctype, *expr_p);
1623 }
1624
1625 /* *EXPR_P is a NOP_EXPR or CONVERT_EXPR.  Remove it and/or other conversions
1626    underneath as appropriate.  */
1627
1628 static enum gimplify_status
1629 gimplify_conversion (tree *expr_p)
1630 {
1631   tree tem;
1632   gcc_assert (TREE_CODE (*expr_p) == NOP_EXPR
1633               || TREE_CODE (*expr_p) == CONVERT_EXPR);
1634   
1635   /* Then strip away all but the outermost conversion.  */
1636   STRIP_SIGN_NOPS (TREE_OPERAND (*expr_p, 0));
1637
1638   /* And remove the outermost conversion if it's useless.  */
1639   if (tree_ssa_useless_type_conversion (*expr_p))
1640     *expr_p = TREE_OPERAND (*expr_p, 0);
1641
1642   /* Attempt to avoid NOP_EXPR by producing reference to a subtype.
1643      For example this fold (subclass *)&A into &A->subclass avoiding
1644      a need for statement.  */
1645   if (TREE_CODE (*expr_p) == NOP_EXPR
1646       && POINTER_TYPE_P (TREE_TYPE (*expr_p))
1647       && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (*expr_p, 0)))
1648       && (tem = maybe_fold_offset_to_reference
1649                   (TREE_OPERAND (*expr_p, 0),
1650                    integer_zero_node, TREE_TYPE (TREE_TYPE (*expr_p)))))
1651     *expr_p = build_fold_addr_expr_with_type (tem, TREE_TYPE (*expr_p));
1652
1653   /* If we still have a conversion at the toplevel,
1654      then canonicalize some constructs.  */
1655   if (TREE_CODE (*expr_p) == NOP_EXPR || TREE_CODE (*expr_p) == CONVERT_EXPR)
1656     {
1657       tree sub = TREE_OPERAND (*expr_p, 0);
1658
1659       /* If a NOP conversion is changing the type of a COMPONENT_REF
1660          expression, then canonicalize its type now in order to expose more
1661          redundant conversions.  */
1662       if (TREE_CODE (sub) == COMPONENT_REF)
1663         canonicalize_component_ref (&TREE_OPERAND (*expr_p, 0));
1664
1665       /* If a NOP conversion is changing a pointer to array of foo
1666          to a pointer to foo, embed that change in the ADDR_EXPR.  */
1667       else if (TREE_CODE (sub) == ADDR_EXPR)
1668         canonicalize_addr_expr (expr_p);
1669     }
1670
1671   return GS_OK;
1672 }
1673
1674 /* Gimplify a VAR_DECL or PARM_DECL.  Returns GS_OK if we expanded a 
1675    DECL_VALUE_EXPR, and it's worth re-examining things.  */
1676
1677 static enum gimplify_status
1678 gimplify_var_or_parm_decl (tree *expr_p)
1679 {
1680   tree decl = *expr_p;
1681
1682   /* ??? If this is a local variable, and it has not been seen in any
1683      outer BIND_EXPR, then it's probably the result of a duplicate
1684      declaration, for which we've already issued an error.  It would
1685      be really nice if the front end wouldn't leak these at all.
1686      Currently the only known culprit is C++ destructors, as seen
1687      in g++.old-deja/g++.jason/binding.C.  */
1688   if (TREE_CODE (decl) == VAR_DECL
1689       && !DECL_SEEN_IN_BIND_EXPR_P (decl)
1690       && !TREE_STATIC (decl) && !DECL_EXTERNAL (decl)
1691       && decl_function_context (decl) == current_function_decl)
1692     {
1693       gcc_assert (errorcount || sorrycount);
1694       return GS_ERROR;
1695     }
1696
1697   /* When within an OpenMP context, notice uses of variables.  */
1698   if (gimplify_omp_ctxp && omp_notice_variable (gimplify_omp_ctxp, decl, true))
1699     return GS_ALL_DONE;
1700
1701   /* If the decl is an alias for another expression, substitute it now.  */
1702   if (DECL_HAS_VALUE_EXPR_P (decl))
1703     {
1704       *expr_p = unshare_expr (DECL_VALUE_EXPR (decl));
1705       return GS_OK;
1706     }
1707
1708   return GS_ALL_DONE;
1709 }
1710
1711
1712 /* Gimplify the COMPONENT_REF, ARRAY_REF, REALPART_EXPR or IMAGPART_EXPR
1713    node pointed to by EXPR_P.
1714
1715       compound_lval
1716               : min_lval '[' val ']'
1717               | min_lval '.' ID
1718               | compound_lval '[' val ']'
1719               | compound_lval '.' ID
1720
1721    This is not part of the original SIMPLE definition, which separates
1722    array and member references, but it seems reasonable to handle them
1723    together.  Also, this way we don't run into problems with union
1724    aliasing; gcc requires that for accesses through a union to alias, the
1725    union reference must be explicit, which was not always the case when we
1726    were splitting up array and member refs.
1727
1728    PRE_P points to the list where side effects that must happen before
1729      *EXPR_P should be stored.
1730
1731    POST_P points to the list where side effects that must happen after
1732      *EXPR_P should be stored.  */
1733
1734 static enum gimplify_status
1735 gimplify_compound_lval (tree *expr_p, tree *pre_p,
1736                         tree *post_p, fallback_t fallback)
1737 {
1738   tree *p;
1739   VEC(tree,heap) *stack;
1740   enum gimplify_status ret = GS_OK, tret;
1741   int i;
1742
1743   /* Create a stack of the subexpressions so later we can walk them in
1744      order from inner to outer.  */
1745   stack = VEC_alloc (tree, heap, 10);
1746
1747   /* We can handle anything that get_inner_reference can deal with.  */
1748   for (p = expr_p; ; p = &TREE_OPERAND (*p, 0))
1749     {
1750     restart:
1751       /* Fold INDIRECT_REFs now to turn them into ARRAY_REFs.  */
1752       if (TREE_CODE (*p) == INDIRECT_REF)
1753         *p = fold_indirect_ref (*p);
1754
1755       if (handled_component_p (*p))
1756         ;
1757       /* Expand DECL_VALUE_EXPR now.  In some cases that may expose
1758          additional COMPONENT_REFs.  */
1759       else if ((TREE_CODE (*p) == VAR_DECL || TREE_CODE (*p) == PARM_DECL)
1760                && gimplify_var_or_parm_decl (p) == GS_OK)
1761         goto restart;
1762       else
1763         break;
1764                
1765       VEC_safe_push (tree, heap, stack, *p);
1766     }
1767
1768   gcc_assert (VEC_length (tree, stack));
1769
1770   /* Now STACK is a stack of pointers to all the refs we've walked through
1771      and P points to the innermost expression.
1772
1773      Java requires that we elaborated nodes in source order.  That
1774      means we must gimplify the inner expression followed by each of
1775      the indices, in order.  But we can't gimplify the inner
1776      expression until we deal with any variable bounds, sizes, or
1777      positions in order to deal with PLACEHOLDER_EXPRs.
1778
1779      So we do this in three steps.  First we deal with the annotations
1780      for any variables in the components, then we gimplify the base,
1781      then we gimplify any indices, from left to right.  */
1782   for (i = VEC_length (tree, stack) - 1; i >= 0; i--)
1783     {
1784       tree t = VEC_index (tree, stack, i);
1785
1786       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1787         {
1788           /* Gimplify the low bound and element type size and put them into
1789              the ARRAY_REF.  If these values are set, they have already been
1790              gimplified.  */
1791           if (!TREE_OPERAND (t, 2))
1792             {
1793               tree low = unshare_expr (array_ref_low_bound (t));
1794               if (!is_gimple_min_invariant (low))
1795                 {
1796                   TREE_OPERAND (t, 2) = low;
1797                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1798                                         is_gimple_formal_tmp_reg, fb_rvalue);
1799                   ret = MIN (ret, tret);
1800                 }
1801             }
1802
1803           if (!TREE_OPERAND (t, 3))
1804             {
1805               tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
1806               tree elmt_size = unshare_expr (array_ref_element_size (t));
1807               tree factor = size_int (TYPE_ALIGN_UNIT (elmt_type));
1808
1809               /* Divide the element size by the alignment of the element
1810                  type (above).  */
1811               elmt_size = size_binop (EXACT_DIV_EXPR, elmt_size, factor);
1812
1813               if (!is_gimple_min_invariant (elmt_size))
1814                 {
1815                   TREE_OPERAND (t, 3) = elmt_size;
1816                   tret = gimplify_expr (&TREE_OPERAND (t, 3), pre_p, post_p,
1817                                         is_gimple_formal_tmp_reg, fb_rvalue);
1818                   ret = MIN (ret, tret);
1819                 }
1820             }
1821         }
1822       else if (TREE_CODE (t) == COMPONENT_REF)
1823         {
1824           /* Set the field offset into T and gimplify it.  */
1825           if (!TREE_OPERAND (t, 2))
1826             {
1827               tree offset = unshare_expr (component_ref_field_offset (t));
1828               tree field = TREE_OPERAND (t, 1);
1829               tree factor
1830                 = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT);
1831
1832               /* Divide the offset by its alignment.  */
1833               offset = size_binop (EXACT_DIV_EXPR, offset, factor);
1834
1835               if (!is_gimple_min_invariant (offset))
1836                 {
1837                   TREE_OPERAND (t, 2) = offset;
1838                   tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1839                                         is_gimple_formal_tmp_reg, fb_rvalue);
1840                   ret = MIN (ret, tret);
1841                 }
1842             }
1843         }
1844     }
1845
1846   /* Step 2 is to gimplify the base expression.  Make sure lvalue is set
1847      so as to match the min_lval predicate.  Failure to do so may result
1848      in the creation of large aggregate temporaries.  */
1849   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval,
1850                         fallback | fb_lvalue);
1851   ret = MIN (ret, tret);
1852
1853   /* And finally, the indices and operands to BIT_FIELD_REF.  During this
1854      loop we also remove any useless conversions.  */
1855   for (; VEC_length (tree, stack) > 0; )
1856     {
1857       tree t = VEC_pop (tree, stack);
1858
1859       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1860         {
1861           /* Gimplify the dimension.
1862              Temporary fix for gcc.c-torture/execute/20040313-1.c.
1863              Gimplify non-constant array indices into a temporary
1864              variable.
1865              FIXME - The real fix is to gimplify post-modify
1866              expressions into a minimal gimple lvalue.  However, that
1867              exposes bugs in alias analysis.  The alias analyzer does
1868              not handle &PTR->FIELD very well.  Will fix after the
1869              branch is merged into mainline (dnovillo 2004-05-03).  */
1870           if (!is_gimple_min_invariant (TREE_OPERAND (t, 1)))
1871             {
1872               tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1873                                     is_gimple_formal_tmp_reg, fb_rvalue);
1874               ret = MIN (ret, tret);
1875             }
1876         }
1877       else if (TREE_CODE (t) == BIT_FIELD_REF)
1878         {
1879           tret = gimplify_expr (&TREE_OPERAND (t, 1), pre_p, post_p,
1880                                 is_gimple_val, fb_rvalue);
1881           ret = MIN (ret, tret);
1882           tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
1883                                 is_gimple_val, fb_rvalue);
1884           ret = MIN (ret, tret);
1885         }
1886
1887       STRIP_USELESS_TYPE_CONVERSION (TREE_OPERAND (t, 0));
1888
1889       /* The innermost expression P may have originally had TREE_SIDE_EFFECTS
1890          set which would have caused all the outer expressions in EXPR_P
1891          leading to P to also have had TREE_SIDE_EFFECTS set.  */
1892       recalculate_side_effects (t);
1893     }
1894
1895   tret = gimplify_expr (p, pre_p, post_p, is_gimple_min_lval, fallback);
1896   ret = MIN (ret, tret);
1897
1898   /* If the outermost expression is a COMPONENT_REF, canonicalize its type.  */
1899   if ((fallback & fb_rvalue) && TREE_CODE (*expr_p) == COMPONENT_REF)
1900     {
1901       canonicalize_component_ref (expr_p);
1902       ret = MIN (ret, GS_OK);
1903     }
1904
1905   VEC_free (tree, heap, stack);
1906
1907   return ret;
1908 }
1909
1910 /*  Gimplify the self modifying expression pointed to by EXPR_P
1911     (++, --, +=, -=).
1912
1913     PRE_P points to the list where side effects that must happen before
1914         *EXPR_P should be stored.
1915
1916     POST_P points to the list where side effects that must happen after
1917         *EXPR_P should be stored.
1918
1919     WANT_VALUE is nonzero iff we want to use the value of this expression
1920         in another expression.  */
1921
1922 static enum gimplify_status
1923 gimplify_self_mod_expr (tree *expr_p, tree *pre_p, tree *post_p,
1924                         bool want_value)
1925 {
1926   enum tree_code code;
1927   tree lhs, lvalue, rhs, t1, post = NULL, *orig_post_p = post_p;
1928   bool postfix;
1929   enum tree_code arith_code;
1930   enum gimplify_status ret;
1931
1932   code = TREE_CODE (*expr_p);
1933
1934   gcc_assert (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR
1935               || code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR);
1936
1937   /* Prefix or postfix?  */
1938   if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1939     /* Faster to treat as prefix if result is not used.  */
1940     postfix = want_value;
1941   else
1942     postfix = false;
1943
1944   /* For postfix, make sure the inner expression's post side effects
1945      are executed after side effects from this expression.  */
1946   if (postfix)
1947     post_p = &post;
1948
1949   /* Add or subtract?  */
1950   if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
1951     arith_code = PLUS_EXPR;
1952   else
1953     arith_code = MINUS_EXPR;
1954
1955   /* Gimplify the LHS into a GIMPLE lvalue.  */
1956   lvalue = TREE_OPERAND (*expr_p, 0);
1957   ret = gimplify_expr (&lvalue, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
1958   if (ret == GS_ERROR)
1959     return ret;
1960
1961   /* Extract the operands to the arithmetic operation.  */
1962   lhs = lvalue;
1963   rhs = TREE_OPERAND (*expr_p, 1);
1964
1965   /* For postfix operator, we evaluate the LHS to an rvalue and then use
1966      that as the result value and in the postqueue operation.  */
1967   if (postfix)
1968     {
1969       ret = gimplify_expr (&lhs, pre_p, post_p, is_gimple_val, fb_rvalue);
1970       if (ret == GS_ERROR)
1971         return ret;
1972     }
1973
1974   /* For POINTERs increment, use POINTER_PLUS_EXPR.  */
1975   if (POINTER_TYPE_P (TREE_TYPE (lhs)))
1976     {
1977       rhs = fold_convert (sizetype, rhs);
1978       if (arith_code == MINUS_EXPR)
1979         rhs = fold_build1 (NEGATE_EXPR, TREE_TYPE (rhs), rhs);
1980       arith_code = POINTER_PLUS_EXPR;
1981     }
1982
1983   t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
1984   t1 = build_gimple_modify_stmt (lvalue, t1);
1985
1986   if (postfix)
1987     {
1988       gimplify_and_add (t1, orig_post_p);
1989       append_to_statement_list (post, orig_post_p);
1990       *expr_p = lhs;
1991       return GS_ALL_DONE;
1992     }
1993   else
1994     {
1995       *expr_p = t1;
1996       return GS_OK;
1997     }
1998 }
1999
2000 /* If *EXPR_P has a variable sized type, wrap it in a WITH_SIZE_EXPR.  */
2001
2002 static void
2003 maybe_with_size_expr (tree *expr_p)
2004 {
2005   tree expr = *expr_p;
2006   tree type = TREE_TYPE (expr);
2007   tree size;
2008
2009   /* If we've already wrapped this or the type is error_mark_node, we can't do
2010      anything.  */
2011   if (TREE_CODE (expr) == WITH_SIZE_EXPR
2012       || type == error_mark_node)
2013     return;
2014
2015   /* If the size isn't known or is a constant, we have nothing to do.  */
2016   size = TYPE_SIZE_UNIT (type);
2017   if (!size || TREE_CODE (size) == INTEGER_CST)
2018     return;
2019
2020   /* Otherwise, make a WITH_SIZE_EXPR.  */
2021   size = unshare_expr (size);
2022   size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, expr);
2023   *expr_p = build2 (WITH_SIZE_EXPR, type, expr, size);
2024 }
2025
2026 /* Subroutine of gimplify_call_expr:  Gimplify a single argument.  */
2027
2028 static enum gimplify_status
2029 gimplify_arg (tree *expr_p, tree *pre_p)
2030 {
2031   bool (*test) (tree);
2032   fallback_t fb;
2033
2034   /* In general, we allow lvalues for function arguments to avoid
2035      extra overhead of copying large aggregates out of even larger
2036      aggregates into temporaries only to copy the temporaries to
2037      the argument list.  Make optimizers happy by pulling out to
2038      temporaries those types that fit in registers.  */
2039   if (is_gimple_reg_type (TREE_TYPE (*expr_p)))
2040     test = is_gimple_val, fb = fb_rvalue;
2041   else
2042     test = is_gimple_lvalue, fb = fb_either;
2043
2044   /* If this is a variable sized type, we must remember the size.  */
2045   maybe_with_size_expr (expr_p);
2046
2047   /* There is a sequence point before a function call.  Side effects in
2048      the argument list must occur before the actual call. So, when
2049      gimplifying arguments, force gimplify_expr to use an internal
2050      post queue which is then appended to the end of PRE_P.  */
2051   return gimplify_expr (expr_p, pre_p, NULL, test, fb);
2052 }
2053
2054 /* Gimplify the CALL_EXPR node pointed to by EXPR_P.  PRE_P points to the
2055    list where side effects that must happen before *EXPR_P should be stored.
2056    WANT_VALUE is true if the result of the call is desired.  */
2057
2058 static enum gimplify_status
2059 gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
2060 {
2061   tree decl, parms, p;
2062   enum gimplify_status ret;
2063   int i, nargs;
2064
2065   gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
2066
2067   /* For reliable diagnostics during inlining, it is necessary that
2068      every call_expr be annotated with file and line.  */
2069   if (! EXPR_HAS_LOCATION (*expr_p))
2070     SET_EXPR_LOCATION (*expr_p, input_location);
2071
2072   /* This may be a call to a builtin function.
2073
2074      Builtin function calls may be transformed into different
2075      (and more efficient) builtin function calls under certain
2076      circumstances.  Unfortunately, gimplification can muck things
2077      up enough that the builtin expanders are not aware that certain
2078      transformations are still valid.
2079
2080      So we attempt transformation/gimplification of the call before
2081      we gimplify the CALL_EXPR.  At this time we do not manage to
2082      transform all calls in the same manner as the expanders do, but
2083      we do transform most of them.  */
2084   decl = get_callee_fndecl (*expr_p);
2085   if (decl && DECL_BUILT_IN (decl))
2086     {
2087       tree new = fold_call_expr (*expr_p, !want_value);
2088
2089       if (new && new != *expr_p)
2090         {
2091           /* There was a transformation of this call which computes the
2092              same value, but in a more efficient way.  Return and try
2093              again.  */
2094           *expr_p = new;
2095           return GS_OK;
2096         }
2097
2098       if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
2099           && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
2100         {
2101           if (call_expr_nargs (*expr_p) < 2)
2102             {
2103               error ("too few arguments to function %<va_start%>");
2104               *expr_p = build_empty_stmt ();
2105               return GS_OK;
2106             }
2107           
2108           if (fold_builtin_next_arg (*expr_p, true))
2109             {
2110               *expr_p = build_empty_stmt ();
2111               return GS_OK;
2112             }
2113           /* Avoid gimplifying the second argument to va_start, which needs
2114              to be the plain PARM_DECL.  */
2115           return gimplify_arg (&CALL_EXPR_ARG (*expr_p, 0), pre_p);
2116         }
2117     }
2118
2119   /* There is a sequence point before the call, so any side effects in
2120      the calling expression must occur before the actual call.  Force
2121      gimplify_expr to use an internal post queue.  */
2122   ret = gimplify_expr (&CALL_EXPR_FN (*expr_p), pre_p, NULL,
2123                        is_gimple_call_addr, fb_rvalue);
2124
2125   nargs = call_expr_nargs (*expr_p);
2126
2127   /* Get argument types for verification.  */
2128   decl = get_callee_fndecl (*expr_p);
2129   parms = NULL_TREE;
2130   if (decl)
2131     parms = TYPE_ARG_TYPES (TREE_TYPE (decl));
2132   else if (POINTER_TYPE_P (TREE_TYPE (CALL_EXPR_FN (*expr_p))))
2133     parms = TYPE_ARG_TYPES (TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (*expr_p))));
2134
2135   /* Verify if the type of the argument matches that of the function
2136      declaration.  If we cannot verify this or there is a mismatch,
2137      mark the call expression so it doesn't get inlined later.  */
2138   if (parms)
2139     {
2140       for (i = 0, p = parms; i < nargs; i++, p = TREE_CHAIN (p))
2141         {
2142           /* If this is a varargs function defer inlining decision
2143              to callee.  */
2144           if (!p)
2145             break;
2146           if (TREE_VALUE (p) == error_mark_node
2147               || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
2148               || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
2149               || !fold_convertible_p (TREE_VALUE (p),
2150                                       CALL_EXPR_ARG (*expr_p, i)))
2151             {
2152               CALL_CANNOT_INLINE_P (*expr_p) = 1;
2153               break;
2154             }
2155         }
2156     }
2157   else if (decl && DECL_ARGUMENTS (decl))
2158     {
2159       for (i = 0, p = DECL_ARGUMENTS (decl); i < nargs;
2160            i++, p = TREE_CHAIN (p))
2161         if (!p
2162             || p == error_mark_node
2163             || CALL_EXPR_ARG (*expr_p, i) == error_mark_node
2164             || !fold_convertible_p (TREE_TYPE (p), CALL_EXPR_ARG (*expr_p, i)))
2165           {
2166             CALL_CANNOT_INLINE_P (*expr_p) = 1;
2167             break;
2168           }
2169     }
2170   else if (nargs != 0)
2171     CALL_CANNOT_INLINE_P (*expr_p) = 1;
2172
2173   /* Finally, gimplify the function arguments.  */
2174   for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
2175        PUSH_ARGS_REVERSED ? i >= 0 : i < nargs;
2176        PUSH_ARGS_REVERSED ? i-- : i++)
2177     {
2178       enum gimplify_status t;
2179
2180       t = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p);
2181
2182       if (t == GS_ERROR)
2183         ret = GS_ERROR;
2184     }
2185
2186   /* Try this again in case gimplification exposed something.  */
2187   if (ret != GS_ERROR)
2188     {
2189       tree new = fold_call_expr (*expr_p, !want_value);
2190
2191       if (new && new != *expr_p)
2192         {
2193           /* There was a transformation of this call which computes the
2194              same value, but in a more efficient way.  Return and try
2195              again.  */
2196           *expr_p = new;
2197           return GS_OK;
2198         }
2199     }
2200
2201   /* If the function is "const" or "pure", then clear TREE_SIDE_EFFECTS on its
2202      decl.  This allows us to eliminate redundant or useless
2203      calls to "const" functions.  */
2204   if (TREE_CODE (*expr_p) == CALL_EXPR
2205       && (call_expr_flags (*expr_p) & (ECF_CONST | ECF_PURE)))
2206     TREE_SIDE_EFFECTS (*expr_p) = 0;
2207
2208   return ret;
2209 }
2210
2211 /* Handle shortcut semantics in the predicate operand of a COND_EXPR by
2212    rewriting it into multiple COND_EXPRs, and possibly GOTO_EXPRs.
2213
2214    TRUE_LABEL_P and FALSE_LABEL_P point to the labels to jump to if the
2215    condition is true or false, respectively.  If null, we should generate
2216    our own to skip over the evaluation of this specific expression.
2217
2218    This function is the tree equivalent of do_jump.
2219
2220    shortcut_cond_r should only be called by shortcut_cond_expr.  */
2221
2222 static tree
2223 shortcut_cond_r (tree pred, tree *true_label_p, tree *false_label_p)
2224 {
2225   tree local_label = NULL_TREE;
2226   tree t, expr = NULL;
2227
2228   /* OK, it's not a simple case; we need to pull apart the COND_EXPR to
2229      retain the shortcut semantics.  Just insert the gotos here;
2230      shortcut_cond_expr will append the real blocks later.  */
2231   if (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2232     {
2233       /* Turn if (a && b) into
2234
2235          if (a); else goto no;
2236          if (b) goto yes; else goto no;
2237          (no:) */
2238
2239       if (false_label_p == NULL)
2240         false_label_p = &local_label;
2241
2242       t = shortcut_cond_r (TREE_OPERAND (pred, 0), NULL, false_label_p);
2243       append_to_statement_list (t, &expr);
2244
2245       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2246                            false_label_p);
2247       append_to_statement_list (t, &expr);
2248     }
2249   else if (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2250     {
2251       /* Turn if (a || b) into
2252
2253          if (a) goto yes;
2254          if (b) goto yes; else goto no;
2255          (yes:) */
2256
2257       if (true_label_p == NULL)
2258         true_label_p = &local_label;
2259
2260       t = shortcut_cond_r (TREE_OPERAND (pred, 0), true_label_p, NULL);
2261       append_to_statement_list (t, &expr);
2262
2263       t = shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2264                            false_label_p);
2265       append_to_statement_list (t, &expr);
2266     }
2267   else if (TREE_CODE (pred) == COND_EXPR)
2268     {
2269       /* As long as we're messing with gotos, turn if (a ? b : c) into
2270          if (a)
2271            if (b) goto yes; else goto no;
2272          else
2273            if (c) goto yes; else goto no;  */
2274       expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (pred, 0),
2275                      shortcut_cond_r (TREE_OPERAND (pred, 1), true_label_p,
2276                                       false_label_p),
2277                      shortcut_cond_r (TREE_OPERAND (pred, 2), true_label_p,
2278                                       false_label_p));
2279     }
2280   else
2281     {
2282       expr = build3 (COND_EXPR, void_type_node, pred,
2283                      build_and_jump (true_label_p),
2284                      build_and_jump (false_label_p));
2285     }
2286
2287   if (local_label)
2288     {
2289       t = build1 (LABEL_EXPR, void_type_node, local_label);
2290       append_to_statement_list (t, &expr);
2291     }
2292
2293   return expr;
2294 }
2295
2296 static tree
2297 shortcut_cond_expr (tree expr)
2298 {
2299   tree pred = TREE_OPERAND (expr, 0);
2300   tree then_ = TREE_OPERAND (expr, 1);
2301   tree else_ = TREE_OPERAND (expr, 2);
2302   tree true_label, false_label, end_label, t;
2303   tree *true_label_p;
2304   tree *false_label_p;
2305   bool emit_end, emit_false, jump_over_else;
2306   bool then_se = then_ && TREE_SIDE_EFFECTS (then_);
2307   bool else_se = else_ && TREE_SIDE_EFFECTS (else_);
2308
2309   /* First do simple transformations.  */
2310   if (!else_se)
2311     {
2312       /* If there is no 'else', turn (a && b) into if (a) if (b).  */
2313       while (TREE_CODE (pred) == TRUTH_ANDIF_EXPR)
2314         {
2315           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2316           then_ = shortcut_cond_expr (expr);
2317           then_se = then_ && TREE_SIDE_EFFECTS (then_);
2318           pred = TREE_OPERAND (pred, 0);
2319           expr = build3 (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
2320         }
2321     }
2322   if (!then_se)
2323     {
2324       /* If there is no 'then', turn
2325            if (a || b); else d
2326          into
2327            if (a); else if (b); else d.  */
2328       while (TREE_CODE (pred) == TRUTH_ORIF_EXPR)
2329         {
2330           TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
2331           else_ = shortcut_cond_expr (expr);
2332           else_se = else_ && TREE_SIDE_EFFECTS (else_);
2333           pred = TREE_OPERAND (pred, 0);
2334           expr = build3 (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
2335         }
2336     }
2337
2338   /* If we're done, great.  */
2339   if (TREE_CODE (pred) != TRUTH_ANDIF_EXPR
2340       && TREE_CODE (pred) != TRUTH_ORIF_EXPR)
2341     return expr;
2342
2343   /* Otherwise we need to mess with gotos.  Change
2344        if (a) c; else d;
2345      to
2346        if (a); else goto no;
2347        c; goto end;
2348        no: d; end:
2349      and recursively gimplify the condition.  */
2350
2351   true_label = false_label = end_label = NULL_TREE;
2352
2353   /* If our arms just jump somewhere, hijack those labels so we don't
2354      generate jumps to jumps.  */
2355
2356   if (then_
2357       && TREE_CODE (then_) == GOTO_EXPR
2358       && TREE_CODE (GOTO_DESTINATION (then_)) == LABEL_DECL)
2359     {
2360       true_label = GOTO_DESTINATION (then_);
2361       then_ = NULL;
2362       then_se = false;
2363     }
2364
2365   if (else_
2366       && TREE_CODE (else_) == GOTO_EXPR
2367       && TREE_CODE (GOTO_DESTINATION (else_)) == LABEL_DECL)
2368     {
2369       false_label = GOTO_DESTINATION (else_);
2370       else_ = NULL;
2371       else_se = false;
2372     }
2373
2374   /* If we aren't hijacking a label for the 'then' branch, it falls through.  */
2375   if (true_label)
2376     true_label_p = &true_label;
2377   else
2378     true_label_p = NULL;
2379
2380   /* The 'else' branch also needs a label if it contains interesting code.  */
2381   if (false_label || else_se)
2382     false_label_p = &false_label;
2383   else
2384     false_label_p = NULL;
2385
2386   /* If there was nothing else in our arms, just forward the label(s).  */
2387   if (!then_se && !else_se)
2388     return shortcut_cond_r (pred, true_label_p, false_label_p);
2389
2390   /* If our last subexpression already has a terminal label, reuse it.  */
2391   if (else_se)
2392     expr = expr_last (else_);
2393   else if (then_se)
2394     expr = expr_last (then_);
2395   else
2396     expr = NULL;
2397   if (expr && TREE_CODE (expr) == LABEL_EXPR)
2398     end_label = LABEL_EXPR_LABEL (expr);
2399
2400   /* If we don't care about jumping to the 'else' branch, jump to the end
2401      if the condition is false.  */
2402   if (!false_label_p)
2403     false_label_p = &end_label;
2404
2405   /* We only want to emit these labels if we aren't hijacking them.  */
2406   emit_end = (end_label == NULL_TREE);
2407   emit_false = (false_label == NULL_TREE);
2408
2409   /* We only emit the jump over the else clause if we have to--if the
2410      then clause may fall through.  Otherwise we can wind up with a
2411      useless jump and a useless label at the end of gimplified code,
2412      which will cause us to think that this conditional as a whole
2413      falls through even if it doesn't.  If we then inline a function
2414      which ends with such a condition, that can cause us to issue an
2415      inappropriate warning about control reaching the end of a
2416      non-void function.  */
2417   jump_over_else = block_may_fallthru (then_);
2418
2419   pred = shortcut_cond_r (pred, true_label_p, false_label_p);
2420
2421   expr = NULL;
2422   append_to_statement_list (pred, &expr);
2423
2424   append_to_statement_list (then_, &expr);
2425   if (else_se)
2426     {
2427       if (jump_over_else)
2428         {
2429           t = build_and_jump (&end_label);
2430           append_to_statement_list (t, &expr);
2431         }
2432       if (emit_false)
2433         {
2434           t = build1 (LABEL_EXPR, void_type_node, false_label);
2435           append_to_statement_list (t, &expr);
2436         }
2437       append_to_statement_list (else_, &expr);
2438     }
2439   if (emit_end && end_label)
2440     {
2441       t = build1 (LABEL_EXPR, void_type_node, end_label);
2442       append_to_statement_list (t, &expr);
2443     }
2444
2445   return expr;
2446 }
2447
2448 /* EXPR is used in a boolean context; make sure it has BOOLEAN_TYPE.  */
2449
2450 tree
2451 gimple_boolify (tree expr)
2452 {
2453   tree type = TREE_TYPE (expr);
2454
2455   if (TREE_CODE (type) == BOOLEAN_TYPE)
2456     return expr;
2457
2458   switch (TREE_CODE (expr))
2459     {
2460     case TRUTH_AND_EXPR:
2461     case TRUTH_OR_EXPR:
2462     case TRUTH_XOR_EXPR:
2463     case TRUTH_ANDIF_EXPR:
2464     case TRUTH_ORIF_EXPR:
2465       /* Also boolify the arguments of truth exprs.  */
2466       TREE_OPERAND (expr, 1) = gimple_boolify (TREE_OPERAND (expr, 1));
2467       /* FALLTHRU */
2468
2469     case TRUTH_NOT_EXPR:
2470       TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2471       /* FALLTHRU */
2472
2473     case EQ_EXPR: case NE_EXPR:
2474     case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2475       /* These expressions always produce boolean results.  */
2476       TREE_TYPE (expr) = boolean_type_node;
2477       return expr;
2478
2479     default:
2480       /* Other expressions that get here must have boolean values, but
2481          might need to be converted to the appropriate mode.  */
2482       return fold_convert (boolean_type_node, expr);
2483     }
2484 }
2485
2486 /*  Convert the conditional expression pointed to by EXPR_P '(p) ? a : b;'
2487     into
2488
2489     if (p)                      if (p)
2490       t1 = a;                     a;
2491     else                or      else
2492       t1 = b;                     b;
2493     t1;
2494
2495     The second form is used when *EXPR_P is of type void.
2496
2497     TARGET is the tree for T1 above.
2498
2499     PRE_P points to the list where side effects that must happen before
2500       *EXPR_P should be stored.  */
2501
2502 static enum gimplify_status
2503 gimplify_cond_expr (tree *expr_p, tree *pre_p, fallback_t fallback)
2504 {
2505   tree expr = *expr_p;
2506   tree tmp, tmp2, type;
2507   enum gimplify_status ret;
2508
2509   type = TREE_TYPE (expr);
2510
2511   /* If this COND_EXPR has a value, copy the values into a temporary within
2512      the arms.  */
2513   if (! VOID_TYPE_P (type))
2514     {
2515       tree result;
2516
2517       if ((fallback & fb_lvalue) == 0)
2518         {
2519           result = tmp2 = tmp = create_tmp_var (TREE_TYPE (expr), "iftmp");
2520           ret = GS_ALL_DONE;
2521         }
2522       else
2523         {
2524           tree type = build_pointer_type (TREE_TYPE (expr));
2525
2526           if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2527             TREE_OPERAND (expr, 1) =
2528               build_fold_addr_expr (TREE_OPERAND (expr, 1));
2529
2530           if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2531             TREE_OPERAND (expr, 2) =
2532               build_fold_addr_expr (TREE_OPERAND (expr, 2));
2533           
2534           tmp2 = tmp = create_tmp_var (type, "iftmp");
2535
2536           expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (expr, 0),
2537                          TREE_OPERAND (expr, 1), TREE_OPERAND (expr, 2));
2538
2539           result = build_fold_indirect_ref (tmp);
2540           ret = GS_ALL_DONE;
2541         }
2542
2543       /* Build the then clause, 't1 = a;'.  But don't build an assignment
2544          if this branch is void; in C++ it can be, if it's a throw.  */
2545       if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node)
2546         TREE_OPERAND (expr, 1)
2547           = build_gimple_modify_stmt (tmp, TREE_OPERAND (expr, 1));
2548
2549       /* Build the else clause, 't1 = b;'.  */
2550       if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node)
2551         TREE_OPERAND (expr, 2)
2552           = build_gimple_modify_stmt (tmp2, TREE_OPERAND (expr, 2));
2553
2554       TREE_TYPE (expr) = void_type_node;
2555       recalculate_side_effects (expr);
2556
2557       /* Move the COND_EXPR to the prequeue.  */
2558       gimplify_and_add (expr, pre_p);
2559
2560       *expr_p = result;
2561       return ret;
2562     }
2563
2564   /* Make sure the condition has BOOLEAN_TYPE.  */
2565   TREE_OPERAND (expr, 0) = gimple_boolify (TREE_OPERAND (expr, 0));
2566
2567   /* Break apart && and || conditions.  */
2568   if (TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ANDIF_EXPR
2569       || TREE_CODE (TREE_OPERAND (expr, 0)) == TRUTH_ORIF_EXPR)
2570     {
2571       expr = shortcut_cond_expr (expr);
2572
2573       if (expr != *expr_p)
2574         {
2575           *expr_p = expr;
2576
2577           /* We can't rely on gimplify_expr to re-gimplify the expanded
2578              form properly, as cleanups might cause the target labels to be
2579              wrapped in a TRY_FINALLY_EXPR.  To prevent that, we need to
2580              set up a conditional context.  */
2581           gimple_push_condition ();
2582           gimplify_stmt (expr_p);
2583           gimple_pop_condition (pre_p);
2584
2585           return GS_ALL_DONE;
2586         }
2587     }
2588
2589   /* Now do the normal gimplification.  */
2590   ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2591                        is_gimple_condexpr, fb_rvalue);
2592
2593   gimple_push_condition ();
2594
2595   gimplify_to_stmt_list (&TREE_OPERAND (expr, 1));
2596   gimplify_to_stmt_list (&TREE_OPERAND (expr, 2));
2597   recalculate_side_effects (expr);
2598
2599   gimple_pop_condition (pre_p);
2600
2601   if (ret == GS_ERROR)
2602     ;
2603   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2604     ret = GS_ALL_DONE;
2605   else if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 2)))
2606     /* Rewrite "if (a); else b" to "if (!a) b"  */
2607     {
2608       TREE_OPERAND (expr, 0) = invert_truthvalue (TREE_OPERAND (expr, 0));
2609       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, NULL,
2610                            is_gimple_condexpr, fb_rvalue);
2611
2612       tmp = TREE_OPERAND (expr, 1);
2613       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 2);
2614       TREE_OPERAND (expr, 2) = tmp;
2615     }
2616   else
2617     /* Both arms are empty; replace the COND_EXPR with its predicate.  */
2618     expr = TREE_OPERAND (expr, 0);
2619
2620   *expr_p = expr;
2621   return ret;
2622 }
2623
2624 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2625    a call to __builtin_memcpy.  */
2626
2627 static enum gimplify_status
2628 gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value)
2629 {
2630   tree t, to, to_ptr, from, from_ptr;
2631
2632   to = GENERIC_TREE_OPERAND (*expr_p, 0);
2633   from = GENERIC_TREE_OPERAND (*expr_p, 1);
2634
2635   from_ptr = build_fold_addr_expr (from);
2636
2637   to_ptr = build_fold_addr_expr (to);
2638   t = implicit_built_in_decls[BUILT_IN_MEMCPY];
2639   t = build_call_expr (t, 3, to_ptr, from_ptr, size);
2640
2641   if (want_value)
2642     {
2643       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2644       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2645     }
2646
2647   *expr_p = t;
2648   return GS_OK;
2649 }
2650
2651 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with
2652    a call to __builtin_memset.  In this case we know that the RHS is
2653    a CONSTRUCTOR with an empty element list.  */
2654
2655 static enum gimplify_status
2656 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value)
2657 {
2658   tree t, to, to_ptr;
2659
2660   to = GENERIC_TREE_OPERAND (*expr_p, 0);
2661
2662   to_ptr = build_fold_addr_expr (to);
2663   t = implicit_built_in_decls[BUILT_IN_MEMSET];
2664   t = build_call_expr (t, 3, to_ptr, integer_zero_node, size);
2665
2666   if (want_value)
2667     {
2668       t = build1 (NOP_EXPR, TREE_TYPE (to_ptr), t);
2669       t = build1 (INDIRECT_REF, TREE_TYPE (to), t);
2670     }
2671
2672   *expr_p = t;
2673   return GS_OK;
2674 }
2675
2676 /* A subroutine of gimplify_init_ctor_preeval.  Called via walk_tree,
2677    determine, cautiously, if a CONSTRUCTOR overlaps the lhs of an
2678    assignment.  Returns non-null if we detect a potential overlap.  */
2679
2680 struct gimplify_init_ctor_preeval_data
2681 {
2682   /* The base decl of the lhs object.  May be NULL, in which case we
2683      have to assume the lhs is indirect.  */
2684   tree lhs_base_decl;
2685
2686   /* The alias set of the lhs object.  */
2687   int lhs_alias_set;
2688 };
2689
2690 static tree
2691 gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
2692 {
2693   struct gimplify_init_ctor_preeval_data *data
2694     = (struct gimplify_init_ctor_preeval_data *) xdata;
2695   tree t = *tp;
2696
2697   /* If we find the base object, obviously we have overlap.  */
2698   if (data->lhs_base_decl == t)
2699     return t;
2700
2701   /* If the constructor component is indirect, determine if we have a
2702      potential overlap with the lhs.  The only bits of information we
2703      have to go on at this point are addressability and alias sets.  */
2704   if (TREE_CODE (t) == INDIRECT_REF
2705       && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2706       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
2707     return t;
2708
2709   /* If the constructor component is a call, determine if it can hide a
2710      potential overlap with the lhs through an INDIRECT_REF like above.  */
2711   if (TREE_CODE (t) == CALL_EXPR)
2712     {
2713       tree type, fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (t)));
2714
2715       for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
2716         if (POINTER_TYPE_P (TREE_VALUE (type))
2717             && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
2718             && alias_sets_conflict_p (data->lhs_alias_set,
2719                                       get_alias_set
2720                                         (TREE_TYPE (TREE_VALUE (type)))))
2721           return t;
2722     }
2723
2724   if (IS_TYPE_OR_DECL_P (t))
2725     *walk_subtrees = 0;
2726   return NULL;
2727 }
2728
2729 /* A subroutine of gimplify_init_constructor.  Pre-evaluate *EXPR_P,
2730    force values that overlap with the lhs (as described by *DATA)
2731    into temporaries.  */
2732
2733 static void
2734 gimplify_init_ctor_preeval (tree *expr_p, tree *pre_p, tree *post_p,
2735                             struct gimplify_init_ctor_preeval_data *data)
2736 {
2737   enum gimplify_status one;
2738
2739   /* If the value is invariant, then there's nothing to pre-evaluate.
2740      But ensure it doesn't have any side-effects since a SAVE_EXPR is
2741      invariant but has side effects and might contain a reference to
2742      the object we're initializing.  */
2743   if (TREE_INVARIANT (*expr_p) && !TREE_SIDE_EFFECTS (*expr_p))
2744     return;
2745
2746   /* If the type has non-trivial constructors, we can't pre-evaluate.  */
2747   if (TREE_ADDRESSABLE (TREE_TYPE (*expr_p)))
2748     return;
2749
2750   /* Recurse for nested constructors.  */
2751   if (TREE_CODE (*expr_p) == CONSTRUCTOR)
2752     {
2753       unsigned HOST_WIDE_INT ix;
2754       constructor_elt *ce;
2755       VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (*expr_p);
2756
2757       for (ix = 0; VEC_iterate (constructor_elt, v, ix, ce); ix++)
2758         gimplify_init_ctor_preeval (&ce->value, pre_p, post_p, data);
2759       return;
2760     }
2761
2762   /* If this is a variable sized type, we must remember the size.  */
2763   maybe_with_size_expr (expr_p);
2764
2765   /* Gimplify the constructor element to something appropriate for the rhs
2766      of a MODIFY_EXPR.  Given that we know the lhs is an aggregate, we know
2767      the gimplifier will consider this a store to memory.  Doing this
2768      gimplification now means that we won't have to deal with complicated
2769      language-specific trees, nor trees like SAVE_EXPR that can induce
2770      exponential search behavior.  */
2771   one = gimplify_expr (expr_p, pre_p, post_p, is_gimple_mem_rhs, fb_rvalue);
2772   if (one == GS_ERROR)
2773     {
2774       *expr_p = NULL;
2775       return;
2776     }
2777
2778   /* If we gimplified to a bare decl, we can be sure that it doesn't overlap
2779      with the lhs, since "a = { .x=a }" doesn't make sense.  This will
2780      always be true for all scalars, since is_gimple_mem_rhs insists on a
2781      temporary variable for them.  */
2782   if (DECL_P (*expr_p))
2783     return;
2784
2785   /* If this is of variable size, we have no choice but to assume it doesn't
2786      overlap since we can't make a temporary for it.  */
2787   if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
2788     return;
2789
2790   /* Otherwise, we must search for overlap ...  */
2791   if (!walk_tree (expr_p, gimplify_init_ctor_preeval_1, data, NULL))
2792     return;
2793
2794   /* ... and if found, force the value into a temporary.  */
2795   *expr_p = get_formal_tmp_var (*expr_p, pre_p);
2796 }
2797
2798 /* A subroutine of gimplify_init_ctor_eval.  Create a loop for
2799    a RANGE_EXPR in a CONSTRUCTOR for an array.
2800
2801       var = lower;
2802     loop_entry:
2803       object[var] = value;
2804       if (var == upper)
2805         goto loop_exit;
2806       var = var + 1;
2807       goto loop_entry;
2808     loop_exit:
2809
2810    We increment var _after_ the loop exit check because we might otherwise
2811    fail if upper == TYPE_MAX_VALUE (type for upper).
2812
2813    Note that we never have to deal with SAVE_EXPRs here, because this has
2814    already been taken care of for us, in gimplify_init_ctor_preeval().  */
2815
2816 static void gimplify_init_ctor_eval (tree, VEC(constructor_elt,gc) *,
2817                                      tree *, bool);
2818
2819 static void
2820 gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
2821                                tree value, tree array_elt_type,
2822                                tree *pre_p, bool cleared)
2823 {
2824   tree loop_entry_label, loop_exit_label;
2825   tree var, var_type, cref, tmp;
2826
2827   loop_entry_label = create_artificial_label ();
2828   loop_exit_label = create_artificial_label ();
2829
2830   /* Create and initialize the index variable.  */
2831   var_type = TREE_TYPE (upper);
2832   var = create_tmp_var (var_type, NULL);
2833   append_to_statement_list (build_gimple_modify_stmt (var, lower), pre_p);
2834
2835   /* Add the loop entry label.  */
2836   append_to_statement_list (build1 (LABEL_EXPR,
2837                                     void_type_node,
2838                                     loop_entry_label),
2839                             pre_p);
2840
2841   /* Build the reference.  */
2842   cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
2843                  var, NULL_TREE, NULL_TREE);
2844
2845   /* If we are a constructor, just call gimplify_init_ctor_eval to do
2846      the store.  Otherwise just assign value to the reference.  */
2847
2848   if (TREE_CODE (value) == CONSTRUCTOR)
2849     /* NB we might have to call ourself recursively through
2850        gimplify_init_ctor_eval if the value is a constructor.  */
2851     gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2852                              pre_p, cleared);
2853   else
2854     append_to_statement_list (build_gimple_modify_stmt (cref, value), pre_p);
2855
2856   /* We exit the loop when the index var is equal to the upper bound.  */
2857   gimplify_and_add (build3 (COND_EXPR, void_type_node,
2858                             build2 (EQ_EXPR, boolean_type_node,
2859                                     var, upper),
2860                             build1 (GOTO_EXPR,
2861                                     void_type_node,
2862                                     loop_exit_label),
2863                             NULL_TREE),
2864                     pre_p);
2865
2866   /* Otherwise, increment the index var...  */
2867   tmp = build2 (PLUS_EXPR, var_type, var,
2868                 fold_convert (var_type, integer_one_node));
2869   append_to_statement_list (build_gimple_modify_stmt (var, tmp), pre_p);
2870
2871   /* ...and jump back to the loop entry.  */
2872   append_to_statement_list (build1 (GOTO_EXPR,
2873                                     void_type_node,
2874                                     loop_entry_label),
2875                             pre_p);
2876
2877   /* Add the loop exit label.  */
2878   append_to_statement_list (build1 (LABEL_EXPR,
2879                                     void_type_node,
2880                                     loop_exit_label),
2881                             pre_p);
2882 }
2883
2884 /* Return true if FDECL is accessing a field that is zero sized.  */
2885    
2886 static bool
2887 zero_sized_field_decl (tree fdecl)
2888 {
2889   if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl) 
2890       && integer_zerop (DECL_SIZE (fdecl)))
2891     return true;
2892   return false;
2893 }
2894
2895 /* Return true if TYPE is zero sized.  */
2896    
2897 static bool
2898 zero_sized_type (tree type)
2899 {
2900   if (AGGREGATE_TYPE_P (type) && TYPE_SIZE (type)
2901       && integer_zerop (TYPE_SIZE (type)))
2902     return true;
2903   return false;
2904 }
2905
2906 /* A subroutine of gimplify_init_constructor.  Generate individual
2907    MODIFY_EXPRs for a CONSTRUCTOR.  OBJECT is the LHS against which the
2908    assignments should happen.  ELTS is the CONSTRUCTOR_ELTS of the
2909    CONSTRUCTOR.  CLEARED is true if the entire LHS object has been
2910    zeroed first.  */
2911
2912 static void
2913 gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
2914                          tree *pre_p, bool cleared)
2915 {
2916   tree array_elt_type = NULL;
2917   unsigned HOST_WIDE_INT ix;
2918   tree purpose, value;
2919
2920   if (TREE_CODE (TREE_TYPE (object)) == ARRAY_TYPE)
2921     array_elt_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (object)));
2922
2923   FOR_EACH_CONSTRUCTOR_ELT (elts, ix, purpose, value)
2924     {
2925       tree cref, init;
2926
2927       /* NULL values are created above for gimplification errors.  */
2928       if (value == NULL)
2929         continue;
2930
2931       if (cleared && initializer_zerop (value))
2932         continue;
2933
2934       /* ??? Here's to hoping the front end fills in all of the indices,
2935          so we don't have to figure out what's missing ourselves.  */
2936       gcc_assert (purpose);
2937
2938       /* Skip zero-sized fields, unless value has side-effects.  This can
2939          happen with calls to functions returning a zero-sized type, which
2940          we shouldn't discard.  As a number of downstream passes don't
2941          expect sets of zero-sized fields, we rely on the gimplification of
2942          the MODIFY_EXPR we make below to drop the assignment statement.  */
2943       if (! TREE_SIDE_EFFECTS (value) && zero_sized_field_decl (purpose))
2944         continue;
2945
2946       /* If we have a RANGE_EXPR, we have to build a loop to assign the
2947          whole range.  */
2948       if (TREE_CODE (purpose) == RANGE_EXPR)
2949         {
2950           tree lower = TREE_OPERAND (purpose, 0);
2951           tree upper = TREE_OPERAND (purpose, 1);
2952
2953           /* If the lower bound is equal to upper, just treat it as if
2954              upper was the index.  */
2955           if (simple_cst_equal (lower, upper))
2956             purpose = upper;
2957           else
2958             {
2959               gimplify_init_ctor_eval_range (object, lower, upper, value,
2960                                              array_elt_type, pre_p, cleared);
2961               continue;
2962             }
2963         }
2964
2965       if (array_elt_type)
2966         {
2967           cref = build4 (ARRAY_REF, array_elt_type, unshare_expr (object),
2968                          purpose, NULL_TREE, NULL_TREE);
2969         }
2970       else
2971         {
2972           gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
2973           cref = build3 (COMPONENT_REF, TREE_TYPE (purpose),
2974                          unshare_expr (object), purpose, NULL_TREE);
2975         }
2976
2977       if (TREE_CODE (value) == CONSTRUCTOR
2978           && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
2979         gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
2980                                  pre_p, cleared);
2981       else
2982         {
2983           init = build2 (INIT_EXPR, TREE_TYPE (cref), cref, value);
2984           gimplify_and_add (init, pre_p);
2985         }
2986     }
2987 }
2988
2989 /* A subroutine of gimplify_modify_expr.  Break out elements of a
2990    CONSTRUCTOR used as an initializer into separate MODIFY_EXPRs.
2991
2992    Note that we still need to clear any elements that don't have explicit
2993    initializers, so if not all elements are initialized we keep the
2994    original MODIFY_EXPR, we just remove all of the constructor elements.  */
2995
2996 static enum gimplify_status
2997 gimplify_init_constructor (tree *expr_p, tree *pre_p,
2998                            tree *post_p, bool want_value)
2999 {
3000   tree object;
3001   tree ctor = GENERIC_TREE_OPERAND (*expr_p, 1);
3002   tree type = TREE_TYPE (ctor);
3003   enum gimplify_status ret;
3004   VEC(constructor_elt,gc) *elts;
3005
3006   if (TREE_CODE (ctor) != CONSTRUCTOR)
3007     return GS_UNHANDLED;
3008
3009   ret = gimplify_expr (&GENERIC_TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3010                        is_gimple_lvalue, fb_lvalue);
3011   if (ret == GS_ERROR)
3012     return ret;
3013   object = GENERIC_TREE_OPERAND (*expr_p, 0);
3014
3015   elts = CONSTRUCTOR_ELTS (ctor);
3016
3017   ret = GS_ALL_DONE;
3018   switch (TREE_CODE (type))
3019     {
3020     case RECORD_TYPE:
3021     case UNION_TYPE:
3022     case QUAL_UNION_TYPE:
3023     case ARRAY_TYPE:
3024       {
3025         struct gimplify_init_ctor_preeval_data preeval_data;
3026         HOST_WIDE_INT num_type_elements, num_ctor_elements;
3027         HOST_WIDE_INT num_nonzero_elements;
3028         bool cleared, valid_const_initializer;
3029
3030         /* Aggregate types must lower constructors to initialization of
3031            individual elements.  The exception is that a CONSTRUCTOR node
3032            with no elements indicates zero-initialization of the whole.  */
3033         if (VEC_empty (constructor_elt, elts))
3034           break;
3035
3036         /* Fetch information about the constructor to direct later processing.
3037            We might want to make static versions of it in various cases, and
3038            can only do so if it known to be a valid constant initializer.  */
3039         valid_const_initializer
3040           = categorize_ctor_elements (ctor, &num_nonzero_elements,
3041                                       &num_ctor_elements, &cleared);
3042
3043         /* If a const aggregate variable is being initialized, then it
3044            should never be a lose to promote the variable to be static.  */
3045         if (valid_const_initializer
3046             && num_nonzero_elements > 1
3047             && TREE_READONLY (object)
3048             && TREE_CODE (object) == VAR_DECL)
3049           {
3050             DECL_INITIAL (object) = ctor;
3051             TREE_STATIC (object) = 1;
3052             if (!DECL_NAME (object))
3053               DECL_NAME (object) = create_tmp_var_name ("C");
3054             walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
3055
3056             /* ??? C++ doesn't automatically append a .<number> to the
3057                assembler name, and even when it does, it looks a FE private
3058                data structures to figure out what that number should be,
3059                which are not set for this variable.  I suppose this is
3060                important for local statics for inline functions, which aren't
3061                "local" in the object file sense.  So in order to get a unique
3062                TU-local symbol, we must invoke the lhd version now.  */
3063             lhd_set_decl_assembler_name (object);
3064
3065             *expr_p = NULL_TREE;
3066             break;
3067           }
3068
3069         /* If there are "lots" of initialized elements, even discounting
3070            those that are not address constants (and thus *must* be
3071            computed at runtime), then partition the constructor into
3072            constant and non-constant parts.  Block copy the constant
3073            parts in, then generate code for the non-constant parts.  */
3074         /* TODO.  There's code in cp/typeck.c to do this.  */
3075
3076         num_type_elements = count_type_elements (type, true);
3077
3078         /* If count_type_elements could not determine number of type elements
3079            for a constant-sized object, assume clearing is needed.
3080            Don't do this for variable-sized objects, as store_constructor
3081            will ignore the clearing of variable-sized objects.  */
3082         if (num_type_elements < 0 && int_size_in_bytes (type) >= 0)
3083           cleared = true;
3084         /* If there are "lots" of zeros, then block clear the object first.  */
3085         else if (num_type_elements - num_nonzero_elements > CLEAR_RATIO
3086                  && num_nonzero_elements < num_type_elements/4)
3087           cleared = true;
3088         /* ??? This bit ought not be needed.  For any element not present
3089            in the initializer, we should simply set them to zero.  Except
3090            we'd need to *find* the elements that are not present, and that
3091            requires trickery to avoid quadratic compile-time behavior in
3092            large cases or excessive memory use in small cases.  */
3093         else if (num_ctor_elements < num_type_elements)
3094           cleared = true;
3095
3096         /* If there are "lots" of initialized elements, and all of them
3097            are valid address constants, then the entire initializer can
3098            be dropped to memory, and then memcpy'd out.  Don't do this
3099            for sparse arrays, though, as it's more efficient to follow
3100            the standard CONSTRUCTOR behavior of memset followed by
3101            individual element initialization.  */
3102         if (valid_const_initializer && !cleared)
3103           {
3104             HOST_WIDE_INT size = int_size_in_bytes (type);
3105             unsigned int align;
3106
3107             /* ??? We can still get unbounded array types, at least
3108                from the C++ front end.  This seems wrong, but attempt
3109                to work around it for now.  */
3110             if (size < 0)
3111               {
3112                 size = int_size_in_bytes (TREE_TYPE (object));
3113                 if (size >= 0)
3114                   TREE_TYPE (ctor) = type = TREE_TYPE (object);
3115               }
3116
3117             /* Find the maximum alignment we can assume for the object.  */
3118             /* ??? Make use of DECL_OFFSET_ALIGN.  */
3119             if (DECL_P (object))
3120               align = DECL_ALIGN (object);
3121             else
3122               align = TYPE_ALIGN (type);
3123
3124             if (size > 0 && !can_move_by_pieces (size, align))
3125               {
3126                 tree new = create_tmp_var_raw (type, "C");
3127
3128                 gimple_add_tmp_var (new);
3129                 TREE_STATIC (new) = 1;
3130                 TREE_READONLY (new) = 1;
3131                 DECL_INITIAL (new) = ctor;
3132                 if (align > DECL_ALIGN (new))
3133                   {
3134                     DECL_ALIGN (new) = align;
3135                     DECL_USER_ALIGN (new) = 1;
3136                   }
3137                 walk_tree (&DECL_INITIAL (new), force_labels_r, NULL, NULL);
3138
3139                 GENERIC_TREE_OPERAND (*expr_p, 1) = new;
3140
3141                 /* This is no longer an assignment of a CONSTRUCTOR, but
3142                    we still may have processing to do on the LHS.  So
3143                    pretend we didn't do anything here to let that happen.  */
3144                 return GS_UNHANDLED;
3145               }
3146           }
3147
3148         /* If there are nonzero elements, pre-evaluate to capture elements
3149            overlapping with the lhs into temporaries.  We must do this before
3150            clearing to fetch the values before they are zeroed-out.  */
3151         if (num_nonzero_elements > 0)
3152           {
3153             preeval_data.lhs_base_decl = get_base_address (object);
3154             if (!DECL_P (preeval_data.lhs_base_decl))
3155               preeval_data.lhs_base_decl = NULL;
3156             preeval_data.lhs_alias_set = get_alias_set (object);
3157
3158             gimplify_init_ctor_preeval (&GENERIC_TREE_OPERAND (*expr_p, 1),
3159                                         pre_p, post_p, &preeval_data);
3160           }
3161
3162         if (cleared)
3163           {
3164             /* Zap the CONSTRUCTOR element list, which simplifies this case.
3165                Note that we still have to gimplify, in order to handle the
3166                case of variable sized types.  Avoid shared tree structures.  */
3167             CONSTRUCTOR_ELTS (ctor) = NULL;
3168             object = unshare_expr (object);
3169             gimplify_stmt (expr_p);
3170             append_to_statement_list (*expr_p, pre_p);
3171           }
3172
3173         /* If we have not block cleared the object, or if there are nonzero
3174            elements in the constructor, add assignments to the individual
3175            scalar fields of the object.  */
3176         if (!cleared || num_nonzero_elements > 0)
3177           gimplify_init_ctor_eval (object, elts, pre_p, cleared);
3178
3179         *expr_p = NULL_TREE;
3180       }
3181       break;
3182
3183     case COMPLEX_TYPE:
3184       {
3185         tree r, i;
3186
3187         /* Extract the real and imaginary parts out of the ctor.  */
3188         gcc_assert (VEC_length (constructor_elt, elts) == 2);
3189         r = VEC_index (constructor_elt, elts, 0)->value;
3190         i = VEC_index (constructor_elt, elts, 1)->value;
3191         if (r == NULL || i == NULL)
3192           {
3193             tree zero = fold_convert (TREE_TYPE (type), integer_zero_node);
3194             if (r == NULL)
3195               r = zero;
3196             if (i == NULL)
3197               i = zero;
3198           }
3199
3200         /* Complex types have either COMPLEX_CST or COMPLEX_EXPR to
3201            represent creation of a complex value.  */
3202         if (TREE_CONSTANT (r) && TREE_CONSTANT (i))
3203           {
3204             ctor = build_complex (type, r, i);
3205             TREE_OPERAND (*expr_p, 1) = ctor;
3206           }
3207         else
3208           {
3209             ctor = build2 (COMPLEX_EXPR, type, r, i);
3210             TREE_OPERAND (*expr_p, 1) = ctor;
3211             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
3212                                  rhs_predicate_for (TREE_OPERAND (*expr_p, 0)),
3213                                  fb_rvalue);
3214           }
3215       }
3216       break;
3217
3218     case VECTOR_TYPE:
3219       {
3220         unsigned HOST_WIDE_INT ix;
3221         constructor_elt *ce;
3222
3223         /* Go ahead and simplify constant constructors to VECTOR_CST.  */
3224         if (TREE_CONSTANT (ctor))
3225           {
3226             bool constant_p = true;
3227             tree value;
3228
3229             /* Even when ctor is constant, it might contain non-*_CST
3230               elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
3231               belong into VECTOR_CST nodes.  */
3232             FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
3233               if (!CONSTANT_CLASS_P (value))
3234                 {
3235                   constant_p = false;
3236                   break;
3237                 }
3238
3239             if (constant_p)
3240               {
3241                 TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts);
3242                 break;
3243               }
3244
3245             /* Don't reduce a TREE_CONSTANT vector ctor even if we can't
3246                make a VECTOR_CST.  It won't do anything for us, and it'll
3247                prevent us from representing it as a single constant.  */
3248             break;
3249           }
3250
3251         /* Vector types use CONSTRUCTOR all the way through gimple
3252           compilation as a general initializer.  */
3253         for (ix = 0; VEC_iterate (constructor_elt, elts, ix, ce); ix++)
3254           {
3255             enum gimplify_status tret;
3256             tret = gimplify_expr (&ce->value, pre_p, post_p,
3257                                   is_gimple_val, fb_rvalue);
3258             if (tret == GS_ERROR)
3259               ret = GS_ERROR;
3260           }
3261         if (!is_gimple_reg (GENERIC_TREE_OPERAND (*expr_p, 0)))
3262           GENERIC_TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p);
3263       }
3264       break;
3265
3266     default:
3267       /* So how did we get a CONSTRUCTOR for a scalar type?  */
3268       gcc_unreachable ();
3269     }
3270
3271   if (ret == GS_ERROR)
3272     return GS_ERROR;
3273   else if (want_value)
3274     {
3275       append_to_statement_list (*expr_p, pre_p);
3276       *expr_p = object;
3277       return GS_OK;
3278     }
3279   else
3280     return GS_ALL_DONE;
3281 }
3282
3283 /* Given a pointer value OP0, return a simplified version of an
3284    indirection through OP0, or NULL_TREE if no simplification is
3285    possible.  This may only be applied to a rhs of an expression.
3286    Note that the resulting type may be different from the type pointed
3287    to in the sense that it is still compatible from the langhooks
3288    point of view. */
3289
3290 static tree
3291 fold_indirect_ref_rhs (tree t)
3292 {
3293   tree type = TREE_TYPE (TREE_TYPE (t));
3294   tree sub = t;
3295   tree subtype;
3296
3297   STRIP_USELESS_TYPE_CONVERSION (sub);
3298   subtype = TREE_TYPE (sub);
3299   if (!POINTER_TYPE_P (subtype))
3300     return NULL_TREE;
3301
3302   if (TREE_CODE (sub) == ADDR_EXPR)
3303     {
3304       tree op = TREE_OPERAND (sub, 0);
3305       tree optype = TREE_TYPE (op);
3306       /* *&p => p */
3307       if (lang_hooks.types_compatible_p (type, optype))
3308         return op;
3309       /* *(foo *)&fooarray => fooarray[0] */
3310       else if (TREE_CODE (optype) == ARRAY_TYPE
3311                && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
3312        {
3313          tree type_domain = TYPE_DOMAIN (optype);
3314          tree min_val = size_zero_node;
3315          if (type_domain && TYPE_MIN_VALUE (type_domain))
3316            min_val = TYPE_MIN_VALUE (type_domain);
3317          return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
3318        }
3319     }
3320
3321   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
3322   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
3323       && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
3324     {
3325       tree type_domain;
3326       tree min_val = size_zero_node;
3327       tree osub = sub;
3328       sub = fold_indirect_ref_rhs (sub);
3329       if (! sub)
3330         sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
3331       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
3332       if (type_domain && TYPE_MIN_VALUE (type_domain))
3333         min_val = TYPE_MIN_VALUE (type_domain);
3334       return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
3335     }
3336
3337   return NULL_TREE;
3338 }
3339
3340 /* Subroutine of gimplify_modify_expr to do simplifications of MODIFY_EXPRs
3341    based on the code of the RHS.  We loop for as long as something changes.  */
3342
3343 static enum gimplify_status
3344 gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
3345                           tree *post_p, bool want_value)
3346 {
3347   enum gimplify_status ret = GS_OK;
3348
3349   while (ret != GS_UNHANDLED)
3350     switch (TREE_CODE (*from_p))
3351       {
3352       case INDIRECT_REF:
3353         {
3354           /* If we have code like 
3355
3356                 *(const A*)(A*)&x
3357
3358              where the type of "x" is a (possibly cv-qualified variant
3359              of "A"), treat the entire expression as identical to "x".
3360              This kind of code arises in C++ when an object is bound
3361              to a const reference, and if "x" is a TARGET_EXPR we want
3362              to take advantage of the optimization below.  */
3363           tree t = fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
3364           if (t)
3365             {
3366               *from_p = t;
3367               ret = GS_OK;
3368             }
3369           else
3370             ret = GS_UNHANDLED;
3371           break;
3372         }
3373
3374       case TARGET_EXPR:
3375         {
3376           /* If we are initializing something from a TARGET_EXPR, strip the
3377              TARGET_EXPR and initialize it directly, if possible.  This can't
3378              be done if the initializer is void, since that implies that the
3379              temporary is set in some non-trivial way.
3380
3381              ??? What about code that pulls out the temp and uses it
3382              elsewhere? I think that such code never uses the TARGET_EXPR as
3383              an initializer.  If I'm wrong, we'll die because the temp won't
3384              have any RTL.  In that case, I guess we'll need to replace
3385              references somehow.  */
3386           tree init = TARGET_EXPR_INITIAL (*from_p);
3387
3388           if (!VOID_TYPE_P (TREE_TYPE (init)))
3389             {
3390               *from_p = init;
3391               ret = GS_OK;
3392             }
3393           else
3394             ret = GS_UNHANDLED;
3395         }
3396         break;
3397
3398       case COMPOUND_EXPR:
3399         /* Remove any COMPOUND_EXPR in the RHS so the following cases will be
3400            caught.  */
3401         gimplify_compound_expr (from_p, pre_p, true);
3402         ret = GS_OK;
3403         break;
3404
3405       case CONSTRUCTOR:
3406         /* If we're initializing from a CONSTRUCTOR, break this into
3407            individual MODIFY_EXPRs.  */
3408         return gimplify_init_constructor (expr_p, pre_p, post_p, want_value);
3409
3410       case COND_EXPR:
3411         /* If we're assigning to a non-register type, push the assignment
3412            down into the branches.  This is mandatory for ADDRESSABLE types,
3413            since we cannot generate temporaries for such, but it saves a
3414            copy in other cases as well.  */
3415         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
3416           {
3417             /* This code should mirror the code in gimplify_cond_expr. */
3418             enum tree_code code = TREE_CODE (*expr_p);
3419             tree cond = *from_p;
3420             tree result = *to_p;
3421
3422             ret = gimplify_expr (&result, pre_p, post_p,
3423                                  is_gimple_min_lval, fb_lvalue);
3424             if (ret != GS_ERROR)
3425               ret = GS_OK;
3426
3427             if (TREE_TYPE (TREE_OPERAND (cond, 1)) != void_type_node)
3428               TREE_OPERAND (cond, 1)
3429                 = build2 (code, void_type_node, result,
3430                           TREE_OPERAND (cond, 1));
3431             if (TREE_TYPE (TREE_OPERAND (cond, 2)) != void_type_node)
3432               TREE_OPERAND (cond, 2)
3433                 = build2 (code, void_type_node, unshare_expr (result),
3434                           TREE_OPERAND (cond, 2));
3435
3436             TREE_TYPE (cond) = void_type_node;
3437             recalculate_side_effects (cond);
3438
3439             if (want_value)
3440               {
3441                 gimplify_and_add (cond, pre_p);
3442                 *expr_p = unshare_expr (result);
3443               }
3444             else
3445               *expr_p = cond;
3446             return ret;
3447           }
3448         else
3449           ret = GS_UNHANDLED;
3450         break;
3451
3452       case CALL_EXPR:
3453         /* For calls that return in memory, give *to_p as the CALL_EXPR's
3454            return slot so that we don't generate a temporary.  */
3455         if (!CALL_EXPR_RETURN_SLOT_OPT (*from_p)
3456             && aggregate_value_p (*from_p, *from_p))
3457           {
3458             bool use_target;
3459
3460             if (!(rhs_predicate_for (*to_p))(*from_p))
3461               /* If we need a temporary, *to_p isn't accurate.  */
3462               use_target = false;
3463             else if (TREE_CODE (*to_p) == RESULT_DECL
3464                      && DECL_NAME (*to_p) == NULL_TREE
3465                      && needs_to_live_in_memory (*to_p))
3466               /* It's OK to use the return slot directly unless it's an NRV. */
3467               use_target = true;
3468             else if (is_gimple_reg_type (TREE_TYPE (*to_p))
3469                      || (DECL_P (*to_p) && DECL_REGISTER (*to_p)))
3470               /* Don't force regs into memory.  */
3471               use_target = false;
3472             else if (TREE_CODE (*to_p) == VAR_DECL
3473                      && DECL_GIMPLE_FORMAL_TEMP_P (*to_p))
3474               /* Don't use the original target if it's a formal temp; we
3475                  don't want to take their addresses.  */
3476               use_target = false;
3477             else if (TREE_CODE (*expr_p) == INIT_EXPR)
3478               /* It's OK to use the target directly if it's being
3479                  initialized. */
3480               use_target = true;
3481             else if (!is_gimple_non_addressable (*to_p))
3482               /* Don't use the original target if it's already addressable;
3483                  if its address escapes, and the called function uses the
3484                  NRV optimization, a conforming program could see *to_p
3485                  change before the called function returns; see c++/19317.
3486                  When optimizing, the return_slot pass marks more functions
3487                  as safe after we have escape info.  */
3488               use_target = false;
3489             else
3490               use_target = true;
3491
3492             if (use_target)
3493               {
3494                 CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
3495                 mark_addressable (*to_p);
3496               }
3497           }
3498
3499         ret = GS_UNHANDLED;
3500         break;
3501
3502         /* If we're initializing from a container, push the initialization
3503            inside it.  */
3504       case CLEANUP_POINT_EXPR:
3505       case BIND_EXPR:
3506       case STATEMENT_LIST:
3507         {
3508           tree wrap = *from_p;
3509           tree t;
3510
3511           ret = gimplify_expr (to_p, pre_p, post_p,
3512                                is_gimple_min_lval, fb_lvalue);
3513           if (ret != GS_ERROR)
3514             ret = GS_OK;
3515
3516           t = voidify_wrapper_expr (wrap, *expr_p);
3517           gcc_assert (t == *expr_p);
3518
3519           if (want_value)
3520             {
3521               gimplify_and_add (wrap, pre_p);
3522               *expr_p = unshare_expr (*to_p);
3523             }
3524           else
3525             *expr_p = wrap;
3526           return GS_OK;
3527         }
3528         
3529       default:
3530         ret = GS_UNHANDLED;
3531         break;
3532       }
3533
3534   return ret;
3535 }
3536
3537 /* Destructively convert the TREE pointer in TP into a gimple tuple if
3538    appropriate.  */
3539
3540 static void
3541 tree_to_gimple_tuple (tree *tp)
3542 {
3543
3544   switch (TREE_CODE (*tp))
3545     {
3546     case GIMPLE_MODIFY_STMT:
3547       return;
3548     case MODIFY_EXPR:
3549       {
3550         struct gimple_stmt *gs;
3551         tree lhs = TREE_OPERAND (*tp, 0);
3552         bool def_stmt_self_p = false;
3553
3554         if (TREE_CODE (lhs) == SSA_NAME)
3555           {
3556             if (SSA_NAME_DEF_STMT (lhs) == *tp)
3557               def_stmt_self_p = true;
3558           }
3559
3560         gs = &make_node (GIMPLE_MODIFY_STMT)->gstmt;
3561         gs->base = (*tp)->base;
3562         /* The set to base above overwrites the CODE.  */
3563         TREE_SET_CODE ((tree) gs, GIMPLE_MODIFY_STMT);
3564
3565         gs->locus = EXPR_LOCUS (*tp);
3566         gs->operands[0] = TREE_OPERAND (*tp, 0);
3567         gs->operands[1] = TREE_OPERAND (*tp, 1);
3568         gs->block = TREE_BLOCK (*tp);
3569         *tp = (tree)gs;
3570
3571         /* If we re-gimplify a set to an SSA_NAME, we must change the
3572            SSA name's DEF_STMT link.  */
3573         if (def_stmt_self_p)
3574           SSA_NAME_DEF_STMT (GIMPLE_STMT_OPERAND (*tp, 0)) = *tp;
3575
3576         return;
3577       }
3578     default:
3579       break;
3580     }
3581 }
3582
3583 /* Promote partial stores to COMPLEX variables to total stores.  *EXPR_P is
3584    a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
3585    DECL_GIMPLE_REG_P set.  */
3586
3587 static enum gimplify_status
3588 gimplify_modify_expr_complex_part (tree *expr_p, tree *pre_p, bool want_value)
3589 {
3590   enum tree_code code, ocode;
3591   tree lhs, rhs, new_rhs, other, realpart, imagpart;
3592
3593   lhs = GENERIC_TREE_OPERAND (*expr_p, 0);
3594   rhs = GENERIC_TREE_OPERAND (*expr_p, 1);
3595   code = TREE_CODE (lhs);
3596   lhs = TREE_OPERAND (lhs, 0);
3597
3598   ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
3599   other = build1 (ocode, TREE_TYPE (rhs), lhs);
3600   other = get_formal_tmp_var (other, pre_p);
3601
3602   realpart = code == REALPART_EXPR ? rhs : other;
3603   imagpart = code == REALPART_EXPR ? other : rhs;
3604
3605   if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
3606     new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
3607   else
3608     new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
3609
3610   GENERIC_TREE_OPERAND (*expr_p, 0) = lhs;
3611   GENERIC_TREE_OPERAND (*expr_p, 1) = new_rhs;
3612
3613   if (want_value)
3614     {
3615       tree_to_gimple_tuple (expr_p);
3616
3617       append_to_statement_list (*expr_p, pre_p);
3618       *expr_p = rhs;
3619     }
3620
3621   return GS_ALL_DONE;
3622 }
3623
3624 /* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
3625
3626       modify_expr
3627               : varname '=' rhs
3628               | '*' ID '=' rhs
3629
3630     PRE_P points to the list where side effects that must happen before
3631         *EXPR_P should be stored.
3632
3633     POST_P points to the list where side effects that must happen after
3634         *EXPR_P should be stored.
3635
3636     WANT_VALUE is nonzero iff we want to use the value of this expression
3637         in another expression.  */
3638
3639 static enum gimplify_status
3640 gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
3641 {
3642   tree *from_p = &GENERIC_TREE_OPERAND (*expr_p, 1);
3643   tree *to_p = &GENERIC_TREE_OPERAND (*expr_p, 0);
3644   enum gimplify_status ret = GS_UNHANDLED;
3645
3646   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
3647               || TREE_CODE (*expr_p) == GIMPLE_MODIFY_STMT
3648               || TREE_CODE (*expr_p) == INIT_EXPR);
3649
3650   /* For zero sized types only gimplify the left hand side and right hand side
3651      as statements and throw away the assignment.  */
3652   if (zero_sized_type (TREE_TYPE (*from_p)))
3653     {
3654       gimplify_stmt (from_p);
3655       gimplify_stmt (to_p);
3656       append_to_statement_list (*from_p, pre_p);
3657       append_to_statement_list (*to_p, pre_p);
3658       *expr_p = NULL_TREE;
3659       return GS_ALL_DONE;
3660     }
3661
3662   /* See if any simplifications can be done based on what the RHS is.  */
3663   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3664                                   want_value);
3665   if (ret != GS_UNHANDLED)
3666     return ret;
3667
3668   /* If the value being copied is of variable width, compute the length
3669      of the copy into a WITH_SIZE_EXPR.   Note that we need to do this
3670      before gimplifying any of the operands so that we can resolve any
3671      PLACEHOLDER_EXPRs in the size.  Also note that the RTL expander uses
3672      the size of the expression to be copied, not of the destination, so
3673      that is what we must here.  */
3674   maybe_with_size_expr (from_p);
3675
3676   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
3677   if (ret == GS_ERROR)
3678     return ret;
3679
3680   ret = gimplify_expr (from_p, pre_p, post_p,
3681                        rhs_predicate_for (*to_p), fb_rvalue);
3682   if (ret == GS_ERROR)
3683     return ret;
3684
3685   /* Now see if the above changed *from_p to something we handle specially.  */
3686   ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
3687                                   want_value);
3688   if (ret != GS_UNHANDLED)
3689     return ret;
3690
3691   /* If we've got a variable sized assignment between two lvalues (i.e. does
3692      not involve a call), then we can make things a bit more straightforward
3693      by converting the assignment to memcpy or memset.  */
3694   if (TREE_CODE (*from_p) == WITH_SIZE_EXPR)
3695     {
3696       tree from = TREE_OPERAND (*from_p, 0);
3697       tree size = TREE_OPERAND (*from_p, 1);
3698
3699       if (TREE_CODE (from) == CONSTRUCTOR)
3700         return gimplify_modify_expr_to_memset (expr_p, size, want_value);
3701       if (is_gimple_addressable (from))
3702         {
3703           *from_p = from;
3704           return gimplify_modify_expr_to_memcpy (expr_p, size, want_value);
3705         }
3706     }
3707
3708   /* Transform partial stores to non-addressable complex variables into
3709      total stores.  This allows us to use real instead of virtual operands
3710      for these variables, which improves optimization.  */
3711   if ((TREE_CODE (*to_p) == REALPART_EXPR
3712        || TREE_CODE (*to_p) == IMAGPART_EXPR)
3713       && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
3714     return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
3715
3716   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
3717     {
3718       /* If we've somehow already got an SSA_NAME on the LHS, then
3719          we're probably modified it twice.  Not good.  */
3720       gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
3721       *to_p = make_ssa_name (*to_p, *expr_p);
3722     }
3723
3724   /* Try to alleviate the effects of the gimplification creating artificial
3725      temporaries (see for example is_gimple_reg_rhs) on the debug info.  */
3726   if (!gimplify_ctxp->into_ssa
3727       && DECL_P (*from_p) && DECL_IGNORED_P (*from_p)
3728       && DECL_P (*to_p) && !DECL_IGNORED_P (*to_p))
3729     {
3730       if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
3731         DECL_NAME (*from_p)
3732           = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
3733       DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1;
3734       SET_DECL_DEBUG_EXPR (*from_p, *to_p);
3735     }
3736
3737   if (want_value)
3738     {
3739       tree_to_gimple_tuple (expr_p);
3740
3741       append_to_statement_list (*expr_p, pre_p);
3742       *expr_p = *to_p;
3743       return GS_OK;
3744     }
3745
3746   return GS_ALL_DONE;
3747 }
3748
3749 /*  Gimplify a comparison between two variable-sized objects.  Do this
3750     with a call to BUILT_IN_MEMCMP.  */
3751
3752 static enum gimplify_status
3753 gimplify_variable_sized_compare (tree *expr_p)
3754 {
3755   tree op0 = TREE_OPERAND (*expr_p, 0);
3756   tree op1 = TREE_OPERAND (*expr_p, 1);
3757   tree t, arg, dest, src;
3758
3759   arg = TYPE_SIZE_UNIT (TREE_TYPE (op0));
3760   arg = unshare_expr (arg);
3761   arg = SUBSTITUTE_PLACEHOLDER_IN_EXPR (arg, op0);
3762   src = build_fold_addr_expr (op1);
3763   dest = build_fold_addr_expr (op0);
3764   t = implicit_built_in_decls[BUILT_IN_MEMCMP];
3765   t = build_call_expr (t, 3, dest, src, arg);
3766   *expr_p
3767     = build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), t, integer_zero_node);
3768
3769   return GS_OK;
3770 }
3771
3772 /*  Gimplify a comparison between two aggregate objects of integral scalar
3773     mode as a comparison between the bitwise equivalent scalar values.  */
3774
3775 static enum gimplify_status
3776 gimplify_scalar_mode_aggregate_compare (tree *expr_p)
3777 {
3778   tree op0 = TREE_OPERAND (*expr_p, 0);
3779   tree op1 = TREE_OPERAND (*expr_p, 1);
3780
3781   tree type = TREE_TYPE (op0);
3782   tree scalar_type = lang_hooks.types.type_for_mode (TYPE_MODE (type), 1);
3783
3784   op0 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op0);
3785   op1 = fold_build1 (VIEW_CONVERT_EXPR, scalar_type, op1);
3786
3787   *expr_p
3788     = fold_build2 (TREE_CODE (*expr_p), TREE_TYPE (*expr_p), op0, op1);
3789
3790   return GS_OK;
3791 }
3792
3793 /*  Gimplify TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR expressions.  EXPR_P
3794     points to the expression to gimplify.
3795
3796     Expressions of the form 'a && b' are gimplified to:
3797
3798         a && b ? true : false
3799
3800     gimplify_cond_expr will do the rest.
3801
3802     PRE_P points to the list where side effects that must happen before
3803         *EXPR_P should be stored.  */
3804
3805 static enum gimplify_status
3806 gimplify_boolean_expr (tree *expr_p)
3807 {
3808   /* Preserve the original type of the expression.  */
3809   tree type = TREE_TYPE (*expr_p);
3810
3811   *expr_p = build3 (COND_EXPR, type, *expr_p,
3812                     fold_convert (type, boolean_true_node),
3813                     fold_convert (type, boolean_false_node));
3814
3815   return GS_OK;
3816 }
3817
3818 /* Gimplifies an expression sequence.  This function gimplifies each
3819    expression and re-writes the original expression with the last
3820    expression of the sequence in GIMPLE form.
3821
3822    PRE_P points to the list where the side effects for all the
3823        expressions in the sequence will be emitted.
3824
3825    WANT_VALUE is true when the result of the last COMPOUND_EXPR is used.  */
3826 /* ??? Should rearrange to share the pre-queue with all the indirect
3827    invocations of gimplify_expr.  Would probably save on creations
3828    of statement_list nodes.  */
3829
3830 static enum gimplify_status
3831 gimplify_compound_expr (tree *expr_p, tree *pre_p, bool want_value)
3832 {
3833   tree t = *expr_p;
3834
3835   do
3836     {
3837       tree *sub_p = &TREE_OPERAND (t, 0);
3838
3839       if (TREE_CODE (*sub_p) == COMPOUND_EXPR)
3840         gimplify_compound_expr (sub_p, pre_p, false);
3841       else
3842         gimplify_stmt (sub_p);
3843       append_to_statement_list (*sub_p, pre_p);
3844
3845       t = TREE_OPERAND (t, 1);
3846     }
3847   while (TREE_CODE (t) == COMPOUND_EXPR);
3848
3849   *expr_p = t;
3850   if (want_value)
3851     return GS_OK;
3852   else
3853     {
3854       gimplify_stmt (expr_p);
3855       return GS_ALL_DONE;
3856     }
3857 }
3858
3859 /* Gimplifies a statement list.  These may be created either by an
3860    enlightened front-end, or by shortcut_cond_expr.  */
3861
3862 static enum gimplify_status
3863 gimplify_statement_list (tree *expr_p, tree *pre_p)
3864 {
3865   tree temp = voidify_wrapper_expr (*expr_p, NULL);
3866
3867   tree_stmt_iterator i = tsi_start (*expr_p);
3868
3869   while (!tsi_end_p (i))
3870     {
3871       tree t;
3872
3873       gimplify_stmt (tsi_stmt_ptr (i));
3874
3875       t = tsi_stmt (i);
3876       if (t == NULL)
3877         tsi_delink (&i);
3878       else if (TREE_CODE (t) == STATEMENT_LIST)
3879         {
3880           tsi_link_before (&i, t, TSI_SAME_STMT);
3881           tsi_delink (&i);
3882         }
3883       else
3884         tsi_next (&i);
3885     }
3886
3887   if (temp)
3888     {
3889       append_to_statement_list (*expr_p, pre_p);
3890       *expr_p = temp;
3891       return GS_OK;
3892     }
3893
3894   return GS_ALL_DONE;
3895 }
3896
3897 /*  Gimplify a SAVE_EXPR node.  EXPR_P points to the expression to
3898     gimplify.  After gimplification, EXPR_P will point to a new temporary
3899     that holds the original value of the SAVE_EXPR node.
3900
3901     PRE_P points to the list where side effects that must happen before
3902         *EXPR_P should be stored.  */
3903
3904 static enum gimplify_status
3905 gimplify_save_expr (tree *expr_p, tree *pre_p, tree *post_p)
3906 {
3907   enum gimplify_status ret = GS_ALL_DONE;
3908   tree val;
3909
3910   gcc_assert (TREE_CODE (*expr_p) == SAVE_EXPR);
3911   val = TREE_OPERAND (*expr_p, 0);
3912
3913   /* If the SAVE_EXPR has not been resolved, then evaluate it once.  */
3914   if (!SAVE_EXPR_RESOLVED_P (*expr_p))
3915     {
3916       /* The operand may be a void-valued expression such as SAVE_EXPRs
3917          generated by the Java frontend for class initialization.  It is
3918          being executed only for its side-effects.  */
3919       if (TREE_TYPE (val) == void_type_node)
3920         {
3921           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
3922                                is_gimple_stmt, fb_none);
3923           append_to_statement_list (TREE_OPERAND (*expr_p, 0), pre_p);
3924           val = NULL;
3925         }
3926       else
3927         val = get_initialized_tmp_var (val, pre_p, post_p);
3928
3929       TREE_OPERAND (*expr_p, 0) = val;
3930       SAVE_EXPR_RESOLVED_P (*expr_p) = 1;
3931     }
3932
3933   *expr_p = val;
3934
3935   return ret;
3936 }
3937
3938 /*  Re-write the ADDR_EXPR node pointed to by EXPR_P
3939
3940       unary_expr
3941               : ...
3942               | '&' varname
3943               ...
3944
3945     PRE_P points to the list where side effects that must happen before
3946         *EXPR_P should be stored.
3947
3948     POST_P points to the list where side effects that must happen after
3949         *EXPR_P should be stored.  */
3950
3951 static enum gimplify_status
3952 gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
3953 {
3954   tree expr = *expr_p;
3955   tree op0 = TREE_OPERAND (expr, 0);
3956   enum gimplify_status ret;
3957
3958   switch (TREE_CODE (op0))
3959     {
3960     case INDIRECT_REF:
3961     case MISALIGNED_INDIRECT_REF:
3962     do_indirect_ref:
3963       /* Check if we are dealing with an expression of the form '&*ptr'.
3964          While the front end folds away '&*ptr' into 'ptr', these
3965          expressions may be generated internally by the compiler (e.g.,
3966          builtins like __builtin_va_end).  */
3967       /* Caution: the silent array decomposition semantics we allow for
3968          ADDR_EXPR means we can't always discard the pair.  */
3969       /* Gimplification of the ADDR_EXPR operand may drop
3970          cv-qualification conversions, so make sure we add them if
3971          needed.  */
3972       {
3973         tree op00 = TREE_OPERAND (op0, 0);
3974         tree t_expr = TREE_TYPE (expr);
3975         tree t_op00 = TREE_TYPE (op00);
3976
3977         if (!lang_hooks.types_compatible_p (t_expr, t_op00))
3978           {
3979 #ifdef ENABLE_CHECKING
3980             tree t_op0 = TREE_TYPE (op0);
3981             gcc_assert (POINTER_TYPE_P (t_expr)
3982                         && cpt_same_type (TREE_CODE (t_op0) == ARRAY_TYPE
3983                                           ? TREE_TYPE (t_op0) : t_op0,
3984                                           TREE_TYPE (t_expr))
3985                         && POINTER_TYPE_P (t_op00)
3986                         && cpt_same_type (t_op0, TREE_TYPE (t_op00)));
3987 #endif
3988             op00 = fold_convert (TREE_TYPE (expr), op00);
3989           }
3990         *expr_p = op00;
3991         ret = GS_OK;
3992       }
3993       break;
3994
3995     case VIEW_CONVERT_EXPR:
3996       /* Take the address of our operand and then convert it to the type of
3997          this ADDR_EXPR.
3998
3999          ??? The interactions of VIEW_CONVERT_EXPR and aliasing is not at
4000          all clear.  The impact of this transformation is even less clear.  */
4001
4002       /* If the operand is a useless conversion, look through it.  Doing so
4003          guarantees that the ADDR_EXPR and its operand will remain of the
4004          same type.  */
4005       if (tree_ssa_useless_type_conversion (TREE_OPERAND (op0, 0)))
4006         op0 = TREE_OPERAND (op0, 0);
4007
4008       *expr_p = fold_convert (TREE_TYPE (expr),
4009                               build_fold_addr_expr (TREE_OPERAND (op0, 0)));
4010       ret = GS_OK;
4011       break;
4012
4013     default:
4014       /* We use fb_either here because the C frontend sometimes takes
4015          the address of a call that returns a struct; see
4016          gcc.dg/c99-array-lval-1.c.  The gimplifier will correctly make
4017          the implied temporary explicit.  */
4018
4019       /* Mark the RHS addressable.  */
4020       ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
4021                            is_gimple_addressable, fb_either);
4022       if (ret != GS_ERROR)
4023         {
4024           op0 = TREE_OPERAND (expr, 0);
4025
4026           /* For various reasons, the gimplification of the expression
4027              may have made a new INDIRECT_REF.  */
4028           if (TREE_CODE (op0) == INDIRECT_REF)
4029             goto do_indirect_ref;
4030
4031           /* Make sure TREE_INVARIANT, TREE_CONSTANT, and TREE_SIDE_EFFECTS
4032              is set properly.  */
4033           recompute_tree_invariant_for_addr_expr (expr);
4034
4035           mark_addressable (TREE_OPERAND (expr, 0));
4036         }
4037       break;
4038     }
4039
4040   return ret;
4041 }
4042
4043 /* Gimplify the operands of an ASM_EXPR.  Input operands should be a gimple
4044    value; output operands should be a gimple lvalue.  */
4045
4046 static enum gimplify_status
4047 gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
4048 {
4049   tree expr = *expr_p;
4050   int noutputs = list_length (ASM_OUTPUTS (expr));
4051   const char **oconstraints
4052     = (const char **) alloca ((noutputs) * sizeof (const char *));
4053   int i;
4054   tree link;
4055   const char *constraint;
4056   bool allows_mem, allows_reg, is_inout;
4057   enum gimplify_status ret, tret;
4058
4059   ret = GS_ALL_DONE;
4060   for (i = 0, link = ASM_OUTPUTS (expr); link; ++i, link = TREE_CHAIN (link))
4061     {
4062       size_t constraint_len;
4063       oconstraints[i] = constraint
4064         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4065       constraint_len = strlen (constraint);
4066       if (constraint_len == 0)
4067         continue;
4068
4069       parse_output_constraint (&constraint, i, 0, 0,
4070                                &allows_mem, &allows_reg, &is_inout);
4071
4072       if (!allows_reg && allows_mem)
4073         mark_addressable (TREE_VALUE (link));
4074
4075       tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4076                             is_inout ? is_gimple_min_lval : is_gimple_lvalue,
4077                             fb_lvalue | fb_mayfail);
4078       if (tret == GS_ERROR)
4079         {
4080           error ("invalid lvalue in asm output %d", i);
4081           ret = tret;
4082         }
4083
4084       if (is_inout)
4085         {
4086           /* An input/output operand.  To give the optimizers more
4087              flexibility, split it into separate input and output
4088              operands.  */
4089           tree input;
4090           char buf[10];
4091
4092           /* Turn the in/out constraint into an output constraint.  */
4093           char *p = xstrdup (constraint);
4094           p[0] = '=';
4095           TREE_VALUE (TREE_PURPOSE (link)) = build_string (constraint_len, p);
4096
4097           /* And add a matching input constraint.  */
4098           if (allows_reg)
4099             {
4100               sprintf (buf, "%d", i);
4101
4102               /* If there are multiple alternatives in the constraint,
4103                  handle each of them individually.  Those that allow register
4104                  will be replaced with operand number, the others will stay
4105                  unchanged.  */
4106               if (strchr (p, ',') != NULL)
4107                 {
4108                   size_t len = 0, buflen = strlen (buf);
4109                   char *beg, *end, *str, *dst;
4110
4111                   for (beg = p + 1;;)
4112                     {
4113                       end = strchr (beg, ',');
4114                       if (end == NULL)
4115                         end = strchr (beg, '\0');
4116                       if ((size_t) (end - beg) < buflen)
4117                         len += buflen + 1;
4118                       else
4119                         len += end - beg + 1;
4120                       if (*end)
4121                         beg = end + 1;
4122                       else
4123                         break;
4124                     }
4125
4126                   str = (char *) alloca (len);
4127                   for (beg = p + 1, dst = str;;)
4128                     {
4129                       const char *tem;
4130                       bool mem_p, reg_p, inout_p;
4131
4132                       end = strchr (beg, ',');
4133                       if (end)
4134                         *end = '\0';
4135                       beg[-1] = '=';
4136                       tem = beg - 1;
4137                       parse_output_constraint (&tem, i, 0, 0,
4138                                                &mem_p, &reg_p, &inout_p);
4139                       if (dst != str)
4140                         *dst++ = ',';
4141                       if (reg_p)
4142                         {
4143                           memcpy (dst, buf, buflen);
4144                           dst += buflen;
4145                         }
4146                       else
4147                         {
4148                           if (end)
4149                             len = end - beg;
4150                           else
4151                             len = strlen (beg);
4152                           memcpy (dst, beg, len);
4153                           dst += len;
4154                         }
4155                       if (end)
4156                         beg = end + 1;
4157                       else
4158                         break;
4159                     }
4160                   *dst = '\0';
4161                   input = build_string (dst - str, str);
4162                 }
4163               else
4164                 input = build_string (strlen (buf), buf);
4165             }
4166           else
4167             input = build_string (constraint_len - 1, constraint + 1);
4168
4169           free (p);
4170
4171           input = build_tree_list (build_tree_list (NULL_TREE, input),
4172                                    unshare_expr (TREE_VALUE (link)));
4173           ASM_INPUTS (expr) = chainon (ASM_INPUTS (expr), input);
4174         }
4175     }
4176
4177   for (link = ASM_INPUTS (expr); link; ++i, link = TREE_CHAIN (link))
4178     {
4179       constraint
4180         = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4181       parse_input_constraint (&constraint, 0, 0, noutputs, 0,
4182                               oconstraints, &allows_mem, &allows_reg);
4183
4184       /* If we can't make copies, we can only accept memory.  */
4185       if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
4186         {
4187           if (allows_mem)
4188             allows_reg = 0;
4189           else
4190             {
4191               error ("impossible constraint in %<asm%>");
4192               error ("non-memory input %d must stay in memory", i);
4193               return GS_ERROR;
4194             }
4195         }
4196
4197       /* If the operand is a memory input, it should be an lvalue.  */
4198       if (!allows_reg && allows_mem)
4199         {
4200           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4201                                 is_gimple_lvalue, fb_lvalue | fb_mayfail);
4202           mark_addressable (TREE_VALUE (link));
4203           if (tret == GS_ERROR)
4204             {
4205               error ("memory input %d is not directly addressable", i);
4206               ret = tret;
4207             }
4208         }
4209       else
4210         {
4211           tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
4212                                 is_gimple_asm_val, fb_rvalue);
4213           if (tret == GS_ERROR)
4214             ret = tret;
4215         }
4216     }
4217
4218   return ret;
4219 }
4220
4221 /* Gimplify a CLEANUP_POINT_EXPR.  Currently this works by adding
4222    WITH_CLEANUP_EXPRs to the prequeue as we encounter cleanups while
4223    gimplifying the body, and converting them to TRY_FINALLY_EXPRs when we
4224    return to this function.
4225
4226    FIXME should we complexify the prequeue handling instead?  Or use flags
4227    for all the cleanups and let the optimizer tighten them up?  The current
4228    code seems pretty fragile; it will break on a cleanup within any
4229    non-conditional nesting.  But any such nesting would be broken, anyway;
4230    we can't write a TRY_FINALLY_EXPR that starts inside a nesting construct
4231    and continues out of it.  We can do that at the RTL level, though, so
4232    having an optimizer to tighten up try/finally regions would be a Good
4233    Thing.  */
4234
4235 static enum gimplify_status
4236 gimplify_cleanup_point_expr (tree *expr_p, tree *pre_p)
4237 {
4238   tree_stmt_iterator iter;
4239   tree body;
4240
4241   tree temp = voidify_wrapper_expr (*expr_p, NULL);
4242
4243   /* We only care about the number of conditions between the innermost
4244      CLEANUP_POINT_EXPR and the cleanup.  So save and reset the count and
4245      any cleanups collected outside the CLEANUP_POINT_EXPR.  */
4246   int old_conds = gimplify_ctxp->conditions;
4247   tree old_cleanups = gimplify_ctxp->conditional_cleanups;
4248   gimplify_ctxp->conditions = 0;
4249   gimplify_ctxp->conditional_cleanups = NULL_TREE;
4250
4251   body = TREE_OPERAND (*expr_p, 0);
4252   gimplify_to_stmt_list (&body);
4253
4254   gimplify_ctxp->conditions = old_conds;
4255   gimplify_ctxp->conditional_cleanups = old_cleanups;
4256
4257   for (iter = tsi_start (body); !tsi_end_p (iter); )
4258     {
4259       tree *wce_p = tsi_stmt_ptr (iter);
4260       tree wce = *wce_p;
4261
4262       if (TREE_CODE (wce) == WITH_CLEANUP_EXPR)
4263         {
4264           if (tsi_one_before_end_p (iter))
4265             {
4266               tsi_link_before (&iter, TREE_OPERAND (wce, 0), TSI_SAME_STMT);
4267               tsi_delink (&iter);
4268               break;
4269             }
4270           else
4271             {
4272               tree sl, tfe;
4273               enum tree_code code;
4274
4275               if (CLEANUP_EH_ONLY (wce))
4276                 code = TRY_CATCH_EXPR;
4277               else
4278                 code = TRY_FINALLY_EXPR;
4279
4280               sl = tsi_split_statement_list_after (&iter);
4281               tfe = build2 (code, void_type_node, sl, NULL_TREE);
4282               append_to_statement_list (TREE_OPERAND (wce, 0),
4283                                         &TREE_OPERAND (tfe, 1));
4284               *wce_p = tfe;
4285               iter = tsi_start (sl);
4286             }
4287         }
4288       else
4289         tsi_next (&iter);
4290     }
4291
4292   if (temp)
4293     {
4294       *expr_p = temp;
4295       append_to_statement_list (body, pre_p);
4296       return GS_OK;
4297     }
4298   else
4299     {
4300       *expr_p = body;
4301       return GS_ALL_DONE;
4302     }
4303 }
4304
4305 /* Insert a cleanup marker for gimplify_cleanup_point_expr.  CLEANUP
4306    is the cleanup action required.  */
4307
4308 static void
4309 gimple_push_cleanup (tree var, tree cleanup, bool eh_only, tree *pre_p)
4310 {
4311   tree wce;
4312
4313   /* Errors can result in improperly nested cleanups.  Which results in
4314      confusion when trying to resolve the WITH_CLEANUP_EXPR.  */
4315   if (errorcount || sorrycount)
4316     return;
4317
4318   if (gimple_conditional_context ())
4319     {
4320       /* If we're in a conditional context, this is more complex.  We only
4321          want to run the cleanup if we actually ran the initialization that
4322          necessitates it, but we want to run it after the end of the
4323          conditional context.  So we wrap the try/finally around the
4324          condition and use a flag to determine whether or not to actually
4325          run the destructor.  Thus
4326
4327            test ? f(A()) : 0
4328
4329          becomes (approximately)
4330
4331            flag = 0;
4332            try {
4333              if (test) { A::A(temp); flag = 1; val = f(temp); }
4334              else { val = 0; }
4335            } finally {
4336              if (flag) A::~A(temp);
4337            }
4338            val
4339       */
4340
4341       tree flag = create_tmp_var (boolean_type_node, "cleanup");
4342       tree ffalse = build_gimple_modify_stmt (flag, boolean_false_node);
4343       tree ftrue = build_gimple_modify_stmt (flag, boolean_true_node);
4344       cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
4345       wce = build1 (WITH_CLEANUP_EXPR, void_type_node, cleanup);
4346       append_to_statement_list (ffalse, &gimplify_ctxp->conditional_cleanups);
4347       append_to_statement_list (wce, &gimplify_ctxp->conditional_cleanups);
4348       append_to_statement_list (ftrue, pre_p);
4349
4350       /* Because of this manipulation, and the EH edges that jump
4351          threading cannot redirect, the temporary (VAR) will appear
4352          to be used uninitialized.  Don't warn.  */
4353       TREE_NO_WARNING (var) = 1;
4354     }
4355   else
4356     {
4357       wce = build1 (WITH_CLEANUP_EXPR, void_type_node, cleanup);
4358       CLEANUP_EH_ONLY (wce) = eh_only;
4359       append_to_statement_list (wce, pre_p);
4360     }
4361
4362   gimplify_stmt (&TREE_OPERAND (wce, 0));
4363 }
4364
4365 /* Gimplify a TARGET_EXPR which doesn't appear on the rhs of an INIT_EXPR.  */
4366
4367 static enum gimplify_status
4368 gimplify_target_expr (tree *expr_p, tree *pre_p, tree *post_p)
4369 {
4370   tree targ = *expr_p;
4371   tree temp = TARGET_EXPR_SLOT (targ);
4372   tree init = TARGET_EXPR_INITIAL (targ);
4373   enum gimplify_status ret;
4374
4375   if (init)
4376     {
4377       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
4378          to the temps list.  */
4379       gimple_add_tmp_var (temp);
4380
4381       /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
4382          expression is supposed to initialize the slot.  */
4383       if (VOID_TYPE_P (TREE_TYPE (init)))
4384         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
4385       else
4386         {
4387           init = build2 (INIT_EXPR, void_type_node, temp, init);
4388           ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt,
4389                                fb_none);
4390         }
4391       if (ret == GS_ERROR)
4392         {
4393           /* PR c++/28266 Make sure this is expanded only once. */
4394           TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4395           return GS_ERROR;
4396         }
4397       append_to_statement_list (init, pre_p);
4398
4399       /* If needed, push the cleanup for the temp.  */
4400       if (TARGET_EXPR_CLEANUP (targ))
4401         {
4402           gimplify_stmt (&TARGET_EXPR_CLEANUP (targ));
4403           gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
4404                                CLEANUP_EH_ONLY (targ), pre_p);
4405         }
4406
4407       /* Only expand this once.  */
4408       TREE_OPERAND (targ, 3) = init;
4409       TARGET_EXPR_INITIAL (targ) = NULL_TREE;
4410     }
4411   else
4412     /* We should have expanded this before.  */
4413     gcc_assert (DECL_SEEN_IN_BIND_EXPR_P (temp));
4414
4415   *expr_p = temp;
4416   return GS_OK;
4417 }
4418
4419 /* Gimplification of expression trees.  */
4420
4421 /* Gimplify an expression which appears at statement context; usually, this
4422    means replacing it with a suitably gimple STATEMENT_LIST.  */
4423
4424 void
4425 gimplify_stmt (tree *stmt_p)
4426 {
4427   gimplify_expr (stmt_p, NULL, NULL, is_gimple_stmt, fb_none);
4428 }
4429
4430 /* Similarly, but force the result to be a STATEMENT_LIST.  */
4431
4432 void
4433 gimplify_to_stmt_list (tree *stmt_p)
4434 {
4435   gimplify_stmt (stmt_p);
4436   if (!*stmt_p)
4437     *stmt_p = alloc_stmt_list ();
4438   else if (TREE_CODE (*stmt_p) != STATEMENT_LIST)
4439     {
4440       tree t = *stmt_p;
4441       *stmt_p = alloc_stmt_list ();
4442       append_to_statement_list (t, stmt_p);
4443     }
4444 }
4445
4446
4447 /* Add FIRSTPRIVATE entries for DECL in the OpenMP the surrounding parallels
4448    to CTX.  If entries already exist, force them to be some flavor of private.
4449    If there is no enclosing parallel, do nothing.  */
4450
4451 void
4452 omp_firstprivatize_variable (struct gimplify_omp_ctx *ctx, tree decl)
4453 {
4454   splay_tree_node n;
4455
4456   if (decl == NULL || !DECL_P (decl))
4457     return;
4458
4459   do
4460     {
4461       n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4462       if (n != NULL)
4463         {
4464           if (n->value & GOVD_SHARED)
4465             n->value = GOVD_FIRSTPRIVATE | (n->value & GOVD_SEEN);
4466           else
4467             return;
4468         }
4469       else if (ctx->is_parallel)
4470         omp_add_variable (ctx, decl, GOVD_FIRSTPRIVATE);
4471
4472       ctx = ctx->outer_context;
4473     }
4474   while (ctx);
4475 }
4476
4477 /* Similarly for each of the type sizes of TYPE.  */
4478
4479 static void
4480 omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *ctx, tree type)
4481 {
4482   if (type == NULL || type == error_mark_node)
4483     return;
4484   type = TYPE_MAIN_VARIANT (type);
4485
4486   if (pointer_set_insert (ctx->privatized_types, type))
4487     return;
4488
4489   switch (TREE_CODE (type))
4490     {
4491     case INTEGER_TYPE:
4492     case ENUMERAL_TYPE:
4493     case BOOLEAN_TYPE:
4494     case REAL_TYPE:
4495       omp_firstprivatize_variable (ctx, TYPE_MIN_VALUE (type));
4496       omp_firstprivatize_variable (ctx, TYPE_MAX_VALUE (type));
4497       break;
4498
4499     case ARRAY_TYPE:
4500       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
4501       omp_firstprivatize_type_sizes (ctx, TYPE_DOMAIN (type));
4502       break;
4503
4504     case RECORD_TYPE:
4505     case UNION_TYPE:
4506     case QUAL_UNION_TYPE:
4507       {
4508         tree field;
4509         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4510           if (TREE_CODE (field) == FIELD_DECL)
4511             {
4512               omp_firstprivatize_variable (ctx, DECL_FIELD_OFFSET (field));
4513               omp_firstprivatize_type_sizes (ctx, TREE_TYPE (field));
4514             }
4515       }
4516       break;
4517
4518     case POINTER_TYPE:
4519     case REFERENCE_TYPE:
4520       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (type));
4521       break;
4522
4523     default:
4524       break;
4525     }
4526
4527   omp_firstprivatize_variable (ctx, TYPE_SIZE (type));
4528   omp_firstprivatize_variable (ctx, TYPE_SIZE_UNIT (type));
4529   lang_hooks.types.omp_firstprivatize_type_sizes (ctx, type);
4530 }
4531
4532 /* Add an entry for DECL in the OpenMP context CTX with FLAGS.  */
4533
4534 static void
4535 omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
4536 {
4537   splay_tree_node n;
4538   unsigned int nflags;
4539   tree t;
4540
4541   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4542     return;
4543
4544   /* Never elide decls whose type has TREE_ADDRESSABLE set.  This means
4545      there are constructors involved somewhere.  */
4546   if (TREE_ADDRESSABLE (TREE_TYPE (decl))
4547       || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
4548     flags |= GOVD_SEEN;
4549
4550   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4551   if (n != NULL)
4552     {
4553       /* We shouldn't be re-adding the decl with the same data
4554          sharing class.  */
4555       gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
4556       /* The only combination of data sharing classes we should see is
4557          FIRSTPRIVATE and LASTPRIVATE.  */
4558       nflags = n->value | flags;
4559       gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
4560                   == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE));
4561       n->value = nflags;
4562       return;
4563     }
4564
4565   /* When adding a variable-sized variable, we have to handle all sorts
4566      of additional bits of data: the pointer replacement variable, and 
4567      the parameters of the type.  */
4568   if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
4569     {
4570       /* Add the pointer replacement variable as PRIVATE if the variable
4571          replacement is private, else FIRSTPRIVATE since we'll need the
4572          address of the original variable either for SHARED, or for the
4573          copy into or out of the context.  */
4574       if (!(flags & GOVD_LOCAL))
4575         {
4576           nflags = flags & GOVD_PRIVATE ? GOVD_PRIVATE : GOVD_FIRSTPRIVATE;
4577           nflags |= flags & GOVD_SEEN;
4578           t = DECL_VALUE_EXPR (decl);
4579           gcc_assert (TREE_CODE (t) == INDIRECT_REF);
4580           t = TREE_OPERAND (t, 0);
4581           gcc_assert (DECL_P (t));
4582           omp_add_variable (ctx, t, nflags);
4583         }
4584
4585       /* Add all of the variable and type parameters (which should have
4586          been gimplified to a formal temporary) as FIRSTPRIVATE.  */
4587       omp_firstprivatize_variable (ctx, DECL_SIZE_UNIT (decl));
4588       omp_firstprivatize_variable (ctx, DECL_SIZE (decl));
4589       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
4590
4591       /* The variable-sized variable itself is never SHARED, only some form
4592          of PRIVATE.  The sharing would take place via the pointer variable
4593          which we remapped above.  */
4594       if (flags & GOVD_SHARED)
4595         flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
4596                 | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
4597
4598       /* We're going to make use of the TYPE_SIZE_UNIT at least in the 
4599          alloca statement we generate for the variable, so make sure it
4600          is available.  This isn't automatically needed for the SHARED
4601          case, since we won't be allocating local storage then.
4602          For local variables TYPE_SIZE_UNIT might not be gimplified yet,
4603          in this case omp_notice_variable will be called later
4604          on when it is gimplified.  */
4605       else if (! (flags & GOVD_LOCAL))
4606         omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
4607     }
4608   else if (lang_hooks.decls.omp_privatize_by_reference (decl))
4609     {
4610       gcc_assert ((flags & GOVD_LOCAL) == 0);
4611       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
4612
4613       /* Similar to the direct variable sized case above, we'll need the
4614          size of references being privatized.  */
4615       if ((flags & GOVD_SHARED) == 0)
4616         {
4617           t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
4618           if (TREE_CODE (t) != INTEGER_CST)
4619             omp_notice_variable (ctx, t, true);
4620         }
4621     }
4622
4623   splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
4624 }
4625
4626 /* Record the fact that DECL was used within the OpenMP context CTX.
4627    IN_CODE is true when real code uses DECL, and false when we should
4628    merely emit default(none) errors.  Return true if DECL is going to
4629    be remapped and thus DECL shouldn't be gimplified into its
4630    DECL_VALUE_EXPR (if any).  */
4631
4632 static bool
4633 omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
4634 {
4635   splay_tree_node n;
4636   unsigned flags = in_code ? GOVD_SEEN : 0;
4637   bool ret = false, shared;
4638
4639   if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4640     return false;
4641
4642   /* Threadprivate variables are predetermined.  */
4643   if (is_global_var (decl))
4644     {
4645       if (DECL_THREAD_LOCAL_P (decl))
4646         return false;
4647
4648       if (DECL_HAS_VALUE_EXPR_P (decl))
4649         {
4650           tree value = get_base_address (DECL_VALUE_EXPR (decl));
4651
4652           if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
4653             return false;
4654         }
4655     }
4656
4657   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4658   if (n == NULL)
4659     {
4660       enum omp_clause_default_kind default_kind, kind;
4661
4662       if (!ctx->is_parallel)
4663         goto do_outer;
4664
4665       /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be
4666          remapped firstprivate instead of shared.  To some extent this is
4667          addressed in omp_firstprivatize_type_sizes, but not effectively.  */
4668       default_kind = ctx->default_kind;
4669       kind = lang_hooks.decls.omp_predetermined_sharing (decl);
4670       if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
4671         default_kind = kind;
4672
4673       switch (default_kind)
4674         {
4675         case OMP_CLAUSE_DEFAULT_NONE:
4676           error ("%qs not specified in enclosing parallel",
4677                  IDENTIFIER_POINTER (DECL_NAME (decl)));
4678           error ("%Henclosing parallel", &ctx->location);
4679           /* FALLTHRU */
4680         case OMP_CLAUSE_DEFAULT_SHARED:
4681           flags |= GOVD_SHARED;
4682           break;
4683         case OMP_CLAUSE_DEFAULT_PRIVATE:
4684           flags |= GOVD_PRIVATE;
4685           break;
4686         default:
4687           gcc_unreachable ();
4688         }
4689
4690       omp_add_variable (ctx, decl, flags);
4691
4692       shared = (flags & GOVD_SHARED) != 0;
4693       ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
4694       goto do_outer;
4695     }
4696
4697   shared = ((flags | n->value) & GOVD_SHARED) != 0;
4698   ret = lang_hooks.decls.omp_disregard_value_expr (decl, shared);
4699
4700   /* If nothing changed, there's nothing left to do.  */
4701   if ((n->value & flags) == flags)
4702     return ret;
4703   flags |= n->value;
4704   n->value = flags;
4705
4706  do_outer:
4707   /* If the variable is private in the current context, then we don't
4708      need to propagate anything to an outer context.  */
4709   if (flags & GOVD_PRIVATE)
4710     return ret;
4711   if (ctx->outer_context
4712       && omp_notice_variable (ctx->outer_context, decl, in_code))
4713     return true;
4714   return ret;
4715 }
4716
4717 /* Verify that DECL is private within CTX.  If there's specific information
4718    to the contrary in the innermost scope, generate an error.  */
4719
4720 static bool
4721 omp_is_private (struct gimplify_omp_ctx *ctx, tree decl)
4722 {
4723   splay_tree_node n;
4724
4725   n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
4726   if (n != NULL)
4727     {
4728       if (n->value & GOVD_SHARED)
4729         {
4730           if (ctx == gimplify_omp_ctxp)
4731             {
4732               error ("iteration variable %qs should be private",
4733                      IDENTIFIER_POINTER (DECL_NAME (decl)));
4734               n->value = GOVD_PRIVATE;
4735               return true;
4736             }
4737           else
4738             return false;
4739         }
4740       else if ((n->value & GOVD_EXPLICIT) != 0
4741                && (ctx == gimplify_omp_ctxp
4742                    || (ctx->is_combined_parallel
4743                        && gimplify_omp_ctxp->outer_context == ctx)))
4744         {
4745           if ((n->value & GOVD_FIRSTPRIVATE) != 0)
4746             error ("iteration variable %qs should not be firstprivate",
4747                    IDENTIFIER_POINTER (DECL_NAME (decl)));
4748           else if ((n->value & GOVD_REDUCTION) != 0)
4749             error ("iteration variable %qs should not be reduction",
4750                    IDENTIFIER_POINTER (DECL_NAME (decl)));
4751         }
4752       return true;
4753     }
4754
4755   if (ctx->is_parallel)
4756     return false;
4757   else if (ctx->outer_context)
4758     return omp_is_private (ctx->outer_context, decl);
4759   else
4760     return !is_global_var (decl);
4761 }
4762
4763 /* Return true if DECL is private within a parallel region
4764    that binds to the current construct's context or in parallel
4765    region's REDUCTION clause.  */
4766
4767 static bool
4768 omp_check_private (struct gimplify_omp_ctx *ctx, tree decl)
4769 {
4770   splay_tree_node n;
4771
4772   do
4773     {
4774       ctx = ctx->outer_context;
4775       if (ctx == NULL)
4776         return !(is_global_var (decl)
4777                  /* References might be private, but might be shared too.  */
4778                  || lang_hooks.decls.omp_privatize_by_reference (decl));
4779
4780       n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4781       if (n != NULL)
4782         return (n->value & GOVD_SHARED) == 0;
4783     }
4784   while (!ctx->is_parallel);
4785   return false;
4786 }
4787
4788 /* Scan the OpenMP clauses in *LIST_P, installing mappings into a new
4789    and previous omp contexts.  */
4790
4791 static void
4792 gimplify_scan_omp_clauses (tree *list_p, tree *pre_p, bool in_parallel,
4793                            bool in_combined_parallel)
4794 {
4795   struct gimplify_omp_ctx *ctx, *outer_ctx;
4796   tree c;
4797
4798   ctx = new_omp_context (in_parallel, in_combined_parallel);
4799   outer_ctx = ctx->outer_context;
4800
4801   while ((c = *list_p) != NULL)
4802     {
4803       enum gimplify_status gs;
4804       bool remove = false;
4805       bool notice_outer = true;
4806       const char *check_non_private = NULL;
4807       unsigned int flags;
4808       tree decl;
4809
4810       switch (OMP_CLAUSE_CODE (c))
4811         {
4812         case OMP_CLAUSE_PRIVATE:
4813           flags = GOVD_PRIVATE | GOVD_EXPLICIT;
4814           notice_outer = false;
4815           goto do_add;
4816         case OMP_CLAUSE_SHARED:
4817           flags = GOVD_SHARED | GOVD_EXPLICIT;
4818           goto do_add;
4819         case OMP_CLAUSE_FIRSTPRIVATE:
4820           flags = GOVD_FIRSTPRIVATE | GOVD_EXPLICIT;
4821           check_non_private = "firstprivate";
4822           goto do_add;
4823         case OMP_CLAUSE_LASTPRIVATE:
4824           flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT;
4825           check_non_private = "lastprivate";
4826           goto do_add;
4827         case OMP_CLAUSE_REDUCTION:
4828           flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT;
4829           check_non_private = "reduction";
4830           goto do_add;
4831
4832         do_add:
4833           decl = OMP_CLAUSE_DECL (c);
4834           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4835             {
4836               remove = true;
4837               break;
4838             }
4839           omp_add_variable (ctx, decl, flags);
4840           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
4841               && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
4842             {
4843               omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
4844                                 GOVD_LOCAL | GOVD_SEEN);
4845               gimplify_omp_ctxp = ctx;
4846               push_gimplify_context ();
4847               gimplify_stmt (&OMP_CLAUSE_REDUCTION_INIT (c));
4848               pop_gimplify_context (OMP_CLAUSE_REDUCTION_INIT (c));
4849               push_gimplify_context ();
4850               gimplify_stmt (&OMP_CLAUSE_REDUCTION_MERGE (c));
4851               pop_gimplify_context (OMP_CLAUSE_REDUCTION_MERGE (c));
4852               gimplify_omp_ctxp = outer_ctx;
4853             }
4854           if (notice_outer)
4855             goto do_notice;
4856           break;
4857
4858         case OMP_CLAUSE_COPYIN:
4859         case OMP_CLAUSE_COPYPRIVATE:
4860           decl = OMP_CLAUSE_DECL (c);
4861           if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
4862             {
4863               remove = true;
4864               break;
4865             }
4866         do_notice:
4867           if (outer_ctx)
4868             omp_notice_variable (outer_ctx, decl, true);
4869           if (check_non_private
4870               && !in_parallel
4871               && omp_check_private (ctx, decl))
4872             {
4873               error ("%s variable %qs is private in outer context",
4874                      check_non_private, IDENTIFIER_POINTER (DECL_NAME (decl)));
4875               remove = true;
4876             }
4877           break;
4878
4879         case OMP_CLAUSE_IF:
4880           OMP_CLAUSE_OPERAND (c, 0)
4881             = gimple_boolify (OMP_CLAUSE_OPERAND (c, 0));
4882           /* Fall through.  */
4883
4884         case OMP_CLAUSE_SCHEDULE:
4885         case OMP_CLAUSE_NUM_THREADS:
4886           gs = gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
4887                               is_gimple_val, fb_rvalue);
4888           if (gs == GS_ERROR)
4889             remove = true;
4890           break;
4891
4892         case OMP_CLAUSE_NOWAIT:
4893         case OMP_CLAUSE_ORDERED:
4894           break;
4895
4896         case OMP_CLAUSE_DEFAULT:
4897           ctx->default_kind = OMP_CLAUSE_DEFAULT_KIND (c);
4898           break;
4899
4900         default:
4901           gcc_unreachable ();
4902         }
4903
4904       if (remove)
4905         *list_p = OMP_CLAUSE_CHAIN (c);
4906       else
4907         list_p = &OMP_CLAUSE_CHAIN (c);
4908     }
4909
4910   gimplify_omp_ctxp = ctx;
4911 }
4912
4913 /* For all variables that were not actually used within the context,
4914    remove PRIVATE, SHARED, and FIRSTPRIVATE clauses.  */
4915
4916 static int
4917 gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
4918 {
4919   tree *list_p = (tree *) data;
4920   tree decl = (tree) n->key;
4921   unsigned flags = n->value;
4922   enum omp_clause_code code;
4923   tree clause;
4924   bool private_debug;
4925
4926   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
4927     return 0;
4928   if ((flags & GOVD_SEEN) == 0)
4929     return 0;
4930   if (flags & GOVD_DEBUG_PRIVATE)
4931     {
4932       gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
4933       private_debug = true;
4934     }
4935   else
4936     private_debug
4937       = lang_hooks.decls.omp_private_debug_clause (decl,
4938                                                    !!(flags & GOVD_SHARED));
4939   if (private_debug)
4940     code = OMP_CLAUSE_PRIVATE;
4941   else if (flags & GOVD_SHARED)
4942     {
4943       if (is_global_var (decl))
4944         {
4945           struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp->outer_context;
4946           while (ctx != NULL)
4947             {
4948               splay_tree_node on
4949                 = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4950               if (on && (on->value & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE
4951                                       | GOVD_PRIVATE | GOVD_REDUCTION)) != 0)
4952                 break;
4953               ctx = ctx->outer_context;
4954             }
4955           if (ctx == NULL)
4956             return 0;
4957         }
4958       code = OMP_CLAUSE_SHARED;
4959     }
4960   else if (flags & GOVD_PRIVATE)
4961     code = OMP_CLAUSE_PRIVATE;
4962   else if (flags & GOVD_FIRSTPRIVATE)
4963     code = OMP_CLAUSE_FIRSTPRIVATE;
4964   else
4965     gcc_unreachable ();
4966
4967   clause = build_omp_clause (code);
4968   OMP_CLAUSE_DECL (clause) = decl;
4969   OMP_CLAUSE_CHAIN (clause) = *list_p;
4970   if (private_debug)
4971     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
4972   *list_p = clause;
4973
4974   return 0;
4975 }
4976
4977 static void
4978 gimplify_adjust_omp_clauses (tree *list_p)
4979 {
4980   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
4981   tree c, decl;
4982
4983   while ((c = *list_p) != NULL)
4984     {
4985       splay_tree_node n;
4986       bool remove = false;
4987
4988       switch (OMP_CLAUSE_CODE (c))
4989         {
4990         case OMP_CLAUSE_PRIVATE:
4991         case OMP_CLAUSE_SHARED:
4992         case OMP_CLAUSE_FIRSTPRIVATE:
4993           decl = OMP_CLAUSE_DECL (c);
4994           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
4995           remove = !(n->value & GOVD_SEEN);
4996           if (! remove)
4997             {
4998               bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
4999               if ((n->value & GOVD_DEBUG_PRIVATE)
5000                   || lang_hooks.decls.omp_private_debug_clause (decl, shared))
5001                 {
5002                   gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
5003                               || ((n->value & GOVD_DATA_SHARE_CLASS)
5004                                   == GOVD_PRIVATE));
5005                   OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
5006                   OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
5007                 }
5008             }
5009           break;
5010
5011         case OMP_CLAUSE_LASTPRIVATE:
5012           /* Make sure OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE is set to
5013              accurately reflect the presence of a FIRSTPRIVATE clause.  */
5014           decl = OMP_CLAUSE_DECL (c);
5015           n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
5016           OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)
5017             = (n->value & GOVD_FIRSTPRIVATE) != 0;
5018           break;
5019           
5020         case OMP_CLAUSE_REDUCTION:
5021         case OMP_CLAUSE_COPYIN:
5022         case OMP_CLAUSE_COPYPRIVATE:
5023         case OMP_CLAUSE_IF:
5024         case OMP_CLAUSE_NUM_THREADS:
5025         case OMP_CLAUSE_SCHEDULE:
5026         case OMP_CLAUSE_NOWAIT:
5027         case OMP_CLAUSE_ORDERED:
5028         case OMP_CLAUSE_DEFAULT:
5029           break;
5030
5031         default:
5032           gcc_unreachable ();
5033         }
5034
5035       if (remove)
5036         *list_p = OMP_CLAUSE_CHAIN (c);
5037       else
5038         list_p = &OMP_CLAUSE_CHAIN (c);
5039     }
5040
5041   /* Add in any implicit data sharing.  */
5042   splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
5043   
5044   gimplify_omp_ctxp = ctx->outer_context;
5045   delete_omp_context (ctx);
5046 }
5047
5048 /* Gimplify the contents of an OMP_PARALLEL statement.  This involves
5049    gimplification of the body, as well as scanning the body for used
5050    variables.  We need to do this scan now, because variable-sized
5051    decls will be decomposed during gimplification.  */
5052
5053 static enum gimplify_status
5054 gimplify_omp_parallel (tree *expr_p, tree *pre_p)
5055 {
5056   tree expr = *expr_p;
5057
5058   gimplify_scan_omp_clauses (&OMP_PARALLEL_CLAUSES (expr), pre_p, true,
5059                              OMP_PARALLEL_COMBINED (expr));
5060
5061   push_gimplify_context ();
5062
5063   gimplify_stmt (&OMP_PARALLEL_BODY (expr));
5064
5065   if (TREE_CODE (OMP_PARALLEL_BODY (expr)) == BIND_EXPR)
5066     pop_gimplify_context (OMP_PARALLEL_BODY (expr));
5067   else
5068     pop_gimplify_context (NULL_TREE);
5069
5070   gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
5071
5072   return GS_ALL_DONE;
5073 }
5074
5075 /* Gimplify the gross structure of an OMP_FOR statement.  */
5076
5077 static enum gimplify_status
5078 gimplify_omp_for (tree *expr_p, tree *pre_p)
5079 {
5080   tree for_stmt, decl, t;
5081   enum gimplify_status ret = GS_OK;
5082
5083   for_stmt = *expr_p;
5084
5085   gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, false, false);
5086
5087   t = OMP_FOR_INIT (for_stmt);
5088   gcc_assert (TREE_CODE (t) == MODIFY_EXPR
5089               || TREE_CODE (t) == GIMPLE_MODIFY_STMT);
5090   decl = GENERIC_TREE_OPERAND (t, 0);
5091   gcc_assert (DECL_P (decl));
5092   gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (decl)));
5093
5094   /* Make sure the iteration variable is private.  */
5095   if (omp_is_private (gimplify_omp_ctxp, decl))
5096     omp_notice_variable (gimplify_omp_ctxp, decl, true);
5097   else
5098     omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
5099
5100   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5101                         &OMP_FOR_PRE_BODY (for_stmt),
5102                         NULL, is_gimple_val, fb_rvalue);
5103
5104   tree_to_gimple_tuple (&OMP_FOR_INIT (for_stmt));
5105
5106   t = OMP_FOR_COND (for_stmt);
5107   gcc_assert (COMPARISON_CLASS_P (t));
5108   gcc_assert (GENERIC_TREE_OPERAND (t, 0) == decl);
5109
5110   ret |= gimplify_expr (&GENERIC_TREE_OPERAND (t, 1),
5111                         &OMP_FOR_PRE_BODY (for_stmt),
5112                         NULL, is_gimple_val, fb_rvalue);
5113
5114   tree_to_gimple_tuple (&OMP_FOR_INCR (for_stmt));
5115   t = OMP_FOR_INCR (for_stmt);
5116   switch (TREE_CODE (t))
5117     {
5118     case PREINCREMENT_EXPR:
5119     case POSTINCREMENT_EXPR:
5120       t = build_int_cst (TREE_TYPE (decl), 1);
5121       t = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, t);
5122       t = build_gimple_modify_stmt (decl, t);
5123       OMP_FOR_INCR (for_stmt) = t;
5124       break;
5125
5126     case PREDECREMENT_EXPR:
5127     case POSTDECREMENT_EXPR:
5128       t = build_int_cst (TREE_TYPE (decl), -1);
5129       t = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, t);
5130       t = build_gimple_modify_stmt (decl, t);
5131       OMP_FOR_INCR (for_stmt) = t;
5132       break;
5133       
5134     case GIMPLE_MODIFY_STMT:
5135       gcc_assert (GIMPLE_STMT_OPERAND (t, 0) == decl);
5136       t = GIMPLE_STMT_OPERAND (t, 1);
5137       switch (TREE_CODE (t))
5138         {
5139         case PLUS_EXPR:
5140           if (TREE_OPERAND (t, 1) == decl)
5141             {
5142               TREE_OPERAND (t, 1) = TREE_OPERAND (t, 0);
5143               TREE_OPERAND (t, 0) = decl;
5144               break;
5145             }
5146         case MINUS_EXPR:
5147           gcc_assert (TREE_OPERAND (t, 0) == decl);
5148           break;
5149         default:
5150           gcc_unreachable ();
5151         }
5152
5153       ret |= gimplify_expr (&TREE_OPERAND (t, 1), &OMP_FOR_PRE_BODY (for_stmt),
5154                             NULL, is_gimple_val, fb_rvalue);
5155       break;
5156
5157     default:
5158       gcc_unreachable ();
5159     }
5160
5161   gimplify_to_stmt_list (&OMP_FOR_BODY (for_stmt));
5162   gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (for_stmt));
5163
5164   return ret == GS_ALL_DONE ? GS_ALL_DONE : GS_ERROR;
5165 }
5166
5167 /* Gimplify the gross structure of other OpenMP worksharing constructs.
5168    In particular, OMP_SECTIONS and OMP_SINGLE.  */
5169
5170 static enum gimplify_status
5171 gimplify_omp_workshare (tree *expr_p, tree *pre_p)
5172 {
5173   tree stmt = *expr_p;
5174
5175   gimplify_scan_omp_clauses (&OMP_CLAUSES (stmt), pre_p, false, false);
5176   gimplify_to_stmt_list (&OMP_BODY (stmt));
5177   gimplify_adjust_omp_clauses (&OMP_CLAUSES (stmt));
5178
5179   return GS_ALL_DONE;
5180 }
5181
5182 /* A subroutine of gimplify_omp_atomic.  The front end is supposed to have
5183    stabilized the lhs of the atomic operation as *ADDR.  Return true if 
5184    EXPR is this stabilized form.  */
5185
5186 static bool
5187 goa_lhs_expr_p (tree expr, tree addr)
5188 {
5189   /* Also include casts to other type variants.  The C front end is fond
5190      of adding these for e.g. volatile variables.  This is like 
5191      STRIP_TYPE_NOPS but includes the main variant lookup.  */
5192   while ((TREE_CODE (expr) == NOP_EXPR
5193           || TREE_CODE (expr) == CONVERT_EXPR
5194           || TREE_CODE (expr) == NON_LVALUE_EXPR)
5195          && TREE_OPERAND (expr, 0) != error_mark_node
5196          && (TYPE_MAIN_VARIANT (TREE_TYPE (expr))
5197              == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
5198     expr = TREE_OPERAND (expr, 0);
5199
5200   if (TREE_CODE (expr) == INDIRECT_REF && TREE_OPERAND (expr, 0) == addr)
5201     return true;
5202   if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
5203     return true;
5204   return false;
5205 }
5206
5207 /* A subroutine of gimplify_omp_atomic.  Attempt to implement the atomic
5208    operation as a __sync_fetch_and_op builtin.  INDEX is log2 of the
5209    size of the data type, and thus usable to find the index of the builtin
5210    decl.  Returns GS_UNHANDLED if the expression is not of the proper form.  */
5211
5212 static enum gimplify_status
5213 gimplify_omp_atomic_fetch_op (tree *expr_p, tree addr, tree rhs, int index)
5214 {
5215   enum built_in_function base;
5216   tree decl, itype;
5217   enum insn_code *optab;
5218
5219   /* Check for one of the supported fetch-op operations.  */
5220   switch (TREE_CODE (rhs))
5221     {
5222     case POINTER_PLUS_EXPR:
5223     case PLUS_EXPR:
5224       base = BUILT_IN_FETCH_AND_ADD_N;
5225       optab = sync_add_optab;
5226       break;
5227     case MINUS_EXPR:
5228       base = BUILT_IN_FETCH_AND_SUB_N;
5229       optab = sync_add_optab;
5230       break;
5231     case BIT_AND_EXPR:
5232       base = BUILT_IN_FETCH_AND_AND_N;
5233       optab = sync_and_optab;
5234       break;
5235     case BIT_IOR_EXPR:
5236       base = BUILT_IN_FETCH_AND_OR_N;
5237       optab = sync_ior_optab;
5238       break;
5239     case BIT_XOR_EXPR:
5240       base = BUILT_IN_FETCH_AND_XOR_N;
5241       optab = sync_xor_optab;
5242       break;
5243     default:
5244       return GS_UNHANDLED;
5245     }
5246
5247   /* Make sure the expression is of the proper form.  */
5248   if (goa_lhs_expr_p (TREE_OPERAND (rhs, 0), addr))
5249     rhs = TREE_OPERAND (rhs, 1);
5250   else if (commutative_tree_code (TREE_CODE (rhs))
5251            && goa_lhs_expr_p (TREE_OPERAND (rhs, 1), addr))
5252     rhs = TREE_OPERAND (rhs, 0);
5253   else
5254     return GS_UNHANDLED;
5255
5256   decl = built_in_decls[base + index + 1];
5257   itype = TREE_TYPE (TREE_TYPE (decl));
5258
5259   if (optab[TYPE_MODE (itype)] == CODE_FOR_nothing)
5260     return GS_UNHANDLED;
5261
5262   *expr_p = build_call_expr (decl, 2, addr, fold_convert (itype, rhs));
5263   return GS_OK;
5264 }
5265
5266 /* A subroutine of gimplify_omp_atomic_pipeline.  Walk *EXPR_P and replace
5267    appearances of *LHS_ADDR with LHS_VAR.  If an expression does not involve
5268    the lhs, evaluate it into a temporary.  Return 1 if the lhs appeared as
5269    a subexpression, 0 if it did not, or -1 if an error was encountered.  */
5270
5271 static int
5272 goa_stabilize_expr (tree *expr_p, tree *pre_p, tree lhs_addr, tree lhs_var)
5273 {
5274   tree expr = *expr_p;
5275   int saw_lhs;
5276
5277   if (goa_lhs_expr_p (expr, lhs_addr))
5278     {
5279       *expr_p = lhs_var;
5280       return 1;
5281     }
5282   if (is_gimple_val (expr))
5283     return 0;
5284  
5285   saw_lhs = 0;
5286   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
5287     {
5288     case tcc_binary:
5289       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 1), pre_p,
5290                                      lhs_addr, lhs_var);
5291     case tcc_unary:
5292       saw_lhs |= goa_stabilize_expr (&TREE_OPERAND (expr, 0), pre_p,
5293                                      lhs_addr, lhs_var);
5294       break;
5295     default:
5296       break;
5297     }
5298
5299   if (saw_lhs == 0)
5300     {
5301       enum gimplify_status gs;
5302       gs = gimplify_expr (expr_p, pre_p, NULL, is_gimple_val, fb_rvalue);
5303       if (gs != GS_ALL_DONE)
5304         saw_lhs = -1;
5305     }
5306
5307   return saw_lhs;
5308 }
5309
5310 /* A subroutine of gimplify_omp_atomic.  Implement the atomic operation as:
5311
5312         oldval = *addr;
5313       repeat:
5314         newval = rhs;   // with oldval replacing *addr in rhs
5315         oldval = __sync_val_compare_and_swap (addr, oldval, newval);
5316         if (oldval != newval)
5317           goto repeat;
5318
5319    INDEX is log2 of the size of the data type, and thus usable to find the
5320    index of the builtin decl.  */
5321
5322 static enum gimplify_status
5323 gimplify_omp_atomic_pipeline (tree *expr_p, tree *pre_p, tree addr,
5324                               tree rhs, int index)
5325 {
5326   tree oldval, oldival, oldival2, newval, newival, label;
5327   tree type, itype, cmpxchg, x, iaddr;
5328
5329   cmpxchg = built_in_decls[BUILT_IN_VAL_COMPARE_AND_SWAP_N + index + 1];
5330   type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
5331   itype = TREE_TYPE (TREE_TYPE (cmpxchg));
5332
5333   if (sync_compare_and_swap[TYPE_MODE (itype)] == CODE_FOR_nothing)
5334     return GS_UNHANDLED;
5335
5336   oldval = create_tmp_var (type, NULL);
5337   newval = create_tmp_var (type, NULL);
5338
5339   /* Precompute as much of RHS as possible.  In the same walk, replace
5340      occurrences of the lhs value with our temporary.  */
5341   if (goa_stabilize_expr (&rhs, pre_p, addr, oldval) < 0)
5342     return GS_ERROR;
5343
5344   x = build_fold_indirect_ref (addr);
5345   x = build_gimple_modify_stmt (oldval, x);
5346   gimplify_and_add (x, pre_p);
5347
5348   /* For floating-point values, we'll need to view-convert them to integers
5349      so that we can perform the atomic compare and swap.  Simplify the 
5350      following code by always setting up the "i"ntegral variables.  */
5351   if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
5352     {
5353       oldival = oldval;
5354       newival = newval;
5355       iaddr = addr;
5356     }
5357   else
5358     {
5359       oldival = create_tmp_var (itype, NULL);
5360       newival = create_tmp_var (itype, NULL);
5361
5362       x = build1 (VIEW_CONVERT_EXPR, itype, oldval);
5363       x = build_gimple_modify_stmt (oldival, x);
5364       gimplify_and_add (x, pre_p);
5365       iaddr = fold_convert (build_pointer_type (itype), addr);
5366     }
5367
5368   oldival2 = create_tmp_var (itype, NULL);
5369
5370   label = create_artificial_label ();
5371   x = build1 (LABEL_EXPR, void_type_node, label);
5372   gimplify_and_add (x, pre_p);
5373
5374   x = build_gimple_modify_stmt (newval, rhs);
5375   gimplify_and_add (x, pre_p);
5376
5377   if (newval != newival)
5378     {
5379       x = build1 (VIEW_CONVERT_EXPR, itype, newval);
5380       x = build_gimple_modify_stmt (newival, x);
5381       gimplify_and_add (x, pre_p);
5382     }
5383
5384   x = build_gimple_modify_stmt (oldival2, fold_convert (itype, oldival));
5385   gimplify_and_add (x, pre_p);
5386
5387   x = build_call_expr (cmpxchg, 3, iaddr, fold_convert (itype, oldival),
5388                        fold_convert (itype, newival));
5389   if (oldval == oldival)
5390     x = fold_convert (type, x);
5391   x = build_gimple_modify_stmt (oldival, x);
5392   gimplify_and_add (x, pre_p);
5393
5394   /* For floating point, be prepared for the loop backedge.  */
5395   if (oldval != oldival)
5396     {
5397       x = build1 (VIEW_CONVERT_EXPR, type, oldival);
5398       x = build_gimple_modify_stmt (oldval, x);
5399       gimplify_and_add (x, pre_p);
5400     }
5401
5402   /* Note that we always perform the comparison as an integer, even for
5403      floating point.  This allows the atomic operation to properly 
5404      succeed even with NaNs and -0.0.  */
5405   x = build3 (COND_EXPR, void_type_node,
5406               build2 (NE_EXPR, boolean_type_node,
5407                       fold_convert (itype, oldival), oldival2),
5408               build1 (GOTO_EXPR, void_type_node, label), NULL);
5409   gimplify_and_add (x, pre_p);
5410
5411   *expr_p = NULL;
5412   return GS_ALL_DONE;
5413 }
5414
5415 /* A subroutine of gimplify_omp_atomic.  Implement the atomic operation as:
5416
5417         GOMP_atomic_start ();
5418         *addr = rhs;
5419         GOMP_atomic_end ();
5420
5421    The result is not globally atomic, but works so long as all parallel
5422    references are within #pragma omp atomic directives.  According to
5423    responses received from omp@openmp.org, appears to be within spec.
5424    Which makes sense, since that's how several other compilers handle
5425    this situation as well.  */
5426
5427 static enum gimplify_status
5428 gimplify_omp_atomic_mutex (tree *expr_p, tree *pre_p, tree addr, tree rhs)
5429 {
5430   tree t;
5431
5432   t = built_in_decls[BUILT_IN_GOMP_ATOMIC_START];
5433   t = build_call_expr (t, 0);
5434   gimplify_and_add (t, pre_p);
5435
5436   t = build_fold_indirect_ref (addr);
5437   t = build_gimple_modify_stmt (t, rhs);
5438   gimplify_and_add (t, pre_p);
5439   
5440   t = built_in_decls[BUILT_IN_GOMP_ATOMIC_END];
5441   t = build_call_expr (t, 0);
5442   gimplify_and_add (t, pre_p);
5443
5444   *expr_p = NULL;
5445   return GS_ALL_DONE;
5446 }
5447
5448 /* Gimplify an OMP_ATOMIC statement.  */
5449
5450 static enum gimplify_status
5451 gimplify_omp_atomic (tree *expr_p, tree *pre_p)
5452 {
5453   tree addr = TREE_OPERAND (*expr_p, 0);
5454   tree rhs = TREE_OPERAND (*expr_p, 1);
5455   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (addr)));
5456   HOST_WIDE_INT index;
5457
5458   /* Make sure the type is one of the supported sizes.  */
5459   index = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5460   index = exact_log2 (index);
5461   if (index >= 0 && index <= 4)
5462     {
5463       enum gimplify_status gs;
5464       unsigned int align;
5465
5466       if (DECL_P (TREE_OPERAND (addr, 0)))
5467         align = DECL_ALIGN_UNIT (TREE_OPERAND (addr, 0));
5468       else if (TREE_CODE (TREE_OPERAND (addr, 0)) == COMPONENT_REF
5469                && TREE_CODE (TREE_OPERAND (TREE_OPERAND (addr, 0), 1))
5470                   == FIELD_DECL)
5471         align = DECL_ALIGN_UNIT (TREE_OPERAND (TREE_OPERAND (addr, 0), 1));
5472       else
5473         align = TYPE_ALIGN_UNIT (type);
5474
5475       /* __sync builtins require strict data alignment.  */
5476       if (exact_log2 (align) >= index)
5477         {
5478           /* When possible, use specialized atomic update functions.  */
5479           if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
5480             {
5481               gs = gimplify_omp_atomic_fetch_op (expr_p, addr, rhs, index);
5482               if (gs != GS_UNHANDLED)
5483                 return gs;
5484             }
5485
5486           /* If we don't have specialized __sync builtins, try and implement
5487              as a compare and swap loop.  */
5488           gs = gimplify_omp_atomic_pipeline (expr_p, pre_p, addr, rhs, index);
5489           if (gs != GS_UNHANDLED)
5490             return gs;
5491         }
5492     }
5493
5494   /* The ultimate fallback is wrapping the operation in a mutex.  */
5495   return gimplify_omp_atomic_mutex (expr_p, pre_p, addr, rhs);
5496 }
5497
5498 /*  Gimplifies the expression tree pointed to by EXPR_P.  Return 0 if
5499     gimplification failed.
5500
5501     PRE_P points to the list where side effects that must happen before
5502         EXPR should be stored.
5503
5504     POST_P points to the list where side effects that must happen after
5505         EXPR should be stored, or NULL if there is no suitable list.  In
5506         that case, we copy the result to a temporary, emit the
5507         post-effects, and then return the temporary.
5508
5509     GIMPLE_TEST_F points to a function that takes a tree T and
5510         returns nonzero if T is in the GIMPLE form requested by the
5511         caller.  The GIMPLE predicates are in tree-gimple.c.
5512
5513         This test is used twice.  Before gimplification, the test is
5514         invoked to determine whether *EXPR_P is already gimple enough.  If
5515         that fails, *EXPR_P is gimplified according to its code and
5516         GIMPLE_TEST_F is called again.  If the test still fails, then a new
5517         temporary variable is created and assigned the value of the
5518         gimplified expression.
5519
5520     FALLBACK tells the function what sort of a temporary we want.  If the 1
5521         bit is set, an rvalue is OK.  If the 2 bit is set, an lvalue is OK.
5522         If both are set, either is OK, but an lvalue is preferable.
5523
5524     The return value is either GS_ERROR or GS_ALL_DONE, since this function
5525     iterates until solution.  */
5526
5527 enum gimplify_status
5528 gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
5529                bool (* gimple_test_f) (tree), fallback_t fallback)
5530 {
5531   tree tmp;
5532   tree internal_pre = NULL_TREE;
5533   tree internal_post = NULL_TREE;
5534   tree save_expr;
5535   int is_statement = (pre_p == NULL);
5536   location_t saved_location;
5537   enum gimplify_status ret;
5538
5539   save_expr = *expr_p;
5540   if (save_expr == NULL_TREE)
5541     return GS_ALL_DONE;
5542
5543   /* We used to check the predicate here and return immediately if it
5544      succeeds.  This is wrong; the design is for gimplification to be
5545      idempotent, and for the predicates to only test for valid forms, not
5546      whether they are fully simplified.  */
5547
5548   /* Set up our internal queues if needed.  */
5549   if (pre_p == NULL)
5550     pre_p = &internal_pre;
5551   if (post_p == NULL)
5552     post_p = &internal_post;
5553
5554   saved_location = input_location;
5555   if (save_expr != error_mark_node
5556       && EXPR_HAS_LOCATION (*expr_p))
5557     input_location = EXPR_LOCATION (*expr_p);
5558
5559   /* Loop over the specific gimplifiers until the toplevel node
5560      remains the same.  */
5561   do
5562     {
5563       /* Strip away as many useless type conversions as possible
5564          at the toplevel.  */
5565       STRIP_USELESS_TYPE_CONVERSION (*expr_p);
5566
5567       /* Remember the expr.  */
5568       save_expr = *expr_p;
5569
5570       /* Die, die, die, my darling.  */
5571       if (save_expr == error_mark_node
5572           || (!GIMPLE_STMT_P (save_expr)
5573               && TREE_TYPE (save_expr)
5574               && TREE_TYPE (save_expr) == error_mark_node))
5575         {
5576           ret = GS_ERROR;
5577           break;
5578         }
5579
5580       /* Do any language-specific gimplification.  */
5581       ret = lang_hooks.gimplify_expr (expr_p, pre_p, post_p);
5582       if (ret == GS_OK)
5583         {
5584           if (*expr_p == NULL_TREE)
5585             break;
5586           if (*expr_p != save_expr)
5587             continue;
5588         }
5589       else if (ret != GS_UNHANDLED)
5590         break;
5591
5592       ret = GS_OK;
5593       switch (TREE_CODE (*expr_p))
5594         {
5595           /* First deal with the special cases.  */
5596
5597         case POSTINCREMENT_EXPR:
5598         case POSTDECREMENT_EXPR:
5599         case PREINCREMENT_EXPR:
5600         case PREDECREMENT_EXPR:
5601           ret = gimplify_self_mod_expr (expr_p, pre_p, post_p,
5602                                         fallback != fb_none);
5603           break;
5604
5605         case ARRAY_REF:
5606         case ARRAY_RANGE_REF:
5607         case REALPART_EXPR:
5608         case IMAGPART_EXPR:
5609         case COMPONENT_REF:
5610         case VIEW_CONVERT_EXPR:
5611           ret = gimplify_compound_lval (expr_p, pre_p, post_p,
5612                                         fallback ? fallback : fb_rvalue);
5613           break;
5614
5615         case COND_EXPR:
5616           ret = gimplify_cond_expr (expr_p, pre_p, fallback);
5617           /* C99 code may assign to an array in a structure value of a
5618              conditional expression, and this has undefined behavior
5619              only on execution, so create a temporary if an lvalue is
5620              required.  */
5621           if (fallback == fb_lvalue)
5622             {
5623               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5624               mark_addressable (*expr_p);
5625             }
5626           break;
5627
5628         case CALL_EXPR:
5629           ret = gimplify_call_expr (expr_p, pre_p, fallback != fb_none);
5630           /* C99 code may assign to an array in a structure returned
5631              from a function, and this has undefined behavior only on
5632              execution, so create a temporary if an lvalue is
5633              required.  */
5634           if (fallback == fb_lvalue)
5635             {
5636               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5637               mark_addressable (*expr_p);
5638             }
5639           break;
5640
5641         case TREE_LIST:
5642           gcc_unreachable ();
5643
5644         case COMPOUND_EXPR:
5645           ret = gimplify_compound_expr (expr_p, pre_p, fallback != fb_none);
5646           break;
5647
5648         case MODIFY_EXPR:
5649         case GIMPLE_MODIFY_STMT:
5650         case INIT_EXPR:
5651           ret = gimplify_modify_expr (expr_p, pre_p, post_p,
5652                                       fallback != fb_none);
5653
5654           if (*expr_p)
5655             {
5656               /* The distinction between MODIFY_EXPR and INIT_EXPR is no longer
5657                  useful.  */
5658               if (TREE_CODE (*expr_p) == INIT_EXPR)
5659                 TREE_SET_CODE (*expr_p, MODIFY_EXPR);
5660
5661               /* Convert MODIFY_EXPR to GIMPLE_MODIFY_STMT.  */
5662               if (TREE_CODE (*expr_p) == MODIFY_EXPR)
5663                 tree_to_gimple_tuple (expr_p);
5664             }
5665
5666           break;
5667
5668         case TRUTH_ANDIF_EXPR:
5669         case TRUTH_ORIF_EXPR:
5670           ret = gimplify_boolean_expr (expr_p);
5671           break;
5672
5673         case TRUTH_NOT_EXPR:
5674           TREE_OPERAND (*expr_p, 0)
5675             = gimple_boolify (TREE_OPERAND (*expr_p, 0));
5676           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5677                                is_gimple_val, fb_rvalue);
5678           recalculate_side_effects (*expr_p);
5679           break;
5680
5681         case ADDR_EXPR:
5682           ret = gimplify_addr_expr (expr_p, pre_p, post_p);
5683           break;
5684
5685         case VA_ARG_EXPR:
5686           ret = gimplify_va_arg_expr (expr_p, pre_p, post_p);
5687           break;
5688
5689         case CONVERT_EXPR:
5690         case NOP_EXPR:
5691           if (IS_EMPTY_STMT (*expr_p))
5692             {
5693               ret = GS_ALL_DONE;
5694               break;
5695             }
5696
5697           if (VOID_TYPE_P (TREE_TYPE (*expr_p))
5698               || fallback == fb_none)
5699             {
5700               /* Just strip a conversion to void (or in void context) and
5701                  try again.  */
5702               *expr_p = TREE_OPERAND (*expr_p, 0);
5703               break;
5704             }
5705
5706           ret = gimplify_conversion (expr_p);
5707           if (ret == GS_ERROR)
5708             break;
5709           if (*expr_p != save_expr)
5710             break;
5711           /* FALLTHRU */
5712
5713         case FIX_TRUNC_EXPR:
5714           /* unary_expr: ... | '(' cast ')' val | ...  */
5715           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5716                                is_gimple_val, fb_rvalue);
5717           recalculate_side_effects (*expr_p);
5718           break;
5719
5720         case INDIRECT_REF:
5721           *expr_p = fold_indirect_ref (*expr_p);
5722           if (*expr_p != save_expr)
5723             break;
5724           /* else fall through.  */
5725         case ALIGN_INDIRECT_REF:
5726         case MISALIGNED_INDIRECT_REF:
5727           ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5728                                is_gimple_reg, fb_rvalue);
5729           recalculate_side_effects (*expr_p);
5730           break;
5731
5732           /* Constants need not be gimplified.  */
5733         case INTEGER_CST:
5734         case REAL_CST:
5735         case STRING_CST:
5736         case COMPLEX_CST:
5737         case VECTOR_CST:
5738           ret = GS_ALL_DONE;
5739           break;
5740
5741         case CONST_DECL:
5742           /* If we require an lvalue, such as for ADDR_EXPR, retain the
5743              CONST_DECL node.  Otherwise the decl is replaceable by its
5744              value.  */
5745           /* ??? Should be == fb_lvalue, but ADDR_EXPR passes fb_either.  */
5746           if (fallback & fb_lvalue)
5747             ret = GS_ALL_DONE;
5748           else
5749             *expr_p = DECL_INITIAL (*expr_p);
5750           break;
5751
5752         case DECL_EXPR:
5753           ret = gimplify_decl_expr (expr_p);
5754           break;
5755
5756         case EXC_PTR_EXPR:
5757           /* FIXME make this a decl.  */
5758           ret = GS_ALL_DONE;
5759           break;
5760
5761         case BIND_EXPR:
5762           ret = gimplify_bind_expr (expr_p, pre_p);
5763           break;
5764
5765         case LOOP_EXPR:
5766           ret = gimplify_loop_expr (expr_p, pre_p);
5767           break;
5768
5769         case SWITCH_EXPR:
5770           ret = gimplify_switch_expr (expr_p, pre_p);
5771           break;
5772
5773         case EXIT_EXPR:
5774           ret = gimplify_exit_expr (expr_p);
5775           break;
5776
5777         case GOTO_EXPR:
5778           /* If the target is not LABEL, then it is a computed jump
5779              and the target needs to be gimplified.  */
5780           if (TREE_CODE (GOTO_DESTINATION (*expr_p)) != LABEL_DECL)
5781             ret = gimplify_expr (&GOTO_DESTINATION (*expr_p), pre_p,
5782                                  NULL, is_gimple_val, fb_rvalue);
5783           break;
5784
5785         case LABEL_EXPR:
5786           ret = GS_ALL_DONE;
5787           gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
5788                       == current_function_decl);
5789           break;
5790
5791         case CASE_LABEL_EXPR:
5792           ret = gimplify_case_label_expr (expr_p);
5793           break;
5794
5795         case RETURN_EXPR:
5796           ret = gimplify_return_expr (*expr_p, pre_p);
5797           break;
5798
5799         case CONSTRUCTOR:
5800           /* Don't reduce this in place; let gimplify_init_constructor work its
5801              magic.  Buf if we're just elaborating this for side effects, just
5802              gimplify any element that has side-effects.  */
5803           if (fallback == fb_none)
5804             {
5805               unsigned HOST_WIDE_INT ix;
5806               constructor_elt *ce;
5807               tree temp = NULL_TREE;
5808               for (ix = 0;
5809                    VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
5810                                 ix, ce);
5811                    ix++)
5812                 if (TREE_SIDE_EFFECTS (ce->value))
5813                   append_to_statement_list (ce->value, &temp);
5814
5815               *expr_p = temp;
5816               ret = GS_OK;
5817             }
5818           /* C99 code may assign to an array in a constructed
5819              structure or union, and this has undefined behavior only
5820              on execution, so create a temporary if an lvalue is
5821              required.  */
5822           else if (fallback == fb_lvalue)
5823             {
5824               *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
5825               mark_addressable (*expr_p);
5826             }
5827           else
5828             ret = GS_ALL_DONE;
5829           break;
5830
5831           /* The following are special cases that are not handled by the
5832              original GIMPLE grammar.  */
5833
5834           /* SAVE_EXPR nodes are converted into a GIMPLE identifier and
5835              eliminated.  */
5836         case SAVE_EXPR:
5837           ret = gimplify_save_expr (expr_p, pre_p, post_p);
5838           break;
5839
5840         case BIT_FIELD_REF:
5841           {
5842             enum gimplify_status r0, r1, r2;
5843
5844             r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
5845                                 is_gimple_lvalue, fb_either);
5846             r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5847                                 is_gimple_val, fb_rvalue);
5848             r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p, post_p,
5849                                 is_gimple_val, fb_rvalue);
5850             recalculate_side_effects (*expr_p);
5851
5852             ret = MIN (r0, MIN (r1, r2));
5853           }
5854           break;
5855
5856         case NON_LVALUE_EXPR:
5857           /* This should have been stripped above.  */
5858           gcc_unreachable ();
5859
5860         case ASM_EXPR:
5861           ret = gimplify_asm_expr (expr_p, pre_p, post_p);
5862           break;
5863
5864         case TRY_FINALLY_EXPR:
5865         case TRY_CATCH_EXPR:
5866           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 0));
5867           gimplify_to_stmt_list (&TREE_OPERAND (*expr_p, 1));
5868           ret = GS_ALL_DONE;
5869           break;
5870
5871         case CLEANUP_POINT_EXPR:
5872           ret = gimplify_cleanup_point_expr (expr_p, pre_p);
5873           break;
5874
5875         case TARGET_EXPR:
5876           ret = gimplify_target_expr (expr_p, pre_p, post_p);
5877           break;
5878
5879         case CATCH_EXPR:
5880           gimplify_to_stmt_list (&CATCH_BODY (*expr_p));
5881           ret = GS_ALL_DONE;
5882           break;
5883
5884         case EH_FILTER_EXPR:
5885           gimplify_to_stmt_list (&EH_FILTER_FAILURE (*expr_p));
5886           ret = GS_ALL_DONE;
5887           break;
5888
5889         case CHANGE_DYNAMIC_TYPE_EXPR:
5890           ret = gimplify_expr (&CHANGE_DYNAMIC_TYPE_LOCATION (*expr_p),
5891                                pre_p, post_p, is_gimple_reg, fb_lvalue);
5892           break;
5893
5894         case OBJ_TYPE_REF:
5895           {
5896             enum gimplify_status r0, r1;
5897             r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, post_p,
5898                                 is_gimple_val, fb_rvalue);
5899             r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
5900                                 is_gimple_val, fb_rvalue);
5901             ret = MIN (r0, r1);
5902           }
5903           break;
5904
5905         case LABEL_DECL:
5906           /* We get here when taking the address of a label.  We mark
5907              the label as "forced"; meaning it can never be removed and
5908              it is a potential target for any computed goto.  */
5909           FORCED_LABEL (*expr_p) = 1;
5910           ret = GS_ALL_DONE;
5911           break;
5912
5913         case STATEMENT_LIST:
5914           ret = gimplify_statement_list (expr_p, pre_p);
5915           break;
5916
5917         case WITH_SIZE_EXPR:
5918           {
5919             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
5920                            post_p == &internal_post ? NULL : post_p,
5921                            gimple_test_f, fallback);
5922             gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
5923                            is_gimple_val, fb_rvalue);
5924           }
5925           break;
5926
5927         case VAR_DECL:
5928         case PARM_DECL:
5929           ret = gimplify_var_or_parm_decl (expr_p);
5930           break;
5931
5932         case RESULT_DECL:
5933           /* When within an OpenMP context, notice uses of variables.  */
5934           if (gimplify_omp_ctxp)
5935             omp_notice_variable (gimplify_omp_ctxp, *expr_p, true);
5936           ret = GS_ALL_DONE;
5937           break;
5938
5939         case SSA_NAME:
5940           /* Allow callbacks into the gimplifier during optimization.  */
5941           ret = GS_ALL_DONE;
5942           break;
5943
5944         case OMP_PARALLEL:
5945           ret = gimplify_omp_parallel (expr_p, pre_p);
5946           break;
5947
5948         case OMP_FOR:
5949           ret = gimplify_omp_for (expr_p, pre_p);
5950           break;
5951
5952         case OMP_SECTIONS:
5953         case OMP_SINGLE:
5954           ret = gimplify_omp_workshare (expr_p, pre_p);
5955           break;
5956
5957         case OMP_SECTION:
5958         case OMP_MASTER:
5959         case OMP_ORDERED:
5960         case OMP_CRITICAL:
5961           gimplify_to_stmt_list (&OMP_BODY (*expr_p));
5962           break;
5963
5964         case OMP_ATOMIC:
5965           ret = gimplify_omp_atomic (expr_p, pre_p);
5966           break;
5967
5968         case OMP_RETURN:
5969         case OMP_CONTINUE:
5970           ret = GS_ALL_DONE;
5971           break;
5972
5973         case POINTER_PLUS_EXPR:
5974           /* Convert ((type *)A)+offset into &A->field_of_type_and_offset.
5975              The second is gimple immediate saving a need for extra statement.
5976            */
5977           if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
5978               && (tmp = maybe_fold_offset_to_reference
5979                          (TREE_OPERAND (*expr_p, 0), TREE_OPERAND (*expr_p, 1),
5980                           TREE_TYPE (TREE_TYPE (*expr_p)))))
5981              {
5982                *expr_p = build_fold_addr_expr_with_type (tmp,
5983                                                          TREE_TYPE (*expr_p));
5984                break;
5985              }
5986           /* Convert (void *)&a + 4 into (void *)&a[1].  */
5987           if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR
5988               && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST
5989               && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p,
5990                                                                         0),0)))
5991               && (tmp = maybe_fold_offset_to_reference
5992                          (TREE_OPERAND (TREE_OPERAND (*expr_p, 0), 0),
5993                           TREE_OPERAND (*expr_p, 1),
5994                           TREE_TYPE (TREE_TYPE
5995                                   (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),
5996                                                  0))))))
5997              {
5998                tmp = build_fold_addr_expr (tmp);
5999                *expr_p = fold_convert (TREE_TYPE (*expr_p), tmp);
6000                break;
6001              }
6002           /* FALLTHRU */
6003         default:
6004           switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
6005             {
6006             case tcc_comparison:
6007               /* Handle comparison of objects of non scalar mode aggregates
6008                  with a call to memcmp.  It would be nice to only have to do
6009                  this for variable-sized objects, but then we'd have to allow
6010                  the same nest of reference nodes we allow for MODIFY_EXPR and
6011                  that's too complex.
6012
6013                  Compare scalar mode aggregates as scalar mode values.  Using
6014                  memcmp for them would be very inefficient at best, and is
6015                  plain wrong if bitfields are involved.  */
6016
6017               {
6018                 tree type = TREE_TYPE (TREE_OPERAND (*expr_p, 1));
6019
6020                 if (!AGGREGATE_TYPE_P (type))
6021                   goto expr_2;
6022                 else if (TYPE_MODE (type) != BLKmode)
6023                   ret = gimplify_scalar_mode_aggregate_compare (expr_p);
6024                 else
6025                   ret = gimplify_variable_sized_compare (expr_p);
6026
6027                 break;
6028                 }
6029
6030             /* If *EXPR_P does not need to be special-cased, handle it
6031                according to its class.  */
6032             case tcc_unary:
6033               ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6034                                    post_p, is_gimple_val, fb_rvalue);
6035               break;
6036
6037             case tcc_binary:
6038             expr_2:
6039               {
6040                 enum gimplify_status r0, r1;
6041
6042                 r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
6043                                     post_p, is_gimple_val, fb_rvalue);
6044                 r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
6045                                     post_p, is_gimple_val, fb_rvalue);
6046
6047                 ret = MIN (r0, r1);
6048                 break;
6049               }
6050
6051             case tcc_declaration:
6052             case tcc_constant:
6053               ret = GS_ALL_DONE;
6054               goto dont_recalculate;
6055
6056             default:
6057               gcc_assert (TREE_CODE (*expr_p) == TRUTH_AND_EXPR
6058                           || TREE_CODE (*expr_p) == TRUTH_OR_EXPR
6059                           || TREE_CODE (*expr_p) == TRUTH_XOR_EXPR);
6060               goto expr_2;
6061             }
6062
6063           recalculate_side_effects (*expr_p);
6064         dont_recalculate:
6065           break;
6066         }
6067
6068       /* If we replaced *expr_p, gimplify again.  */
6069       if (ret == GS_OK && (*expr_p == NULL || *expr_p == save_expr))
6070         ret = GS_ALL_DONE;
6071     }
6072   while (ret == GS_OK);
6073
6074   /* If we encountered an error_mark somewhere nested inside, either
6075      stub out the statement or propagate the error back out.  */
6076   if (ret == GS_ERROR)
6077     {
6078       if (is_statement)
6079         *expr_p = NULL;
6080       goto out;
6081     }
6082
6083   /* This was only valid as a return value from the langhook, which
6084      we handled.  Make sure it doesn't escape from any other context.  */
6085   gcc_assert (ret != GS_UNHANDLED);
6086
6087   if (fallback == fb_none && *expr_p && !is_gimple_stmt (*expr_p))
6088     {
6089       /* We aren't looking for a value, and we don't have a valid
6090          statement.  If it doesn't have side-effects, throw it away.  */
6091       if (!TREE_SIDE_EFFECTS (*expr_p))
6092         *expr_p = NULL;
6093       else if (!TREE_THIS_VOLATILE (*expr_p))
6094         {
6095           /* This is probably a _REF that contains something nested that
6096              has side effects.  Recurse through the operands to find it.  */
6097           enum tree_code code = TREE_CODE (*expr_p);
6098
6099           switch (code)
6100             {
6101             case COMPONENT_REF:
6102             case REALPART_EXPR:
6103             case IMAGPART_EXPR:
6104             case VIEW_CONVERT_EXPR:
6105               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6106                              gimple_test_f, fallback);
6107               break;
6108
6109             case ARRAY_REF:
6110             case ARRAY_RANGE_REF:
6111               gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
6112                              gimple_test_f, fallback);
6113               gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p, post_p,
6114                              gimple_test_f, fallback);
6115               break;
6116
6117             default:
6118                /* Anything else with side-effects must be converted to
6119                   a valid statement before we get here.  */
6120               gcc_unreachable ();
6121             }
6122
6123           *expr_p = NULL;
6124         }
6125       else if (COMPLETE_TYPE_P (TREE_TYPE (*expr_p))
6126                && TYPE_MODE (TREE_TYPE (*expr_p)) != BLKmode)
6127         {
6128           /* Historically, the compiler has treated a bare reference
6129              to a non-BLKmode volatile lvalue as forcing a load.  */
6130           tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
6131           /* Normally, we do not want to create a temporary for a
6132              TREE_ADDRESSABLE type because such a type should not be
6133              copied by bitwise-assignment.  However, we make an
6134              exception here, as all we are doing here is ensuring that
6135              we read the bytes that make up the type.  We use
6136              create_tmp_var_raw because create_tmp_var will abort when
6137              given a TREE_ADDRESSABLE type.  */
6138           tree tmp = create_tmp_var_raw (type, "vol");
6139           gimple_add_tmp_var (tmp);
6140           *expr_p = build_gimple_modify_stmt (tmp, *expr_p);
6141         }
6142       else
6143         /* We can't do anything useful with a volatile reference to
6144            an incomplete type, so just throw it away.  Likewise for
6145            a BLKmode type, since any implicit inner load should
6146            already have been turned into an explicit one by the
6147            gimplification process.  */
6148         *expr_p = NULL;
6149     }
6150
6151   /* If we are gimplifying at the statement level, we're done.  Tack
6152      everything together and replace the original statement with the
6153      gimplified form.  */
6154   if (fallback == fb_none || is_statement)
6155     {
6156       if (internal_pre || internal_post)
6157         {
6158           append_to_statement_list (*expr_p, &internal_pre);
6159           append_to_statement_list (internal_post, &internal_pre);
6160           annotate_all_with_locus (&internal_pre, input_location);
6161           *expr_p = internal_pre;
6162         }
6163       else if (!*expr_p)
6164         ;
6165       else if (TREE_CODE (*expr_p) == STATEMENT_LIST)
6166         annotate_all_with_locus (expr_p, input_location);
6167       else
6168         annotate_one_with_locus (*expr_p, input_location);
6169       goto out;
6170     }
6171
6172   /* Otherwise we're gimplifying a subexpression, so the resulting value is
6173      interesting.  */
6174
6175   /* If it's sufficiently simple already, we're done.  Unless we are
6176      handling some post-effects internally; if that's the case, we need to
6177      copy into a temp before adding the post-effects to the tree.  */
6178   if (!internal_post && (*gimple_test_f) (*expr_p))
6179     goto out;
6180
6181   /* Otherwise, we need to create a new temporary for the gimplified
6182      expression.  */
6183
6184   /* We can't return an lvalue if we have an internal postqueue.  The
6185      object the lvalue refers to would (probably) be modified by the
6186      postqueue; we need to copy the value out first, which means an
6187      rvalue.  */
6188   if ((fallback & fb_lvalue) && !internal_post
6189       && is_gimple_addressable (*expr_p))
6190     {
6191       /* An lvalue will do.  Take the address of the expression, store it
6192          in a temporary, and replace the expression with an INDIRECT_REF of
6193          that temporary.  */
6194       tmp = build_fold_addr_expr (*expr_p);
6195       gimplify_expr (&tmp, pre_p, post_p, is_gimple_reg, fb_rvalue);
6196       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (tmp)), tmp);
6197     }
6198   else if ((fallback & fb_rvalue) && is_gimple_formal_tmp_rhs (*expr_p))
6199     {
6200       gcc_assert (!VOID_TYPE_P (TREE_TYPE (*expr_p)));
6201
6202       /* An rvalue will do.  Assign the gimplified expression into a new
6203          temporary TMP and replace the original expression with TMP.  */
6204
6205       if (internal_post || (fallback & fb_lvalue))
6206         /* The postqueue might change the value of the expression between
6207            the initialization and use of the temporary, so we can't use a
6208            formal temp.  FIXME do we care?  */
6209         *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
6210       else
6211         *expr_p = get_formal_tmp_var (*expr_p, pre_p);
6212
6213       if (TREE_CODE (*expr_p) != SSA_NAME)
6214         DECL_GIMPLE_FORMAL_TEMP_P (*expr_p) = 1;
6215     }
6216   else
6217     {
6218 #ifdef ENABLE_CHECKING
6219       if (!(fallback & fb_mayfail))
6220         {
6221           fprintf (stderr, "gimplification failed:\n");
6222           print_generic_expr (stderr, *expr_p, 0);
6223           debug_tree (*expr_p);
6224           internal_error ("gimplification failed");
6225         }
6226 #endif
6227       gcc_assert (fallback & fb_mayfail);
6228       /* If this is an asm statement, and the user asked for the
6229          impossible, don't die.  Fail and let gimplify_asm_expr
6230          issue an error.  */
6231       ret = GS_ERROR;
6232       goto out;
6233     }
6234
6235   /* Make sure the temporary matches our predicate.  */
6236   gcc_assert ((*gimple_test_f) (*expr_p));
6237
6238   if (internal_post)
6239     {
6240       annotate_all_with_locus (&internal_post, input_location);
6241       append_to_statement_list (internal_post, pre_p);
6242     }
6243
6244  out:
6245   input_location = saved_location;
6246   return ret;
6247 }
6248
6249 /* Look through TYPE for variable-sized objects and gimplify each such
6250    size that we find.  Add to LIST_P any statements generated.  */
6251
6252 void
6253 gimplify_type_sizes (tree type, tree *list_p)
6254 {
6255   tree field, t;
6256
6257   if (type == NULL || type == error_mark_node)
6258     return;
6259
6260   /* We first do the main variant, then copy into any other variants.  */
6261   type = TYPE_MAIN_VARIANT (type);
6262
6263   /* Avoid infinite recursion.  */
6264   if (TYPE_SIZES_GIMPLIFIED (type))
6265     return;
6266
6267   TYPE_SIZES_GIMPLIFIED (type) = 1;
6268
6269   switch (TREE_CODE (type))
6270     {
6271     case INTEGER_TYPE:
6272     case ENUMERAL_TYPE:
6273     case BOOLEAN_TYPE:
6274     case REAL_TYPE:
6275       gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
6276       gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);
6277
6278       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6279         {
6280           TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
6281           TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
6282         }
6283       break;
6284
6285     case ARRAY_TYPE:
6286       /* These types may not have declarations, so handle them here.  */
6287       gimplify_type_sizes (TREE_TYPE (type), list_p);
6288       gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
6289       break;
6290
6291     case RECORD_TYPE:
6292     case UNION_TYPE:
6293     case QUAL_UNION_TYPE:
6294       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6295         if (TREE_CODE (field) == FIELD_DECL)
6296           {
6297             gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
6298             gimplify_type_sizes (TREE_TYPE (field), list_p);
6299           }
6300       break;
6301
6302     case POINTER_TYPE:
6303     case REFERENCE_TYPE:
6304         /* We used to recurse on the pointed-to type here, which turned out to
6305            be incorrect because its definition might refer to variables not
6306            yet initialized at this point if a forward declaration is involved.
6307
6308            It was actually useful for anonymous pointed-to types to ensure
6309            that the sizes evaluation dominates every possible later use of the
6310            values.  Restricting to such types here would be safe since there
6311            is no possible forward declaration around, but would introduce an
6312            undesirable middle-end semantic to anonymity.  We then defer to
6313            front-ends the responsibility of ensuring that the sizes are
6314            evaluated both early and late enough, e.g. by attaching artificial
6315            type declarations to the tree.  */
6316       break;
6317
6318     default:
6319       break;
6320     }
6321
6322   gimplify_one_sizepos (&TYPE_SIZE (type), list_p);
6323   gimplify_one_sizepos (&TYPE_SIZE_UNIT (type), list_p);
6324
6325   for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
6326     {
6327       TYPE_SIZE (t) = TYPE_SIZE (type);
6328       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
6329       TYPE_SIZES_GIMPLIFIED (t) = 1;
6330     }
6331 }
6332
6333 /* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
6334    a size or position, has had all of its SAVE_EXPRs evaluated.
6335    We add any required statements to STMT_P.  */
6336
6337 void
6338 gimplify_one_sizepos (tree *expr_p, tree *stmt_p)
6339 {
6340   tree type, expr = *expr_p;
6341
6342   /* We don't do anything if the value isn't there, is constant, or contains
6343      A PLACEHOLDER_EXPR.  We also don't want to do anything if it's already
6344      a VAR_DECL.  If it's a VAR_DECL from another function, the gimplifier
6345      will want to replace it with a new variable, but that will cause problems
6346      if this type is from outside the function.  It's OK to have that here.  */
6347   if (expr == NULL_TREE || TREE_CONSTANT (expr)
6348       || TREE_CODE (expr) == VAR_DECL
6349       || CONTAINS_PLACEHOLDER_P (expr))
6350     return;
6351
6352   type = TREE_TYPE (expr);
6353   *expr_p = unshare_expr (expr);
6354
6355   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue);
6356   expr = *expr_p;
6357
6358   /* Verify that we've an exact type match with the original expression.
6359      In particular, we do not wish to drop a "sizetype" in favour of a
6360      type of similar dimensions.  We don't want to pollute the generic
6361      type-stripping code with this knowledge because it doesn't matter
6362      for the bulk of GENERIC/GIMPLE.  It only matters that TYPE_SIZE_UNIT
6363      and friends retain their "sizetype-ness".  */
6364   if (TREE_TYPE (expr) != type
6365       && TREE_CODE (type) == INTEGER_TYPE
6366       && TYPE_IS_SIZETYPE (type))
6367     {
6368       tree tmp;
6369
6370       *expr_p = create_tmp_var (type, NULL);
6371       tmp = build1 (NOP_EXPR, type, expr);
6372       tmp = build_gimple_modify_stmt (*expr_p, tmp);
6373       if (EXPR_HAS_LOCATION (expr))
6374         SET_EXPR_LOCUS (tmp, EXPR_LOCUS (expr));
6375       else
6376         SET_EXPR_LOCATION (tmp, input_location);
6377
6378       gimplify_and_add (tmp, stmt_p);
6379     }
6380 }
6381 \f
6382 #ifdef ENABLE_CHECKING
6383 /* Compare types A and B for a "close enough" match.  */
6384
6385 static bool
6386 cpt_same_type (tree a, tree b)
6387 {
6388   if (lang_hooks.types_compatible_p (a, b))
6389     return true;
6390
6391   /* ??? The C++ FE decomposes METHOD_TYPES to FUNCTION_TYPES and doesn't
6392      link them together.  This routine is intended to catch type errors
6393      that will affect the optimizers, and the optimizers don't add new
6394      dereferences of function pointers, so ignore it.  */
6395   if ((TREE_CODE (a) == FUNCTION_TYPE || TREE_CODE (a) == METHOD_TYPE)
6396       && (TREE_CODE (b) == FUNCTION_TYPE || TREE_CODE (b) == METHOD_TYPE))
6397     return true;
6398
6399   /* ??? The C FE pushes type qualifiers after the fact into the type of
6400      the element from the type of the array.  See build_unary_op's handling
6401      of ADDR_EXPR.  This seems wrong -- if we were going to do this, we
6402      should have done it when creating the variable in the first place.
6403      Alternately, why aren't the two array types made variants?  */
6404   if (TREE_CODE (a) == ARRAY_TYPE && TREE_CODE (b) == ARRAY_TYPE)
6405     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
6406
6407   /* And because of those, we have to recurse down through pointers.  */
6408   if (POINTER_TYPE_P (a) && POINTER_TYPE_P (b))
6409     return cpt_same_type (TREE_TYPE (a), TREE_TYPE (b));
6410
6411   return false;
6412 }
6413
6414 /* Check for some cases of the front end missing cast expressions.
6415    The type of a dereference should correspond to the pointer type;
6416    similarly the type of an address should match its object.  */
6417
6418 static tree
6419 check_pointer_types_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
6420                        void *data ATTRIBUTE_UNUSED)
6421 {
6422   tree t = *tp;
6423   tree ptype, otype, dtype;
6424
6425   switch (TREE_CODE (t))
6426     {
6427     case INDIRECT_REF:
6428     case ARRAY_REF:
6429       otype = TREE_TYPE (t);
6430       ptype = TREE_TYPE (TREE_OPERAND (t, 0));
6431       dtype = TREE_TYPE (ptype);
6432       gcc_assert (cpt_same_type (otype, dtype));
6433       break;
6434
6435     case ADDR_EXPR:
6436       ptype = TREE_TYPE (t);
6437       otype = TREE_TYPE (TREE_OPERAND (t, 0));
6438       dtype = TREE_TYPE (ptype);
6439       if (!cpt_same_type (otype, dtype))
6440         {
6441           /* &array is allowed to produce a pointer to the element, rather than
6442              a pointer to the array type.  We must allow this in order to
6443              properly represent assigning the address of an array in C into
6444              pointer to the element type.  */
6445           gcc_assert (TREE_CODE (otype) == ARRAY_TYPE
6446                       && POINTER_TYPE_P (ptype)
6447                       && cpt_same_type (TREE_TYPE (otype), dtype));
6448           break;
6449         }
6450       break;
6451
6452     default:
6453       return NULL_TREE;
6454     }
6455
6456
6457   return NULL_TREE;
6458 }
6459 #endif
6460
6461 /* Gimplify the body of statements pointed to by BODY_P.  FNDECL is the
6462    function decl containing BODY.  */
6463
6464 void
6465 gimplify_body (tree *body_p, tree fndecl, bool do_parms)
6466 {
6467   location_t saved_location = input_location;
6468   tree body, parm_stmts;
6469
6470   timevar_push (TV_TREE_GIMPLIFY);
6471
6472   gcc_assert (gimplify_ctxp == NULL);
6473   push_gimplify_context ();
6474
6475   /* Unshare most shared trees in the body and in that of any nested functions.
6476      It would seem we don't have to do this for nested functions because
6477      they are supposed to be output and then the outer function gimplified
6478      first, but the g++ front end doesn't always do it that way.  */
6479   unshare_body (body_p, fndecl);
6480   unvisit_body (body_p, fndecl);
6481
6482   /* Make sure input_location isn't set to something wierd.  */
6483   input_location = DECL_SOURCE_LOCATION (fndecl);
6484
6485   /* Resolve callee-copies.  This has to be done before processing
6486      the body so that DECL_VALUE_EXPR gets processed correctly.  */
6487   parm_stmts = do_parms ? gimplify_parameters () : NULL;
6488
6489   /* Gimplify the function's body.  */
6490   gimplify_stmt (body_p);
6491   body = *body_p;
6492
6493   if (!body)
6494     body = alloc_stmt_list ();
6495   else if (TREE_CODE (body) == STATEMENT_LIST)
6496     {
6497       tree t = expr_only (*body_p);
6498       if (t)
6499         body = t;
6500     }
6501
6502   /* If there isn't an outer BIND_EXPR, add one.  */
6503   if (TREE_CODE (body) != BIND_EXPR)
6504     {
6505       tree b = build3 (BIND_EXPR, void_type_node, NULL_TREE,
6506                        NULL_TREE, NULL_TREE);
6507       TREE_SIDE_EFFECTS (b) = 1;
6508       append_to_statement_list_force (body, &BIND_EXPR_BODY (b));
6509       body = b;
6510     }
6511
6512   /* If we had callee-copies statements, insert them at the beginning
6513      of the function.  */
6514   if (parm_stmts)
6515     {
6516       append_to_statement_list_force (BIND_EXPR_BODY (body), &parm_stmts);
6517       BIND_EXPR_BODY (body) = parm_stmts;
6518     }
6519
6520   /* Unshare again, in case gimplification was sloppy.  */
6521   unshare_all_trees (body);
6522
6523   *body_p = body;
6524
6525   pop_gimplify_context (body);
6526   gcc_assert (gimplify_ctxp == NULL);
6527
6528 #ifdef ENABLE_CHECKING
6529   walk_tree (body_p, check_pointer_types_r, NULL, NULL);
6530 #endif
6531
6532   timevar_pop (TV_TREE_GIMPLIFY);
6533   input_location = saved_location;
6534 }
6535
6536 /* Entry point to the gimplification pass.  FNDECL is the FUNCTION_DECL
6537    node for the function we want to gimplify.  */
6538
6539 void
6540 gimplify_function_tree (tree fndecl)
6541 {
6542   tree oldfn, parm, ret;
6543
6544   oldfn = current_function_decl;
6545   current_function_decl = fndecl;
6546   cfun = DECL_STRUCT_FUNCTION (fndecl);
6547   if (cfun == NULL)
6548     allocate_struct_function (fndecl);
6549
6550   for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
6551     {
6552       /* Preliminarily mark non-addressed complex variables as eligible
6553          for promotion to gimple registers.  We'll transform their uses
6554          as we find them.  */
6555       if ((TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
6556            || TREE_CODE (TREE_TYPE (parm)) == VECTOR_TYPE)
6557           && !TREE_THIS_VOLATILE (parm)
6558           && !needs_to_live_in_memory (parm))
6559         DECL_GIMPLE_REG_P (parm) = 1;
6560     }
6561
6562   ret = DECL_RESULT (fndecl);
6563   if ((TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
6564            || TREE_CODE (TREE_TYPE (ret)) == VECTOR_TYPE)
6565       && !needs_to_live_in_memory (ret))
6566     DECL_GIMPLE_REG_P (ret) = 1;
6567
6568   gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
6569
6570   /* If we're instrumenting function entry/exit, then prepend the call to
6571      the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
6572      catch the exit hook.  */
6573   /* ??? Add some way to ignore exceptions for this TFE.  */
6574   if (flag_instrument_function_entry_exit
6575       && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl))
6576     {
6577       tree tf, x, bind;
6578
6579       tf = build2 (TRY_FINALLY_EXPR, void_type_node, NULL, NULL);
6580       TREE_SIDE_EFFECTS (tf) = 1;
6581       x = DECL_SAVED_TREE (fndecl);
6582       append_to_statement_list (x, &TREE_OPERAND (tf, 0));
6583       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT];
6584       x = build_call_expr (x, 0);
6585       append_to_statement_list (x, &TREE_OPERAND (tf, 1));
6586
6587       bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);
6588       TREE_SIDE_EFFECTS (bind) = 1;
6589       x = implicit_built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER];
6590       x = build_call_expr (x, 0);
6591       append_to_statement_list (x, &BIND_EXPR_BODY (bind));
6592       append_to_statement_list (tf, &BIND_EXPR_BODY (bind));
6593
6594       DECL_SAVED_TREE (fndecl) = bind;
6595     }
6596
6597   cfun->gimplified = true;
6598   current_function_decl = oldfn;
6599   cfun = oldfn ? DECL_STRUCT_FUNCTION (oldfn) : NULL;
6600 }
6601 \f
6602 /* Expands EXPR to list of gimple statements STMTS.  If SIMPLE is true,
6603    force the result to be either ssa_name or an invariant, otherwise
6604    just force it to be a rhs expression.  If VAR is not NULL, make the
6605    base variable of the final destination be VAR if suitable.  */
6606
6607 tree
6608 force_gimple_operand (tree expr, tree *stmts, bool simple, tree var)
6609 {
6610   tree t;
6611   enum gimplify_status ret;
6612   gimple_predicate gimple_test_f;
6613
6614   *stmts = NULL_TREE;
6615
6616   if (is_gimple_val (expr))
6617     return expr;
6618
6619   gimple_test_f = simple ? is_gimple_val : is_gimple_reg_rhs;
6620
6621   push_gimplify_context ();
6622   gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
6623
6624   if (var)
6625     expr = build_gimple_modify_stmt (var, expr);
6626
6627   ret = gimplify_expr (&expr, stmts, NULL,
6628                        gimple_test_f, fb_rvalue);
6629   gcc_assert (ret != GS_ERROR);
6630
6631   if (gimple_referenced_vars (cfun))
6632     {
6633       for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
6634         add_referenced_var (t);
6635     }
6636
6637   pop_gimplify_context (NULL);
6638
6639   return expr;
6640 }
6641
6642 /* Invokes force_gimple_operand for EXPR with parameters SIMPLE_P and VAR.  If
6643    some statements are produced, emits them before BSI.  */
6644
6645 tree
6646 force_gimple_operand_bsi (block_stmt_iterator *bsi, tree expr,
6647                           bool simple_p, tree var)
6648 {
6649   tree stmts;
6650
6651   expr = force_gimple_operand (expr, &stmts, simple_p, var);
6652   if (stmts)
6653     bsi_insert_before (bsi, stmts, BSI_SAME_STMT);
6654
6655   return expr;
6656 }
6657
6658 #include "gt-gimplify.h"