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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [tree-complex.c] - Blame information for rev 816

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* Lower complex number operations to scalar operations.
2
   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
3
 
4
This file is part of GCC.
5
 
6
GCC is free software; you can redistribute it and/or modify it
7
under the terms of the GNU General Public License as published by the
8
Free Software Foundation; either version 3, or (at your option) any
9
later version.
10
 
11
GCC is distributed in the hope that it will be useful, but WITHOUT
12
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14
for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GCC; see the file COPYING3.  If not see
18
<http://www.gnu.org/licenses/>.  */
19
 
20
#include "config.h"
21
#include "system.h"
22
#include "coretypes.h"
23
#include "tm.h"
24
#include "tree.h"
25
#include "rtl.h"
26
#include "real.h"
27
#include "flags.h"
28
#include "tree-flow.h"
29
#include "tree-gimple.h"
30
#include "tree-iterator.h"
31
#include "tree-pass.h"
32
#include "tree-ssa-propagate.h"
33
#include "diagnostic.h"
34
 
35
 
36
/* For each complex ssa name, a lattice value.  We're interested in finding
37
   out whether a complex number is degenerate in some way, having only real
38
   or only complex parts.  */
39
 
40
typedef enum
41
{
42
  UNINITIALIZED = 0,
43
  ONLY_REAL = 1,
44
  ONLY_IMAG = 2,
45
  VARYING = 3
46
} complex_lattice_t;
47
 
48
#define PAIR(a, b)  ((a) << 2 | (b))
49
 
50
DEF_VEC_I(complex_lattice_t);
51
DEF_VEC_ALLOC_I(complex_lattice_t, heap);
52
 
53
static VEC(complex_lattice_t, heap) *complex_lattice_values;
54
 
55
/* For each complex variable, a pair of variables for the components exists in
56
   the hashtable.  */
57
static htab_t complex_variable_components;
58
 
59
/* For each complex SSA_NAME, a pair of ssa names for the components.  */
60
static VEC(tree, heap) *complex_ssa_name_components;
61
 
62
/* Lookup UID in the complex_variable_components hashtable and return the
63
   associated tree.  */
64
static tree
65
cvc_lookup (unsigned int uid)
66
{
67
  struct int_tree_map *h, in;
68
  in.uid = uid;
69
  h = htab_find_with_hash (complex_variable_components, &in, uid);
70
  return h ? h->to : NULL;
71
}
72
 
73
/* Insert the pair UID, TO into the complex_variable_components hashtable.  */
74
 
75
static void
76
cvc_insert (unsigned int uid, tree to)
77
{
78
  struct int_tree_map *h;
79
  void **loc;
80
 
81
  h = XNEW (struct int_tree_map);
82
  h->uid = uid;
83
  h->to = to;
84
  loc = htab_find_slot_with_hash (complex_variable_components, h,
85
                                  uid, INSERT);
86
  *(struct int_tree_map **) loc = h;
87
}
88
 
89
/* Return true if T is not a zero constant.  In the case of real values,
90
   we're only interested in +0.0.  */
91
 
92
static int
93
some_nonzerop (tree t)
94
{
95
  int zerop = false;
96
 
97
  if (TREE_CODE (t) == REAL_CST)
98
    zerop = REAL_VALUES_IDENTICAL (TREE_REAL_CST (t), dconst0);
99
  else if (TREE_CODE (t) == INTEGER_CST)
100
    zerop = integer_zerop (t);
101
 
102
  return !zerop;
103
}
104
 
105
/* Compute a lattice value from T.  It may be a gimple_val, or, as a
106
   special exception, a COMPLEX_EXPR.  */
107
 
108
static complex_lattice_t
109
find_lattice_value (tree t)
110
{
111
  tree real, imag;
112
  int r, i;
113
  complex_lattice_t ret;
114
 
115
  switch (TREE_CODE (t))
116
    {
117
    case SSA_NAME:
118
      return VEC_index (complex_lattice_t, complex_lattice_values,
119
                        SSA_NAME_VERSION (t));
120
 
121
    case COMPLEX_CST:
122
      real = TREE_REALPART (t);
123
      imag = TREE_IMAGPART (t);
124
      break;
125
 
126
    case COMPLEX_EXPR:
127
      real = TREE_OPERAND (t, 0);
128
      imag = TREE_OPERAND (t, 1);
129
      break;
130
 
131
    default:
132
      gcc_unreachable ();
133
    }
134
 
135
  r = some_nonzerop (real);
136
  i = some_nonzerop (imag);
137
  ret = r*ONLY_REAL + i*ONLY_IMAG;
138
 
139
  /* ??? On occasion we could do better than mapping 0+0i to real, but we
140
     certainly don't want to leave it UNINITIALIZED, which eventually gets
141
     mapped to VARYING.  */
142
  if (ret == UNINITIALIZED)
143
    ret = ONLY_REAL;
144
 
145
  return ret;
146
}
147
 
148
/* Determine if LHS is something for which we're interested in seeing
149
   simulation results.  */
150
 
151
static bool
152
is_complex_reg (tree lhs)
153
{
154
  return TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE && is_gimple_reg (lhs);
155
}
156
 
157
/* Mark the incoming parameters to the function as VARYING.  */
158
 
159
static void
160
init_parameter_lattice_values (void)
161
{
162
  tree parm;
163
 
164
  for (parm = DECL_ARGUMENTS (cfun->decl); parm ; parm = TREE_CHAIN (parm))
165
    if (is_complex_reg (parm) && var_ann (parm) != NULL)
166
      {
167
        tree ssa_name = default_def (parm);
168
        VEC_replace (complex_lattice_t, complex_lattice_values,
169
                     SSA_NAME_VERSION (ssa_name), VARYING);
170
      }
171
}
172
 
173
/* Initialize DONT_SIMULATE_AGAIN for each stmt and phi.  Return false if
174
   we found no statements we want to simulate, and thus there's nothing for
175
   the entire pass to do.  */
176
 
177
static bool
178
init_dont_simulate_again (void)
179
{
180
  basic_block bb;
181
  block_stmt_iterator bsi;
182
  tree phi;
183
  bool saw_a_complex_op = false;
184
 
185
  FOR_EACH_BB (bb)
186
    {
187
      for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
188
        DONT_SIMULATE_AGAIN (phi) = !is_complex_reg (PHI_RESULT (phi));
189
 
190
      for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
191
        {
192
          tree orig_stmt, stmt, rhs = NULL;
193
          bool dsa;
194
 
195
          orig_stmt = stmt = bsi_stmt (bsi);
196
 
197
          /* Most control-altering statements must be initially
198
             simulated, else we won't cover the entire cfg.  */
199
          dsa = !stmt_ends_bb_p (stmt);
200
 
201
          switch (TREE_CODE (stmt))
202
            {
203
            case RETURN_EXPR:
204
              /* We don't care what the lattice value of <retval> is,
205
                 since it's never used as an input to another computation.  */
206
              dsa = true;
207
              stmt = TREE_OPERAND (stmt, 0);
208
              if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
209
                break;
210
              /* FALLTHRU */
211
 
212
            case MODIFY_EXPR:
213
              dsa = !is_complex_reg (TREE_OPERAND (stmt, 0));
214
              rhs = TREE_OPERAND (stmt, 1);
215
              break;
216
 
217
            case COND_EXPR:
218
              rhs = TREE_OPERAND (stmt, 0);
219
              break;
220
 
221
            default:
222
              break;
223
            }
224
 
225
          if (rhs)
226
            switch (TREE_CODE (rhs))
227
              {
228
              case EQ_EXPR:
229
              case NE_EXPR:
230
                rhs = TREE_OPERAND (rhs, 0);
231
                /* FALLTHRU */
232
 
233
              case PLUS_EXPR:
234
              case MINUS_EXPR:
235
              case MULT_EXPR:
236
              case TRUNC_DIV_EXPR:
237
              case CEIL_DIV_EXPR:
238
              case FLOOR_DIV_EXPR:
239
              case ROUND_DIV_EXPR:
240
              case RDIV_EXPR:
241
              case NEGATE_EXPR:
242
              case CONJ_EXPR:
243
                if (TREE_CODE (TREE_TYPE (rhs)) == COMPLEX_TYPE)
244
                  saw_a_complex_op = true;
245
                break;
246
 
247
              default:
248
                break;
249
              }
250
 
251
          DONT_SIMULATE_AGAIN (orig_stmt) = dsa;
252
        }
253
    }
254
 
255
  return saw_a_complex_op;
256
}
257
 
