OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [gimplify.c] - Blame information for rev 820

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.