optimize polymorphic field accesses
[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)).
1198  * If possible, remove the Conv's.
1199  */
1200 static ir_node *transform_node_AddSub(ir_node *n)
1201 {
1202   ir_mode *mode = get_irn_mode(n);
1203
1204   if (mode_is_reference(mode)) {
1205     ir_node *left  = get_binop_left(n);
1206     ir_node *right = get_binop_right(n);
1207     int ref_bits   = get_mode_size_bits(mode);
1208
1209     if (get_irn_op(left) == op_Conv) {
1210       ir_mode *mode = get_irn_mode(left);
1211       int bits      = get_mode_size_bits(mode);
1212
1213       if (ref_bits == bits &&
1214           mode_is_int(mode) &&
1215           get_mode_arithmetic(mode) == irma_twos_complement) {
1216         ir_node *pre      = get_Conv_op(left);
1217         ir_mode *pre_mode = get_irn_mode(pre);
1218
1219         if (mode_is_int(pre_mode) &&
1220             get_mode_size_bits(pre_mode) == bits &&
1221             get_mode_arithmetic(pre_mode) == irma_twos_complement) {
1222           /* ok, this conv just changes to sign, moreover the calculation
1223            * is done with same number of bits as our address mode, so
1224            * we can ignore the conv as address calculation can be viewed
1225            * as either signed or unsigned
1226            */
1227           set_binop_left(n, pre);
1228         }
1229       }
1230     }
1231
1232     if (get_irn_op(right) == op_Conv) {
1233       ir_mode *mode = get_irn_mode(right);
1234       int bits      = get_mode_size_bits(mode);
1235
1236       if (ref_bits == bits &&
1237           mode_is_int(mode) &&
1238           get_mode_arithmetic(mode) == irma_twos_complement) {
1239         ir_node *pre      = get_Conv_op(right);
1240         ir_mode *pre_mode = get_irn_mode(pre);
1241
1242         if (mode_is_int(pre_mode) &&
1243             get_mode_size_bits(pre_mode) == bits &&
1244             get_mode_arithmetic(pre_mode) == irma_twos_complement) {
1245           /* ok, this conv just changes to sign, moreover the calculation
1246            * is done with same number of bits as our address mode, so
1247            * we can ignore the conv as address calculation can be viewed
1248            * as either signed or unsigned
1249            */
1250           set_binop_right(n, pre);
1251         }
1252       }
1253     }
1254   }
1255   return n;
1256 }
1257
1258 /**
1259  * Do the AddSub optimization, then Transform Add(a,a) into Mul(a, 2)
1260  * if the mode is integer or float.
1261  * Reassociation might fold this further.
1262  */
1263 static ir_node *transform_node_Add(ir_node *n)
1264 {
1265   ir_mode *mode;
1266   ir_node *oldn = n;
1267
1268   n = transform_node_AddSub(n);
1269
1270   mode = get_irn_mode(n);
1271   if (mode_is_num(mode)) {
1272     ir_node *a = get_Add_left(n);
1273
1274     if (a == get_Add_right(n)) {
1275       ir_node *block = get_nodes_block(n);
1276
1277       n = new_rd_Mul(
1278             get_irn_dbg_info(n),
1279             current_ir_graph,
1280             block,
1281             a,
1282             new_r_Const_long(current_ir_graph, block, mode, 2),
1283             mode);
1284       DBG_OPT_ALGSIM0(oldn, n);
1285     }
1286   }
1287   return n;
1288 }
1289
1290 /**
1291  * Do the AddSub optimization, then Transform Sub(0,a) into Minus(a).
1292  */
1293 static ir_node *transform_node_Sub(ir_node *n)
1294 {
1295   ir_mode *mode;
1296   ir_node *oldn = n;
1297
1298   n = transform_node_AddSub(n);
1299
1300   mode = get_irn_mode(n);
1301   if (mode_is_num(mode)) {
1302     if (classify_Const(get_Sub_left(n)) == CNST_NULL) {
1303       n = new_rd_Minus(
1304             get_irn_dbg_info(n),
1305             current_ir_graph,
1306             get_nodes_block(n),
1307             get_Sub_right(n),
1308             mode);
1309       DBG_OPT_ALGSIM0(oldn, n);
1310     }
1311   }
1312
1313   return n;
1314 }
1315
1316 /** Do architecture dependend optimizations on Mul nodes */
1317 static ir_node *transform_node_Mul(ir_node *n) {
1318   return arch_dep_replace_mul_with_shifts(n);
1319 }
1320
1321 static ir_node *transform_node_Div(ir_node *n)
1322 {
1323   tarval *tv = value_of(n);
1324   ir_node *value = n;
1325
1326   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1327
1328   if (tv != tarval_bad) {
1329     value = new_Const(get_tarval_mode(tv), tv);
1330
1331     DBG_OPT_CSTEVAL(n, value);
1332   }
1333   else /* Try architecture dependand optimization */
1334     value = arch_dep_replace_div_by_const(n);
1335
1336   if (value != n) {
1337     /* Turn Div into a tuple (mem, bad, value) */
1338     ir_node *mem = get_Div_mem(n);
1339
1340     turn_into_tuple(n, 3);
1341     set_Tuple_pred(n, pn_Div_M, mem);
1342     set_Tuple_pred(n, pn_Div_X_except, new_Bad());
1343     set_Tuple_pred(n, pn_Div_res, value);
1344   }
1345   return n;
1346 }
1347
1348 static ir_node *transform_node_Mod(ir_node *n)
1349 {
1350   tarval *tv = value_of(n);
1351   ir_node *value = n;
1352
1353   /* BEWARE: it is NOT possible to optimize a%a to 0, as this may cause a exception */
1354
1355   if (tv != tarval_bad) {
1356     value = new_Const(get_tarval_mode(tv), tv);
1357
1358     DBG_OPT_CSTEVAL(n, value);
1359   }
1360   else /* Try architecture dependand optimization */
1361     value = arch_dep_replace_mod_by_const(n);
1362
1363   if (value != n) {
1364     /* Turn Mod into a tuple (mem, bad, value) */
1365     ir_node *mem = get_Mod_mem(n);
1366
1367     turn_into_tuple(n, 3);
1368     set_Tuple_pred(n, pn_Mod_M, mem);
1369     set_Tuple_pred(n, pn_Mod_X_except, new_Bad());
1370     set_Tuple_pred(n, pn_Mod_res, value);
1371   }
1372   return n;
1373 }
1374
1375 static ir_node *transform_node_DivMod(ir_node *n)
1376 {
1377   int evaluated = 0;
1378
1379   ir_node *a = get_DivMod_left(n);
1380   ir_node *b = get_DivMod_right(n);
1381   ir_mode *mode = get_irn_mode(a);
1382   tarval *ta = value_of(a);
1383   tarval *tb = value_of(b);
1384
1385   if (!(mode_is_int(mode) && mode_is_int(get_irn_mode(b))))
1386     return n;
1387
1388   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1389
1390   if (tb != tarval_bad) {
1391     if (tb == get_mode_one(get_tarval_mode(tb))) {
1392       b = new_Const (mode, get_mode_null(mode));
1393       evaluated = 1;
1394
1395       DBG_OPT_CSTEVAL(n, b);
1396     }
1397     else if (ta != tarval_bad) {
1398       tarval *resa, *resb;
1399       resa = tarval_div (ta, tb);
1400       if (resa == tarval_bad) return n; /* Causes exception!!! Model by replacing through
1401                                         Jmp for X result!? */
1402       resb = tarval_mod (ta, tb);
1403       if (resb == tarval_bad) return n; /* Causes exception! */
1404       a = new_Const (mode, resa);
1405       b = new_Const (mode, resb);
1406       evaluated = 1;
1407
1408       DBG_OPT_CSTEVAL(n, a);
1409       DBG_OPT_CSTEVAL(n, b);
1410     }
1411     else { /* Try architecture dependand optimization */
1412       arch_dep_replace_divmod_by_const(&a, &b, n);
1413       evaluated = a != NULL;
1414     }
1415   } else if (ta == get_mode_null(mode)) {
1416     /* 0 / non-Const = 0 */
1417     b = a;
1418     evaluated = 1;
1419   }
1420
1421   if (evaluated) { /* replace by tuple */
1422     ir_node *mem = get_DivMod_mem(n);
1423     turn_into_tuple(n, 4);
1424     set_Tuple_pred(n, pn_DivMod_M,        mem);
1425     set_Tuple_pred(n, pn_DivMod_X_except, new_Bad());  /* no exception */
1426     set_Tuple_pred(n, pn_DivMod_res_div,  a);
1427     set_Tuple_pred(n, pn_DivMod_res_mod,  b);
1428     assert(get_nodes_block(n));
1429   }
1430
1431   return n;
1432 }
1433
1434 static ir_node *transform_node_Cond(ir_node *n)
1435 {
1436   /* Replace the Cond by a Jmp if it branches on a constant
1437      condition. */
1438   ir_node *jmp;
1439   ir_node *a = get_Cond_selector(n);
1440   tarval *ta = value_of(a);
1441
1442   if ((ta != tarval_bad) &&
1443       (get_irn_mode(a) == mode_b) &&
1444       (get_opt_unreachable_code())) {
1445     /* It's a boolean Cond, branching on a boolean constant.
1446                Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */
1447     jmp = new_r_Jmp(current_ir_graph, get_nodes_block(n));
1448     turn_into_tuple(n, 2);
1449     if (ta == tarval_b_true) {
1450       set_Tuple_pred(n, pn_Cond_false, new_Bad());
1451       set_Tuple_pred(n, pn_Cond_true, jmp);
1452     } else {
1453       set_Tuple_pred(n, pn_Cond_false, jmp);
1454       set_Tuple_pred(n, pn_Cond_true, new_Bad());
1455     }
1456     /* We might generate an endless loop, so keep it alive. */
1457     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1458   } else if ((ta != tarval_bad) &&
1459              (get_irn_mode(a) == mode_Iu) &&
1460              (get_Cond_kind(n) == dense) &&
1461              (get_opt_unreachable_code())) {
1462     /* I don't want to allow Tuples smaller than the biggest Proj.
1463        Also this tuple might get really big...
1464        I generate the Jmp here, and remember it in link.  Link is used
1465        when optimizing Proj. */
1466     set_irn_link(n, new_r_Jmp(current_ir_graph, get_nodes_block(n)));
1467     /* We might generate an endless loop, so keep it alive. */
1468     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1469   } else if ((get_irn_op(a) == op_Eor)
1470              && (get_irn_mode(a) == mode_b)
1471              && (classify_tarval(value_of(get_Eor_right(a))) == TV_CLASSIFY_ONE)) {
1472     /* The Eor is a negate.  Generate a new Cond without the negate,
1473        simulate the negate by exchanging the results. */
1474     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1475                                get_Eor_left(a)));
1476   } else if ((get_irn_op(a) == op_Not)
1477              && (get_irn_mode(a) == mode_b)) {
1478     /* A Not before the Cond.  Generate a new Cond without the Not,
1479        simulate the Not by exchanging the results. */
1480     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1481                                get_Not_op(a)));
1482   }
1483   return n;
1484 }
1485
1486 /**
1487  * Transform an Eor.
1488  */
1489 static ir_node *transform_node_Eor(ir_node *n)
1490 {
1491   ir_node *oldn = n;
1492   ir_node *a = get_Eor_left(n);
1493   ir_node *b = get_Eor_right(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       && (classify_tarval (value_of(b)) == TV_CLASSIFY_ONE)
1499       && (get_irn_op(get_Proj_pred(a)) == op_Cmp)) {
1500     /* The Eor negates a Cmp. The Cmp has the negated result anyways! */
1501     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1502                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1503
1504     DBG_OPT_ALGSIM0(oldn, n);
1505   }
1506   else if ((get_irn_mode(n) == mode_b)
1507         && (classify_tarval (value_of(b)) == TV_CLASSIFY_ONE)) {
1508     /* The Eor is a Not. Replace it by a Not. */
1509     /*   ????!!!Extend to bitfield 1111111. */
1510     n = new_r_Not(current_ir_graph, get_nodes_block(n), a, mode_b);
1511
1512     DBG_OPT_ALGSIM0(oldn, n);
1513   }
1514
1515   return n;
1516 }
1517
1518 /**
1519  * Transform a boolean Not.
1520  */
1521 static ir_node *transform_node_Not(ir_node *n)
1522 {
1523   ir_node *oldn = n;
1524   ir_node *a = get_Not_op(n);
1525
1526   if (   (get_irn_mode(n) == mode_b)
1527       && (get_irn_op(a) == op_Proj)
1528       && (get_irn_mode(a) == mode_b)
1529       && (get_irn_op(get_Proj_pred(a)) == op_Cmp)) {
1530     /* We negate a Cmp. The Cmp has the negated result anyways! */
1531     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1532                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1533     DBG_OPT_ALGSIM0(oldn, n);
1534   }
1535
1536   return n;
1537 }
1538
1539 /**
1540  * Transform a Cast of a Const into a new Const
1541  */
1542 static ir_node *transform_node_Cast(ir_node *n) {
1543   ir_node *oldn = n;
1544   ir_node *pred = get_Cast_op(n);
1545   type *tp = get_irn_type(pred);
1546
1547   if (get_irn_op(pred) == op_Const && get_Const_type(pred) != tp) {
1548     n = new_rd_Const_type(NULL, current_ir_graph, get_nodes_block(pred), get_irn_mode(pred),
1549               get_Const_tarval(pred), tp);
1550     DBG_OPT_CSTEVAL(oldn, n);
1551   } else if ((get_irn_op(pred) == op_SymConst) && (get_SymConst_value_type(pred) != tp)) {
1552     n = new_rd_SymConst_type(NULL, current_ir_graph, get_nodes_block(pred), get_SymConst_symbol(pred),
1553                  get_SymConst_kind(pred), tp);
1554     DBG_OPT_CSTEVAL(oldn, n);
1555   }
1556   return n;
1557 }
1558
1559 /**
1560  * Transform a Div/Mod/DivMod with a non-zero constant. Must be
1561  * done here instead of equivalent node because it creates new
1562  * nodes.
1563  * Removes the exceptions and routes the memory to the NoMem node.
1564  *
1565  * Further, it optimizes jump tables by removing all impossible cases.
1566  */
1567 static ir_node *transform_node_Proj(ir_node *proj)
1568 {
1569   ir_node *n = get_Proj_pred(proj);
1570   ir_node *b;
1571   tarval *tb;
1572   long proj_nr;
1573
1574   switch (get_irn_opcode(n)) {
1575   case iro_Div:
1576     b  = get_Div_right(n);
1577     tb = value_of(b);
1578
1579     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* div(x, c) && c != 0 */
1580       proj_nr = get_Proj_proj(proj);
1581
1582       /* this node may float */
1583       set_irn_pinned(n, op_pin_state_floats);
1584
1585       if (proj_nr == pn_Div_X_except) {
1586         /* we found an exception handler, remove it */
1587         return new_Bad();
1588       } else {
1589         /* the memory Proj can be removed */
1590         ir_node *res = get_Div_mem(n);
1591         set_Div_mem(n, get_irg_no_mem(current_ir_graph));
1592         if (proj_nr == pn_Div_M)
1593           return res;
1594       }
1595     }
1596     break;
1597   case iro_Mod:
1598     b  = get_Mod_right(n);
1599     tb = value_of(b);
1600
1601     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* mod(x, c) && c != 0 */
1602       proj_nr = get_Proj_proj(proj);
1603
1604       /* this node may float */
1605       set_irn_pinned(n, op_pin_state_floats);
1606
1607       if (proj_nr == pn_Mod_X_except) {
1608         /* we found an exception handler, remove it */
1609         return new_Bad();
1610       } else {
1611         /* the memory Proj can be removed */
1612         ir_node *res = get_Mod_mem(n);
1613         set_Mod_mem(n, get_irg_no_mem(current_ir_graph));
1614         if (proj_nr == pn_Mod_M)
1615           return res;
1616       }
1617     }
1618     break;
1619   case iro_DivMod:
1620     b  = get_DivMod_right(n);
1621     tb = value_of(b);
1622
1623     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* DivMod(x, c) && c != 0 */
1624       proj_nr = get_Proj_proj(proj);
1625
1626       /* this node may float */
1627       set_irn_pinned(n, op_pin_state_floats);
1628
1629       if (proj_nr == pn_DivMod_X_except) {
1630         /* we found an exception handler, remove it */
1631         return new_Bad();
1632       }
1633       else {
1634         /* the memory Proj can be removed */
1635         ir_node *res = get_DivMod_mem(n);
1636         set_DivMod_mem(n, get_irg_no_mem(current_ir_graph));
1637         if (proj_nr == pn_DivMod_M)
1638           return res;
1639       }
1640     }
1641     break;
1642
1643   case iro_Cond:
1644     if (get_opt_unreachable_code()) {
1645       b = get_Cond_selector(n);
1646       tb = value_of(b);
1647
1648       if (tb != tarval_bad && mode_is_int(get_tarval_mode(tb))) {
1649         /* we have a constant switch */
1650         long num = get_Proj_proj(proj);
1651
1652         if (num != get_Cond_defaultProj(n)) { /* we cannot optimize default Proj's yet */
1653           if (get_tarval_long(tb) == num) {
1654             /* Do NOT create a jump here, or we will have 2 control flow ops
1655              * in a block. This case is optimized away in optimize_cf(). */
1656             return proj;
1657           }
1658           else
1659             return new_Bad();
1660         }
1661       }
1662     }
1663     return proj;
1664
1665   case iro_Tuple:
1666     /* should not happen, but if it does will be optimized away */
1667     break;
1668
1669   default:
1670     /* do nothing */
1671     return proj;
1672   }
1673
1674   /* we have added a Tuple, optimize it for the current Proj away */
1675   return equivalent_node_Proj(proj);
1676 }
1677
1678 /**
1679  * returns the operands of a commutative bin-op, if one operand is
1680  * a const, it is returned as the second one.
1681  */
1682 static void get_comm_Binop_Ops(ir_node *binop, ir_node **a, ir_node **c)
1683 {
1684   ir_node *op_a = get_binop_left(binop);
1685   ir_node *op_b = get_binop_right(binop);
1686
1687   assert(is_op_commutative(get_irn_op(binop)));
1688
1689   if (get_irn_op(op_a) == op_Const) {
1690     *a = op_b;
1691     *c = op_a;
1692   }
1693   else {
1694     *a = op_a;
1695     *c = op_b;
1696   }
1697 }
1698
1699 /**
1700  * Optimize a Or(And(Or(And(v,c4),c3),c2),c1) pattern if possible.
1701  * Such pattern may arise in bitfield stores.
1702  *
1703  * value  c4                  value      c4 & c2
1704  *    AND     c3                    AND           c1 | c3
1705  *        OR     c2      ===>               OR
1706  *           AND    c1
1707  *               OR
1708  */
1709 static ir_node *transform_node_Or_bf_store(ir_node *or)
1710 {
1711   ir_node *and, *c1;
1712   ir_node *or_l, *c2;
1713   ir_node *and_l, *c3;
1714   ir_node *value, *c4;
1715   ir_node *new_and, *new_const, *block;
1716   ir_mode *mode = get_irn_mode(or);
1717
1718   tarval *tv1, *tv2, *tv3, *tv4, *tv, *n_tv4, *n_tv2;
1719
1720   get_comm_Binop_Ops(or, &and, &c1);
1721   if ((get_irn_op(c1) != op_Const) || (get_irn_op(and) != op_And))
1722     return or;
1723
1724   get_comm_Binop_Ops(and, &or_l, &c2);
1725   if ((get_irn_op(c2) != op_Const) || (get_irn_op(or_l) != op_Or))
1726     return or;
1727
1728   get_comm_Binop_Ops(or_l, &and_l, &c3);
1729   if ((get_irn_op(c3) != op_Const) || (get_irn_op(and_l) != op_And))
1730     return or;
1731
1732   get_comm_Binop_Ops(and_l, &value, &c4);
1733   if (get_irn_op(c4) != op_Const)
1734     return or;
1735
1736   /* ok, found the pattern, check for conditions */
1737   assert(mode == get_irn_mode(and));
1738   assert(mode == get_irn_mode(or_l));
1739   assert(mode == get_irn_mode(and_l));
1740
1741   tv1 = get_Const_tarval(c1);
1742   tv2 = get_Const_tarval(c2);
1743   tv3 = get_Const_tarval(c3);
1744   tv4 = get_Const_tarval(c4);
1745
1746   tv = tarval_or(tv4, tv2);
1747   if (classify_tarval(tv) != TV_CLASSIFY_ALL_ONE) {
1748     /* have at least one 0 at the same bit position */
1749     return or;
1750   }
1751
1752   n_tv4 = tarval_not(tv4);
1753   if (tv3 != tarval_and(tv3, n_tv4)) {
1754     /* bit in the or_mask is outside the and_mask */
1755     return or;
1756   }
1757
1758   n_tv2 = tarval_not(tv2);
1759   if (tv1 != tarval_and(tv1, n_tv2)) {
1760     /* bit in the or_mask is outside the and_mask */
1761     return or;
1762   }
1763
1764   /* ok, all conditions met */
1765   block = get_nodes_block(or);
1766
1767   new_and = new_r_And(current_ir_graph, block,
1768       value, new_r_Const(current_ir_graph, block, mode, tarval_and(tv4, tv2)), mode);
1769
1770   new_const = new_r_Const(current_ir_graph, block, mode, tarval_or(tv3, tv1));
1771
1772   set_Or_left(or, new_and);
1773   set_Or_right(or, new_const);
1774
1775   /* check for more */
1776   return transform_node_Or_bf_store(or);
1777 }
1778
1779 /**
1780  * Optimize an Or(shl(x, c), shr(x, bits - c)) into a Rot
1781  */
1782 static ir_node *transform_node_Or_Rot(ir_node *or)
1783 {
1784   ir_mode *mode = get_irn_mode(or);
1785   ir_node *shl, *shr, *block;
1786   ir_node *irn, *x, *c1, *c2, *v, *sub, *n;
1787   tarval *tv1, *tv2;
1788
1789   if (! mode_is_int(mode))
1790     return or;
1791
1792   shl = get_binop_left(or);
1793   shr = get_binop_right(or);
1794
1795   if (get_irn_op(shl) == op_Shr) {
1796     if (get_irn_op(shr) != op_Shl)
1797       return or;
1798
1799     irn = shl;
1800     shl = shr;
1801     shr = irn;
1802   }
1803   else if (get_irn_op(shl) != op_Shl)
1804     return or;
1805   else if (get_irn_op(shr) != op_Shr)
1806     return or;
1807
1808   x = get_Shl_left(shl);
1809   if (x != get_Shr_left(shr))
1810     return or;
1811
1812   c1 = get_Shl_right(shl);
1813   c2 = get_Shr_right(shr);
1814   if (get_irn_op(c1) == op_Const && get_irn_op(c2) == op_Const) {
1815     tv1 = get_Const_tarval(c1);
1816     if (! tarval_is_long(tv1))
1817       return or;
1818
1819     tv2 = get_Const_tarval(c2);
1820     if (! tarval_is_long(tv2))
1821       return or;
1822
1823     if (get_tarval_long(tv1) + get_tarval_long(tv2)
1824         != get_mode_size_bits(mode))
1825       return or;
1826
1827     /* yet, condition met */
1828     block = get_nodes_block(or);
1829
1830     n = new_r_Rot(current_ir_graph, block, x, c1, mode);
1831
1832     DBG_OPT_ALGSIM1(or, shl, shr, n);
1833     return n;
1834   }
1835   else if (get_irn_op(c1) == op_Sub) {
1836     v   = c2;
1837     sub = c1;
1838
1839     if (get_Sub_right(sub) != v)
1840       return or;
1841
1842     c1 = get_Sub_left(sub);
1843     if (get_irn_op(c1) != op_Const)
1844       return or;
1845
1846     tv1 = get_Const_tarval(c1);
1847     if (! tarval_is_long(tv1))
1848       return or;
1849
1850     if (get_tarval_long(tv1) != get_mode_size_bits(mode))
1851       return or;
1852
1853     /* yet, condition met */
1854     block = get_nodes_block(or);
1855
1856     /* a Rot right is not supported, so use a rot left */
1857     n =  new_r_Rot(current_ir_graph, block, x, sub, mode);
1858
1859     DBG_OPT_ALGSIM0(or, n);
1860     return n;
1861   }
1862   else if (get_irn_op(c2) == op_Sub) {
1863     v   = c1;
1864     sub = c2;
1865
1866     c1 = get_Sub_left(sub);
1867     if (get_irn_op(c1) != op_Const)
1868       return or;
1869
1870     tv1 = get_Const_tarval(c1);
1871     if (! tarval_is_long(tv1))
1872       return or;
1873
1874     if (get_tarval_long(tv1) != get_mode_size_bits(mode))
1875       return or;
1876
1877     /* yet, condition met */
1878     block = get_nodes_block(or);
1879
1880     /* a Rot Left */
1881     n = new_r_Rot(current_ir_graph, block, x, v, mode);
1882
1883     DBG_OPT_ALGSIM0(or, n);
1884     return n;
1885   }
1886
1887   return or;
1888 }
1889
1890 /**
1891  * Optimize an Or
1892  */
1893 static ir_node *transform_node_Or(ir_node *or)
1894 {
1895   or = transform_node_Or_bf_store(or);
1896   or = transform_node_Or_Rot(or);
1897
1898   return or;
1899 }
1900
1901 /* forward */
1902 static ir_node *transform_node(ir_node *n);
1903
1904 /**
1905  * Optimize (a >> c1) >> c2), works for Shr, Shrs, Shl
1906  */
1907 static ir_node * transform_node_shift(ir_node *n)
1908 {
1909   ir_node *left, *right;
1910   tarval *tv1, *tv2, *res;
1911   ir_mode *mode;
1912   int modulo_shf, flag;
1913
1914   left = get_binop_left(n);
1915
1916   /* different operations */
1917   if (get_irn_op(left) != get_irn_op(n))
1918     return n;
1919
1920   right = get_binop_right(n);
1921   tv1 = value_of(right);
1922   if (tv1 == tarval_bad)
1923     return n;
1924
1925   tv2 = value_of(get_binop_right(left));
1926   if (tv2 == tarval_bad)
1927     return n;
1928
1929   res = tarval_add(tv1, tv2);
1930
1931   /* beware: a simple replacement works only, if res < modulo shift */
1932   mode = get_irn_mode(n);
1933
1934   flag = 0;
1935
1936   modulo_shf = get_mode_modulo_shift(mode);
1937   if (modulo_shf > 0) {
1938     tarval *modulo = new_tarval_from_long(modulo_shf, get_tarval_mode(res));
1939
1940     if (tarval_cmp(res, modulo) & pn_Cmp_Lt)
1941       flag = 1;
1942   }
1943   else
1944     flag = 1;
1945
1946   if (flag) {
1947     /* ok, we can replace it */
1948     ir_node *in[2], *irn, *block = get_nodes_block(n);
1949
1950     in[0] = get_binop_left(left);
1951     in[1] = new_r_Const(current_ir_graph, block, get_tarval_mode(res), res);
1952
1953     irn = new_ir_node(NULL, current_ir_graph, block, get_irn_op(n), mode, 2, in);
1954
1955     DBG_OPT_ALGSIM0(n, irn);
1956
1957     return transform_node(irn);
1958   }
1959   return n;
1960 }
1961
1962 static ir_node * transform_node_End(ir_node *n) {
1963   int i, n_keepalives = get_End_n_keepalives(n);
1964
1965   /* Remove dead blocks in keepalive list.
1966      We do not generate a new End node. */
1967   for (i = 0; i < n_keepalives; ++i) {
1968     ir_node *ka = get_End_keepalive(n, i);
1969     if (is_Block(ka) && is_Block_dead(ka))
1970       set_End_keepalive(n, i, new_Bad());
1971   }
1972   return n;
1973 }
1974
1975
1976 /**
1977  * Tries several [inplace] [optimizing] transformations and returns an
1978  * equivalent node.  The difference to equivalent_node() is that these
1979  * transformations _do_ generate new nodes, and thus the old node must
1980  * not be freed even if the equivalent node isn't the old one.
1981  */
1982 static ir_node *transform_node(ir_node *n)
1983 {
1984   if (n->op->transform_node)
1985     n = n->op->transform_node(n);
1986   return n;
1987 }
1988
1989 /**
1990  * set the default transform node operation
1991  */
1992 static ir_op *firm_set_default_transform_node(ir_op *op)
1993 {
1994 #define CASE(a)                                 \
1995   case iro_##a:                                 \
1996     op->transform_node  = transform_node_##a;   \
1997     break
1998
1999   switch (op->code) {
2000   CASE(Add);
2001   CASE(Sub);
2002   CASE(Mul);
2003   CASE(Div);
2004   CASE(Mod);
2005   CASE(DivMod);
2006   CASE(Cond);
2007   CASE(Eor);
2008   CASE(Not);
2009   CASE(Cast);
2010   CASE(Proj);
2011   CASE(Or);
2012   CASE(End);
2013   case iro_Shr:
2014   case iro_Shrs:
2015   case iro_Shl:
2016     op->transform_node  = transform_node_shift;
2017     break;
2018   default:
2019     op->transform_node  = NULL;
2020   }
2021
2022   return op;
2023 #undef CASE
2024 }
2025
2026
2027 /* **************** Common Subexpression Elimination **************** */
2028
2029 /** The size of the hash table used, should estimate the number of nodes
2030     in a graph. */
2031 #define N_IR_NODES 512
2032
2033 /** Compares the attributes of two Const nodes. */
2034 static int node_cmp_attr_Const(ir_node *a, ir_node *b)
2035 {
2036   return (get_Const_tarval(a) != get_Const_tarval(b))
2037       || (get_Const_type(a) != get_Const_type(b));
2038 }
2039
2040 /** Compares the attributes of two Proj nodes. */
2041 static int node_cmp_attr_Proj(ir_node *a, ir_node *b)
2042 {
2043     return get_irn_proj_attr (a) != get_irn_proj_attr (b);
2044 }
2045
2046 /** Compares the attributes of two Filter nodes. */
2047 static int node_cmp_attr_Filter(ir_node *a, ir_node *b)
2048 {
2049     return get_Filter_proj(a) != get_Filter_proj(b);
2050 }
2051
2052 /** Compares the attributes of two Alloc nodes. */
2053 static int node_cmp_attr_Alloc(ir_node *a, ir_node *b)
2054 {
2055     return (get_irn_alloc_attr(a).where != get_irn_alloc_attr(b).where)
2056         || (get_irn_alloc_attr(a).type != get_irn_alloc_attr(b).type);
2057 }
2058
2059 /** Compares the attributes of two Free nodes. */
2060 static int node_cmp_attr_Free(ir_node *a, ir_node *b)
2061 {
2062     return (get_irn_free_attr(a).where != get_irn_free_attr(b).where)
2063         || (get_irn_free_attr(a).type != get_irn_free_attr(b).type);
2064 }
2065
2066 /** Compares the attributes of two SymConst nodes. */
2067 static int node_cmp_attr_SymConst(ir_node *a, ir_node *b)
2068 {
2069     return (get_irn_symconst_attr(a).num != get_irn_symconst_attr(b).num)
2070       || (get_irn_symconst_attr(a).sym.type_p != get_irn_symconst_attr(b).sym.type_p)
2071       || (get_irn_symconst_attr(a).tp != get_irn_symconst_attr(b).tp);
2072 }
2073
2074 /** Compares the attributes of two Call nodes. */
2075 static int node_cmp_attr_Call(ir_node *a, ir_node *b)
2076 {
2077     return (get_irn_call_attr(a) != get_irn_call_attr(b));
2078 }
2079
2080 /** Compares the attributes of two Sel nodes. */
2081 static int node_cmp_attr_Sel(ir_node *a, ir_node *b)
2082 {
2083     return (get_irn_sel_attr(a).ent->kind  != get_irn_sel_attr(b).ent->kind)
2084       || (get_irn_sel_attr(a).ent->name    != get_irn_sel_attr(b).ent->name)
2085       || (get_irn_sel_attr(a).ent->owner   != get_irn_sel_attr(b).ent->owner)
2086       || (get_irn_sel_attr(a).ent->ld_name != get_irn_sel_attr(b).ent->ld_name)
2087       || (get_irn_sel_attr(a).ent->type    != get_irn_sel_attr(b).ent->type);
2088 }
2089
2090 /** Compares the attributes of two Phi nodes. */
2091 static int node_cmp_attr_Phi(ir_node *a, ir_node *b)
2092 {
2093     return get_irn_phi_attr (a) != get_irn_phi_attr (b);
2094 }
2095
2096 /** Compares the attributes of two Cast nodes. */
2097 static int node_cmp_attr_Cast(ir_node *a, ir_node *b)
2098 {
2099     return get_Cast_type(a) != get_Cast_type(b);
2100 }
2101
2102 /** Compares the attributes of two Load nodes. */
2103 static int node_cmp_attr_Load(ir_node *a, ir_node *b)
2104 {
2105   if (get_Load_volatility(a) == volatility_is_volatile ||
2106       get_Load_volatility(b) == volatility_is_volatile)
2107     /* NEVER do CSE on volatile Loads */
2108     return 1;
2109
2110   return get_Load_mode(a) != get_Load_mode(b);
2111 }
2112
2113 /** Compares the attributes of two Store nodes. */
2114 static int node_cmp_attr_Store(ir_node *a, ir_node *b)
2115 {
2116   /* NEVER do CSE on volatile Stores */
2117   return (get_Store_volatility(a) == volatility_is_volatile ||
2118       get_Store_volatility(b) == volatility_is_volatile);
2119 }
2120
2121 /**
2122  * set the default node attribute compare operation
2123  */
2124 static ir_op *firm_set_default_node_cmp_attr(ir_op *op)
2125 {
2126 #define CASE(a)                             \
2127   case iro_##a:                             \
2128     op->node_cmp_attr  = node_cmp_attr_##a; \
2129     break
2130
2131   switch (op->code) {
2132   CASE(Const);
2133   CASE(Proj);
2134   CASE(Filter);
2135   CASE(Alloc);
2136   CASE(Free);
2137   CASE(SymConst);
2138   CASE(Call);
2139   CASE(Sel);
2140   CASE(Phi);
2141   CASE(Cast);
2142   CASE(Load);
2143   CASE(Store);
2144   default:
2145     op->node_cmp_attr  = NULL;
2146   }
2147
2148   return op;
2149 #undef CASE
2150 }
2151
2152 /**
2153  * Compare function for two nodes in the hash table. Gets two
2154  * nodes as parameters.  Returns 0 if the nodes are a cse.
2155  */
2156 static int
2157 vt_cmp (const void *elt, const void *key)
2158 {
2159   ir_node *a, *b;
2160   int i, irn_arity_a;
2161
2162   a = (void *)elt;
2163   b = (void *)key;
2164
2165   if (a == b) return 0;
2166
2167   if ((get_irn_op(a) != get_irn_op(b)) ||
2168       (get_irn_mode(a) != get_irn_mode(b))) return 1;
2169
2170   /* compare if a's in and b's in are of equal length */
2171   irn_arity_a = get_irn_intra_arity (a);
2172   if (irn_arity_a != get_irn_intra_arity(b))
2173     return 1;
2174
2175   /* for block-local cse and op_pin_state_pinned nodes: */
2176   if (!get_opt_global_cse() || (get_irn_pinned(a) == op_pin_state_pinned)) {
2177     if (get_irn_intra_n(a, -1) != get_irn_intra_n(b, -1))
2178       return 1;
2179   }
2180
2181   /* compare a->in[0..ins] with b->in[0..ins] */
2182   for (i = 0; i < irn_arity_a; i++)
2183     if (get_irn_intra_n(a, i) != get_irn_intra_n(b, i))
2184       return 1;
2185
2186   /*
2187    * here, we already now that the nodes are identical except their
2188    * attributes
2189    */
2190   if (a->op->node_cmp_attr)
2191     return a->op->node_cmp_attr(a, b);
2192
2193   return 0;
2194 }
2195
2196 /*
2197  * Calculate a hash value of a node.
2198  */
2199 unsigned
2200 ir_node_hash (ir_node *node)
2201 {
2202   unsigned h;
2203   int i, irn_arity;
2204
2205   if (node->op == op_Const) {
2206     /* special value for const, as they only differ in their tarval. */
2207     h = HASH_PTR(node->attr.con.tv);
2208     h = 9*h + HASH_PTR(get_irn_mode(node));
2209   } else if (node->op == op_SymConst) {
2210     /* special value for const, as they only differ in their symbol. */
2211     h = HASH_PTR(node->attr.i.sym.type_p);
2212     h = 9*h + HASH_PTR(get_irn_mode(node));
2213   } else {
2214
2215     /* hash table value = 9*(9*(9*(9*(9*arity+in[0])+in[1])+ ...)+mode)+code */
2216     h = irn_arity = get_irn_intra_arity(node);
2217
2218     /* consider all in nodes... except the block if not a control flow. */
2219     for (i =  is_cfop(node) ? -1 : 0;  i < irn_arity;  i++) {
2220       h = 9*h + HASH_PTR(get_irn_intra_n(node, i));
2221     }
2222
2223     /* ...mode,... */
2224     h = 9*h + HASH_PTR(get_irn_mode(node));
2225     /* ...and code */
2226     h = 9*h + HASH_PTR(get_irn_op(node));
2227   }
2228
2229   return h;
2230 }
2231
2232 pset *
2233 new_identities(void) {
2234   return new_pset(vt_cmp, N_IR_NODES);
2235 }
2236
2237 void
2238 del_identities(pset *value_table) {
2239   del_pset(value_table);
2240 }
2241
2242 /**
2243  * Return the canonical node computing the same value as n.
2244  * Looks up the node in a hash table.
2245  *
2246  * For Const nodes this is performed in the constructor, too.  Const
2247  * nodes are extremely time critical because of their frequent use in
2248  * constant string arrays.
2249  */
2250 static INLINE ir_node *
2251 identify (pset *value_table, ir_node *n)
2252 {
2253   ir_node *o = NULL;
2254
2255   if (!value_table) return n;
2256
2257   if (get_opt_reassociation()) {
2258     if (is_op_commutative(get_irn_op(n))) {
2259       ir_node *l = get_binop_left(n);
2260       ir_node *r = get_binop_right(n);
2261
2262       /* for commutative operators perform  a OP b == b OP a */
2263       if (l > r) {
2264         set_binop_left(n, r);
2265         set_binop_right(n, l);
2266       }
2267     }
2268   }
2269
2270   o = pset_find (value_table, n, ir_node_hash (n));
2271   if (!o) return n;
2272
2273   DBG_OPT_CSE(n, o);
2274
2275   return o;
2276 }
2277
2278 /**
2279  * During construction we set the op_pin_state_pinned flag in the graph right when the
2280  * optimization is performed.  The flag turning on procedure global cse could
2281  * be changed between two allocations.  This way we are safe.
2282  */
2283 static INLINE ir_node *
2284 identify_cons (pset *value_table, ir_node *n) {
2285   ir_node *old = n;
2286
2287   n = identify(value_table, n);
2288   if (get_irn_n(old, -1) != get_irn_n(n, -1))
2289     set_irg_pinned(current_ir_graph, op_pin_state_floats);
2290   return n;
2291 }
2292
2293 /**
2294  * Return the canonical node computing the same value as n.
2295  * Looks up the node in a hash table, enters it in the table
2296  * if it isn't there yet.
2297  */
2298 static ir_node *
2299 identify_remember (pset *value_table, ir_node *n)
2300 {
2301   ir_node *o = NULL;
2302
2303   if (!value_table) return n;
2304
2305   if (get_opt_reassociation()) {
2306     if (is_op_commutative(get_irn_op(n))) {
2307       ir_node *l = get_binop_left(n);
2308       ir_node *r = get_binop_right(n);
2309
2310       /* for commutative operators perform  a OP b == b OP a */
2311       if (l > r) {
2312         set_binop_left(n, r);
2313         set_binop_right(n, l);
2314       }
2315     }
2316   }
2317
2318   /* lookup or insert in hash table with given hash key. */
2319   o = pset_insert (value_table, n, ir_node_hash (n));
2320
2321   if (o != n) {
2322     DBG_OPT_CSE(n, o);
2323   }
2324
2325   return o;
2326 }
2327
2328 void
2329 add_identities (pset *value_table, ir_node *node) {
2330   if (get_opt_cse() && (get_irn_opcode(node) != iro_Block))
2331     identify_remember (value_table, node);
2332 }
2333
2334 /**
2335  * garbage in, garbage out. If a node has a dead input, i.e., the
2336  * Bad node is input to the node, return the Bad node.
2337  */
2338 static INLINE ir_node *
2339 gigo (ir_node *node)
2340 {
2341   int i, irn_arity;
2342   ir_op* op = get_irn_op(node);
2343
2344   /* remove garbage blocks by looking at control flow that leaves the block
2345      and replacing the control flow by Bad. */
2346   if (get_irn_mode(node) == mode_X) {
2347     ir_node *block = get_nodes_block(node);
2348     if (!get_Block_matured(block)) return node;  /* Don't optimize nodes in immature blocks. */
2349     if (op == op_End) return node;     /* Don't optimize End, may have Bads. */
2350
2351     if (get_irn_op(block) == op_Block && get_Block_matured(block)) {
2352       irn_arity = get_irn_arity(block);
2353       for (i = 0; i < irn_arity; i++) {
2354         if (!is_Bad(get_irn_n(block, i))) break;
2355       }
2356       if (i == irn_arity) return new_Bad();
2357     }
2358   }
2359
2360   /* Blocks, Phis and Tuples may have dead inputs, e.g., if one of the
2361      blocks predecessors is dead. */
2362   if ( op != op_Block && op != op_Phi && op != op_Tuple) {
2363     irn_arity = get_irn_arity(node);
2364
2365     if (is_Block_dead(get_nodes_block(node)))
2366       return new_Bad();
2367
2368     for (i = 0; i < irn_arity; i++) {
2369       if (is_Bad(get_irn_n(node, i))) {
2370         return new_Bad();
2371       }
2372     }
2373   }
2374 #if 0
2375   /* With this code we violate the agreement that local_optimize
2376      only leaves Bads in Block, Phi and Tuple nodes. */
2377   /* If Block has only Bads as predecessors it's garbage. */
2378   /* If Phi has only Bads as predecessors it's garbage. */
2379   if ((op == op_Block && get_Block_matured(node)) || op == op_Phi)  {
2380     irn_arity = get_irn_arity(node);
2381     for (i = 0; i < irn_arity; i++) {
2382       if (!is_Bad(get_irn_n(node, i))) break;
2383     }
2384     if (i == irn_arity) node = new_Bad();
2385   }
2386 #endif
2387   return node;
2388 }
2389
2390
2391 /**
2392  * These optimizations deallocate nodes from the obstack.
2393  * It can only be called if it is guaranteed that no other nodes
2394  * reference this one, i.e., right after construction of a node.
2395  */
2396 ir_node *
2397 optimize_node (ir_node *n)
2398 {
2399         tarval *tv;
2400         ir_node *oldn = n;
2401         opcode iro = get_irn_opcode(n);
2402
2403         type *old_tp = get_irn_type(n);
2404         {
2405                 int i, arity = get_irn_arity(n);
2406                 for (i = 0; i < arity && !old_tp; ++i)
2407                         old_tp = get_irn_type(get_irn_n(n, i));
2408         }
2409
2410         /* Always optimize Phi nodes: part of the construction. */
2411         if ((!get_opt_optimize()) && (iro != iro_Phi)) return n;
2412
2413         /* constant expression evaluation / constant folding */
2414         if (get_opt_constant_folding()) {
2415                 /* constants can not be evaluated */
2416                 if (iro != iro_Const) {
2417                         /* try to evaluate */
2418                         tv = computed_value(n);
2419                         if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
2420                                 ir_node *nw;
2421
2422                                 /*
2423                                  * we MUST copy the node here temporary, because it's still needed
2424                                  * for DBG_OPT_CSTEVAL
2425                                  */
2426                                 int node_size = offsetof(ir_node, attr) +  n->op->attr_size;
2427                                 oldn = alloca(node_size);
2428
2429                                 memcpy(oldn, n, node_size);
2430                                 CLONE_ARR_A(ir_node *, oldn->in, n->in);
2431
2432                                 /* ARG, copy the in array, we need it for statistics */
2433                                 memcpy(oldn->in, n->in, ARR_LEN(n->in) * sizeof(n->in[0]));
2434
2435
2436                                 edges_node_deleted(n, current_ir_graph);
2437
2438                                 /* evaluation was successful -- replace the node. */
2439                                 obstack_free (current_ir_graph->obst, n);
2440                                 nw = new_Const (get_tarval_mode (tv), tv);
2441
2442                                 if (old_tp && get_type_mode(old_tp) == get_tarval_mode (tv))
2443                                         set_Const_type(nw, old_tp);
2444                                 DBG_OPT_CSTEVAL(oldn, nw);
2445                                 return nw;
2446                         }
2447                 }
2448         }
2449
2450         /* remove unnecessary nodes */
2451         if (get_opt_constant_folding() ||
2452                         (iro == iro_Phi)  ||   /* always optimize these nodes. */
2453                         (iro == iro_Id)   ||
2454                         (iro == iro_Proj) ||
2455                         (iro == iro_Block)  )  /* Flags tested local. */
2456                 n = equivalent_node (n);
2457
2458         optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
2459
2460         /** common subexpression elimination **/
2461         /* Checks whether n is already available. */
2462         /* The block input is used to distinguish different subexpressions. Right
2463                  now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
2464                  subexpressions within a block. */
2465         if (get_opt_cse())
2466                 n = identify_cons (current_ir_graph->value_table, n);
2467
2468         if (n != oldn) {
2469                 edges_node_deleted(oldn, current_ir_graph);
2470
2471                 /* We found an existing, better node, so we can deallocate the old node. */
2472                 obstack_free (current_ir_graph->obst, oldn);
2473
2474                 return n;
2475         }
2476
2477         /* Some more constant expression evaluation that does not allow to
2478                  free the node. */
2479         iro = get_irn_opcode(n);
2480         if (get_opt_constant_folding() ||
2481                         (iro == iro_Cond) ||
2482                         (iro == iro_Proj))     /* Flags tested local. */
2483                 n = transform_node (n);
2484
2485         /* Remove nodes with dead (Bad) input.
2486                  Run always for transformation induced Bads. */
2487         n = gigo (n);
2488
2489         /* Now we have a legal, useful node. Enter it in hash table for cse */
2490         if (get_opt_cse() && (get_irn_opcode(n) != iro_Block)) {
2491                 n = identify_remember (current_ir_graph->value_table, n);
2492         }
2493
2494         return n;
2495 }
2496
2497
2498 /**
2499  * These optimizations never deallocate nodes (in place).  This can cause dead
2500  * nodes lying on the obstack.  Remove these by a dead node elimination,
2501  * i.e., a copying garbage collection.
2502  */
2503 ir_node *
2504 optimize_in_place_2 (ir_node *n)
2505 {
2506   tarval *tv;
2507   ir_node *oldn = n;
2508   opcode iro = get_irn_opcode(n);
2509
2510   type *old_tp = get_irn_type(n);
2511   {
2512     int i, arity = get_irn_arity(n);
2513     for (i = 0; i < arity && !old_tp; ++i)
2514       old_tp = get_irn_type(get_irn_n(n, i));
2515   }
2516
2517   if (!get_opt_optimize() && (get_irn_op(n) != op_Phi)) return n;
2518
2519   /* if not optimize return n */
2520   if (n == NULL) {
2521     assert(0);
2522     /* Here this is possible.  Why? */
2523     return n;
2524   }
2525
2526   /* constant expression evaluation / constant folding */
2527   if (get_opt_constant_folding()) {
2528     /* constants can not be evaluated */
2529     if (iro != iro_Const) {
2530       /* try to evaluate */
2531       tv = computed_value(n);
2532       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
2533         /* evaluation was successful -- replace the node. */
2534         n = new_Const (get_tarval_mode (tv), tv);
2535
2536     if (old_tp && get_type_mode(old_tp) == get_tarval_mode (tv))
2537       set_Const_type(n, old_tp);
2538
2539         DBG_OPT_CSTEVAL(oldn, n);
2540         return n;
2541       }
2542     }
2543   }
2544
2545   /* remove unnecessary nodes */
2546   if (get_opt_constant_folding() ||
2547       (iro == iro_Phi)  ||   /* always optimize these nodes. */
2548       (iro == iro_Id)   ||   /* ... */
2549       (iro == iro_Proj) ||   /* ... */
2550       (iro == iro_Block)  )  /* Flags tested local. */
2551     n = equivalent_node (n);
2552
2553   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
2554
2555   /** common subexpression elimination **/
2556   /* Checks whether n is already available. */
2557   /* The block input is used to distinguish different subexpressions.  Right
2558      now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
2559      subexpressions within a block. */
2560   if (get_opt_cse()) {
2561     n = identify (current_ir_graph->value_table, n);
2562   }
2563
2564   /* Some more constant expression evaluation. */
2565   iro = get_irn_opcode(n);
2566   if (get_opt_constant_folding() ||
2567       (iro == iro_Cond) ||
2568       (iro == iro_Proj))     /* Flags tested local. */
2569     n = transform_node (n);
2570
2571   /* Remove nodes with dead (Bad) input.
2572      Run always for transformation induced Bads.  */
2573   n = gigo (n);
2574
2575   /* Now we can verify the node, as it has no dead inputs any more. */
2576   irn_vrfy(n);
2577
2578   /* Now we have a legal, useful node. Enter it in hash table for cse.
2579      Blocks should be unique anyways.  (Except the successor of start:
2580      is cse with the start block!) */
2581   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block))
2582     n = identify_remember (current_ir_graph->value_table, n);
2583
2584   return n;
2585 }
2586
2587 /**
2588  * Wrapper for external use, set proper status bits after optimization.
2589  */
2590 ir_node *
2591 optimize_in_place (ir_node *n)
2592 {
2593   /* Handle graph state */
2594   assert(get_irg_phase_state(current_ir_graph) != phase_building);
2595
2596   if (get_opt_global_cse())
2597     set_irg_pinned(current_ir_graph, op_pin_state_floats);
2598   if (get_irg_outs_state(current_ir_graph) == outs_consistent)
2599     set_irg_outs_inconsistent(current_ir_graph);
2600
2601   /* Maybe we could also test whether optimizing the node can
2602      change the control graph. */
2603   if (get_irg_dom_state(current_ir_graph) == dom_consistent)
2604     set_irg_dom_inconsistent(current_ir_graph);
2605   return optimize_in_place_2 (n);
2606 }
2607
2608 /**
2609  * set the default ir op operations
2610  */
2611 ir_op *firm_set_default_operations(ir_op *op)
2612 {
2613   op = firm_set_default_computed_value(op);
2614   op = firm_set_default_equivalent_node(op);
2615   op = firm_set_default_transform_node(op);
2616   op = firm_set_default_node_cmp_attr(op);
2617   op = firm_set_default_get_type(op);
2618
2619   return op;
2620 }