258
 
259
/* Evaluate statement STMT against the complex lattice defined above.  */
260
 
261
static enum ssa_prop_result
262
complex_visit_stmt (tree stmt, edge *taken_edge_p ATTRIBUTE_UNUSED,
263
                    tree *result_p)
264
{
265
  complex_lattice_t new_l, old_l, op1_l, op2_l;
266
  unsigned int ver;
267
  tree lhs, rhs;
268
 
269
  if (TREE_CODE (stmt) != MODIFY_EXPR)
270
    return SSA_PROP_VARYING;
271
 
272
  lhs = TREE_OPERAND (stmt, 0);
273
  rhs = TREE_OPERAND (stmt, 1);
274
 
275
  /* These conditions should be satisfied due to the initial filter
276
     set up in init_dont_simulate_again.  */
277
  gcc_assert (TREE_CODE (lhs) == SSA_NAME);
278
  gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);
279
 
280
  *result_p = lhs;
281
  ver = SSA_NAME_VERSION (lhs);
282
  old_l = VEC_index (complex_lattice_t, complex_lattice_values, ver);
283
 
284
  switch (TREE_CODE (rhs))
285
    {
286
    case SSA_NAME:
287
    case COMPLEX_EXPR:
288
    case COMPLEX_CST:
289
      new_l = find_lattice_value (rhs);
290
      break;
291
 
292
    case PLUS_EXPR:
293
    case MINUS_EXPR:
294
      op1_l = find_lattice_value (TREE_OPERAND (rhs, 0));
295
      op2_l = find_lattice_value (TREE_OPERAND (rhs, 1));
296
 
297
      /* We've set up the lattice values such that IOR neatly
298
         models addition.  */
299
      new_l = op1_l | op2_l;
300
      break;
301
 
302
    case MULT_EXPR:
303
    case RDIV_EXPR:
304
    case TRUNC_DIV_EXPR:
305
    case CEIL_DIV_EXPR:
306
    case FLOOR_DIV_EXPR:
307
    case ROUND_DIV_EXPR:
308
      op1_l = find_lattice_value (TREE_OPERAND (rhs, 0));
309
      op2_l = find_lattice_value (TREE_OPERAND (rhs, 1));
310
 
311
      /* Obviously, if either varies, so does the result.  */
312
      if (op1_l == VARYING || op2_l == VARYING)
313
        new_l = VARYING;
314
      /* Don't prematurely promote variables if we've not yet seen
315
         their inputs.  */
316
      else if (op1_l == UNINITIALIZED)
317
        new_l = op2_l;
318
      else if (op2_l == UNINITIALIZED)
319
        new_l = op1_l;
320
      else
321
        {
322
          /* At this point both numbers have only one component. If the
323
             numbers are of opposite kind, the result is imaginary,
324
             otherwise the result is real. The add/subtract translates
325
             the real/imag from/to 0/1; the ^ performs the comparison.  */
326
          new_l = ((op1_l - ONLY_REAL) ^ (op2_l - ONLY_REAL)) + ONLY_REAL;
327
 
328
          /* Don't allow the lattice value to flip-flop indefinitely.  */
329
          new_l |= old_l;
330
        }
331
      break;
332
 
333
    case NEGATE_EXPR:
334
    case CONJ_EXPR:
335
      new_l = find_lattice_value (TREE_OPERAND (rhs, 0));
336
      break;
337
 
338
    default:
339
      new_l = VARYING;
340
      break;
341
    }
342
 
343
  /* If nothing changed this round, let the propagator know.  */
344
  if (new_l == old_l)
345
    return SSA_PROP_NOT_INTERESTING;
346
 
347
  VEC_replace (complex_lattice_t, complex_lattice_values, ver, new_l);
348
  return new_l == VARYING ? SSA_PROP_VARYING : SSA_PROP_INTERESTING;
349
}
350
 
351
/* Evaluate a PHI node against the complex lattice defined above.  */
352
 
353
static enum ssa_prop_result
354
complex_visit_phi (tree phi)
355
{
356
  complex_lattice_t new_l, old_l;
357
  unsigned int ver;
358
  tree lhs;
359
  int i;
360
 
361
  lhs = PHI_RESULT (phi);
362
 
363
  /* This condition should be satisfied due to the initial filter
364
     set up in init_dont_simulate_again.  */
365
  gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);
366
 
367
  /* We've set up the lattice values such that IOR neatly models PHI meet.  */
368
  new_l = UNINITIALIZED;
369
  for (i = PHI_NUM_ARGS (phi) - 1; i >= 0; --i)
370
    new_l |= find_lattice_value (PHI_ARG_DEF (phi, i));
371
 
372
  ver = SSA_NAME_VERSION (lhs);
373
  old_l = VEC_index (complex_lattice_t, complex_lattice_values, ver);
374
 
375
  if (new_l == old_l)
376
    return SSA_PROP_NOT_INTERESTING;
377
 
378
  VEC_replace (complex_lattice_t, complex_lattice_values, ver, new_l);
379
  return new_l == VARYING ? SSA_PROP_VARYING : SSA_PROP_INTERESTING;
380
}
381
 
382
/* Create one backing variable for a complex component of ORIG.  */
383
 
384
static tree
385
create_one_component_var (tree type, tree orig, const char *prefix,
386
                          const char *suffix, enum tree_code code)
387
{
388
  tree r = create_tmp_var (type, prefix);
389
  add_referenced_var (r);
390
 
391
  DECL_SOURCE_LOCATION (r) = DECL_SOURCE_LOCATION (orig);
392
  DECL_ARTIFICIAL (r) = 1;
393
 
394
  if (DECL_NAME (orig) && !DECL_IGNORED_P (orig))
395
    {
396
      const char *name = IDENTIFIER_POINTER (DECL_NAME (orig));
397
      tree inner_type;
398
 
399
      DECL_NAME (r) = get_identifier (ACONCAT ((name, suffix, NULL)));
400
 
401
      inner_type = TREE_TYPE (TREE_TYPE (orig));
402
      SET_DECL_DEBUG_EXPR (r, build1 (code, type, orig));
403
      DECL_DEBUG_EXPR_IS_FROM (r) = 1;
404
      DECL_IGNORED_P (r) = 0;
405
      TREE_NO_WARNING (r) = TREE_NO_WARNING (orig);
406
    }
407
  else
408
    {
409
      DECL_IGNORED_P (r) = 1;
410
      TREE_NO_WARNING (r) = 1;
411
    }
412
 
413
  return r;
414
}
415
 
416
/* Retrieve a value for a complex component of VAR.  */
417
 
