added missing parentesis
[libfirm] / ir / ir / iropt.c
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/iropt.c
4  * Purpose:     iropt --- optimizations intertwined with IR construction.
5  * Author:      Christian Schaefer
6  * Modified by: Goetz Lindenmaier
7  * Created:
8  * CVS-ID:      $Id$
9  * Copyright:   (c) 1998-2003 Universität Karlsruhe
10  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
11  */
12
13 #ifdef HAVE_CONFIG_H
14 # include "config.h"
15 #endif
16
17 #ifdef HAVE_ALLOCA_H
18 #include <alloca.h>
19 #endif
20 #ifdef HAVE_MALLOC_H
21 #include <malloc.h>
22 #endif
23 #ifdef HAVE_STRING_H
24 #include <string.h>
25 #endif
26
27 # include "irnode_t.h"
28 # include "irgraph_t.h"
29 # include "iredges_t.h"
30 # include "irmode_t.h"
31 # include "iropt_t.h"
32 # include "ircons_t.h"
33 # include "irgmod.h"
34 # include "irvrfy.h"
35 # include "tv_t.h"
36 # include "dbginfo_t.h"
37 # include "iropt_dbg.h"
38 # include "irflag_t.h"
39 # include "irhooks.h"
40 # include "irarch.h"
41 # include "hashptr.h"
42
43 /* Make types visible to allow most efficient access */
44 # include "entity_t.h"
45
46 /**
47  * Trivial INLINEable routine for copy propagation.
48  * Does follow Ids, needed to optimize INLINEd code.
49  */
50 static INLINE ir_node *
51 follow_Id (ir_node *n)
52 {
53   while (get_irn_op (n) == op_Id) n = get_Id_pred (n);
54   return n;
55 }
56
57 /**
58  * return the value of a Constant
59  */
60 static tarval *computed_value_Const(ir_node *n)
61 {
62     return get_Const_tarval(n);
63 }
64
65 /**
66  * return the value of a 'sizeof' SymConst
67  */
68 static tarval *computed_value_SymConst(ir_node *n)
69 {
70   if ((get_SymConst_kind(n) == symconst_size) &&
71       (get_type_state(get_SymConst_type(n))) == layout_fixed)
72     return new_tarval_from_long(get_type_size_bytes(get_SymConst_type(n)), get_irn_mode(n));
73   return tarval_bad;
74 }
75
76 /**
77  * return the value of an Add
78  */
79 static tarval *computed_value_Add(ir_node *n)
80 {
81   ir_node *a = get_Add_left(n);
82   ir_node *b = get_Add_right(n);
83
84   tarval *ta = value_of(a);
85   tarval *tb = value_of(b);
86
87   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b)))
88     return tarval_add(ta, tb);
89
90   return tarval_bad;
91 }
92
93 /**
94  * return the value of a Sub
95  * Special case: a - a
96  */
97 static tarval *computed_value_Sub(ir_node *n)
98 {
99   ir_node *a = get_Sub_left(n);
100   ir_node *b = get_Sub_right(n);
101   tarval *ta;
102   tarval *tb;
103
104   /* a - a */
105   if (a == b && !is_Bad(a))
106     return get_tarval_null(get_irn_mode(n));
107
108   ta = value_of(a);
109   tb = value_of(b);
110
111   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b)))
112     return tarval_sub(ta, tb);
113
114   return tarval_bad;
115 }
116
117 /**
118  * return the value of an unary Minus
119  */
120 static tarval *computed_value_Minus(ir_node *n)
121 {
122   ir_node *a = get_Minus_op(n);
123   tarval *ta = value_of(a);
124
125   if ((ta != tarval_bad) && mode_is_signed(get_irn_mode(a)))
126     return tarval_neg(ta);
127
128   return tarval_bad;
129 }
130
131 /**
132  * return the value of a Mul
133  */
134 static tarval *computed_value_Mul(ir_node *n)
135 {
136   ir_node *a = get_Mul_left(n);
137   ir_node *b = get_Mul_right(n);
138
139   tarval *ta = value_of(a);
140   tarval *tb = value_of(b);
141
142   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b))) {
143     return tarval_mul(ta, tb);
144   } else {
145     /* a*0 = 0 or 0*b = 0:
146        calls computed_value recursive and returns the 0 with proper
147        mode. */
148     if ((ta != tarval_bad) && (ta == get_mode_null(get_tarval_mode(ta))))
149       return ta;
150     if ((tb != tarval_bad) && (tb == get_mode_null(get_tarval_mode(tb))))
151       return tb;
152   }
153   return tarval_bad;
154 }
155
156 /**
157  * return the value of a floating point Quot
158  */
159 static tarval *computed_value_Quot(ir_node *n)
160 {
161   ir_node *a = get_Quot_left(n);
162   ir_node *b = get_Quot_right(n);
163
164   tarval *ta = value_of(a);
165   tarval *tb = value_of(b);
166
167   /* This was missing in original implementation. Why? */
168   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b))) {
169     if (tb != get_mode_null(get_tarval_mode(tb)))   /* div by zero: return tarval_bad */
170       return tarval_quo(ta, tb);
171   }
172   return tarval_bad;
173 }
174
175 /**
176  * calculate the value of an integer Div of two nodes
177  * Special case: 0 / b
178  */
179 static tarval *do_computed_value_Div(ir_node *a, ir_node *b)
180 {
181   tarval *ta = value_of(a);
182   tarval *tb = value_of(b);
183
184   /* Compute c1 / c2 or 0 / a, a != 0 */
185   if (ta != tarval_bad) {
186     if ((tb != tarval_bad) && (tb != get_mode_null(get_irn_mode(b))))   /* div by zero: return tarval_bad */
187       return tarval_div(ta, tb);
188     else if (ta == get_mode_null(get_tarval_mode(ta)))  /* 0 / b == 0 */
189       return ta;
190   }
191   return tarval_bad;
192 }
193
194 /**
195  * return the value of an integer Div
196  */
197 static tarval *computed_value_Div(ir_node *n)
198 {
199   return do_computed_value_Div(get_Div_left(n), get_Div_right(n));
200 }
201
202 /**
203  * calculate the value of an integer Mod of two nodes
204  * Special case: a % 1
205  */
206 static tarval *do_computed_value_Mod(ir_node *a, ir_node *b)
207 {
208   tarval *ta = value_of(a);
209   tarval *tb = value_of(b);
210
211   /* Compute c1 % c2 or a % 1 */
212   if (tb != tarval_bad) {
213     if ((ta != tarval_bad) && (tb != get_mode_null(get_tarval_mode(tb))))   /* div by zero: return tarval_bad */
214       return tarval_mod(ta, tb);
215     else if (tb == get_mode_one(get_tarval_mode(tb)))    /* x mod 1 == 0 */
216       return get_mode_null(get_irn_mode(a));
217   }
218
219   return tarval_bad;
220 }
221
222 /**
223  * return the value of an integer Mod
224  */
225 static tarval *computed_value_Mod(ir_node *n)
226 {
227   return do_computed_value_Mod(get_Mod_left(n), get_Mod_right(n));
228 }
229
230 /**
231  * return the value of an Abs
232  */
233 static tarval *computed_value_Abs(ir_node *n)
234 {
235   ir_node *a = get_Abs_op(n);
236   tarval *ta = value_of(a);
237
238   if (ta != tarval_bad)
239     return tarval_abs(ta);
240
241   return tarval_bad;
242 }
243
244 /**
245  * return the value of an And
246  * Special case: a & 0, 0 & b
247  */
248 static tarval *computed_value_And(ir_node *n)
249 {
250   ir_node *a = get_And_left(n);
251   ir_node *b = get_And_right(n);
252
253   tarval *ta = value_of(a);
254   tarval *tb = value_of(b);
255
256   if ((ta != tarval_bad) && (tb != tarval_bad)) {
257     return tarval_and (ta, tb);
258   } else {
259     tarval *v;
260
261     if (   (classify_tarval ((v = ta)) == TV_CLASSIFY_NULL)
262         || (classify_tarval ((v = tb)) == TV_CLASSIFY_NULL)) {
263       return v;
264     }
265   }
266   return tarval_bad;
267 }
268
269 /**
270  * return the value of an Or
271  * Special case: a | 1...1, 1...1 | b
272  */
273 static tarval *computed_value_Or(ir_node *n)
274 {
275   ir_node *a = get_Or_left(n);
276   ir_node *b = get_Or_right(n);
277
278   tarval *ta = value_of(a);
279   tarval *tb = value_of(b);
280
281   if ((ta != tarval_bad) && (tb != tarval_bad)) {
282     return tarval_or (ta, tb);
283   } else {
284     tarval *v;
285     if (   (classify_tarval ((v = ta)) == TV_CLASSIFY_ALL_ONE)
286         || (classify_tarval ((v = tb)) == TV_CLASSIFY_ALL_ONE)) {
287       return v;
288     }
289   }
290   return tarval_bad;
291 }
292
293 /**
294  * return the value of an Eor
295  */
296 static tarval *computed_value_Eor(ir_node *n)
297 {
298   ir_node *a = get_Eor_left(n);
299   ir_node *b = get_Eor_right(n);
300
301   tarval *ta, *tb;
302
303   if (a == b)
304     return get_tarval_null(get_irn_mode(n));
305
306   ta = value_of(a);
307   tb = value_of(b);
308
309   if ((ta != tarval_bad) && (tb != tarval_bad)) {
310     return tarval_eor (ta, tb);
311   }
312   return tarval_bad;
313 }
314
315 /**
316  * return the value of a Not
317  */
318 static tarval *computed_value_Not(ir_node *n)
319 {
320   ir_node *a = get_Not_op(n);
321   tarval *ta = value_of(a);
322
323   if (ta != tarval_bad)
324     return tarval_not(ta);
325
326   return tarval_bad;
327 }
328
329 /**
330  * return the value of a Shl
331  */
332 static tarval *computed_value_Shl(ir_node *n)
333 {
334   ir_node *a = get_Shl_left(n);
335   ir_node *b = get_Shl_right(n);
336
337   tarval *ta = value_of(a);
338   tarval *tb = value_of(b);
339
340   if ((ta != tarval_bad) && (tb != tarval_bad)) {
341     return tarval_shl (ta, tb);
342   }
343   return tarval_bad;
344 }
345
346 /**
347  * return the value of a Shr
348  */
349 static tarval *computed_value_Shr(ir_node *n)
350 {
351   ir_node *a = get_Shr_left(n);
352   ir_node *b = get_Shr_right(n);
353
354   tarval *ta = value_of(a);
355   tarval *tb = value_of(b);
356
357   if ((ta != tarval_bad) && (tb != tarval_bad)) {
358     return tarval_shr (ta, tb);
359   }
360   return tarval_bad;
361 }
362
363 /**
364  * return the value of a Shrs
365  */
366 static tarval *computed_value_Shrs(ir_node *n)
367 {
368   ir_node *a = get_Shrs_left(n);
369   ir_node *b = get_Shrs_right(n);
370
371   tarval *ta = value_of(a);
372   tarval *tb = value_of(b);
373
374   if ((ta != tarval_bad) && (tb != tarval_bad)) {
375     return tarval_shrs (ta, tb);
376   }
377   return tarval_bad;
378 }
379
380 /**
381  * return the value of a Rot
382  */
383 static tarval *computed_value_Rot(ir_node *n)
384 {
385   ir_node *a = get_Rot_left(n);
386   ir_node *b = get_Rot_right(n);
387
388   tarval *ta = value_of(a);
389   tarval *tb = value_of(b);
390
391   if ((ta != tarval_bad) && (tb != tarval_bad)) {
392     return tarval_rot (ta, tb);
393   }
394   return tarval_bad;
395 }
396
397 /**
398  * return the value of a Conv
399  */
400 static tarval *computed_value_Conv(ir_node *n)
401 {
402   ir_node *a = get_Conv_op(n);
403   tarval *ta = value_of(a);
404
405   if (ta != tarval_bad)
406     return tarval_convert_to(ta, get_irn_mode(n));
407
408   return tarval_bad;
409 }
410
411 /**
412  * return the value of a Proj, handle Proj(Cmp), Proj(Div), Proj(Mod), Proj(DivMod)
413  */
414 static tarval *computed_value_Proj(ir_node *n)
415 {
416   ir_node *a = get_Proj_pred(n);
417   ir_node *aa, *ab;
418   long proj_nr;
419
420   /* Optimize Cmp nodes.
421      This performs a first step of unreachable code elimination.
422      Proj can not be computed, but folding a Cmp above the Proj here is
423      not as wasteful as folding a Cmp into a Tuple of 16 Consts of which
424      only 1 is used.
425      There are several case where we can evaluate a Cmp node:
426      1. The nodes compared are both the same.  If we compare for
427         equal, greater equal, ... this will return true, else it
428         will return false.  This step relies on cse.
429      2. The predecessors of Cmp are target values.  We can evaluate
430         the Cmp.
431      3. The predecessors are Allocs or void* constants.  Allocs never
432         return NULL, they raise an exception.   Therefore we can predict
433         the Cmp result. */
434   switch (get_irn_opcode(a)) {
435   case iro_Cmp:
436     aa = get_Cmp_left(a);
437     ab = get_Cmp_right(a);
438     proj_nr = get_Proj_proj(n);
439
440     if (aa == ab && !mode_is_float(get_irn_mode(aa))) { /* 1.: */
441       /* BEWARE: a == a is NOT always True for floating Point!!! */
442       /* This is a trick with the bits used for encoding the Cmp
443          Proj numbers, the following statement is not the same:
444       return new_tarval_from_long (proj_nr == pn_Cmp_Eq, mode_b) */
445       return new_tarval_from_long (proj_nr & pn_Cmp_Eq, mode_b);
446     } else {
447       tarval *taa = value_of(aa);
448       tarval *tab = value_of(ab);
449
450       if ((taa != tarval_bad) && (tab != tarval_bad)) { /* 2.: */
451         /* strange checks... */
452         pn_Cmp flags = tarval_cmp (taa, tab);
453         if (flags != pn_Cmp_False) {
454           return new_tarval_from_long (proj_nr & flags, mode_b);
455         }
456       } else {  /* check for 3.: */
457         ir_node *aaa = skip_Id(skip_Proj(aa));
458         ir_node *aba = skip_Id(skip_Proj(ab));
459
460         if (   (   (/* aa is ProjP and aaa is Alloc */
461                        (get_irn_op(aa) == op_Proj)
462                     && (mode_is_reference(get_irn_mode(aa)))
463                     && (get_irn_op(aaa) == op_Alloc))
464                 && (   (/* ab is constant void */
465                            (get_irn_op(ab) == op_Const)
466                         && (mode_is_reference(get_irn_mode(ab)))
467                         && (get_Const_tarval(ab) == get_mode_null(get_irn_mode(ab))))
468                     || (/* ab is other Alloc */
469                            (get_irn_op(ab) == op_Proj)
470                         && (mode_is_reference(get_irn_mode(ab)))
471                         && (get_irn_op(aba) == op_Alloc)
472                         && (aaa != aba))))
473             || (/* aa is void and aba is Alloc */
474                    (get_irn_op(aa) == op_Const)
475                 && (mode_is_reference(get_irn_mode(aa)))
476                 && (get_Const_tarval(aa) == get_mode_null(get_irn_mode(aa)))
477                 && (get_irn_op(ab) == op_Proj)
478                 && (mode_is_reference(get_irn_mode(ab)))
479                 && (get_irn_op(aba) == op_Alloc)))
480           /* 3.: */
481           return new_tarval_from_long (proj_nr & pn_Cmp_Ne, mode_b);
482       }
483     }
484     break;
485
486   case iro_DivMod:
487     /* compute either the Div or the Mod part */
488     proj_nr = get_Proj_proj(n);
489     if (proj_nr == pn_DivMod_res_div)
490       return do_computed_value_Div(get_DivMod_left(a), get_DivMod_right(a));
491     else if (proj_nr == pn_DivMod_res_mod)
492       return do_computed_value_Mod(get_DivMod_left(a), get_DivMod_right(a));
493     break;
494
495   case iro_Div:
496     if (get_Proj_proj(n) == pn_Div_res)
497       return computed_value(a);
498     break;
499
500   case iro_Mod:
501     if (get_Proj_proj(n) == pn_Mod_res)
502       return computed_value(a);
503     break;
504
505   default:
506     return tarval_bad;
507   }
508   return tarval_bad;
509 }
510
511 /**
512  * calculate the value of a Mux: can be evaluated, if the
513  * sel and the right input are known
514  */
515 static tarval *computed_value_Mux(ir_node *n)
516 {
517   ir_node *sel = get_Mux_sel(n);
518   tarval *ts = value_of(sel);
519
520   if (ts == get_tarval_b_true()) {
521     ir_node *v = get_Mux_true(n);
522     return value_of(v);
523   }
524   else if (ts == get_tarval_b_false()) {
525     ir_node *v = get_Mux_false(n);
526     return value_of(v);
527   }
528   return tarval_bad;
529 }
530
531 /**
532  * If the parameter n can be computed, return its value, else tarval_bad.
533  * Performs constant folding.
534  *
535  * @param n  The node this should be evaluated
536  */
537 tarval *computed_value(ir_node *n)
538 {
539   if (n->op->computed_value)
540     return n->op->computed_value(n);
541   return tarval_bad;
542 }
543
544 /**
545  * set the default computed_value evaluator
546  */
547 static ir_op *firm_set_default_computed_value(ir_op *op)
548 {
549 #define CASE(a)                               \
550   case iro_##a:                               \
551     op->computed_value  = computed_value_##a; \
552     break
553
554   switch (op->code) {
555   CASE(Const);
556   CASE(SymConst);
557   CASE(Add);
558   CASE(Sub);
559   CASE(Minus);
560   CASE(Mul);
561   CASE(Quot);
562   CASE(Div);
563   CASE(Mod);
564   CASE(Abs);
565   CASE(And);
566   CASE(Or);
567   CASE(Eor);
568   CASE(Not);
569   CASE(Shl);
570   CASE(Shr);
571   CASE(Shrs);
572   CASE(Rot);
573   CASE(Conv);
574   CASE(Proj);
575   CASE(Mux);
576   default:
577     op->computed_value  = NULL;
578   }
579
580   return op;
581 #undef CASE
582 }
583
584 #if 0
585 /* returns 1 if the a and b are pointers to different locations. */
586 static bool
587 different_identity (ir_node *a, ir_node *b)
588 {
589   assert (mode_is_reference(get_irn_mode (a))
590           && mode_is_reference(get_irn_mode (b)));
591
592   if (get_irn_op (a) == op_Proj && get_irn_op(b) == op_Proj) {
593     ir_node *a1 = get_Proj_pred (a);
594     ir_node *b1 = get_Proj_pred (b);
595     if (a1 != b1 && get_irn_op (a1) == op_Alloc
596                 && get_irn_op (b1) == op_Alloc)
597       return 1;
598   }
599   return 0;
600 }
601 #endif
602
603 static ir_node *equivalent_node_Block(ir_node *n)
604 {
605   ir_node *oldn = n;
606
607   /* The Block constructor does not call optimize, but mature_immBlock
608      calls the optimization. */
609   assert(get_Block_matured(n));
610
611   /* Straightening: a single entry Block following a single exit Block
612      can be merged, if it is not the Start block. */
613   /* !!! Beware, all Phi-nodes of n must have been optimized away.
614      This should be true, as the block is matured before optimize is called.
615      But what about Phi-cycles with the Phi0/Id that could not be resolved?
616      Remaining Phi nodes are just Ids. */
617    if ((get_Block_n_cfgpreds(n) == 1) &&
618        (get_irn_op(get_Block_cfgpred(n, 0)) == op_Jmp)) {
619      ir_node *predblock = get_nodes_block(get_Block_cfgpred(n, 0));
620      if (predblock == oldn) {
621        /* Jmp jumps into the block it is in -- deal self cycle. */
622        n = set_Block_dead(n);
623        DBG_OPT_DEAD(oldn, n);
624      } else if (get_opt_control_flow_straightening()) {
625        n = predblock;
626        DBG_OPT_STG(oldn, n);
627      }
628    }
629    else if ((get_Block_n_cfgpreds(n) == 1) &&
630             (get_irn_op(skip_Proj(get_Block_cfgpred(n, 0))) == op_Cond)) {
631      ir_node *predblock = get_nodes_block(get_Block_cfgpred(n, 0));
632      if (predblock == oldn) {
633        /* Jmp jumps into the block it is in -- deal self cycle. */
634        n = set_Block_dead(n);
635        DBG_OPT_DEAD(oldn, n);
636      }
637    }
638    else if ((get_Block_n_cfgpreds(n) == 2) &&
639             (get_opt_control_flow_weak_simplification())) {
640     /* Test whether Cond jumps twice to this block
641        @@@ we could do this also with two loops finding two preds from several ones. */
642     ir_node *a = get_Block_cfgpred(n, 0);
643     ir_node *b = get_Block_cfgpred(n, 1);
644
645     if ((get_irn_op(a) == op_Proj) &&
646         (get_irn_op(b) == op_Proj) &&
647         (get_Proj_pred(a) == get_Proj_pred(b)) &&
648         (get_irn_op(get_Proj_pred(a)) == op_Cond) &&
649         (get_irn_mode(get_Cond_selector(get_Proj_pred(a))) == mode_b)) {
650       /* Also a single entry Block following a single exit Block.  Phis have
651          twice the same operand and will be optimized away. */
652       n = get_nodes_block(a);
653       DBG_OPT_IFSIM(oldn, a, b, n);
654     }
655   } else if (get_opt_unreachable_code() &&
656              (n != current_ir_graph->start_block) &&
657              (n != current_ir_graph->end_block)     ) {
658     int i, n_cfg = get_Block_n_cfgpreds(n);
659
660     /* If all inputs are dead, this block is dead too, except if it is
661        the start or end block.  This is a step of unreachable code
662        elimination */
663     for (i = 0; i < n_cfg; i++) {
664       ir_node *pred = get_Block_cfgpred(n, i);
665       ir_node *pred_blk;
666
667       if (is_Bad(pred)) continue;
668       pred_blk = get_nodes_block(pred);
669
670       if (is_Block_dead(pred_blk)) continue;
671
672       if (pred_blk != n) {
673         /* really found a living input */
674         break;
675       }
676     }
677     if (i == n_cfg)
678       n = set_Block_dead(n);
679   }
680
681   return n;
682 }
683
684 /**
685  * Returns a equivalent node for a Jmp, a Bad :-)
686  * Of course this only happens if the Block of the Jmp is Bad.
687  */
688 static ir_node *equivalent_node_Jmp(ir_node *n)
689 {
690   /* GL: Why not same for op_Raise?? */
691   /* unreachable code elimination */
692   if (is_Block_dead(get_nodes_block(n)))
693     n = new_Bad();
694
695   return n;
696 }
697
698 static ir_node *equivalent_node_Cond(ir_node *n)
699 {
700   /* We do not evaluate Cond here as we replace it by a new node, a Jmp.
701      See cases for iro_Cond and iro_Proj in transform_node. */
702   return n;
703 }
704
705 /**
706  * optimize operations that are commutative and have neutral 0,
707  * so a op 0 = 0 op a = a.
708  */
709 static ir_node *equivalent_node_neutral_zero(ir_node *n)
710 {
711   ir_node *oldn = n;
712
713   ir_node *a = get_binop_left(n);
714   ir_node *b = get_binop_right(n);
715
716   tarval *tv;
717   ir_node *on;
718
719   /* After running compute_node there is only one constant predecessor.
720      Find this predecessors value and remember the other node: */
721   if ((tv = value_of(a)) != tarval_bad) {
722     on = b;
723   } else if ((tv = value_of(b)) != tarval_bad) {
724     on = a;
725   } else
726     return n;
727
728   /* If this predecessors constant value is zero, the operation is
729      unnecessary. Remove it: */
730   if (classify_tarval (tv) == TV_CLASSIFY_NULL) {
731     n = on;
732
733     DBG_OPT_ALGSIM1(oldn, a, b, n);
734   }
735
736   return n;
737 }
738
739 #define equivalent_node_Add  equivalent_node_neutral_zero
740 #define equivalent_node_Eor  equivalent_node_neutral_zero
741
742 /**
743  * optimize operations that are not commutative but have neutral 0 on left,
744  * so a op 0 = a.
745  */
746 static ir_node *equivalent_node_left_zero(ir_node *n)
747 {
748   ir_node *oldn = n;
749
750   ir_node *a = get_binop_left(n);
751   ir_node *b = get_binop_right(n);
752
753   if (classify_tarval(value_of(b)) == TV_CLASSIFY_NULL) {
754     n = a;
755
756     DBG_OPT_ALGSIM1(oldn, a, b, n);
757   }
758
759   return n;
760 }
761
762 #define equivalent_node_Sub   equivalent_node_left_zero
763 #define equivalent_node_Shl   equivalent_node_left_zero
764 #define equivalent_node_Shr   equivalent_node_left_zero
765 #define equivalent_node_Shrs  equivalent_node_left_zero
766 #define equivalent_node_Rot   equivalent_node_left_zero
767
768 /**
769  * Er, a "symmetic unop", ie op(op(n)) = n.
770  */
771 static ir_node *equivalent_node_symmetric_unop(ir_node *n)
772 {
773   ir_node *oldn = n;
774   ir_node *pred = get_unop_op(n);
775
776   /* optimize symmetric unop */
777   if (get_irn_op(pred) == get_irn_op(n)) {
778     n = get_unop_op(pred);
779     DBG_OPT_ALGSIM2(oldn, pred, n);
780   }
781   return n;
782 }
783
784 /* NotNot x == x */
785 #define equivalent_node_Not    equivalent_node_symmetric_unop
786
787 /* --x == x */  /* ??? Is this possible or can --x raise an
788                        out of bounds exception if min =! max? */
789 #define equivalent_node_Minus  equivalent_node_symmetric_unop
790
791 /**
792  * Optimize a * 1 = 1 * a = a.
793  */
794 static ir_node *equivalent_node_Mul(ir_node *n)
795 {
796   ir_node *oldn = n;
797
798   ir_node *a = get_Mul_left(n);
799   ir_node *b = get_Mul_right(n);
800
801   /* Mul is commutative and has again an other neutral element. */
802   if (classify_tarval(value_of(a)) == TV_CLASSIFY_ONE) {
803     n = b;
804     DBG_OPT_ALGSIM1(oldn, a, b, n);
805   } else if (classify_tarval(value_of(b)) == TV_CLASSIFY_ONE) {
806     n = a;
807     DBG_OPT_ALGSIM1(oldn, a, b, n);
808   }
809   return n;
810 }
811
812 /**
813  * Optimize a / 1 = a.
814  */
815 static ir_node *equivalent_node_Div(ir_node *n)
816 {
817   ir_node *a = get_Div_left(n);
818   ir_node *b = get_Div_right(n);
819
820   /* Div is not commutative. */
821   if (classify_tarval(value_of(b)) == TV_CLASSIFY_ONE) { /* div(x, 1) == x */
822     /* Turn Div into a tuple (mem, bad, a) */
823     ir_node *mem = get_Div_mem(n);
824     turn_into_tuple(n, 3);
825     set_Tuple_pred(n, pn_Div_M,        mem);
826     set_Tuple_pred(n, pn_Div_X_except, new_Bad());        /* no exception */
827     set_Tuple_pred(n, pn_Div_res,      a);
828   }
829   return n;
830 }
831
832 /**
833  * Optimize a / 1 = a.
834  */
835 static ir_node *equivalent_node_DivMod(ir_node *n)
836 {
837   ir_node *a = get_DivMod_left(n);
838   ir_node *b = get_DivMod_right(n);
839
840   /* Div is not commutative. */
841   if (classify_tarval(value_of(b)) == TV_CLASSIFY_ONE) { /* div(x, 1) == x */
842     /* Turn DivMod into a tuple (mem, bad, a, 0) */
843     ir_node *mem = get_Div_mem(n);
844     ir_mode *mode = get_irn_mode(b);
845
846     turn_into_tuple(n, 4);
847     set_Tuple_pred(n, pn_DivMod_M,        mem);
848     set_Tuple_pred(n, pn_DivMod_X_except, new_Bad());        /* no exception */
849     set_Tuple_pred(n, pn_DivMod_res_div,  a);
850     set_Tuple_pred(n, pn_DivMod_res_mod,  new_Const(mode, get_mode_null(mode)));
851   }
852   return n;
853 }
854
855 /**
856  * Use algebraic simplification a | a = a | 0 = 0 | a = a.
857  */
858 static ir_node *equivalent_node_Or(ir_node *n)
859 {
860   ir_node *oldn = n;
861
862   ir_node *a = get_Or_left(n);
863   ir_node *b = get_Or_right(n);
864
865   if (a == b) {
866     n = a;    /* Or has it's own neutral element */
867   } else if (classify_tarval(value_of(a)) == TV_CLASSIFY_NULL) {
868     n = b;
869     DBG_OPT_ALGSIM1(oldn, a, b, n);
870   } else if (classify_tarval(value_of(b)) == TV_CLASSIFY_NULL) {
871     n = a;
872     DBG_OPT_ALGSIM1(oldn, a, b, n);
873   }
874
875   return n;
876 }
877
878 /**
879  * Optimize a & 0b1...1 = 0b1...1 & a =  a & a = a.
880  */
881 static ir_node *equivalent_node_And(ir_node *n)
882 {
883   ir_node *oldn = n;
884
885   ir_node *a = get_And_left(n);
886   ir_node *b = get_And_right(n);
887
888   if (a == b) {
889     n = a;    /* And has it's own neutral element */
890   } else if (classify_tarval(value_of(a)) == TV_CLASSIFY_ALL_ONE) {
891     n = b;
892     DBG_OPT_ALGSIM1(oldn, a, b, n);
893   } else if (classify_tarval(value_of(b)) == TV_CLASSIFY_ALL_ONE) {
894     n = a;
895     DBG_OPT_ALGSIM1(oldn, a, b, n);
896   }
897   return n;
898 }
899
900 /**
901  * Try to remove useless conv's:
902  */
903 static ir_node *equivalent_node_Conv(ir_node *n)
904 {
905   ir_node *oldn = n;
906   ir_node *a = get_Conv_op(n);
907   ir_node *b;
908
909   ir_mode *n_mode = get_irn_mode(n);
910   ir_mode *a_mode = get_irn_mode(a);
911
912   if (n_mode == a_mode) { /* No Conv necessary */
913     n = a;
914     DBG_OPT_ALGSIM3(oldn, a, n);
915   } else if (get_irn_op(a) == op_Conv) { /* Conv(Conv(b)) */
916     ir_mode *b_mode;
917
918     b = get_Conv_op(a);
919     n_mode = get_irn_mode(n);
920     b_mode = get_irn_mode(b);
921
922     if (n_mode == b_mode) {
923       if (n_mode == mode_b) {
924         n = b; /* Convb(Conv*(xxxb(...))) == xxxb(...) */
925     DBG_OPT_ALGSIM1(oldn, a, b, n);
926       }
927       else if (mode_is_int(n_mode) || mode_is_character(n_mode)) {
928         if (smaller_mode(b_mode, a_mode)){
929           n = b;        /* ConvS(ConvL(xxxS(...))) == xxxS(...) */
930       DBG_OPT_ALGSIM1(oldn, a, b, n);
931         }
932       }
933     }
934   }
935   return n;
936 }
937
938 /**
939  * A Cast may be removed if the type of the previous node
940  * is already to type of the Cast.
941  */
942 static ir_node *equivalent_node_Cast(ir_node *n) {
943   ir_node *pred = get_Cast_op(n);
944   if (get_irn_type(pred) == get_Cast_type(n))
945     n = pred;
946   return n;
947 }
948
949 /* Several optimizations:
950    - no Phi in start block.
951    - remove Id operators that are inputs to Phi
952    - fold Phi-nodes, iff they have only one predecessor except
953            themselves.
954 */
955 static ir_node *equivalent_node_Phi(ir_node *n)
956 {
957   int i, n_preds;
958
959   ir_node *oldn = n;
960   ir_node *block = NULL;     /* to shutup gcc */
961   ir_node *first_val = NULL; /* to shutup gcc */
962   ir_node *scnd_val = NULL;  /* to shutup gcc */
963
964   if (!get_opt_normalize()) return n;
965
966   n_preds = get_Phi_n_preds(n);
967
968   block = get_nodes_block(n);
969   /* @@@ fliegt 'raus, sollte aber doch immer wahr sein!!!
970      assert(get_irn_arity(block) == n_preds && "phi in wrong block!"); */
971   if ((is_Block_dead(block)) ||                  /* Control dead */
972       (block == current_ir_graph->start_block))  /* There should be no Phi nodes */
973     return new_Bad();                            /* in the Start Block. */
974
975   if (n_preds == 0) return n;           /* Phi of dead Region without predecessors. */
976
977 #if 0
978   /* first we test for a special case: */
979   /* Confirm is a special node fixing additional information for a
980      value that is known at a certain point.  This is useful for
981      dataflow analysis. */
982   if (n_preds == 2) {
983     ir_node *a = get_Phi_pred(n, 0);
984     ir_node *b = get_Phi_pred(n, 1);
985     if (   (get_irn_op(a) == op_Confirm)
986         && (get_irn_op(b) == op_Confirm)
987         && follow_Id (get_irn_n(a, 0) == get_irn_n(b, 0))
988         && (get_irn_n(a, 1) == get_irn_n (b, 1))
989         && (a->data.num == (~b->data.num & irpn_True) )) {
990       return get_irn_n(a, 0);
991     }
992   }
993 #endif
994
995   /* If the Block has a Bad pred, we also have one. */
996   for (i = 0;  i < n_preds;  ++i)
997     if (is_Bad (get_Block_cfgpred(block, i)))
998       set_Phi_pred(n, i, new_Bad());
999
1000   /* Find first non-self-referencing input */
1001   for (i = 0;  i < n_preds;  ++i) {
1002     first_val = get_Phi_pred(n, i);
1003     if (   (first_val != n)                            /* not self pointer */
1004 #if 1
1005         && (get_irn_op(first_val) != op_Bad)
1006 #endif
1007            ) {        /* value not dead */
1008       break;          /* then found first value. */
1009     }
1010   }
1011
1012   /* A totally Bad or self-referencing Phi (we didn't break the above loop) */
1013   if (i >= n_preds) { return new_Bad(); }
1014
1015   scnd_val = NULL;
1016
1017   /* follow_Id () for rest of inputs, determine if any of these
1018      are non-self-referencing */
1019   while (++i < n_preds) {
1020     scnd_val = get_Phi_pred(n, i);
1021     if (   (scnd_val != n)
1022         && (scnd_val != first_val)
1023 #if 1
1024         && (get_irn_op(scnd_val) != op_Bad)
1025 #endif
1026            ) {
1027       break;
1028     }
1029   }
1030
1031   /* Fold, if no multiple distinct non-self-referencing inputs */
1032   if (i >= n_preds) {
1033     n = first_val;
1034     DBG_OPT_PHI(oldn, first_val, n);
1035   } else {
1036     /* skip the remaining Ids (done in get_Phi_pred). */
1037     /* superfluous, since we walk all to propagate Block's Bads.
1038        while (++i < n_preds) get_Phi_pred(n, i);     */
1039   }
1040   return n;
1041 }
1042
1043 /**
1044  * optimize Proj(Tuple) and gigo for ProjX in Bad block
1045  */
1046 static ir_node *equivalent_node_Proj(ir_node *n)
1047 {
1048   ir_node *oldn = n;
1049
1050   ir_node *a = get_Proj_pred(n);
1051
1052   if ( get_irn_op(a) == op_Tuple) {
1053     /* Remove the Tuple/Proj combination. */
1054     if ( get_Proj_proj(n) <= get_Tuple_n_preds(a) ) {
1055       n = get_Tuple_pred(a, get_Proj_proj(n));
1056       DBG_OPT_TUPLE(oldn, a, n);
1057     } else {
1058       assert(0); /* This should not happen! */
1059       n = new_Bad();
1060     }
1061   } else if (get_irn_mode(n) == mode_X &&
1062              is_Block_dead(get_nodes_block(n))) {
1063     /* Remove dead control flow -- early gigo. */
1064     n = new_Bad();
1065   }
1066   return n;
1067 }
1068
1069 /**
1070  * Remove Id's.
1071  */
1072 static ir_node *equivalent_node_Id(ir_node *n)
1073 {
1074   ir_node *oldn = n;
1075
1076   n = follow_Id(n);
1077   DBG_OPT_ID(oldn, n);
1078   return n;
1079 }
1080
1081 /**
1082  * optimize a Mux
1083  */
1084 static ir_node *equivalent_node_Mux(ir_node *n)
1085 {
1086   ir_node *oldn = n, *sel = get_Mux_sel(n);
1087   tarval *ts = value_of(sel);
1088
1089   if (ts == get_tarval_b_true()) {
1090     n = get_Mux_true(n);
1091     DBG_OPT_ALGSIM0(oldn, n);
1092   }
1093   else if (ts == get_tarval_b_false()) {
1094     n = get_Mux_false(n);
1095     DBG_OPT_ALGSIM0(oldn, n);
1096   }
1097   else if(get_Mux_false(n) == get_Mux_true(n)) {
1098                 n = get_Mux_true(n);
1099     DBG_OPT_ALGSIM0(oldn, n);
1100   }
1101
1102   return n;
1103 }
1104
1105 /**
1106  * equivalent_node() returns a node equivalent to input n. It skips all nodes that
1107  * perform no actual computation, as, e.g., the Id nodes.  It does not create
1108  * new nodes.  It is therefore safe to free n if the node returned is not n.
1109  * If a node returns a Tuple we can not just skip it.  If the size of the
1110  * in array fits, we transform n into a tuple (e.g., Div).
1111  */
1112 ir_node *
1113 equivalent_node(ir_node *n)
1114 {
1115   if (n->op->equivalent_node)
1116     return n->op->equivalent_node(n);
1117   return n;
1118 }
1119
1120 /**
1121  * set the default equivalent node operation
1122  */
1123 static ir_op *firm_set_default_equivalent_node(ir_op *op)
1124 {
1125 #define CASE(a)                                 \
1126   case iro_##a:                                 \
1127     op->equivalent_node  = equivalent_node_##a; \
1128     break
1129
1130   switch (op->code) {
1131   CASE(Block);
1132   CASE(Jmp);
1133   CASE(Cond);
1134   CASE(Or);
1135   CASE(Add);
1136   CASE(Eor);
1137   CASE(Sub);
1138   CASE(Shl);
1139   CASE(Shr);
1140   CASE(Shrs);
1141   CASE(Rot);
1142   CASE(Not);
1143   CASE(Minus);
1144   CASE(Mul);
1145   CASE(Div);
1146   CASE(DivMod);
1147   CASE(And);
1148   CASE(Conv);
1149   CASE(Cast);
1150   CASE(Phi);
1151   CASE(Proj);
1152   CASE(Id);
1153   CASE(Mux);
1154   default:
1155     op->equivalent_node  = NULL;
1156   }
1157
1158   return op;
1159 #undef CASE
1160 }
1161
1162 /**
1163  * Do node specific optimizations of nodes predecessors.
1164  */
1165 static void
1166 optimize_preds(ir_node *n) {
1167   ir_node *a = NULL, *b = NULL;
1168
1169   /* get the operands we will work on for simple cases. */
1170   if (is_binop(n)) {
1171     a = get_binop_left(n);
1172     b = get_binop_right(n);
1173   } else if (is_unop(n)) {
1174     a = get_unop_op(n);
1175   }
1176
1177   switch (get_irn_opcode(n)) {
1178
1179   case iro_Cmp:
1180     /* We don't want Cast as input to Cmp. */
1181     if (get_irn_op(a) == op_Cast) {
1182       a = get_Cast_op(a);
1183       set_Cmp_left(n, a);
1184     }
1185     if (get_irn_op(b) == op_Cast) {
1186       b = get_Cast_op(b);
1187       set_Cmp_right(n, b);
1188     }
1189     break;
1190
1191   default: break;
1192   } /* end switch */
1193 }
1194
1195 /**
1196  * Transform AddP(P, ConvIs(Iu)), AddP(P, ConvIu(Is)) and
1197  * SubP(P, ConvIs(Iu)), SubP(P, ConvIu(Is)) if possible.
1198  */
1199 static ir_node *transform_node_AddSub(ir_node *n)
1200 {
1201   ir_mode *mode = get_irn_mode(n);
1202
1203   if (mode_is_reference(mode)) {
1204     ir_node *left  = get_binop_left(n);
1205     ir_node *right = get_binop_right(n);
1206     int ref_bits   = get_mode_size_bits(mode);
1207
1208     if (get_irn_op(left) == op_Conv) {
1209       ir_mode *mode = get_irn_mode(left);
1210       int bits      = get_mode_size_bits(mode);
1211
1212       if (ref_bits == bits &&
1213           mode_is_int(mode) &&
1214           get_mode_arithmetic(mode) == irma_twos_complement) {
1215         ir_node *pre      = get_Conv_op(left);
1216         ir_mode *pre_mode = get_irn_mode(pre);
1217
1218         if (mode_is_int(pre_mode) &&
1219             get_mode_size_bits(pre_mode) == bits &&
1220             get_mode_arithmetic(pre_mode) == irma_twos_complement) {
1221           /* ok, this conv just changes to sign, moreover the calculation
1222            * is done with same number of bits as our address mode, so
1223            * we can ignore the conv as address calculation can be viewed
1224            * as either signed or unsigned
1225            */
1226           set_binop_left(n, pre);
1227         }
1228       }
1229     }
1230
1231     if (get_irn_op(right) == op_Conv) {
1232       ir_mode *mode = get_irn_mode(right);
1233       int bits      = get_mode_size_bits(mode);
1234
1235       if (ref_bits == bits &&
1236           mode_is_int(mode) &&
1237           get_mode_arithmetic(mode) == irma_twos_complement) {
1238         ir_node *pre      = get_Conv_op(right);
1239         ir_mode *pre_mode = get_irn_mode(pre);
1240
1241         if (mode_is_int(pre_mode) &&
1242             get_mode_size_bits(pre_mode) == bits &&
1243             get_mode_arithmetic(pre_mode) == irma_twos_complement) {
1244           /* ok, this conv just changes to sign, moreover the calculation
1245            * is done with same number of bits as our address mode, so
1246            * we can ignore the conv as address calculation can be viewed
1247            * as either signed or unsigned
1248            */
1249           set_binop_right(n, pre);
1250         }
1251       }
1252     }
1253   }
1254   return n;
1255 }
1256
1257 #define transform_node_Add      transform_node_AddSub
1258
1259 /**
1260  * Do the AddSub optimization, then Transform Sub(0,a) into Minus(a).
1261  */
1262 static ir_node *transform_node_Sub(ir_node *n)
1263 {
1264   ir_mode *mode;
1265   ir_node *oldn = n;
1266
1267   n = transform_node_AddSub(n);
1268
1269   mode = get_irn_mode(n);
1270   if (mode_is_num(mode)) {
1271     if (classify_Const(get_Sub_left(n)) == CNST_NULL) {
1272       n = new_rd_Minus(
1273             get_irn_dbg_info(n),
1274             current_ir_graph,
1275             get_nodes_block(n),
1276             get_Sub_right(n),
1277             mode);
1278       DBG_OPT_ALGSIM0(oldn, n);
1279     }
1280   }
1281
1282   return n;
1283 }
1284
1285 /** Do architecture dependend optimizations on Mul nodes */
1286 static ir_node *transform_node_Mul(ir_node *n) {
1287   return arch_dep_replace_mul_with_shifts(n);
1288 }
1289
1290 static ir_node *transform_node_Div(ir_node *n)
1291 {
1292   tarval *tv = value_of(n);
1293   ir_node *value = n;
1294
1295   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1296
1297   if (tv != tarval_bad) {
1298     value = new_Const(get_tarval_mode(tv), tv);
1299
1300     DBG_OPT_CSTEVAL(n, value);
1301   }
1302   else /* Try architecture dependand optimization */
1303     value = arch_dep_replace_div_by_const(n);
1304
1305   if (value != n) {
1306     /* Turn Div into a tuple (mem, bad, value) */
1307     ir_node *mem = get_Div_mem(n);
1308
1309     turn_into_tuple(n, 3);
1310     set_Tuple_pred(n, pn_Div_M, mem);
1311     set_Tuple_pred(n, pn_Div_X_except, new_Bad());
1312     set_Tuple_pred(n, pn_Div_res, value);
1313   }
1314   return n;
1315 }
1316
1317 static ir_node *transform_node_Mod(ir_node *n)
1318 {
1319   tarval *tv = value_of(n);
1320   ir_node *value = n;
1321
1322   /* BEWARE: it is NOT possible to optimize a%a to 0, as this may cause a exception */
1323
1324   if (tv != tarval_bad) {
1325     value = new_Const(get_tarval_mode(tv), tv);
1326
1327     DBG_OPT_CSTEVAL(n, value);
1328   }
1329   else /* Try architecture dependand optimization */
1330     value = arch_dep_replace_mod_by_const(n);
1331
1332   if (value != n) {
1333     /* Turn Mod into a tuple (mem, bad, value) */
1334     ir_node *mem = get_Mod_mem(n);
1335
1336     turn_into_tuple(n, 3);
1337     set_Tuple_pred(n, pn_Mod_M, mem);
1338     set_Tuple_pred(n, pn_Mod_X_except, new_Bad());
1339     set_Tuple_pred(n, pn_Mod_res, value);
1340   }
1341   return n;
1342 }
1343
1344 static ir_node *transform_node_DivMod(ir_node *n)
1345 {
1346   int evaluated = 0;
1347
1348   ir_node *a = get_DivMod_left(n);
1349   ir_node *b = get_DivMod_right(n);
1350   ir_mode *mode = get_irn_mode(a);
1351   tarval *ta = value_of(a);
1352   tarval *tb = value_of(b);
1353
1354   if (!(mode_is_int(mode) && mode_is_int(get_irn_mode(b))))
1355     return n;
1356
1357   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1358
1359   if (tb != tarval_bad) {
1360     if (tb == get_mode_one(get_tarval_mode(tb))) {
1361       b = new_Const (mode, get_mode_null(mode));
1362       evaluated = 1;
1363
1364       DBG_OPT_CSTEVAL(n, b);
1365     }
1366     else if (ta != tarval_bad) {
1367       tarval *resa, *resb;
1368       resa = tarval_div (ta, tb);
1369       if (resa == tarval_bad) return n; /* Causes exception!!! Model by replacing through
1370                                         Jmp for X result!? */
1371       resb = tarval_mod (ta, tb);
1372       if (resb == tarval_bad) return n; /* Causes exception! */
1373       a = new_Const (mode, resa);
1374       b = new_Const (mode, resb);
1375       evaluated = 1;
1376
1377       DBG_OPT_CSTEVAL(n, a);
1378       DBG_OPT_CSTEVAL(n, b);
1379     }
1380     else { /* Try architecture dependand optimization */
1381       arch_dep_replace_divmod_by_const(&a, &b, n);
1382       evaluated = a != NULL;
1383     }
1384   } else if (ta == get_mode_null(mode)) {
1385     /* 0 / non-Const = 0 */
1386     b = a;
1387     evaluated = 1;
1388   }
1389
1390   if (evaluated) { /* replace by tuple */
1391     ir_node *mem = get_DivMod_mem(n);
1392     turn_into_tuple(n, 4);
1393     set_Tuple_pred(n, pn_DivMod_M,        mem);
1394     set_Tuple_pred(n, pn_DivMod_X_except, new_Bad());  /* no exception */
1395     set_Tuple_pred(n, pn_DivMod_res_div,  a);
1396     set_Tuple_pred(n, pn_DivMod_res_mod,  b);
1397     assert(get_nodes_block(n));
1398   }
1399
1400   return n;
1401 }
1402
1403 static ir_node *transform_node_Cond(ir_node *n)
1404 {
1405   /* Replace the Cond by a Jmp if it branches on a constant
1406      condition. */
1407   ir_node *jmp;
1408   ir_node *a = get_Cond_selector(n);
1409   tarval *ta = value_of(a);
1410
1411   if ((ta != tarval_bad) &&
1412       (get_irn_mode(a) == mode_b) &&
1413       (get_opt_unreachable_code())) {
1414     /* It's a boolean Cond, branching on a boolean constant.
1415                Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */
1416     jmp = new_r_Jmp(current_ir_graph, get_nodes_block(n));
1417     turn_into_tuple(n, 2);
1418     if (ta == tarval_b_true) {
1419       set_Tuple_pred(n, pn_Cond_false, new_Bad());
1420       set_Tuple_pred(n, pn_Cond_true, jmp);
1421     } else {
1422       set_Tuple_pred(n, pn_Cond_false, jmp);
1423       set_Tuple_pred(n, pn_Cond_true, new_Bad());
1424     }
1425     /* We might generate an endless loop, so keep it alive. */
1426     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1427   } else if ((ta != tarval_bad) &&
1428              (get_irn_mode(a) == mode_Iu) &&
1429              (get_Cond_kind(n) == dense) &&
1430              (get_opt_unreachable_code())) {
1431     /* I don't want to allow Tuples smaller than the biggest Proj.
1432        Also this tuple might get really big...
1433        I generate the Jmp here, and remember it in link.  Link is used
1434        when optimizing Proj. */
1435     set_irn_link(n, new_r_Jmp(current_ir_graph, get_nodes_block(n)));
1436     /* We might generate an endless loop, so keep it alive. */
1437     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1438   } else if ((get_irn_op(a) == op_Eor)
1439              && (get_irn_mode(a) == mode_b)
1440              && (classify_tarval(value_of(get_Eor_right(a))) == TV_CLASSIFY_ONE)) {
1441     /* The Eor is a negate.  Generate a new Cond without the negate,
1442        simulate the negate by exchanging the results. */
1443     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1444                                get_Eor_left(a)));
1445   } else if ((get_irn_op(a) == op_Not)
1446              && (get_irn_mode(a) == mode_b)) {
1447     /* A Not before the Cond.  Generate a new Cond without the Not,
1448        simulate the Not by exchanging the results. */
1449     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1450                                get_Not_op(a)));
1451   }
1452   return n;
1453 }
1454
1455 /**
1456  * Transform an Eor.
1457  */
1458 static ir_node *transform_node_Eor(ir_node *n)
1459 {
1460   ir_node *oldn = n;
1461   ir_node *a = get_Eor_left(n);
1462   ir_node *b = get_Eor_right(n);
1463
1464   if ((get_irn_mode(n) == mode_b)
1465       && (get_irn_op(a) == op_Proj)
1466       && (get_irn_mode(a) == mode_b)
1467       && (classify_tarval (value_of(b)) == TV_CLASSIFY_ONE)
1468       && (get_irn_op(get_Proj_pred(a)) == op_Cmp)) {
1469     /* The Eor negates a Cmp. The Cmp has the negated result anyways! */
1470     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1471                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1472
1473     DBG_OPT_ALGSIM0(oldn, n);
1474   }
1475   else if ((get_irn_mode(n) == mode_b)
1476         && (classify_tarval (value_of(b)) == TV_CLASSIFY_ONE)) {
1477     /* The Eor is a Not. Replace it by a Not. */
1478     /*   ????!!!Extend to bitfield 1111111. */
1479     n = new_r_Not(current_ir_graph, get_nodes_block(n), a, mode_b);
1480
1481     DBG_OPT_ALGSIM0(oldn, n);
1482   }
1483
1484   return n;
1485 }
1486
1487 /**
1488  * Transform a boolean Not.
1489  */
1490 static ir_node *transform_node_Not(ir_node *n)
1491 {
1492   ir_node *oldn = n;
1493   ir_node *a = get_Not_op(n);
1494
1495   if (   (get_irn_mode(n) == mode_b)
1496       && (get_irn_op(a) == op_Proj)
1497       && (get_irn_mode(a) == mode_b)
1498       && (get_irn_op(get_Proj_pred(a)) == op_Cmp)) {
1499     /* We negate a Cmp. The Cmp has the negated result anyways! */
1500     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1501                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1502     DBG_OPT_ALGSIM0(oldn, n);
1503   }
1504
1505   return n;
1506 }
1507
1508 /**
1509  * Transform a Cast of a Const into a new Const
1510  */
1511 static ir_node *transform_node_Cast(ir_node *n) {
1512   ir_node *oldn = n;
1513   ir_node *pred = get_Cast_op(n);
1514   type *tp = get_irn_type(pred);
1515
1516   if (get_irn_op(pred) == op_Const && get_Const_type(pred) != tp) {
1517     n = new_rd_Const_type(NULL, current_ir_graph, get_nodes_block(pred), get_irn_mode(pred),
1518               get_Const_tarval(pred), tp);
1519     DBG_OPT_CSTEVAL(oldn, n);
1520   } else if ((get_irn_op(pred) == op_SymConst) && (get_SymConst_value_type(pred) != tp)) {
1521     n = new_rd_SymConst_type(NULL, current_ir_graph, get_nodes_block(pred), get_SymConst_symbol(pred),
1522                  get_SymConst_kind(pred), tp);
1523     DBG_OPT_CSTEVAL(oldn, n);
1524   }
1525   return n;
1526 }
1527
1528 /**
1529  * Transform a Div/Mod/DivMod with a non-zero constant. Must be
1530  * done here instead of equivalent node because it creates new
1531  * nodes.
1532  * Removes the exceptions and routes the memory to the NoMem node.
1533  *
1534  * Further, it optimizes jump tables by removing all impossible cases.
1535  */
1536 static ir_node *transform_node_Proj(ir_node *proj)
1537 {
1538   ir_node *n = get_Proj_pred(proj);
1539   ir_node *b;
1540   tarval *tb;
1541   long proj_nr;
1542
1543   switch (get_irn_opcode(n)) {
1544   case iro_Div:
1545     b  = get_Div_right(n);
1546     tb = value_of(b);
1547
1548     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* div(x, c) && c != 0 */
1549       proj_nr = get_Proj_proj(proj);
1550
1551       /* this node may float */
1552       set_irn_pinned(n, op_pin_state_floats);
1553
1554       if (proj_nr == pn_Div_X_except) {
1555         /* we found an exception handler, remove it */
1556         return new_Bad();
1557       } else {
1558         /* the memory Proj can be removed */
1559         ir_node *res = get_Div_mem(n);
1560         set_Div_mem(n, get_irg_no_mem(current_ir_graph));
1561         if (proj_nr == pn_Div_M)
1562           return res;
1563       }
1564     }
1565     break;
1566   case iro_Mod:
1567     b  = get_Mod_right(n);
1568     tb = value_of(b);
1569
1570     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* mod(x, c) && c != 0 */
1571       proj_nr = get_Proj_proj(proj);
1572
1573       /* this node may float */
1574       set_irn_pinned(n, op_pin_state_floats);
1575
1576       if (proj_nr == pn_Mod_X_except) {
1577         /* we found an exception handler, remove it */
1578         return new_Bad();
1579       } else {
1580         /* the memory Proj can be removed */
1581         ir_node *res = get_Mod_mem(n);
1582         set_Mod_mem(n, get_irg_no_mem(current_ir_graph));
1583         if (proj_nr == pn_Mod_M)
1584           return res;
1585       }
1586     }
1587     break;
1588   case iro_DivMod:
1589     b  = get_DivMod_right(n);
1590     tb = value_of(b);
1591
1592     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* DivMod(x, c) && c != 0 */
1593       proj_nr = get_Proj_proj(proj);
1594
1595       /* this node may float */
1596       set_irn_pinned(n, op_pin_state_floats);
1597
1598       if (proj_nr == pn_DivMod_X_except) {
1599         /* we found an exception handler, remove it */
1600         return new_Bad();
1601       }
1602       else {
1603         /* the memory Proj can be removed */
1604         ir_node *res = get_DivMod_mem(n);
1605         set_DivMod_mem(n, get_irg_no_mem(current_ir_graph));
1606         if (proj_nr == pn_DivMod_M)
1607           return res;
1608       }
1609     }
1610     break;
1611
1612   case iro_Cond:
1613     if (get_opt_unreachable_code()) {
1614       b = get_Cond_selector(n);
1615       tb = value_of(b);
1616
1617       if (tb != tarval_bad && mode_is_int(get_tarval_mode(tb))) {
1618         /* we have a constant switch */
1619         long num = get_Proj_proj(proj);
1620
1621         if (num != get_Cond_defaultProj(n)) { /* we cannot optimize default Proj's yet */
1622           if (get_tarval_long(tb) == num) {
1623             /* Do NOT create a jump here, or we will have 2 control flow ops
1624              * in a block. This case is optimized away in optimize_cf(). */
1625             return proj;
1626           }
1627           else
1628             return new_Bad();
1629         }
1630       }
1631     }
1632     return proj;
1633
1634   case iro_Tuple:
1635     /* should not happen, but if it does will be optimized away */
1636     break;
1637
1638   default:
1639     /* do nothing */
1640     return proj;
1641   }
1642
1643   /* we have added a Tuple, optimize it for the current Proj away */
1644   return equivalent_node_Proj(proj);
1645 }
1646
1647 /**
1648  * returns the operands of a commutative bin-op, if one operand is
1649  * a const, it is returned as the second one.
1650  */
1651 static void get_comm_Binop_Ops(ir_node *binop, ir_node **a, ir_node **c)
1652 {
1653   ir_node *op_a = get_binop_left(binop);
1654   ir_node *op_b = get_binop_right(binop);
1655
1656   assert(is_op_commutative(get_irn_op(binop)));
1657
1658   if (get_irn_op(op_a) == op_Const) {
1659     *a = op_b;
1660     *c = op_a;
1661   }
1662   else {
1663     *a = op_a;
1664     *c = op_b;
1665   }
1666 }
1667
1668 /**
1669  * Optimize a Or(And(Or(And(v,c4),c3),c2),c1) pattern if possible.
1670  * Such pattern may arise in bitfield stores.
1671  *
1672  * value  c4                  value      c4 & c2
1673  *    AND     c3                    AND           c1 | c3
1674  *        OR     c2      ===>               OR
1675  *           AND    c1
1676  *               OR
1677  */
1678 static ir_node *transform_node_Or_bf_store(ir_node *or)
1679 {
1680   ir_node *and, *c1;
1681   ir_node *or_l, *c2;
1682   ir_node *and_l, *c3;
1683   ir_node *value, *c4;
1684   ir_node *new_and, *new_const, *block;
1685   ir_mode *mode = get_irn_mode(or);
1686
1687   tarval *tv1, *tv2, *tv3, *tv4, *tv, *n_tv4, *n_tv2;
1688
1689   get_comm_Binop_Ops(or, &and, &c1);
1690   if ((get_irn_op(c1) != op_Const) || (get_irn_op(and) != op_And))
1691     return or;
1692
1693   get_comm_Binop_Ops(and, &or_l, &c2);
1694   if ((get_irn_op(c2) != op_Const) || (get_irn_op(or_l) != op_Or))
1695     return or;
1696
1697   get_comm_Binop_Ops(or_l, &and_l, &c3);
1698   if ((get_irn_op(c3) != op_Const) || (get_irn_op(and_l) != op_And))
1699     return or;
1700
1701   get_comm_Binop_Ops(and_l, &value, &c4);
1702   if (get_irn_op(c4) != op_Const)
1703     return or;
1704
1705   /* ok, found the pattern, check for conditions */
1706   assert(mode == get_irn_mode(and));
1707   assert(mode == get_irn_mode(or_l));
1708   assert(mode == get_irn_mode(and_l));
1709
1710   tv1 = get_Const_tarval(c1);
1711   tv2 = get_Const_tarval(c2);
1712   tv3 = get_Const_tarval(c3);
1713   tv4 = get_Const_tarval(c4);
1714
1715   tv = tarval_or(tv4, tv2);
1716   if (classify_tarval(tv) != TV_CLASSIFY_ALL_ONE) {
1717     /* have at least one 0 at the same bit position */
1718     return or;
1719   }
1720
1721   n_tv4 = tarval_not(tv4);
1722   if (tv3 != tarval_and(tv3, n_tv4)) {
1723     /* bit in the or_mask is outside the and_mask */
1724     return or;
1725   }
1726
1727   n_tv2 = tarval_not(tv2);
1728   if (tv1 != tarval_and(tv1, n_tv2)) {
1729     /* bit in the or_mask is outside the and_mask */
1730     return or;
1731   }
1732
1733   /* ok, all conditions met */
1734   block = get_nodes_block(or);
1735
1736   new_and = new_r_And(current_ir_graph, block,
1737       value, new_r_Const(current_ir_graph, block, mode, tarval_and(tv4, tv2)), mode);
1738
1739   new_const = new_r_Const(current_ir_graph, block, mode, tarval_or(tv3, tv1));
1740
1741   set_Or_left(or, new_and);
1742   set_Or_right(or, new_const);
1743
1744   /* check for more */
1745   return transform_node_Or_bf_store(or);
1746 }
1747
1748 /**
1749  * Optimize an Or(shl(x, c), shr(x, bits - c)) into a Rot
1750  */
1751 static ir_node *transform_node_Or_Rot(ir_node *or)
1752 {
1753   ir_mode *mode = get_irn_mode(or);
1754   ir_node *shl, *shr, *block;
1755   ir_node *irn, *x, *c1, *c2, *v, *sub, *n;
1756   tarval *tv1, *tv2;
1757
1758   if (! mode_is_int(mode))
1759     return or;
1760
1761   shl = get_binop_left(or);
1762   shr = get_binop_right(or);
1763
1764   if (get_irn_op(shl) == op_Shr) {
1765     if (get_irn_op(shr) != op_Shl)
1766       return or;
1767
1768     irn = shl;
1769     shl = shr;
1770     shr = irn;
1771   }
1772   else if (get_irn_op(shl) != op_Shl)
1773     return or;
1774   else if (get_irn_op(shr) != op_Shr)
1775     return or;
1776
1777   x = get_Shl_left(shl);
1778   if (x != get_Shr_left(shr))
1779     return or;
1780
1781   c1 = get_Shl_right(shl);
1782   c2 = get_Shr_right(shr);
1783   if (get_irn_op(c1) == op_Const && get_irn_op(c2) == op_Const) {
1784     tv1 = get_Const_tarval(c1);
1785     if (! tarval_is_long(tv1))
1786       return or;
1787
1788     tv2 = get_Const_tarval(c2);
1789     if (! tarval_is_long(tv2))
1790       return or;
1791
1792     if (get_tarval_long(tv1) + get_tarval_long(tv2)
1793         != get_mode_size_bits(mode))
1794       return or;
1795
1796     /* yet, condition met */
1797     block = get_nodes_block(or);
1798
1799     n = new_r_Rot(current_ir_graph, block, x, c1, mode);
1800
1801     DBG_OPT_ALGSIM1(or, shl, shr, n);
1802     return n;
1803   }
1804   else if (get_irn_op(c1) == op_Sub) {
1805     v   = c2;
1806     sub = c1;
1807
1808     if (get_Sub_right(sub) != v)
1809       return or;
1810
1811     c1 = get_Sub_left(sub);
1812     if (get_irn_op(c1) != op_Const)
1813       return or;
1814
1815     tv1 = get_Const_tarval(c1);
1816     if (! tarval_is_long(tv1))
1817       return or;
1818
1819     if (get_tarval_long(tv1) != get_mode_size_bits(mode))
1820       return or;
1821
1822     /* yet, condition met */
1823     block = get_nodes_block(or);
1824
1825     /* a Rot right is not supported, so use a rot left */
1826     n =  new_r_Rot(current_ir_graph, block, x, sub, mode);
1827
1828     DBG_OPT_ALGSIM0(or, n);
1829     return n;
1830   }
1831   else if (get_irn_op(c2) == op_Sub) {
1832     v   = c1;
1833     sub = c2;
1834
1835     c1 = get_Sub_left(sub);
1836     if (get_irn_op(c1) != op_Const)
1837       return or;
1838
1839     tv1 = get_Const_tarval(c1);
1840     if (! tarval_is_long(tv1))
1841       return or;
1842
1843     if (get_tarval_long(tv1) != get_mode_size_bits(mode))
1844       return or;
1845
1846     /* yet, condition met */
1847     block = get_nodes_block(or);
1848
1849     /* a Rot Left */
1850     n = new_r_Rot(current_ir_graph, block, x, v, mode);
1851
1852     DBG_OPT_ALGSIM0(or, n);
1853     return n;
1854   }
1855
1856   return or;
1857 }
1858
1859 /**
1860  * Optimize an Or
1861  */
1862 static ir_node *transform_node_Or(ir_node *or)
1863 {
1864   or = transform_node_Or_bf_store(or);
1865   or = transform_node_Or_Rot(or);
1866
1867   return or;
1868 }
1869
1870 /* forward */
1871 static ir_node *transform_node(ir_node *n);
1872
1873 /**
1874  * Optimize (a >> c1) >> c2), works for Shr, Shrs, Shl
1875  */
1876 static ir_node * transform_node_shift(ir_node *n)
1877 {
1878   ir_node *left, *right;
1879   tarval *tv1, *tv2, *res;
1880   ir_mode *mode;
1881   int modulo_shf, flag;
1882
1883   left = get_binop_left(n);
1884
1885   /* different operations */
1886   if (get_irn_op(left) != get_irn_op(n))
1887     return n;
1888
1889   right = get_binop_right(n);
1890   tv1 = value_of(right);
1891   if (tv1 == tarval_bad)
1892     return n;
1893
1894   tv2 = value_of(get_binop_right(left));
1895   if (tv2 == tarval_bad)
1896     return n;
1897
1898   res = tarval_add(tv1, tv2);
1899
1900   /* beware: a simple replacement works only, if res < modulo shift */
1901   mode = get_irn_mode(n);
1902
1903   flag = 0;
1904
1905   modulo_shf = get_mode_modulo_shift(mode);
1906   if (modulo_shf > 0) {
1907     tarval *modulo = new_tarval_from_long(modulo_shf, get_tarval_mode(res));
1908
1909     if (tarval_cmp(res, modulo) & pn_Cmp_Lt)
1910       flag = 1;
1911   }
1912   else
1913     flag = 1;
1914
1915   if (flag) {
1916     /* ok, we can replace it */
1917     ir_node *in[2], *irn, *block = get_nodes_block(n);
1918
1919     in[0] = get_binop_left(left);
1920     in[1] = new_r_Const(current_ir_graph, block, get_tarval_mode(res), res);
1921
1922     irn = new_ir_node(NULL, current_ir_graph, block, get_irn_op(n), mode, 2, in);
1923
1924     DBG_OPT_ALGSIM0(n, irn);
1925
1926     return transform_node(irn);
1927   }
1928   return n;
1929 }
1930
1931 static ir_node * transform_node_End(ir_node *n) {
1932   int i, n_keepalives = get_End_n_keepalives(n);
1933
1934   /* Remove dead blocks in keepalive list.
1935      We do not generate a new End node. */
1936   for (i = 0; i < n_keepalives; ++i) {
1937     ir_node *ka = get_End_keepalive(n, i);
1938     if (is_Block(ka) && is_Block_dead(ka))
1939       set_End_keepalive(n, i, new_Bad());
1940   }
1941   return n;
1942 }
1943
1944
1945 /**
1946  * Tries several [inplace] [optimizing] transformations and returns an
1947  * equivalent node.  The difference to equivalent_node() is that these
1948  * transformations _do_ generate new nodes, and thus the old node must
1949  * not be freed even if the equivalent node isn't the old one.
1950  */
1951 static ir_node *transform_node(ir_node *n)
1952 {
1953   if (n->op->transform_node)
1954     n = n->op->transform_node(n);
1955   return n;
1956 }
1957
1958 /**
1959  * set the default transform node operation
1960  */
1961 static ir_op *firm_set_default_transform_node(ir_op *op)
1962 {
1963 #define CASE(a)                                 \
1964   case iro_##a:                                 \
1965     op->transform_node  = transform_node_##a;   \
1966     break
1967
1968   switch (op->code) {
1969   CASE(Add);
1970   CASE(Sub);
1971   CASE(Mul);
1972   CASE(Div);
1973   CASE(Mod);
1974   CASE(DivMod);
1975   CASE(Cond);
1976   CASE(Eor);
1977   CASE(Not);
1978   CASE(Cast);
1979   CASE(Proj);
1980   CASE(Or);
1981   CASE(End);
1982   case iro_Shr:
1983   case iro_Shrs:
1984   case iro_Shl:
1985     op->transform_node  = transform_node_shift;
1986     break;
1987   default:
1988     op->transform_node  = NULL;
1989   }
1990
1991   return op;
1992 #undef CASE
1993 }
1994
1995
1996 /* **************** Common Subexpression Elimination **************** */
1997
1998 /** The size of the hash table used, should estimate the number of nodes
1999     in a graph. */
2000 #define N_IR_NODES 512
2001
2002 /** Compares the attributes of two Const nodes. */
2003 static int node_cmp_attr_Const(ir_node *a, ir_node *b)
2004 {
2005   return (get_Const_tarval(a) != get_Const_tarval(b))
2006       || (get_Const_type(a) != get_Const_type(b));
2007 }
2008
2009 /** Compares the attributes of two Proj nodes. */
2010 static int node_cmp_attr_Proj(ir_node *a, ir_node *b)
2011 {
2012     return get_irn_proj_attr (a) != get_irn_proj_attr (b);
2013 }
2014
2015 /** Compares the attributes of two Filter nodes. */
2016 static int node_cmp_attr_Filter(ir_node *a, ir_node *b)
2017 {
2018     return get_Filter_proj(a) != get_Filter_proj(b);
2019 }
2020
2021 /** Compares the attributes of two Alloc nodes. */
2022 static int node_cmp_attr_Alloc(ir_node *a, ir_node *b)
2023 {
2024     return (get_irn_alloc_attr(a).where != get_irn_alloc_attr(b).where)
2025         || (get_irn_alloc_attr(a).type != get_irn_alloc_attr(b).type);
2026 }
2027
2028 /** Compares the attributes of two Free nodes. */
2029 static int node_cmp_attr_Free(ir_node *a, ir_node *b)
2030 {
2031     return (get_irn_free_attr(a).where != get_irn_free_attr(b).where)
2032         || (get_irn_free_attr(a).type != get_irn_free_attr(b).type);
2033 }
2034
2035 /** Compares the attributes of two SymConst nodes. */
2036 static int node_cmp_attr_SymConst(ir_node *a, ir_node *b)
2037 {
2038     return (get_irn_symconst_attr(a).num != get_irn_symconst_attr(b).num)
2039       || (get_irn_symconst_attr(a).sym.type_p != get_irn_symconst_attr(b).sym.type_p)
2040       || (get_irn_symconst_attr(a).tp != get_irn_symconst_attr(b).tp);
2041 }
2042
2043 /** Compares the attributes of two Call nodes. */
2044 static int node_cmp_attr_Call(ir_node *a, ir_node *b)
2045 {
2046     return (get_irn_call_attr(a) != get_irn_call_attr(b));
2047 }
2048
2049 /** Compares the attributes of two Sel nodes. */
2050 static int node_cmp_attr_Sel(ir_node *a, ir_node *b)
2051 {
2052     return (get_irn_sel_attr(a).ent->kind  != get_irn_sel_attr(b).ent->kind)
2053       || (get_irn_sel_attr(a).ent->name    != get_irn_sel_attr(b).ent->name)
2054       || (get_irn_sel_attr(a).ent->owner   != get_irn_sel_attr(b).ent->owner)
2055       || (get_irn_sel_attr(a).ent->ld_name != get_irn_sel_attr(b).ent->ld_name)
2056       || (get_irn_sel_attr(a).ent->type    != get_irn_sel_attr(b).ent->type);
2057 }
2058
2059 /** Compares the attributes of two Phi nodes. */
2060 static int node_cmp_attr_Phi(ir_node *a, ir_node *b)
2061 {
2062     return get_irn_phi_attr (a) != get_irn_phi_attr (b);
2063 }
2064
2065 /** Compares the attributes of two Cast nodes. */
2066 static int node_cmp_attr_Cast(ir_node *a, ir_node *b)
2067 {
2068     return get_Cast_type(a) != get_Cast_type(b);
2069 }
2070
2071 /** Compares the attributes of two Load nodes. */
2072 static int node_cmp_attr_Load(ir_node *a, ir_node *b)
2073 {
2074   if (get_Load_volatility(a) == volatility_is_volatile ||
2075       get_Load_volatility(b) == volatility_is_volatile)
2076     /* NEVER do CSE on volatile Loads */
2077     return 1;
2078
2079   return get_Load_mode(a) != get_Load_mode(b);
2080 }
2081
2082 /** Compares the attributes of two Store nodes. */
2083 static int node_cmp_attr_Store(ir_node *a, ir_node *b)
2084 {
2085   /* NEVER do CSE on volatile Stores */
2086   return (get_Store_volatility(a) == volatility_is_volatile ||
2087       get_Store_volatility(b) == volatility_is_volatile);
2088 }
2089
2090 /**
2091  * set the default node attribute compare operation
2092  */
2093 static ir_op *firm_set_default_node_cmp_attr(ir_op *op)
2094 {
2095 #define CASE(a)                             \
2096   case iro_##a:                             \
2097     op->node_cmp_attr  = node_cmp_attr_##a; \
2098     break
2099
2100   switch (op->code) {
2101   CASE(Const);
2102   CASE(Proj);
2103   CASE(Filter);
2104   CASE(Alloc);
2105   CASE(Free);
2106   CASE(SymConst);
2107   CASE(Call);
2108   CASE(Sel);
2109   CASE(Phi);
2110   CASE(Cast);
2111   CASE(Load);
2112   CASE(Store);
2113   default:
2114     op->node_cmp_attr  = NULL;
2115   }
2116
2117   return op;
2118 #undef CASE
2119 }
2120
2121 /**
2122  * Compare function for two nodes in the hash table. Gets two
2123  * nodes as parameters.  Returns 0 if the nodes are a cse.
2124  */
2125 static int
2126 vt_cmp (const void *elt, const void *key)
2127 {
2128   ir_node *a, *b;
2129   int i, irn_arity_a;
2130
2131   a = (void *)elt;
2132   b = (void *)key;
2133
2134   if (a == b) return 0;
2135
2136   if ((get_irn_op(a) != get_irn_op(b)) ||
2137       (get_irn_mode(a) != get_irn_mode(b))) return 1;
2138
2139   /* compare if a's in and b's in are of equal length */
2140   irn_arity_a = get_irn_intra_arity (a);
2141   if (irn_arity_a != get_irn_intra_arity(b))
2142     return 1;
2143
2144   /* for block-local cse and op_pin_state_pinned nodes: */
2145   if (!get_opt_global_cse() || (get_irn_pinned(a) == op_pin_state_pinned)) {
2146     if (get_irn_intra_n(a, -1) != get_irn_intra_n(b, -1))
2147       return 1;
2148   }
2149
2150   /* compare a->in[0..ins] with b->in[0..ins] */
2151   for (i = 0; i < irn_arity_a; i++)
2152     if (get_irn_intra_n(a, i) != get_irn_intra_n(b, i))
2153       return 1;
2154
2155   /*
2156    * here, we already now that the nodes are identical except their
2157    * attributes
2158    */
2159   if (a->op->node_cmp_attr)
2160     return a->op->node_cmp_attr(a, b);
2161
2162   return 0;
2163 }
2164
2165 /*
2166  * Calculate a hash value of a node.
2167  */
2168 unsigned
2169 ir_node_hash (ir_node *node)
2170 {
2171   unsigned h;
2172   int i, irn_arity;
2173
2174   if (node->op == op_Const) {
2175     /* special value for const, as they only differ in their tarval. */
2176     h = HASH_PTR(node->attr.con.tv);
2177     h = 9*h + HASH_PTR(get_irn_mode(node));
2178   } else if (node->op == op_SymConst) {
2179     /* special value for const, as they only differ in their symbol. */
2180     h = HASH_PTR(node->attr.i.sym.type_p);
2181     h = 9*h + HASH_PTR(get_irn_mode(node));
2182   } else {
2183
2184     /* hash table value = 9*(9*(9*(9*(9*arity+in[0])+in[1])+ ...)+mode)+code */
2185     h = irn_arity = get_irn_intra_arity(node);
2186
2187     /* consider all in nodes... except the block if not a control flow. */
2188     for (i =  is_cfop(node) ? -1 : 0;  i < irn_arity;  i++) {
2189       h = 9*h + HASH_PTR(get_irn_intra_n(node, i));
2190     }
2191
2192     /* ...mode,... */
2193     h = 9*h + HASH_PTR(get_irn_mode(node));
2194     /* ...and code */
2195     h = 9*h + HASH_PTR(get_irn_op(node));
2196   }
2197
2198   return h;
2199 }
2200
2201 pset *
2202 new_identities(void) {
2203   return new_pset(vt_cmp, N_IR_NODES);
2204 }
2205
2206 void
2207 del_identities(pset *value_table) {
2208   del_pset(value_table);
2209 }
2210
2211 /**
2212  * Return the canonical node computing the same value as n.
2213  * Looks up the node in a hash table.
2214  *
2215  * For Const nodes this is performed in the constructor, too.  Const
2216  * nodes are extremely time critical because of their frequent use in
2217  * constant string arrays.
2218  */
2219 static INLINE ir_node *
2220 identify (pset *value_table, ir_node *n)
2221 {
2222   ir_node *o = NULL;
2223
2224   if (!value_table) return n;
2225
2226   if (get_opt_reassociation()) {
2227     if (is_op_commutative(get_irn_op(n))) {
2228       ir_node *l = get_binop_left(n);
2229       ir_node *r = get_binop_right(n);
2230
2231       /* for commutative operators perform  a OP b == b OP a */
2232       if (l > r) {
2233         set_binop_left(n, r);
2234         set_binop_right(n, l);
2235       }
2236     }
2237   }
2238
2239   o = pset_find (value_table, n, ir_node_hash (n));
2240   if (!o) return n;
2241
2242   DBG_OPT_CSE(n, o);
2243
2244   return o;
2245 }
2246
2247 /**
2248  * During construction we set the op_pin_state_pinned flag in the graph right when the
2249  * optimization is performed.  The flag turning on procedure global cse could
2250  * be changed between two allocations.  This way we are safe.
2251  */
2252 static INLINE ir_node *
2253 identify_cons (pset *value_table, ir_node *n) {
2254   ir_node *old = n;
2255
2256   n = identify(value_table, n);
2257   if (get_irn_n(old, -1) != get_irn_n(n, -1))
2258     set_irg_pinned(current_ir_graph, op_pin_state_floats);
2259   return n;
2260 }
2261
2262 /**
2263  * Return the canonical node computing the same value as n.
2264  * Looks up the node in a hash table, enters it in the table
2265  * if it isn't there yet.
2266  */
2267 static ir_node *
2268 identify_remember (pset *value_table, ir_node *n)
2269 {
2270   ir_node *o = NULL;
2271
2272   if (!value_table) return n;
2273
2274   if (get_opt_reassociation()) {
2275     if (is_op_commutative(get_irn_op(n))) {
2276       ir_node *l = get_binop_left(n);
2277       ir_node *r = get_binop_right(n);
2278
2279       /* for commutative operators perform  a OP b == b OP a */
2280       if (l > r) {
2281         set_binop_left(n, r);
2282         set_binop_right(n, l);
2283       }
2284     }
2285   }
2286
2287   /* lookup or insert in hash table with given hash key. */
2288   o = pset_insert (value_table, n, ir_node_hash (n));
2289
2290   if (o != n) {
2291     DBG_OPT_CSE(n, o);
2292   }
2293
2294   return o;
2295 }
2296
2297 void
2298 add_identities (pset *value_table, ir_node *node) {
2299   if (get_opt_cse() && (get_irn_opcode(node) != iro_Block))
2300     identify_remember (value_table, node);
2301 }
2302
2303 /**
2304  * garbage in, garbage out. If a node has a dead input, i.e., the
2305  * Bad node is input to the node, return the Bad node.
2306  */
2307 static INLINE ir_node *
2308 gigo (ir_node *node)
2309 {
2310   int i, irn_arity;
2311   ir_op* op = get_irn_op(node);
2312
2313   /* remove garbage blocks by looking at control flow that leaves the block
2314      and replacing the control flow by Bad. */
2315   if (get_irn_mode(node) == mode_X) {
2316     ir_node *block = get_nodes_block(node);
2317     if (!get_Block_matured(block)) return node;  /* Don't optimize nodes in immature blocks. */
2318     if (op == op_End) return node;     /* Don't optimize End, may have Bads. */
2319
2320     if (get_irn_op(block) == op_Block && get_Block_matured(block)) {
2321       irn_arity = get_irn_arity(block);
2322       for (i = 0; i < irn_arity; i++) {
2323         if (!is_Bad(get_irn_n(block, i))) break;
2324       }
2325       if (i == irn_arity) return new_Bad();
2326     }
2327   }
2328
2329   /* Blocks, Phis and Tuples may have dead inputs, e.g., if one of the
2330      blocks predecessors is dead. */
2331   if ( op != op_Block && op != op_Phi && op != op_Tuple) {
2332     irn_arity = get_irn_arity(node);
2333
2334     if (is_Block_dead(get_nodes_block(node)))
2335       return new_Bad();
2336
2337     for (i = 0; i < irn_arity; i++) {
2338       if (is_Bad(get_irn_n(node, i))) {
2339         return new_Bad();
2340       }
2341     }
2342   }
2343 #if 0
2344   /* With this code we violate the agreement that local_optimize
2345      only leaves Bads in Block, Phi and Tuple nodes. */
2346   /* If Block has only Bads as predecessors it's garbage. */
2347   /* If Phi has only Bads as predecessors it's garbage. */
2348   if ((op == op_Block && get_Block_matured(node)) || op == op_Phi)  {
2349     irn_arity = get_irn_arity(node);
2350     for (i = 0; i < irn_arity; i++) {
2351       if (!is_Bad(get_irn_n(node, i))) break;
2352     }
2353     if (i == irn_arity) node = new_Bad();
2354   }
2355 #endif
2356   return node;
2357 }
2358
2359
2360 /**
2361  * These optimizations deallocate nodes from the obstack.
2362  * It can only be called if it is guaranteed that no other nodes
2363  * reference this one, i.e., right after construction of a node.
2364  */
2365 ir_node *
2366 optimize_node (ir_node *n)
2367 {
2368         tarval *tv;
2369         ir_node *oldn = n;
2370         opcode iro = get_irn_opcode(n);
2371
2372         type *old_tp = get_irn_type(n);
2373         {
2374                 int i, arity = get_irn_arity(n);
2375                 for (i = 0; i < arity && !old_tp; ++i)
2376                         old_tp = get_irn_type(get_irn_n(n, i));
2377         }
2378
2379         /* Always optimize Phi nodes: part of the construction. */
2380         if ((!get_opt_optimize()) && (iro != iro_Phi)) return n;
2381
2382         /* constant expression evaluation / constant folding */
2383         if (get_opt_constant_folding()) {
2384                 /* constants can not be evaluated */
2385                 if (iro != iro_Const) {
2386                         /* try to evaluate */
2387                         tv = computed_value(n);
2388                         if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
2389                                 ir_node *nw;
2390
2391                                 /*
2392                                  * we MUST copy the node here temporary, because it's still needed
2393                                  * for DBG_OPT_CSTEVAL
2394                                  */
2395                                 int node_size = offsetof(ir_node, attr) +  n->op->attr_size;
2396                                 oldn = alloca(node_size);
2397
2398                                 memcpy(oldn, n, node_size);
2399                                 CLONE_ARR_A(ir_node *, oldn->in, n->in);
2400
2401                                 /* ARG, copy the in array, we need it for statistics */
2402                                 memcpy(oldn->in, n->in, ARR_LEN(n->in) * sizeof(n->in[0]));
2403
2404
2405                                 edges_node_deleted(n, current_ir_graph);
2406
2407                                 /* evaluation was successful -- replace the node. */
2408                                 obstack_free (current_ir_graph->obst, n);
2409                                 nw = new_Const (get_tarval_mode (tv), tv);
2410
2411                                 if (old_tp && get_type_mode(old_tp) == get_tarval_mode (tv))
2412                                         set_Const_type(nw, old_tp);
2413                                 DBG_OPT_CSTEVAL(oldn, nw);
2414                                 return nw;
2415                         }
2416                 }
2417         }
2418
2419         /* remove unnecessary nodes */
2420         if (get_opt_constant_folding() ||
2421                         (iro == iro_Phi)  ||   /* always optimize these nodes. */
2422                         (iro == iro_Id)   ||
2423                         (iro == iro_Proj) ||
2424                         (iro == iro_Block)  )  /* Flags tested local. */
2425                 n = equivalent_node (n);
2426
2427         optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
2428
2429         /** common subexpression elimination **/
2430         /* Checks whether n is already available. */
2431         /* The block input is used to distinguish different subexpressions. Right
2432                  now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
2433                  subexpressions within a block. */
2434         if (get_opt_cse())
2435                 n = identify_cons (current_ir_graph->value_table, n);
2436
2437         if (n != oldn) {
2438                 edges_node_deleted(oldn, current_ir_graph);
2439
2440                 /* We found an existing, better node, so we can deallocate the old node. */
2441                 obstack_free (current_ir_graph->obst, oldn);
2442
2443                 return n;
2444         }
2445
2446         /* Some more constant expression evaluation that does not allow to
2447                  free the node. */
2448         iro = get_irn_opcode(n);
2449         if (get_opt_constant_folding() ||
2450                         (iro == iro_Cond) ||
2451                         (iro == iro_Proj))     /* Flags tested local. */
2452                 n = transform_node (n);
2453
2454         /* Remove nodes with dead (Bad) input.
2455                  Run always for transformation induced Bads. */
2456         n = gigo (n);
2457
2458         /* Now we have a legal, useful node. Enter it in hash table for cse */
2459         if (get_opt_cse() && (get_irn_opcode(n) != iro_Block)) {
2460                 n = identify_remember (current_ir_graph->value_table, n);
2461         }
2462
2463         return n;
2464 }
2465
2466
2467 /**
2468  * These optimizations never deallocate nodes (in place).  This can cause dead
2469  * nodes lying on the obstack.  Remove these by a dead node elimination,
2470  * i.e., a copying garbage collection.
2471  */
2472 ir_node *
2473 optimize_in_place_2 (ir_node *n)
2474 {
2475   tarval *tv;
2476   ir_node *oldn = n;
2477   opcode iro = get_irn_opcode(n);
2478
2479   type *old_tp = get_irn_type(n);
2480   {
2481     int i, arity = get_irn_arity(n);
2482     for (i = 0; i < arity && !old_tp; ++i)
2483       old_tp = get_irn_type(get_irn_n(n, i));
2484   }
2485
2486   if (!get_opt_optimize() && (get_irn_op(n) != op_Phi)) return n;
2487
2488   /* if not optimize return n */
2489   if (n == NULL) {
2490     assert(0);
2491     /* Here this is possible.  Why? */
2492     return n;
2493   }
2494
2495   /* constant expression evaluation / constant folding */
2496   if (get_opt_constant_folding()) {
2497     /* constants can not be evaluated */
2498     if (iro != iro_Const) {
2499       /* try to evaluate */
2500       tv = computed_value(n);
2501       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
2502         /* evaluation was successful -- replace the node. */
2503         n = new_Const (get_tarval_mode (tv), tv);
2504
2505     if (old_tp && get_type_mode(old_tp) == get_tarval_mode (tv))
2506       set_Const_type(n, old_tp);
2507
2508         DBG_OPT_CSTEVAL(oldn, n);
2509         return n;
2510       }
2511     }
2512   }
2513
2514   /* remove unnecessary nodes */
2515   if (get_opt_constant_folding() ||
2516       (iro == iro_Phi)  ||   /* always optimize these nodes. */
2517       (iro == iro_Id)   ||   /* ... */
2518       (iro == iro_Proj) ||   /* ... */
2519       (iro == iro_Block)  )  /* Flags tested local. */
2520     n = equivalent_node (n);
2521
2522   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
2523
2524   /** common subexpression elimination **/
2525   /* Checks whether n is already available. */
2526   /* The block input is used to distinguish different subexpressions.  Right
2527      now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
2528      subexpressions within a block. */
2529   if (get_opt_cse()) {
2530     n = identify (current_ir_graph->value_table, n);
2531   }
2532
2533   /* Some more constant expression evaluation. */
2534   iro = get_irn_opcode(n);
2535   if (get_opt_constant_folding() ||
2536       (iro == iro_Cond) ||
2537       (iro == iro_Proj))     /* Flags tested local. */
2538     n = transform_node (n);
2539
2540   /* Remove nodes with dead (Bad) input.
2541      Run always for transformation induced Bads.  */
2542   n = gigo (n);
2543
2544   /* Now we can verify the node, as it has no dead inputs any more. */
2545   irn_vrfy(n);
2546
2547   /* Now we have a legal, useful node. Enter it in hash table for cse.
2548      Blocks should be unique anyways.  (Except the successor of start:
2549      is cse with the start block!) */
2550   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block))
2551     n = identify_remember (current_ir_graph->value_table, n);
2552
2553   return n;
2554 }
2555
2556 /**
2557  * Wrapper for external use, set proper status bits after optimization.
2558  */
2559 ir_node *
2560 optimize_in_place (ir_node *n)
2561 {
2562   /* Handle graph state */
2563   assert(get_irg_phase_state(current_ir_graph) != phase_building);
2564
2565   if (get_opt_global_cse())
2566     set_irg_pinned(current_ir_graph, op_pin_state_floats);
2567   if (get_irg_outs_state(current_ir_graph) == outs_consistent)
2568     set_irg_outs_inconsistent(current_ir_graph);
2569
2570   /* Maybe we could also test whether optimizing the node can
2571      change the control graph. */
2572   if (get_irg_dom_state(current_ir_graph) == dom_consistent)
2573     set_irg_dom_inconsistent(current_ir_graph);
2574   return optimize_in_place_2 (n);
2575 }
2576
2577 /**
2578  * set the default ir op operations
2579  */
2580 ir_op *firm_set_default_operations(ir_op *op)
2581 {
2582   op = firm_set_default_computed_value(op);
2583   op = firm_set_default_equivalent_node(op);
2584   op = firm_set_default_transform_node(op);
2585   op = firm_set_default_node_cmp_attr(op);
2586   op = firm_set_default_get_type(op);
2587
2588   return op;
2589 }