418
static tree
419
get_component_var (tree var, bool imag_p)
420
{
421
  size_t decl_index = DECL_UID (var) * 2 + imag_p;
422
  tree ret = cvc_lookup (decl_index);
423
 
424
  if (ret == NULL)
425
    {
426
      ret = create_one_component_var (TREE_TYPE (TREE_TYPE (var)), var,
427
                                      imag_p ? "CI" : "CR",
428
                                      imag_p ? "$imag" : "$real",
429
                                      imag_p ? IMAGPART_EXPR : REALPART_EXPR);
430
      cvc_insert (decl_index, ret);
431
    }
432
 
433
  return ret;
434
}
435
 
436
/* Retrieve a value for a complex component of SSA_NAME.  */
437
 
438
static tree
439
get_component_ssa_name (tree ssa_name, bool imag_p)
440
{
441
  complex_lattice_t lattice = find_lattice_value (ssa_name);
442
  size_t ssa_name_index;
443
  tree ret;
444
 
445
  if (lattice == (imag_p ? ONLY_REAL : ONLY_IMAG))
446
    {
447
      tree inner_type = TREE_TYPE (TREE_TYPE (ssa_name));
448
      if (SCALAR_FLOAT_TYPE_P (inner_type))
449
        return build_real (inner_type, dconst0);
450
      else
451
        return build_int_cst (inner_type, 0);
452
    }
453
 
454
  ssa_name_index = SSA_NAME_VERSION (ssa_name) * 2 + imag_p;
455
  ret = VEC_index (tree, complex_ssa_name_components, ssa_name_index);
456
  if (ret == NULL)
457
    {
458
      ret = get_component_var (SSA_NAME_VAR (ssa_name), imag_p);
459
      ret = make_ssa_name (ret, NULL);
460
 
461
      /* Copy some properties from the original.  In particular, whether it
462
         is used in an abnormal phi, and whether it's uninitialized.  */
463
      SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ret)
464
        = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name);
465
      if (TREE_CODE (SSA_NAME_VAR (ssa_name)) == VAR_DECL
466
          && IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name)))
467
        {
468
          SSA_NAME_DEF_STMT (ret) = SSA_NAME_DEF_STMT (ssa_name);
469
          set_default_def (SSA_NAME_VAR (ret), ret);
470
        }
471
 
472
      VEC_replace (tree, complex_ssa_name_components, ssa_name_index, ret);
473
    }
474
 
475
  return ret;
476
}
477
 
478
/* Set a value for a complex component of SSA_NAME, return a STMT_LIST of
479
   stuff that needs doing.  */
480
 
481
static tree
482
set_component_ssa_name (tree ssa_name, bool imag_p, tree value)
483
{
484
  complex_lattice_t lattice = find_lattice_value (ssa_name);
485
  size_t ssa_name_index;
486
  tree comp, list, last;
487
 
488
  /* We know the value must be zero, else there's a bug in our lattice
489
     analysis.  But the value may well be a variable known to contain
490
     zero.  We should be safe ignoring it.  */
491
  if (lattice == (imag_p ? ONLY_REAL : ONLY_IMAG))
492
    return NULL;
493
 
494
  /* If we've already assigned an SSA_NAME to this component, then this
495
     means that our walk of the basic blocks found a use before the set.
496
     This is fine.  Now we should create an initialization for the value
497
     we created earlier.  */
498
  ssa_name_index = SSA_NAME_VERSION (ssa_name) * 2 + imag_p;
499
  comp = VEC_index (tree, complex_ssa_name_components, ssa_name_index);
500
  if (comp)
501
    ;
502
 
503
  /* If we've nothing assigned, and the value we're given is already stable,
504
     then install that as the value for this SSA_NAME.  This preemptively
505
     copy-propagates the value, which avoids unnecessary memory allocation.  */
506
  else if (is_gimple_min_invariant (value))
507
    {
508
      VEC_replace (tree, complex_ssa_name_components, ssa_name_index, value);
509
      return NULL;
510
    }
511
  else if (TREE_CODE (value) == SSA_NAME
512
           && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
513
    {
514
      /* Replace an anonymous base value with the variable from cvc_lookup.
515
         This should result in better debug info.  */
516
      if (DECL_IGNORED_P (SSA_NAME_VAR (value))
517
          && !DECL_IGNORED_P (SSA_NAME_VAR (ssa_name)))
518
        {
519
          comp = get_component_var (SSA_NAME_VAR (ssa_name), imag_p);
520
          replace_ssa_name_symbol (value, comp);
521
        }
522
 
523
      VEC_replace (tree, complex_ssa_name_components, ssa_name_index, value);
524
      return NULL;
525
    }
526
 
527
  /* Finally, we need to stabilize the result by installing the value into
528
     a new ssa name.  */
529
  else
530
    comp = get_component_ssa_name (ssa_name, imag_p);
531
 
532
  /* Do all the work to assign VALUE to COMP.  */
533
  value = force_gimple_operand (value, &list, false, NULL);
534
  last = build2 (MODIFY_EXPR, TREE_TYPE (comp), comp, value);
535
  append_to_statement_list (last, &list);
536
 
537
  gcc_assert (SSA_NAME_DEF_STMT (comp) == NULL);
538
  SSA_NAME_DEF_STMT (comp) = last;
539
 
540
  return list;
541
}
542
 
543
/* Extract the real or imaginary part of a complex variable or constant.
544
   Make sure that it's a proper gimple_val and gimplify it if not.
545
   Emit any new code before BSI.  */
546
 
547
static tree
548
extract_component (block_stmt_iterator *bsi, tree t, bool imagpart_p,
549
                   bool gimple_p)
550
{
551
  switch (TREE_CODE (t))
552
    {
553
    case COMPLEX_CST:
554
      return imagpart_p ? TREE_IMAGPART (t) : TREE_REALPART (t);
555
 
556
    case COMPLEX_EXPR:
557
      return TREE_OPERAND (t, imagpart_p);
558
 
559
    case VAR_DECL:
560
    case RESULT_DECL:
561
    case PARM_DECL:
562
    case INDIRECT_REF:
563
    case COMPONENT_REF:
564
    case ARRAY_REF:
565
      {
566
        tree inner_type = TREE_TYPE (TREE_TYPE (t));
567
 
568
        t = build1 ((imagpart_p ? IMAGPART_EXPR : REALPART_EXPR),
569
                    inner_type, unshare_expr (t));
570
 
571
        if (gimple_p)
572
          t = gimplify_val (bsi, inner_type, t);
573
 
574
        return t;
575
      }
576
 
577
    case SSA_NAME:
578
      return get_component_ssa_name (t, imagpart_p);
579
 
580
    default:
581
      gcc_unreachable ();
582
    }
583
}
584
 
585
/* Update the complex components of the ssa name on the lhs of STMT.  */
586
 
587
static void
588
update_complex_components (block_stmt_iterator *bsi, tree stmt, tree r, tree i)
589
{
590
  tree lhs = TREE_OPERAND (stmt, 0);
591
  tree list;
592
 
593
  list = set_component_ssa_name (lhs, false, r);
594
  if (list)
595
    bsi_insert_after (bsi, list, BSI_CONTINUE_LINKING);
596
 
597
  list = set_component_ssa_name (lhs, true, i);
598
  if (list)
599
    bsi_insert_after (bsi, list, BSI_CONTINUE_LINKING);
600
}
601
 
602
static void
603
update_complex_components_on_edge (edge e, tree lhs, tree r, tree i)
604
{
605
  tree list;
606
 
607
  list = set_component_ssa_name (lhs, false, r);
608
  if (list)
609
    bsi_insert_on_edge (e, list);
610
 
611
  list = set_component_ssa_name (lhs, true, i);
612
  if (list)
613
    bsi_insert_on_edge (e, list);
614
}
615
 
616
/* Update an assignment to a complex variable in place.  */
617
 
618
static void
619
update_complex_assignment (block_stmt_iterator *bsi, tree r, tree i)
620
{
621
  tree stmt, mod;
622
  tree type;
623
 
624
  mod = stmt = bsi_stmt (*bsi);
625
  if (TREE_CODE (stmt) == RETURN_EXPR)
626
    mod = TREE_OPERAND (mod, 0);
627
  else if (in_ssa_p)
628
    update_complex_components (bsi, stmt, r, i);
629
 
630
  type = TREE_TYPE (TREE_OPERAND (mod, 1));
631
  TREE_OPERAND (mod, 1) = build2 (COMPLEX_EXPR, type, r, i);
632
  update_stmt (stmt);
633
}
634
 
635
/* Generate code at the entry point of the function to initialize the
636
   component variables for a complex parameter.  */
637
 
638
static void
639
update_parameter_components (void)
640
{
641
  edge entry_edge = single_succ_edge (ENTRY_BLOCK_PTR);
642
  tree parm;
643
 
644
  for (parm = DECL_ARGUMENTS (cfun->decl); parm ; parm = TREE_CHAIN (parm))
645
    {
646
      tree type = TREE_TYPE (parm);
647
      tree ssa_name, r, i;
648
 
649
      if (TREE_CODE (type) != COMPLEX_TYPE || !is_gimple_reg (parm))
650
        continue;
651
 
652
      type = TREE_TYPE (type);
653
      ssa_name = default_def (parm);
654
      if (!ssa_name)
655
        continue;
656
 
657
      r = build1 (REALPART_EXPR, type, ssa_name);
658
      i = build1 (IMAGPART_EXPR, type, ssa_name);
659
      update_complex_components_on_edge (entry_edge, ssa_name, r, i);
660
    }
661
}
662
 
663
/* Generate code to set the component variables of a complex variable
664
   to match the PHI statements in block BB.  */
665
 
666
static void
667
update_phi_components (basic_block bb)
668
{
669
  tree phi;
670
 
671
  for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
672
    if (is_complex_reg (PHI_RESULT (phi)))
673
      {
674
        tree lr, li, pr = NULL, pi = NULL;
675
        unsigned int i, n;
676
 
677
        lr = get_component_ssa_name (PHI_RESULT (phi), false);
678
        if (TREE_CODE (lr) == SSA_NAME)
679
          {
680
            pr = create_phi_node (lr, bb);
681
            SSA_NAME_DEF_STMT (lr) = pr;
682
          }
683
 
684
        li = get_component_ssa_name (PHI_RESULT (phi), true);
685
        if (TREE_CODE (li) == SSA_NAME)
686
          {
687
            pi = create_phi_node (li, bb);
688
            SSA_NAME_DEF_STMT (li) = pi;
689
          }
690
 
691
        for (i = 0, n = PHI_NUM_ARGS (phi); i < n; ++i)
692
          {
693
            tree comp, arg = PHI_ARG_DEF (phi, i);
694
            if (pr)
695
              {
696
                comp = extract_component (NULL, arg, false, false);
697
                SET_PHI_ARG_DEF (pr, i, comp);
698
              }
699
            if (pi)
700
              {
701
                comp = extract_component (NULL, arg, true, false);
702
                SET_PHI_ARG_DEF (pi, i, comp);
703
              }
704
          }
705
      }
706
}
707
 
708
/* Mark each virtual op in STMT for ssa update.  */
709
 
710
static void
711
update_all_vops (tree stmt)
712
{
713
  ssa_op_iter iter;
714
  tree sym;
715
 
716
  FOR_EACH_SSA_TREE_OPERAND (sym, stmt, iter, SSA_OP_ALL_VIRTUALS)
717
    {
718
      if (TREE_CODE (sym) == SSA_NAME)
719
        sym = SSA_NAME_VAR (sym);
720
      mark_sym_for_renaming (sym);
721
    }
722
}
723
 
724
/* Expand a complex move to scalars.  */
725
 
726
static void
727
expand_complex_move (block_stmt_iterator *bsi, tree stmt, tree type,
728
                     tree lhs, tree rhs)
729
{
730
  tree inner_type = TREE_TYPE (type);
731
  tree r, i;
732
 
733
  if (TREE_CODE (lhs) == SSA_NAME)
734
    {
735
      if (is_ctrl_altering_stmt (bsi_stmt (*bsi)))
736
        {
737
          edge_iterator ei;
738
          edge e;
739
 
740
          /* The value is not assigned on the exception edges, so we need not
741
             concern ourselves there.  We do need to update on the fallthru
742
             edge.  Find it.  */
743
          FOR_EACH_EDGE (e, ei, bsi->bb->succs)
744
            if (e->flags & EDGE_FALLTHRU)
745
              goto found_fallthru;
746
          gcc_unreachable ();
747
        found_fallthru:
748
 
749
          r = build1 (REALPART_EXPR, inner_type, lhs);
750
          i = build1 (IMAGPART_EXPR, inner_type, lhs);
751
          update_complex_components_on_edge (e, lhs, r, i);
752
        }
753
      else if (TREE_CODE (rhs) == CALL_EXPR || TREE_SIDE_EFFECTS (rhs))
754
        {
755
          r = build1 (REALPART_EXPR, inner_type, lhs);
756
          i = build1 (IMAGPART_EXPR, inner_type, lhs);
757
          update_complex_components (bsi, stmt, r, i);
758
        }
759
      else
760
        {
761
          update_all_vops (bsi_stmt (*bsi));
762
          r = extract_component (bsi, rhs, 0, true);
763
          i = extract_component (bsi, rhs, 1, true);
764
          update_complex_assignment (bsi, r, i);
765
        }
766
    }
767
  else if (TREE_CODE (rhs) == SSA_NAME && !TREE_SIDE_EFFECTS (lhs))
768
    {
769
      tree x;
770
 
771
      r = extract_component (bsi, rhs, 0, false);
772
      i = extract_component (bsi, rhs, 1, false);
773
 
774
      x = build1 (REALPART_EXPR, inner_type, unshare_expr (lhs));
775
      x = build2 (MODIFY_EXPR, inner_type, x, r);
776
      bsi_insert_before (bsi, x, BSI_SAME_STMT);
777
 
778
      if (stmt == bsi_stmt (*bsi))
779
        {
780
          x = build1 (IMAGPART_EXPR, inner_type, unshare_expr (lhs));
781
          TREE_OPERAND (stmt, 0) = x;
782
          TREE_OPERAND (stmt, 1) = i;
783
          TREE_TYPE (stmt) = inner_type;
784
        }
785
      else
786
        {
787
          x = build1 (IMAGPART_EXPR, inner_type, unshare_expr (lhs));
788
          x = build2 (MODIFY_EXPR, inner_type, x, i);
789
          bsi_insert_before (bsi, x, BSI_SAME_STMT);
790
 
791
          stmt = bsi_stmt (*bsi);
792
          gcc_assert (TREE_CODE (stmt) == RETURN_EXPR);
793
          TREE_OPERAND (stmt, 0) = lhs;
794
        }
795
 
796
      update_all_vops (stmt);
797
      update_stmt (stmt);
798
    }
799
}
800
 
801
/* Expand complex addition to scalars:
802
        a + b = (ar + br) + i(ai + bi)
803
        a - b = (ar - br) + i(ai + bi)
804
*/
805
 
806
static void
807
expand_complex_addition (block_stmt_iterator *bsi, tree inner_type,
808
                         tree ar, tree ai, tree br, tree bi,
809
                         enum tree_code code,
810
                         complex_lattice_t al, complex_lattice_t bl)
811
{
812
  tree rr, ri;
813
 
814
  switch (PAIR (al, bl))
815
    {
816
    case PAIR (ONLY_REAL, ONLY_REAL):
817
      rr = gimplify_build2 (bsi, code, inner_type, ar, br);
818
      ri = ai;
819
      break;
820
 
821
    case PAIR (ONLY_REAL, ONLY_IMAG):
822
      rr = ar;
823
      if (code == MINUS_EXPR)
824
        ri = gimplify_build2 (bsi, MINUS_EXPR, inner_type, ai, bi);
825
      else
826
        ri = bi;
827
      break;
828
 
829
    case PAIR (ONLY_IMAG, ONLY_REAL):
830
      if (code == MINUS_EXPR)
831
        rr = gimplify_build2 (bsi, MINUS_EXPR, inner_type, ar, br);
832
      else
833
        rr = br;
834
      ri = ai;
835
      break;
836
 
837
    case PAIR (ONLY_IMAG, ONLY_IMAG):
838
      rr = ar;
839
      ri = gimplify_build2 (bsi, code, inner_type, ai, bi);
840
      break;
841
 
842
    case PAIR (VARYING, ONLY_REAL):
843
      rr = gimplify_build2 (bsi, code, inner_type, ar, br);
844
      ri = ai;
845
      break;
846
 
847
    case PAIR (VARYING, ONLY_IMAG):
848
      rr = ar;
849
      ri = gimplify_build2 (bsi, code, inner_type, ai, bi);
850
      break;
851
 
852
    case PAIR (ONLY_REAL, VARYING):
853
      if (code == MINUS_EXPR)
854
        goto general;
855
      rr = gimplify_build2 (bsi, code, inner_type, ar, br);
856
      ri = bi;
857
      break;
858
 
859
    case PAIR (ONLY_IMAG, VARYING):
860
      if (code == MINUS_EXPR)
861
        goto general;
862
      rr = br;
863
      ri = gimplify_build2 (bsi, code, inner_type, ai, bi);
864
      break;
865
 
866
    case PAIR (VARYING, VARYING):
867
    general:
868
      rr = gimplify_build2 (bsi, code, inner_type, ar, br);
869
      ri = gimplify_build2 (bsi, code, inner_type, ai, bi);
870
      break;
871
 
872
    default:
873
      gcc_unreachable ();
874
    }
875
 
876
  update_complex_assignment (bsi, rr, ri);
877
}
878
 
879
/* Expand a complex multiplication or division to a libcall to the c99
880
   compliant routines.  */
881
 
882
static void
883
expand_complex_libcall (block_stmt_iterator *bsi, tree ar, tree ai,
884
                        tree br, tree bi, enum tree_code code)
885
{
886
  enum machine_mode mode;
887
  enum built_in_function bcode;
888
  tree args, fn, stmt, type;
889
 
890
  args = tree_cons (NULL, bi, NULL);
891
  args = tree_cons (NULL, br, args);
892
  args = tree_cons (NULL, ai, args);
893
  args = tree_cons (NULL, ar, args);
894
 
895
  stmt = bsi_stmt (*bsi);
896
  type = TREE_TYPE (TREE_OPERAND (stmt, 1));
897
 
898
  mode = TYPE_MODE (type);
899
  gcc_assert (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT);
900
  if (code == MULT_EXPR)
901
    bcode = BUILT_IN_COMPLEX_MUL_MIN + mode - MIN_MODE_COMPLEX_FLOAT;
902
  else if (code == RDIV_EXPR)
903
    bcode = BUILT_IN_COMPLEX_DIV_MIN + mode - MIN_MODE_COMPLEX_FLOAT;
904
  else
905
    gcc_unreachable ();
906
  fn = built_in_decls[bcode];
907
 
908
  TREE_OPERAND (stmt, 1)
909
    = build3 (CALL_EXPR, type, build_fold_addr_expr (fn), args, NULL);
910
  update_stmt (stmt);
911
 
912
  if (in_ssa_p)
913
    {
914
      tree lhs = TREE_OPERAND (stmt, 0);
915
      type = TREE_TYPE (type);
916
      update_complex_components (bsi, stmt,
917
                                 build1 (REALPART_EXPR, type, lhs),
918
                                 build1 (IMAGPART_EXPR, type, lhs));
919
    }
920
}
921
 
922
/* Expand complex multiplication to scalars:
923
        a * b = (ar*br - ai*bi) + i(ar*bi + br*ai)
924
*/
925
 
926
static void
927
expand_complex_multiplication (block_stmt_iterator *bsi, tree inner_type,
928
                               tree ar, tree ai, tree br, tree bi,
929
                               complex_lattice_t al, complex_lattice_t bl)
930
{
931
  tree rr, ri;
932
 
933
  if (al < bl)
934
    {
935
      complex_lattice_t tl;
936
      rr = ar, ar = br, br = rr;
937
      ri = ai, ai = bi, bi = ri;
938
      tl = al, al = bl, bl = tl;
939
    }
940
 
941
  switch (PAIR (al, bl))
942
    {
943
    case PAIR (ONLY_REAL, ONLY_REAL):
944
      rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
945
      ri = ai;
946
      break;
947
 
948
    case PAIR (ONLY_IMAG, ONLY_REAL):
949
      rr = ar;
950
      if (TREE_CODE (ai) == REAL_CST
951
          && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ai), dconst1))
952
        ri = br;
953
      else
954
        ri = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
955
      break;
956
 
957
    case PAIR (ONLY_IMAG, ONLY_IMAG):
958
      rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
959
      rr = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, rr);
960
      ri = ar;
961
      break;
962
 
963
    case PAIR (VARYING, ONLY_REAL):
964
      rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
965
      ri = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
966
      break;
967
 
968
    case PAIR (VARYING, ONLY_IMAG):
969
      rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
970
      rr = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, rr);
971
      ri = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, bi);
972
      break;
973
 
974
    case PAIR (VARYING, VARYING):
975
      if (flag_complex_method == 2 && SCALAR_FLOAT_TYPE_P (inner_type))
976
        {
977
          expand_complex_libcall (bsi, ar, ai, br, bi, MULT_EXPR);
978
          return;
979
        }
980
      else
981
        {
982
          tree t1, t2, t3, t4;
983
 
984
          t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
985
          t2 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
986
          t3 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, bi);
987
 
988
          /* Avoid expanding redundant multiplication for the common
989
             case of squaring a complex number.  */
990
          if (ar == br && ai == bi)
991
            t4 = t3;
992
          else
993
            t4 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
994
 
995
          rr = gimplify_build2 (bsi, MINUS_EXPR, inner_type, t1, t2);
996
          ri = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t3, t4);
997
        }
998
      break;
999
 
1000
    default:
1001
      gcc_unreachable ();
1002
    }
1003
 
1004
  update_complex_assignment (bsi, rr, ri);
1005
}
1006
 
1007
/* Expand complex division to scalars, straightforward algorithm.
1008
        a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t)
1009
            t = br*br + bi*bi
1010
*/
1011
 
1012
static void
1013
expand_complex_div_straight (block_stmt_iterator *bsi, tree inner_type,
1014
                             tree ar, tree ai, tree br, tree bi,
1015
                             enum tree_code code)
1016
{
1017
  tree rr, ri, div, t1, t2, t3;
1018
 
1019
  t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, br, br);
1020
  t2 = gimplify_build2 (bsi, MULT_EXPR, inner_type, bi, bi);
1021
  div = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t1, t2);
1022
 
1023
  t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
1024
  t2 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
1025
  t3 = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t1, t2);
1026
  rr = gimplify_build2 (bsi, code, inner_type, t3, div);
1027
 
1028
  t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
1029
  t2 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, bi);
1030
  t3 = gimplify_build2 (bsi, MINUS_EXPR, inner_type, t1, t2);
1031
  ri = gimplify_build2 (bsi, code, inner_type, t3, div);
1032
 
1033
  update_complex_assignment (bsi, rr, ri);
1034
}
1035
 
1036
/* Expand complex division to scalars, modified algorithm to minimize
1037
   overflow with wide input ranges.  */
1038
 
1039
static void
1040
expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
1041
                         tree ar, tree ai, tree br, tree bi,
1042
                         enum tree_code code)
1043
{
1044
  tree rr, ri, ratio, div, t1, t2, tr, ti, cond;
1045
  basic_block bb_cond, bb_true, bb_false, bb_join;
1046
 
1047
  /* Examine |br| < |bi|, and branch.  */
1048
  t1 = gimplify_build1 (bsi, ABS_EXPR, inner_type, br);
1049
  t2 = gimplify_build1 (bsi, ABS_EXPR, inner_type, bi);
1050
  cond = fold_build2 (LT_EXPR, boolean_type_node, t1, t2);
1051
  STRIP_NOPS (cond);
1052
 
1053
  bb_cond = bb_true = bb_false = bb_join = NULL;
1054
  rr = ri = tr = ti = NULL;
1055
  if (!TREE_CONSTANT (cond))
1056
    {
1057
      edge e;
1058
 
1059
      cond = build3 (COND_EXPR, void_type_node, cond, NULL_TREE, NULL_TREE);
1060
      bsi_insert_before (bsi, cond, BSI_SAME_STMT);
1061
 
1062
      /* Split the original block, and create the TRUE and FALSE blocks.  */
1063
      e = split_block (bsi->bb, cond);
1064
      bb_cond = e->src;
1065
      bb_join = e->dest;
1066
      bb_true = create_empty_bb (bb_cond);
1067
      bb_false = create_empty_bb (bb_true);
1068
 
1069
      t1 = build1 (GOTO_EXPR, void_type_node, tree_block_label (bb_true));
1070
      t2 = build1 (GOTO_EXPR, void_type_node, tree_block_label (bb_false));
1071
      COND_EXPR_THEN (cond) = t1;
1072
      COND_EXPR_ELSE (cond) = t2;
1073
 
1074
      /* Wire the blocks together.  */
1075
      e->flags = EDGE_TRUE_VALUE;
1076
      redirect_edge_succ (e, bb_true);
1077
      make_edge (bb_cond, bb_false, EDGE_FALSE_VALUE);
1078
      make_edge (bb_true, bb_join, EDGE_FALLTHRU);
1079
      make_edge (bb_false, bb_join, EDGE_FALLTHRU);
1080
 
1081
      /* Update dominance info.  Note that bb_join's data was
1082
         updated by split_block.  */
1083
      if (dom_info_available_p (CDI_DOMINATORS))
1084
        {
1085
          set_immediate_dominator (CDI_DOMINATORS, bb_true, bb_cond);
1086
          set_immediate_dominator (CDI_DOMINATORS, bb_false, bb_cond);
1087
        }
1088
 
1089
      rr = make_rename_temp (inner_type, NULL);
1090
      ri = make_rename_temp (inner_type, NULL);
1091
    }
1092
 
1093
  /* In the TRUE branch, we compute
1094
      ratio = br/bi;
1095
      div = (br * ratio) + bi;
1096
      tr = (ar * ratio) + ai;
1097
      ti = (ai * ratio) - ar;
1098
      tr = tr / div;
1099
      ti = ti / div;  */
1100
  if (bb_true || integer_nonzerop (cond))
1101
    {
1102
      if (bb_true)
1103
        {
1104
          *bsi = bsi_last (bb_true);
1105
          bsi_insert_after (bsi, build_empty_stmt (), BSI_NEW_STMT);
1106
        }
1107
 
1108
      ratio = gimplify_build2 (bsi, code, inner_type, br, bi);
1109
 
1110
      t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, br, ratio);
1111
      div = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t1, bi);
1112
 
1113
      t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, ratio);
1114
      tr = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t1, ai);
1115
 
1116
      t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, ratio);
1117
      ti = gimplify_build2 (bsi, MINUS_EXPR, inner_type, t1, ar);
1118
 
1119
      tr = gimplify_build2 (bsi, code, inner_type, tr, div);
1120
      ti = gimplify_build2 (bsi, code, inner_type, ti, div);
1121
 
1122
     if (bb_true)
1123
       {
1124
         t1 = build2 (MODIFY_EXPR, inner_type, rr, tr);
1125
         bsi_insert_before (bsi, t1, BSI_SAME_STMT);
1126
         t1 = build2 (MODIFY_EXPR, inner_type, ri, ti);
1127
         bsi_insert_before (bsi, t1, BSI_SAME_STMT);
1128
         bsi_remove (bsi, true);
1129
       }
1130
    }
1131
 
1132
  /* In the FALSE branch, we compute
1133
      ratio = d/c;
1134
      divisor = (d * ratio) + c;
1135
      tr = (b * ratio) + a;
1136
      ti = b - (a * ratio);
1137
      tr = tr / div;
1138
      ti = ti / div;  */
1139
  if (bb_false || integer_zerop (cond))
1140
    {
1141
      if (bb_false)
1142
        {
1143
          *bsi = bsi_last (bb_false);
1144
          bsi_insert_after (bsi, build_empty_stmt (), BSI_NEW_STMT);
1145
        }
1146
 
1147
      ratio = gimplify_build2 (bsi, code, inner_type, bi, br);
1148
 
1149
      t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, bi, ratio);
1150
      div = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t1, br);
1151
 
1152
      t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, ratio);
1153
      tr = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t1, ar);
1154
 
1155
      t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, ratio);
1156
      ti = gimplify_build2 (bsi, MINUS_EXPR, inner_type, ai, t1);
1157
 
1158
      tr = gimplify_build2 (bsi, code, inner_type, tr, div);
1159
      ti = gimplify_build2 (bsi, code, inner_type, ti, div);
1160
 
1161
     if (bb_false)
1162
       {
1163
         t1 = build2 (MODIFY_EXPR, inner_type, rr, tr);
1164
         bsi_insert_before (bsi, t1, BSI_SAME_STMT);
1165
         t1 = build2 (MODIFY_EXPR, inner_type, ri, ti);
1166
         bsi_insert_before (bsi, t1, BSI_SAME_STMT);
1167
         bsi_remove (bsi, true);
1168
       }
1169
    }
1170
 
1171
  if (bb_join)
1172
    *bsi = bsi_start (bb_join);
1173
  else
1174
    rr = tr, ri = ti;
1175
 
1176
  update_complex_assignment (bsi, rr, ri);
1177
}
1178
 
1179
/* Expand complex division to scalars.  */
1180
 
1181
static void
1182
expand_complex_division (block_stmt_iterator *bsi, tree inner_type,
1183
                         tree ar, tree ai, tree br, tree bi,
1184
                         enum tree_code code,
1185
                         complex_lattice_t al, complex_lattice_t bl)
1186
{
1187
  tree rr, ri;
1188
 
1189
  switch (PAIR (al, bl))
1190
    {
1191
    case PAIR (ONLY_REAL, ONLY_REAL):
1192
      rr = gimplify_build2 (bsi, code, inner_type, ar, br);
1193
      ri = ai;
1194
      break;
1195
 
1196
    case PAIR (ONLY_REAL, ONLY_IMAG):
1197
      rr = ai;
1198
      ri = gimplify_build2 (bsi, code, inner_type, ar, bi);
1199
      ri = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, ri);
1200
      break;
1201
 
1202
    case PAIR (ONLY_IMAG, ONLY_REAL):
1203
      rr = ar;
1204
      ri = gimplify_build2 (bsi, code, inner_type, ai, br);
1205
      break;
1206
 
1207
    case PAIR (ONLY_IMAG, ONLY_IMAG):
1208
      rr = gimplify_build2 (bsi, code, inner_type, ai, bi);
1209
      ri = ar;
1210
      break;
1211
 
1212
    case PAIR (VARYING, ONLY_REAL):
1213
      rr = gimplify_build2 (bsi, code, inner_type, ar, br);
1214
      ri = gimplify_build2 (bsi, code, inner_type, ai, br);
1215
      break;
1216
 
1217
    case PAIR (VARYING, ONLY_IMAG):
1218
      rr = gimplify_build2 (bsi, code, inner_type, ai, bi);
1219
      ri = gimplify_build2 (bsi, code, inner_type, ar, bi);
1220
      ri = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, ri);
1221
 
1222
    case PAIR (ONLY_REAL, VARYING):
1223
    case PAIR (ONLY_IMAG, VARYING):
1224
    case PAIR (VARYING, VARYING):
1225
      switch (flag_complex_method)
1226
        {
1227
        case 0:
1228
          /* straightforward implementation of complex divide acceptable.  */
1229
          expand_complex_div_straight (bsi, inner_type, ar, ai, br, bi, code);
1230
          break;
1231
 
1232
        case 2:
1233
          if (SCALAR_FLOAT_TYPE_P (inner_type))
1234
            {
1235
              expand_complex_libcall (bsi, ar, ai, br, bi, code);
1236
              break;
1237
            }
1238
          /* FALLTHRU */
1239
 
1240
        case 1:
1241
          /* wide ranges of inputs must work for complex divide.  */
1242
          expand_complex_div_wide (bsi, inner_type, ar, ai, br, bi, code);
1243
          break;
1244
 
1245
        default:
1246
          gcc_unreachable ();
1247
        }
1248
      return;
1249
 
1250
    default:
1251
      gcc_unreachable ();
1252
    }
1253
 
1254
  update_complex_assignment (bsi, rr, ri);
1255
}
1256
 
1257
/* Expand complex negation to scalars:
1258
        -a = (-ar) + i(-ai)
1259
*/
1260
 
1261
static void
1262
expand_complex_negation (block_stmt_iterator *bsi, tree inner_type,
1263
                         tree ar, tree ai)
1264
{
1265
  tree rr, ri;
1266
 
1267
  rr = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, ar);
1268
  ri = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, ai);
1269
 
1270
  update_complex_assignment (bsi, rr, ri);
1271
}
1272
 
1273
/* Expand complex conjugate to scalars:
1274
        ~a = (ar) + i(-ai)
1275
*/
1276
 
1277
static void
1278
expand_complex_conjugate (block_stmt_iterator *bsi, tree inner_type,
1279
                          tree ar, tree ai)
1280
{
1281
  tree ri;
1282
 
1283
  ri = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, ai);
1284
 
1285
  update_complex_assignment (bsi, ar, ri);
1286
}
1287
 
1288
/* Expand complex comparison (EQ or NE only).  */
1289
 
1290
static void
1291
expand_complex_comparison (block_stmt_iterator *bsi, tree ar, tree ai,
1292
                           tree br, tree bi, enum tree_code code)
1293
{
1294
  tree cr, ci, cc, stmt, expr, type;
1295
 
1296
  cr = gimplify_build2 (bsi, code, boolean_type_node, ar, br);
1297
  ci = gimplify_build2 (bsi, code, boolean_type_node, ai, bi);
1298
  cc = gimplify_build2 (bsi,
1299
                        (code == EQ_EXPR ? TRUTH_AND_EXPR : TRUTH_OR_EXPR),
1300
                        boolean_type_node, cr, ci);
1301
 
1302
  stmt = expr = bsi_stmt (*bsi);
1303
 
1304
  switch (TREE_CODE (stmt))
1305
    {
1306
    case RETURN_EXPR:
1307
      expr = TREE_OPERAND (stmt, 0);
1308
      /* FALLTHRU */
1309
    case MODIFY_EXPR:
1310
      type = TREE_TYPE (TREE_OPERAND (expr, 1));
1311
      TREE_OPERAND (expr, 1) = fold_convert (type, cc);
1312
      break;
1313
    case COND_EXPR:
1314
      TREE_OPERAND (stmt, 0) = cc;
1315
      break;
1316
    default:
1317
      gcc_unreachable ();
1318
    }
1319
 
1320
  update_stmt (stmt);
1321
}
1322
 
1323
/* Process one statement.  If we identify a complex operation, expand it.  */
1324
 
1325
static void
1326
expand_complex_operations_1 (block_stmt_iterator *bsi)
1327
{
1328
  tree stmt = bsi_stmt (*bsi);
1329
  tree rhs, type, inner_type;
1330
  tree ac, ar, ai, bc, br, bi;
1331
  complex_lattice_t al, bl;
1332
  enum tree_code code;
1333
 
1334
  switch (TREE_CODE (stmt))
1335
    {
1336
    case RETURN_EXPR:
1337
      stmt = TREE_OPERAND (stmt, 0);
1338
      if (!stmt)
1339
        return;
1340
      if (TREE_CODE (stmt) != MODIFY_EXPR)
1341
        return;
1342
      /* FALLTHRU */
1343
 
1344
    case MODIFY_EXPR:
1345
      rhs = TREE_OPERAND (stmt, 1);
1346
      break;
1347
 
1348
    case COND_EXPR:
1349
      rhs = TREE_OPERAND (stmt, 0);
1350
      break;
1351
 
1352
    default:
1353
      return;
1354
    }
1355
 
1356
  type = TREE_TYPE (rhs);
1357
  code = TREE_CODE (rhs);
1358
 
1359
  /* Initial filter for operations we handle.  */
1360
  switch (code)
1361
    {
1362
    case PLUS_EXPR:
1363
    case MINUS_EXPR:
1364
    case MULT_EXPR:
1365
    case TRUNC_DIV_EXPR:
1366
    case CEIL_DIV_EXPR:
1367
    case FLOOR_DIV_EXPR:
1368
    case ROUND_DIV_EXPR:
1369
    case RDIV_EXPR:
1370
    case NEGATE_EXPR:
1371
    case CONJ_EXPR:
1372
      if (TREE_CODE (type) != COMPLEX_TYPE)
1373
        return;
1374
      inner_type = TREE_TYPE (type);
1375
      break;
1376
 
1377
    case EQ_EXPR:
1378
    case NE_EXPR:
1379
      inner_type = TREE_TYPE (TREE_OPERAND (rhs, 1));
1380
      if (TREE_CODE (inner_type) != COMPLEX_TYPE)
1381
        return;
1382
      break;
1383
 
1384
    default:
1385
      {
1386
        tree lhs = TREE_OPERAND (stmt, 0);
1387
        tree rhs = TREE_OPERAND (stmt, 1);
1388
 
1389
        if (TREE_CODE (type) == COMPLEX_TYPE)
1390
          expand_complex_move (bsi, stmt, type, lhs, rhs);
1391
        else if ((TREE_CODE (rhs) == REALPART_EXPR
1392
                  || TREE_CODE (rhs) == IMAGPART_EXPR)
1393
                 && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
1394
          {
1395
            TREE_OPERAND (stmt, 1)
1396
              = extract_component (bsi, TREE_OPERAND (rhs, 0),
1397
                                   TREE_CODE (rhs) == IMAGPART_EXPR, false);
1398
            update_stmt (stmt);
1399
          }
1400
      }
1401
      return;
1402
    }
1403
 
1404
  /* Extract the components of the two complex values.  Make sure and
1405
     handle the common case of the same value used twice specially.  */
1406
  ac = TREE_OPERAND (rhs, 0);
1407
  ar = extract_component (bsi, ac, 0, true);
1408
  ai = extract_component (bsi, ac, 1, true);
1409
 
1410
  if (TREE_CODE_CLASS (code) == tcc_unary)
1411
    bc = br = bi = NULL;
1412
  else
1413
    {
1414
      bc = TREE_OPERAND (rhs, 1);
1415
      if (ac == bc)
1416
        br = ar, bi = ai;
1417
      else
1418
        {
1419
          br = extract_component (bsi, bc, 0, true);
1420
          bi = extract_component (bsi, bc, 1, true);
1421
        }
1422
    }
1423
 
1424
  if (in_ssa_p)
1425
    {
1426
      al = find_lattice_value (ac);
1427
      if (al == UNINITIALIZED)
1428
        al = VARYING;
1429
 
1430
      if (TREE_CODE_CLASS (code) == tcc_unary)
1431
        bl = UNINITIALIZED;
1432
      else if (ac == bc)
1433
        bl = al;
1434
      else
1435
        {
1436
          bl = find_lattice_value (bc);
1437
          if (bl == UNINITIALIZED)
1438
            bl = VARYING;
1439
        }
1440
    }
1441
  else
1442
    al = bl = VARYING;
1443
 
1444
  switch (code)
1445
    {
1446
    case PLUS_EXPR:
1447
    case MINUS_EXPR:
1448
      expand_complex_addition (bsi, inner_type, ar, ai, br, bi, code, al, bl);
1449
      break;
1450
 
1451
    case MULT_EXPR:
1452
      expand_complex_multiplication (bsi, inner_type, ar, ai, br, bi, al, bl);
1453
      break;
1454
 
1455
    case TRUNC_DIV_EXPR:
1456
    case CEIL_DIV_EXPR:
1457
    case FLOOR_DIV_EXPR:
1458
    case ROUND_DIV_EXPR:
1459
    case RDIV_EXPR:
1460
      expand_complex_division (bsi, inner_type, ar, ai, br, bi, code, al, bl);
1461
      break;
1462
 
1463
    case NEGATE_EXPR:
1464
      expand_complex_negation (bsi, inner_type, ar, ai);
1465
      break;
1466
 
1467
    case CONJ_EXPR:
1468
      expand_complex_conjugate (bsi, inner_type, ar, ai);
1469
      break;
1470
 
1471
    case EQ_EXPR:
1472
    case NE_EXPR:
1473
      expand_complex_comparison (bsi, ar, ai, br, bi, code);
1474
      break;
1475
 
1476
    default:
1477
      gcc_unreachable ();
1478
    }
1479
}
1480
 
1481
 
1482
/* Entry point for complex operation lowering during optimization.  */
1483
 
1484
static unsigned int
1485
tree_lower_complex (void)
1486
{
1487
  int old_last_basic_block;
1488
  block_stmt_iterator bsi;
1489
  basic_block bb;
1490
 
1491
  if (!init_dont_simulate_again ())
1492
    return 0;
1493
 
1494
  complex_lattice_values = VEC_alloc (complex_lattice_t, heap, num_ssa_names);
1495
  VEC_safe_grow (complex_lattice_t, heap,
1496
                 complex_lattice_values, num_ssa_names);
1497
  memset (VEC_address (complex_lattice_t, complex_lattice_values), 0,
1498
          num_ssa_names * sizeof(complex_lattice_t));
1499
 
1500
  init_parameter_lattice_values ();
1501
  ssa_propagate (complex_visit_stmt, complex_visit_phi);
1502
 
1503
  complex_variable_components = htab_create (10,  int_tree_map_hash,
1504
                                             int_tree_map_eq, free);
1505
 
1506
  complex_ssa_name_components = VEC_alloc (tree, heap, 2*num_ssa_names);
1507
  VEC_safe_grow (tree, heap, complex_ssa_name_components, 2*num_ssa_names);
1508
  memset (VEC_address (tree, complex_ssa_name_components), 0,
1509
          2 * num_ssa_names * sizeof(tree));
1510
 
1511
  update_parameter_components ();
1512
 
1513
  /* ??? Ideally we'd traverse the blocks in breadth-first order.  */
1514
  old_last_basic_block = last_basic_block;
1515
  FOR_EACH_BB (bb)
1516
    {
1517
      if (bb->index >= old_last_basic_block)
1518
        continue;
1519
      update_phi_components (bb);
1520
      for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1521
        expand_complex_operations_1 (&bsi);
1522
    }
1523
 
1524
  bsi_commit_edge_inserts ();
1525
 
1526
  htab_delete (complex_variable_components);
1527
  VEC_free (tree, heap, complex_ssa_name_components);
1528
  VEC_free (complex_lattice_t, heap, complex_lattice_values);
1529
  return 0;
1530
}
1531
 
1532
struct tree_opt_pass pass_lower_complex =
1533
{
1534
  "cplxlower",                          /* name */
1535
  0,                                     /* gate */
1536
  tree_lower_complex,                   /* execute */
1537
  NULL,                                 /* sub */
1538
  NULL,                                 /* next */
1539
  0,                                     /* static_pass_number */
1540
  0,                                     /* tv_id */
1541
  PROP_ssa,                             /* properties_required */
1542
  0,                                     /* properties_provided */
1543
  PROP_smt_usage,                       /* properties_destroyed */
1544
  0,                                     /* todo_flags_start */
1545
  TODO_dump_func | TODO_ggc_collect
1546
  | TODO_update_smt_usage
1547
  | TODO_update_ssa
1548
  | TODO_verify_stmts,                  /* todo_flags_finish */
1549
 
1550
};
1551
 
1552
 
1553
/* Entry point for complex operation lowering without optimization.  */
1554
 
1555
static unsigned int
1556
tree_lower_complex_O0 (void)
1557
{
1558
  int old_last_basic_block = last_basic_block;
1559
  block_stmt_iterator bsi;
1560
  basic_block bb;
1561
 
1562
  FOR_EACH_BB (bb)
1563
    {
1564
      if (bb->index >= old_last_basic_block)
1565
        continue;
1566
      for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1567
        expand_complex_operations_1 (&bsi);
1568
    }
1569
  return 0;
1570
}
1571
 
1572
static bool
1573
gate_no_optimization (void)
1574
{
1575
  /* With errors, normal optimization passes are not run.  If we don't
1576
     lower complex operations at all, rtl expansion will abort.  */
1577
  return optimize == 0 || sorrycount || errorcount;
1578
}
1579
 
1580
struct tree_opt_pass pass_lower_complex_O0 =
1581
{
1582
  "cplxlower0",                         /* name */
1583
  gate_no_optimization,                 /* gate */
1584
  tree_lower_complex_O0,                /* execute */
1585
  NULL,                                 /* sub */
1586
  NULL,                                 /* next */
1587
  0,                                     /* static_pass_number */
1588
  0,                                     /* tv_id */
1589
  PROP_cfg,                             /* properties_required */
1590
  0,                                     /* properties_provided */
1591
  0,                                     /* properties_destroyed */
1592
  0,                                     /* todo_flags_start */
1593
  TODO_dump_func | TODO_ggc_collect
1594
    | TODO_verify_stmts,                /* todo_flags_finish */
1595
 
1596
};

powered by: WebSVN 2.1.0

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