6d862ab45ec4362812a84a6a8ae0565c46a34d3b
[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 # include "irnode_t.h"
18 # include "irgraph_t.h"
19 # include "irmode_t.h"
20 # include "iropt_t.h"
21 # include "ircons.h"
22 # include "irgmod.h"
23 # include "irvrfy.h"
24 # include "tv.h"
25 # include "dbginfo_t.h"
26 # include "iropt_dbg.h"
27 # include "irflag_t.h"
28 # include "firmstat.h"
29
30 /* Make types visible to allow most efficient access */
31 # include "entity_t.h"
32
33 /**
34  * Trivial INLINEable routine for copy propagation.
35  * Does follow Ids, needed to optimize INLINEd code.
36  */
37 static INLINE ir_node *
38 follow_Id (ir_node *n)
39 {
40   while (get_irn_op (n) == op_Id) n = get_Id_pred (n);
41   return n;
42 }
43
44 /**
45  * Returns the tarval of a Const node or tarval_bad for all other nodes.
46  */
47 static INLINE tarval *
48 value_of (ir_node *n)
49 {
50   if ((n != NULL) && (get_irn_op(n) == op_Const))
51     return get_Const_tarval(n); /* might return tarval_bad */
52   else
53     return tarval_bad;
54 }
55
56 static tarval *computed_value_Const(ir_node *n)
57 {
58     return get_Const_tarval(n);
59 }
60
61 static tarval *computed_value_SymConst(ir_node *n)
62 {
63   if ((get_SymConst_kind(n) == size) &&
64       (get_type_state(get_SymConst_type(n))) == layout_fixed)
65     return new_tarval_from_long (get_type_size(get_SymConst_type(n)), mode_Is);
66   return tarval_bad;
67 }
68
69 static tarval *computed_value_Add(ir_node *n)
70 {
71   ir_node *a = get_Add_left(n);
72   ir_node *b = get_Add_right(n);
73
74   tarval *ta = value_of(a);
75   tarval *tb = value_of(b);
76
77   if ((ta != tarval_bad) && (tb != tarval_bad)
78         && (get_irn_mode(a) == get_irn_mode(b))
79         && !(get_mode_sort(get_irn_mode(a)) == irms_reference)) {
80     return tarval_add(ta, tb);
81   }
82   return tarval_bad;
83 }
84
85 static tarval *computed_value_Sub(ir_node *n)
86 {
87   ir_node *a = get_Sub_left(n);
88   ir_node *b = get_Sub_right(n);
89
90   tarval *ta = value_of(a);
91   tarval *tb = value_of(b);
92
93   if ((ta != tarval_bad) && (tb != tarval_bad)
94         && (get_irn_mode(a) == get_irn_mode(b))
95         && !(get_mode_sort(get_irn_mode(a)) == irms_reference)) {
96     return tarval_sub(ta, tb);
97   }
98   return tarval_bad;
99 }
100
101 static tarval *computed_value_Minus(ir_node *n)
102 {
103   ir_node *a = get_Minus_op(n);
104   tarval *ta = value_of(a);
105
106   if ((ta != tarval_bad) && mode_is_signed(get_irn_mode(a)))
107     return tarval_neg(ta);
108
109   return tarval_bad;
110 }
111
112 static tarval *computed_value_Mul(ir_node *n)
113 {
114   ir_node *a = get_Mul_left(n);
115   ir_node *b = get_Mul_right(n);
116
117   tarval *ta = value_of(a);
118   tarval *tb = value_of(b);
119
120   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b))) {
121     return tarval_mul(ta, tb);
122   } else {
123     /* a*0 = 0 or 0*b = 0:
124        calls computed_value recursive and returns the 0 with proper
125        mode. */
126     tarval *v;
127
128     if ( ( ((v = ta) != tarval_bad)
129              && (v == get_mode_null(get_tarval_mode(v))) )
130       || ( ((v = tb) != tarval_bad)
131              && (v == get_mode_null(get_tarval_mode(v))) )) {
132         return v;
133     }
134   }
135   return tarval_bad;
136 }
137
138 static tarval *computed_value_Quot(ir_node *n)
139 {
140   ir_node *a = get_Quot_left(n);
141   ir_node *b = get_Quot_right(n);
142
143   tarval *ta = value_of(a);
144   tarval *tb = value_of(b);
145
146   /* This was missing in original implementation. Why? */
147   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b))) {
148     if (tb != get_mode_null(get_tarval_mode(tb)))   /* div by zero: return tarval_bad */
149       return tarval_quo(ta, tb);
150   }
151   return tarval_bad;
152 }
153
154 static tarval *computed_value_Div(ir_node *n)
155 {
156   ir_node *a = get_Div_left(n);
157   ir_node *b = get_Div_right(n);
158
159   tarval *ta = value_of(a);
160   tarval *tb = value_of(b);
161
162   /* This was missing in original implementation. Why? */
163   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b))) {
164     if (tb != get_mode_null(get_tarval_mode(tb)))   /* div by zero: return tarval_bad */
165       return tarval_div(ta, tb);
166   }
167   return tarval_bad;
168 }
169
170 static tarval *computed_value_Mod(ir_node *n)
171 {
172   ir_node *a = get_Mod_left(n);
173   ir_node *b = get_Mod_right(n);
174
175   tarval *ta = value_of(a);
176   tarval *tb = value_of(b);
177
178   /* This was missing in original implementation. Why? */
179   if ((ta != tarval_bad) && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b))) {
180     if (tb != get_mode_null(get_tarval_mode(tb)))   /* div by zero: return tarval_bad */
181       return tarval_mod(ta, tb);
182   }
183   return tarval_bad;
184 }
185
186 static tarval *computed_value_Abs(ir_node *n)
187 {
188   ir_node *a = get_Abs_op(n);
189   tarval *ta = value_of(a);
190
191   if (ta != tarval_bad)
192     return tarval_abs(ta);
193
194   return tarval_bad;
195 }
196
197 static tarval *computed_value_And(ir_node *n)
198 {
199   ir_node *a = get_And_left(n);
200   ir_node *b = get_And_right(n);
201
202   tarval *ta = value_of(a);
203   tarval *tb = value_of(b);
204
205   if ((ta != tarval_bad) && (tb != tarval_bad)) {
206     return tarval_and (ta, tb);
207   } else {
208     tarval *v;
209
210     if (   (tarval_classify ((v = computed_value (a))) == TV_CLASSIFY_NULL)
211         || (tarval_classify ((v = computed_value (b))) == TV_CLASSIFY_NULL)) {
212       return v;
213     }
214   }
215   return tarval_bad;
216 }
217
218 static tarval *computed_value_Or(ir_node *n)
219 {
220   ir_node *a = get_Or_left(n);
221   ir_node *b = get_Or_right(n);
222
223   tarval *ta = value_of(a);
224   tarval *tb = value_of(b);
225
226   if ((ta != tarval_bad) && (tb != tarval_bad)) {
227     return tarval_or (ta, tb);
228   } else {
229     tarval *v;
230     if (   (tarval_classify ((v = computed_value (a))) == TV_CLASSIFY_ALL_ONE)
231         || (tarval_classify ((v = computed_value (b))) == TV_CLASSIFY_ALL_ONE)) {
232       return v;
233     }
234   }
235   return tarval_bad;
236 }
237
238 static tarval *computed_value_Eor(ir_node *n)
239 {
240   ir_node *a = get_Eor_left(n);
241   ir_node *b = get_Eor_right(n);
242
243   tarval *ta = value_of(a);
244   tarval *tb = value_of(b);
245
246   if ((ta != tarval_bad) && (tb != tarval_bad)) {
247     return tarval_eor (ta, tb);
248   }
249   return tarval_bad;
250 }
251
252 static tarval *computed_value_Not(ir_node *n)
253 {
254   ir_node *a = get_Not_op(n);
255   tarval *ta = value_of(a);
256
257   if (ta != tarval_bad)
258     return tarval_not(ta);
259
260   return tarval_bad;
261 }
262
263 static tarval *computed_value_Shl(ir_node *n)
264 {
265   ir_node *a = get_Shl_left(n);
266   ir_node *b = get_Shl_right(n);
267
268   tarval *ta = value_of(a);
269   tarval *tb = value_of(b);
270
271   if ((ta != tarval_bad) && (tb != tarval_bad)) {
272     return tarval_shl (ta, tb);
273   }
274   return tarval_bad;
275 }
276
277 static tarval *computed_value_Shr(ir_node *n)
278 {
279   ir_node *a = get_Shr_left(n);
280   ir_node *b = get_Shr_right(n);
281
282   tarval *ta = value_of(a);
283   tarval *tb = value_of(b);
284
285   if ((ta != tarval_bad) && (tb != tarval_bad)) {
286     return tarval_shr (ta, tb);
287   }
288   return tarval_bad;
289 }
290
291 static tarval *computed_value_Shrs(ir_node *n)
292 {
293   ir_node *a = get_Shrs_left(n);
294   ir_node *b = get_Shrs_right(n);
295
296   tarval *ta = value_of(a);
297   tarval *tb = value_of(b);
298
299   if ((ta != tarval_bad) && (tb != tarval_bad)) {
300     return tarval_shrs (ta, tb);
301   }
302   return tarval_bad;
303 }
304
305 static tarval *computed_value_Rot(ir_node *n)
306 {
307   ir_node *a = get_Rot_left(n);
308   ir_node *b = get_Rot_right(n);
309
310   tarval *ta = value_of(a);
311   tarval *tb = value_of(b);
312
313   if ((ta != tarval_bad) && (tb != tarval_bad)) {
314     /* return tarval_rot (ta, tb); */
315   }
316   return tarval_bad;
317 }
318
319 static tarval *computed_value_Conv(ir_node *n)
320 {
321   ir_node *a = get_Conv_op(n);
322   tarval *ta = value_of(a);
323
324   if (ta != tarval_bad)
325     return tarval_convert_to(ta, get_irn_mode(n));
326
327   return tarval_bad;
328 }
329
330 static tarval *computed_value_Proj(ir_node *n)
331 {
332   ir_node *a = get_Proj_pred(n), *b;
333   ir_node *aa, *ab;
334
335   /* Optimize Cmp nodes.
336      This performs a first step of unreachable code elimination.
337      Proj can not be computed, but folding a Cmp above the Proj here is
338      not as wasteful as folding a Cmp into a Tuple of 16 Consts of which
339      only 1 is used.
340      There are several case where we can evaluate a Cmp node:
341      1. The nodes compared are both the same.  If we compare for
342         equal, greater equal, ... this will return true, else it
343         will return false.  This step relies on cse.
344      2. The predecessors of Cmp are target values.  We can evaluate
345         the Cmp.
346      3. The predecessors are Allocs or void* constants.  Allocs never
347         return NULL, they raise an exception.   Therefore we can predict
348         the Cmp result. */
349   if (get_irn_op(a) == op_Cmp) {
350     aa = get_Cmp_left(a);
351     ab = get_Cmp_right(a);
352
353     if (aa == ab) { /* 1.: */
354       /* This is a tric with the bits used for encoding the Cmp
355          Proj numbers, the following statement is not the same:
356       return new_tarval_from_long ((get_Proj_proj(n) == Eq), mode_b) */
357       return new_tarval_from_long ((get_Proj_proj(n) & Eq), mode_b);
358     } else {
359       tarval *taa = computed_value (aa);
360       tarval *tab = computed_value (ab);
361
362       if ((taa != tarval_bad) && (tab != tarval_bad)) { /* 2.: */
363         /* strange checks... */
364         pnc_number flags = tarval_cmp (taa, tab);
365         if (flags != False) {
366           return new_tarval_from_long (get_Proj_proj(n) & flags, mode_b);
367         }
368       } else {  /* check for 3.: */
369         ir_node *aaa = skip_nop(skip_Proj(aa));
370         ir_node *aba = skip_nop(skip_Proj(ab));
371
372         if (   (   (/* aa is ProjP and aaa is Alloc */
373                        (get_irn_op(aa) == op_Proj)
374                     && (mode_is_reference(get_irn_mode(aa)))
375                     && (get_irn_op(aaa) == op_Alloc))
376                 && (   (/* ab is constant void */
377                            (get_irn_op(ab) == op_Const)
378                         && (mode_is_reference(get_irn_mode(ab)))
379                         && (get_Const_tarval(ab) == get_mode_null(get_irn_mode(ab))))
380                     || (/* ab is other Alloc */
381                            (get_irn_op(ab) == op_Proj)
382                         && (mode_is_reference(get_irn_mode(ab)))
383                         && (get_irn_op(aba) == op_Alloc)
384                         && (aaa != aba))))
385             || (/* aa is void and aba is Alloc */
386                    (get_irn_op(aa) == op_Const)
387                 && (mode_is_reference(get_irn_mode(aa)))
388                 && (get_Const_tarval(aa) == get_mode_null(get_irn_mode(aa)))
389                 && (get_irn_op(ab) == op_Proj)
390                 && (mode_is_reference(get_irn_mode(ab)))
391                 && (get_irn_op(aba) == op_Alloc)))
392           /* 3.: */
393           return new_tarval_from_long (get_Proj_proj(n) & Ne, mode_b);
394       }
395     }
396   } else if (get_irn_op(a) == op_DivMod) {
397     tarval *tb = value_of(b = get_DivMod_right(a));
398     tarval *ta = value_of(a = get_DivMod_left(a));
399
400     if ((ta != tarval_bad)  && (tb != tarval_bad) && (get_irn_mode(a) == get_irn_mode(b))) {
401       if (tb == get_mode_null(get_tarval_mode(tb)))  /* div by zero: return tarval_bad */
402         return tarval_bad;
403       if (get_Proj_proj(n)== 0) /* Div */
404         return tarval_div(ta, tb);
405       else /* Mod */
406         return tarval_mod(ta, tb);
407     }
408   }
409   return tarval_bad;
410 }
411
412 /**
413  * If the parameter n can be computed, return its value, else tarval_bad.
414  * Performs constant folding.
415  *
416  * GL: Only if n is arithmetic operator?
417  */
418 tarval *computed_value(ir_node *n)
419 {
420   if (n->op->computed_value)
421     return n->op->computed_value(n);
422   return tarval_bad;
423 }
424
425 /**
426  * set the default computed_value evaluator
427  */
428 static ir_op *firm_set_default_computed_value(ir_op *op)
429 {
430 #define CASE(a)                                 \
431   case iro_##a:                                 \
432     op->computed_value  = computed_value_##a;   \
433     break
434
435   switch (op->code) {
436   CASE(Const);
437   CASE(SymConst);
438   CASE(Add);
439   CASE(Sub);
440   CASE(Minus);
441   CASE(Mul);
442   CASE(Quot);
443   CASE(Div);
444   CASE(Mod);
445   CASE(Abs);
446   CASE(And);
447   CASE(Or);
448   CASE(Eor);
449   CASE(Not);
450   CASE(Shl);
451   CASE(Shr);
452   CASE(Shrs);
453   CASE(Rot);
454   CASE(Conv);
455   CASE(Proj);
456   default:
457     op->computed_value  = NULL;
458   }
459
460   return op;
461 #undef CASE
462 }
463
464 #if 0
465 /* returns 1 if the a and b are pointers to different locations. */
466 static bool
467 different_identity (ir_node *a, ir_node *b)
468 {
469   assert (mode_is_reference(get_irn_mode (a))
470           && mode_is_reference(get_irn_mode (b)));
471
472   if (get_irn_op (a) == op_Proj && get_irn_op(b) == op_Proj) {
473     ir_node *a1 = get_Proj_pred (a);
474     ir_node *b1 = get_Proj_pred (b);
475     if (a1 != b1 && get_irn_op (a1) == op_Alloc
476                 && get_irn_op (b1) == op_Alloc)
477       return 1;
478   }
479   return 0;
480 }
481 #endif
482
483 static ir_node *equivalent_node_Block(ir_node *n)
484 {
485   ir_node *oldn = n;
486
487   /* The Block constructor does not call optimize, but mature_block
488      calls the optimization. */
489   assert(get_Block_matured(n));
490
491   /* Straightening: a single entry Block following a single exit Block
492      can be merged, if it is not the Start block. */
493   /* !!! Beware, all Phi-nodes of n must have been optimized away.
494      This should be true, as the block is matured before optimize is called.
495      But what about Phi-cycles with the Phi0/Id that could not be resolved?
496      Remaining Phi nodes are just Ids. */
497   if ((get_Block_n_cfgpreds(n) == 1) &&
498       (get_irn_op(get_Block_cfgpred(n, 0)) == op_Jmp) &&
499       (get_opt_control_flow_straightening())) {
500     n = get_nodes_Block(get_Block_cfgpred(n, 0));
501     if (n == oldn)
502       /* Jmp jumps into the block it is in -- deal self cycle. */
503       n = new_Bad();                                                   DBG_OPT_STG;
504
505   } else if ((get_Block_n_cfgpreds(n) == 2) &&
506              (get_opt_control_flow_weak_simplification())) {
507     /* Test whether Cond jumps twice to this block
508        @@@ we could do this also with two loops finding two preds from several ones. */
509     ir_node *a = get_Block_cfgpred(n, 0);
510     ir_node *b = get_Block_cfgpred(n, 1);
511
512     if ((get_irn_op(a) == op_Proj) &&
513         (get_irn_op(b) == op_Proj) &&
514         (get_Proj_pred(a) == get_Proj_pred(b)) &&
515         (get_irn_op(get_Proj_pred(a)) == op_Cond) &&
516         (get_irn_mode(get_Cond_selector(get_Proj_pred(a))) == mode_b)) {
517       /* Also a single entry Block following a single exit Block.  Phis have
518          twice the same operand and will be optimized away. */
519       n = get_nodes_Block(a);                                         DBG_OPT_IFSIM;
520     }
521   } else if (get_opt_unreachable_code() &&
522              (n != current_ir_graph->start_block) &&
523              (n != current_ir_graph->end_block)     ) {
524     int i;
525     /* If all inputs are dead, this block is dead too, except if it is
526        the start or end block.  This is a step of unreachable code
527        elimination */
528     for (i = 0; i < get_Block_n_cfgpreds(n); i++) {
529       if (!is_Bad(get_Block_cfgpred(n, i))) break;
530     }
531     if (i == get_Block_n_cfgpreds(n))
532       n = new_Bad();
533   }
534
535   return n;
536 }
537
538 static ir_node *equivalent_node_Jmp(ir_node *n)
539 {
540   /* GL: Why not same for op_Raise?? */
541   /* unreachable code elimination */
542   if (is_Bad(get_nodes_Block(n)))
543     n = new_Bad();
544
545   return n;
546 }
547
548 static ir_node *equivalent_node_Cond(ir_node *n)
549 {
550   /* We do not evaluate Cond here as we replace it by a new node, a Jmp.
551      See cases for iro_Cond and iro_Proj in transform_node. */
552   return n;
553 }
554
555 static ir_node *equivalent_node_Or(ir_node *n)
556 {
557   ir_node *oldn = n;
558
559   ir_node *a = get_Or_left(n);
560   ir_node *b = get_Or_right(n);
561
562   /* remove a v a */
563   if (a == b) {
564     n = a;                                                             DBG_OPT_ALGSIM1;
565   }
566
567   return n;
568 }
569
570 /**
571  * optimize operations that are commutative and have neutral 0.
572  */
573 static ir_node *equivalent_node_neutral_zero(ir_node *n)
574 {
575   ir_node *oldn = n;
576
577   ir_node *a = get_binop_left(n);
578   ir_node *b = get_binop_right(n);
579
580   tarval *tv;
581   ir_node *on;
582
583   /* After running compute_node there is only one constant predecessor.
584      Find this predecessors value and remember the other node: */
585   if ((tv = computed_value (a)) != tarval_bad) {
586     on = b;
587   } else if ((tv = computed_value (b)) != tarval_bad) {
588     on = a;
589   } else
590     return n;
591
592   /* If this predecessors constant value is zero, the operation is
593      unnecessary. Remove it: */
594   if (tarval_classify (tv) == TV_CLASSIFY_NULL) {
595     n = on;                                                             DBG_OPT_ALGSIM1;
596   }
597
598   return n;
599 }
600
601 static ir_node *equivalent_node_Add(ir_node *n)
602 {
603   return equivalent_node_neutral_zero(n);
604 }
605
606 static ir_node *equivalent_node_Eor(ir_node *n)
607 {
608   return equivalent_node_neutral_zero(n);
609 }
610
611 /**
612  * optimize operations that are not commutative but have neutral 0 on left.
613  * Test only one predecessor.
614  */
615 static ir_node *equivalent_node_left_zero(ir_node *n)
616 {
617   ir_node *oldn = n;
618
619   ir_node *a = get_binop_left(n);
620   ir_node *b = get_binop_right(n);
621
622   if (tarval_classify (computed_value (b)) == TV_CLASSIFY_NULL) {
623     n = a;                                                              DBG_OPT_ALGSIM1;
624   }
625
626   return n;
627 }
628
629 static ir_node *equivalent_node_Sub(ir_node *n)
630 {
631   return equivalent_node_left_zero(n);
632 }
633
634 static ir_node *equivalent_node_Shl(ir_node *n)
635 {
636   return equivalent_node_left_zero(n);
637 }
638
639 static ir_node *equivalent_node_Shr(ir_node *n)
640 {
641   return equivalent_node_left_zero(n);
642 }
643
644 static ir_node *equivalent_node_Shrs(ir_node *n)
645 {
646   return equivalent_node_left_zero(n);
647 }
648
649 static ir_node *equivalent_node_Rot(ir_node *n)
650 {
651   return equivalent_node_left_zero(n);
652 }
653
654 static ir_node *equivalent_node_symmetric_unop(ir_node *n)
655 {
656   ir_node *oldn = n;
657
658   /* optimize symmetric unop */
659   if (get_irn_op(get_unop_op(n)) == get_irn_op(n)) {
660     n = get_unop_op(get_unop_op(n));                                    DBG_OPT_ALGSIM2;
661   }
662   return n;
663 }
664
665 static ir_node *equivalent_node_Not(ir_node *n)
666 {
667   /* NotNot x == x */
668   return equivalent_node_symmetric_unop(n);
669 }
670
671 static ir_node *equivalent_node_Minus(ir_node *n)
672 {
673   /* --x == x */  /* ??? Is this possible or can --x raise an
674                          out of bounds exception if min =! max? */
675   return equivalent_node_symmetric_unop(n);
676 }
677
678 static ir_node *equivalent_node_Mul(ir_node *n)
679 {
680   ir_node *oldn = n;
681
682   ir_node *a = get_Mul_left(n);
683   ir_node *b = get_Mul_right(n);
684
685   /* Mul is commutative and has again an other neutral element. */
686   if (tarval_classify (computed_value (a)) == TV_CLASSIFY_ONE) {
687     n = b;                                                              DBG_OPT_ALGSIM1;
688   } else if (tarval_classify (computed_value (b)) == TV_CLASSIFY_ONE) {
689     n = a;                                                              DBG_OPT_ALGSIM1;
690   }
691   return n;
692 }
693
694 static ir_node *equivalent_node_Div(ir_node *n)
695 {
696   ir_node *a = get_Div_left(n);
697   ir_node *b = get_Div_right(n);
698
699   /* Div is not commutative. */
700   if (tarval_classify (computed_value (b)) == TV_CLASSIFY_ONE) { /* div(x, 1) == x */
701     /* Turn Div into a tuple (mem, bad, a) */
702     ir_node *mem = get_Div_mem(n);
703     turn_into_tuple(n, 3);
704     set_Tuple_pred(n, pn_Div_M,        mem);
705     set_Tuple_pred(n, pn_Div_X_except, new_Bad());      /* no exception */
706     set_Tuple_pred(n, pn_Div_res,      a);
707   }
708   return n;
709 }
710
711 static ir_node *equivalent_node_And(ir_node *n)
712 {
713   ir_node *oldn = n;
714
715   ir_node *a = get_And_left(n);
716   ir_node *b = get_And_right(n);
717
718   if (a == b) {
719     n = a;    /* And has it's own neutral element */
720   } else if (tarval_classify (computed_value (a)) == TV_CLASSIFY_ALL_ONE) {
721     n = b;
722   } else if (tarval_classify (computed_value (b)) == TV_CLASSIFY_ALL_ONE) {
723     n = a;
724   }
725   if (n != oldn)                                                        DBG_OPT_ALGSIM1;
726   return n;
727 }
728
729 static ir_node *equivalent_node_Conv(ir_node *n)
730 {
731   ir_node *oldn = n;
732   ir_node *a = get_Conv_op(n);
733   ir_node *b;
734
735   ir_mode *n_mode = get_irn_mode(n);
736   ir_mode *a_mode = get_irn_mode(a);
737
738   if (n_mode == a_mode) { /* No Conv necessary */
739     n = a;                                                              DBG_OPT_ALGSIM3;
740   } else if (get_irn_op(a) == op_Conv) { /* Conv(Conv(b)) */
741     ir_mode *b_mode;
742
743     b = get_Conv_op(a);
744     n_mode = get_irn_mode(n);
745     b_mode = get_irn_mode(b);
746
747     if (n_mode == b_mode) {
748       if (n_mode == mode_b) {
749         n = b;  /* Convb(Conv*(xxxb(...))) == xxxb(...) */              DBG_OPT_ALGSIM1;
750       }
751       else if (mode_is_int(n_mode) || mode_is_character(n_mode)) {
752         if (smaller_mode(b_mode, a_mode)){
753           n = b;        /* ConvS(ConvL(xxxS(...))) == xxxS(...) */      DBG_OPT_ALGSIM1;
754         }
755       }
756     }
757   }
758   return n;
759 }
760
761 static ir_node *equivalent_node_Phi(ir_node *n)
762 {
763   /* Several optimizations:
764      - no Phi in start block.
765      - remove Id operators that are inputs to Phi
766      - fold Phi-nodes, iff they have only one predecessor except
767              themselves.
768   */
769   int i, n_preds;
770
771   ir_node *oldn = n;
772   ir_node *block = NULL;     /* to shutup gcc */
773   ir_node *first_val = NULL; /* to shutup gcc */
774   ir_node *scnd_val = NULL;  /* to shutup gcc */
775
776   if (!get_opt_normalize()) return n;
777
778   n_preds = get_Phi_n_preds(n);
779
780   block = get_nodes_Block(n);
781   /* @@@ fliegt 'raus, sollte aber doch immer wahr sein!!!
782      assert(get_irn_arity(block) == n_preds && "phi in wrong block!"); */
783   if ((is_Bad(block)) ||                         /* Control dead */
784       (block == current_ir_graph->start_block))  /* There should be no Phi nodes */
785     return new_Bad();                        /* in the Start Block. */
786
787   if (n_preds == 0) return n;           /* Phi of dead Region without predecessors. */
788
789 #if 0
790   /* first we test for a special case: */
791   /* Confirm is a special node fixing additional information for a
792      value that is known at a certain point.  This is useful for
793      dataflow analysis. */
794   if (n_preds == 2) {
795     ir_node *a = follow_Id (get_Phi_pred(n, 0));
796     ir_node *b = follow_Id (get_Phi_pred(n, 1));
797     if (   (get_irn_op(a) == op_Confirm)
798         && (get_irn_op(b) == op_Confirm)
799         && follow_Id (get_irn_n(a, 0) == get_irn_n(b, 0))
800         && (get_irn_n(a, 1) == get_irn_n (b, 1))
801         && (a->data.num == (~b->data.num & irpn_True) )) {
802       return get_irn_n(a, 0);
803     }
804   }
805 #endif
806
807   /* Find first non-self-referencing input */
808   for (i = 0;  i < n_preds;  ++i) {
809     first_val = follow_Id(get_Phi_pred(n, i));
810     /* skip Id's */
811     set_Phi_pred(n, i, first_val);
812     if (   (first_val != n)                            /* not self pointer */
813         && (get_irn_op(first_val) != op_Bad)           /* value not dead */
814         && !(is_Bad (get_Block_cfgpred(block, i))) ) { /* not dead control flow */
815       break;                         /* then found first value. */
816     }
817   }
818
819   /* A totally Bad or self-referencing Phi (we didn't break the above loop) */
820   if (i >= n_preds) { return new_Bad(); }
821
822   scnd_val = NULL;
823
824   /* follow_Id () for rest of inputs, determine if any of these
825      are non-self-referencing */
826   while (++i < n_preds) {
827     scnd_val = follow_Id(get_Phi_pred(n, i));
828     /* skip Id's */
829     set_Phi_pred(n, i, scnd_val);
830     if (   (scnd_val != n)
831         && (scnd_val != first_val)
832         && (get_irn_op(scnd_val) != op_Bad)
833         && !(is_Bad (get_Block_cfgpred(block, i))) ) {
834       break;
835     }
836   }
837
838   /* Fold, if no multiple distinct non-self-referencing inputs */
839   if (i >= n_preds) {
840     n = first_val;                                     DBG_OPT_PHI;
841   } else {
842     /* skip the remaining Ids. */
843     while (++i < n_preds) {
844       set_Phi_pred(n, i, follow_Id(get_Phi_pred(n, i)));
845     }
846   }
847   return n;
848 }
849
850 static ir_node *equivalent_node_Load(ir_node *n)
851 {
852 #if 0  /* Is an illegal transformation: different nodes can
853           represent the same pointer value!! */
854  ir_node *a = skip_Proj(get_Load_mem(n));
855  ir_node *b = get_Load_ptr(n);
856
857  if (get_irn_op(a) == op_Store) {
858    if ( different_identity (b, get_Store_ptr(a))) {
859          /* load and store use different pointers, therefore load
860                 needs not take store's memory but the state before. */
861          set_Load_mem (n, get_Store_mem(a));
862    } else if (( 0 /* ???didn't get cryptic test that returns 0 */ )) {
863    }
864  }
865 #endif
866  return n;
867 }
868
869 static ir_node *equivalent_node_Store(ir_node *n)
870 {
871   ir_node *oldn = n;
872
873   /* remove unnecessary store. */
874   ir_node *a = skip_Proj(get_Store_mem(n));
875   ir_node *b = get_Store_ptr(n);
876   ir_node *c = skip_Proj(get_Store_value(n));
877
878   if (get_irn_op(a) == op_Store
879       && get_Store_ptr(a) == b
880       && skip_Proj(get_Store_value(a)) == c) {
881     /* We have twice exactly the same store -- a write after write. */
882     n = a;                                                         DBG_OPT_WAW;
883   } else if (get_irn_op(c) == op_Load
884              && (a == c || skip_Proj(get_Load_mem(c)) == a)
885              && get_Load_ptr(c) == b ) {
886     /* We just loaded the value from the same memory, i.e., the store
887        doesn't change the memory -- a write after read. */
888     a = get_Store_mem(n);
889     turn_into_tuple(n, 2);
890     set_Tuple_pred(n, pn_Store_M,        a);
891     set_Tuple_pred(n, pn_Store_X_except, new_Bad());               DBG_OPT_WAR;
892   }
893   return n;
894 }
895
896 static ir_node *equivalent_node_Proj(ir_node *n)
897 {
898   ir_node *oldn = n;
899
900   ir_node *a = get_Proj_pred(n);
901
902   if ( get_irn_op(a) == op_Tuple) {
903     /* Remove the Tuple/Proj combination. */
904     if ( get_Proj_proj(n) <= get_Tuple_n_preds(a) ) {
905       n = get_Tuple_pred(a, get_Proj_proj(n));                     DBG_OPT_TUPLE;
906     } else {
907       assert(0); /* This should not happen! */
908       n = new_Bad();
909     }
910   } else if (get_irn_mode(n) == mode_X &&
911              is_Bad(get_nodes_Block(n))) {
912     /* Remove dead control flow -- early gigo. */
913     n = new_Bad();
914   }
915   return n;
916 }
917
918 static ir_node *equivalent_node_Id(ir_node *n)
919 {
920   ir_node *oldn = n;
921
922   n = follow_Id (n);                                                 DBG_OPT_ID;
923   return n;
924 }
925
926 /*
927 case iro_Mod, Quot, DivMod
928   DivMod allocates new nodes --> it's treated in transform node.
929   What about Quot, DivMod?
930 */
931
932 /**
933  * equivalent_node() returns a node equivalent to input n. It skips all nodes that
934  * perform no actual computation, as, e.g., the Id nodes.  It does not create
935  * new nodes.  It is therefore safe to free n if the node returned is not n.
936  * If a node returns a Tuple we can not just skip it.  If the size of the
937  * in array fits, we transform n into a tuple (e.g., Div).
938  */
939 ir_node *
940 equivalent_node (ir_node *n)
941 {
942   if (n->op->equivalent_node)
943     return n->op->equivalent_node(n);
944   return n;
945 }
946
947 /**
948  * set the default equivalent node operation
949  */
950 static ir_op *firm_set_default_equivalent_node(ir_op *op)
951 {
952 #define CASE(a)                                 \
953   case iro_##a:                                 \
954     op->equivalent_node  = equivalent_node_##a; \
955     break
956
957   switch (op->code) {
958   CASE(Block);
959   CASE(Jmp);
960   CASE(Cond);
961   CASE(Or);
962   CASE(Add);
963   CASE(Eor);
964   CASE(Sub);
965   CASE(Shl);
966   CASE(Shr);
967   CASE(Shrs);
968   CASE(Rot);
969   CASE(Not);
970   CASE(Minus);
971   CASE(Mul);
972   CASE(Div);
973   CASE(And);
974   CASE(Conv);
975   CASE(Phi);
976   CASE(Load);
977   CASE(Store);
978   CASE(Proj);
979   CASE(Id);
980   default:
981     op->equivalent_node  = NULL;
982   }
983
984   return op;
985 #undef CASE
986 }
987
988 /**
989  * Do node specific optimizations of nodes predecessors.
990  */
991 static void
992 optimize_preds(ir_node *n) {
993   ir_node *a = NULL, *b = NULL;
994
995   /* get the operands we will work on for simple cases. */
996   if (is_binop(n)) {
997     a = get_binop_left(n);
998     b = get_binop_right(n);
999   } else if (is_unop(n)) {
1000     a = get_unop_op(n);
1001   }
1002
1003   switch (get_irn_opcode(n)) {
1004
1005   case iro_Cmp:
1006     /* We don't want Cast as input to Cmp. */
1007     if (get_irn_op(a) == op_Cast) {
1008       a = get_Cast_op(a);
1009       set_Cmp_left(n, a);
1010     }
1011     if (get_irn_op(b) == op_Cast) {
1012       b = get_Cast_op(b);
1013       set_Cmp_right(n, b);
1014     }
1015     break;
1016
1017   default: break;
1018   } /* end switch */
1019 }
1020
1021 static ir_node *transform_node_Div(ir_node *n)
1022 {
1023   tarval *ta = computed_value(n);
1024
1025   if (ta != tarval_bad) {
1026     /* Turn Div into a tuple (mem, bad, value) */
1027     ir_node *mem = get_Div_mem(n);
1028
1029     turn_into_tuple(n, 3);
1030     set_Tuple_pred(n, pn_Div_M, mem);
1031     set_Tuple_pred(n, pn_Div_X_except, new_Bad());
1032     set_Tuple_pred(n, pn_Div_res, new_Const(get_tarval_mode(ta), ta));
1033   }
1034   return n;
1035 }
1036
1037 static ir_node *transform_node_Mod(ir_node *n)
1038 {
1039   tarval *ta = computed_value(n);
1040
1041   if (ta != tarval_bad) {
1042     /* Turn Mod into a tuple (mem, bad, value) */
1043     ir_node *mem = get_Mod_mem(n);
1044     turn_into_tuple(n, 3);
1045     set_Tuple_pred(n, pn_Mod_M, mem);
1046     set_Tuple_pred(n, pn_Mod_X_except, new_Bad());
1047     set_Tuple_pred(n, pn_Mod_res, new_Const(get_tarval_mode(ta), ta));
1048   }
1049   return n;
1050 }
1051
1052 static ir_node *transform_node_DivMod(ir_node *n)
1053 {
1054   int evaluated = 0;
1055
1056   ir_node *a = get_DivMod_left(n);
1057   ir_node *b = get_DivMod_right(n);
1058   ir_mode *mode = get_irn_mode(a);
1059
1060   if (!(mode_is_int(mode) && mode_is_int(get_irn_mode(b))))
1061     return n;
1062
1063   if (a == b) {
1064     a = new_Const(mode, get_mode_one(mode));
1065     b = new_Const(mode, get_mode_null(mode));
1066     evaluated = 1;
1067   } else {
1068     tarval *ta = value_of(a);
1069     tarval *tb = value_of(b);
1070
1071     if (tb != tarval_bad) {
1072       if (tb == get_mode_one(get_tarval_mode(tb))) {
1073         b = new_Const (mode, get_mode_null(mode));
1074         evaluated = 1;
1075       } else if (ta != tarval_bad) {
1076         tarval *resa, *resb;
1077         resa = tarval_div (ta, tb);
1078         if (resa == tarval_bad) return n; /* Causes exception!!! Model by replacing through
1079                                           Jmp for X result!? */
1080         resb = tarval_mod (ta, tb);
1081         if (resb == tarval_bad) return n; /* Causes exception! */
1082         a = new_Const (mode, resa);
1083         b = new_Const (mode, resb);
1084         evaluated = 1;
1085       }
1086     } else if (ta == get_mode_null(mode)) {
1087       b = a;
1088       evaluated = 1;
1089     }
1090   }
1091   if (evaluated) { /* replace by tuple */
1092     ir_node *mem = get_DivMod_mem(n);
1093     turn_into_tuple(n, 4);
1094     set_Tuple_pred(n, pn_DivMod_M,        mem);
1095     set_Tuple_pred(n, pn_DivMod_X_except, new_Bad());  /* no exception */
1096     set_Tuple_pred(n, pn_DivMod_res_div,  a);
1097     set_Tuple_pred(n, pn_DivMod_res_mod,  b);
1098     assert(get_nodes_Block(n));
1099   }
1100
1101   return n;
1102 }
1103
1104 static ir_node *transform_node_Cond(ir_node *n)
1105 {
1106   /* Replace the Cond by a Jmp if it branches on a constant
1107      condition. */
1108   ir_node *jmp;
1109   ir_node *a = get_Cond_selector(n);
1110   tarval *ta = value_of(a);
1111
1112   if ((ta != tarval_bad) &&
1113       (get_irn_mode(a) == mode_b) &&
1114       (get_opt_unreachable_code())) {
1115     /* It's a boolean Cond, branching on a boolean constant.
1116                Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */
1117     jmp = new_r_Jmp(current_ir_graph, get_nodes_Block(n));
1118     turn_into_tuple(n, 2);
1119     if (ta == tarval_b_true) {
1120       set_Tuple_pred(n, pn_Cond_false, new_Bad());
1121       set_Tuple_pred(n, pn_Cond_true, jmp);
1122     } else {
1123       set_Tuple_pred(n, pn_Cond_false, jmp);
1124       set_Tuple_pred(n, pn_Cond_true, new_Bad());
1125     }
1126     /* We might generate an endless loop, so keep it alive. */
1127     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_Block(n));
1128   } else if ((ta != tarval_bad) &&
1129              (get_irn_mode(a) == mode_Iu) &&
1130              (get_Cond_kind(n) == dense) &&
1131              (get_opt_unreachable_code())) {
1132     /* I don't want to allow Tuples smaller than the biggest Proj.
1133        Also this tuple might get really big...
1134        I generate the Jmp here, and remember it in link.  Link is used
1135        when optimizing Proj. */
1136     set_irn_link(n, new_r_Jmp(current_ir_graph, get_nodes_Block(n)));
1137     /* We might generate an endless loop, so keep it alive. */
1138     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_Block(n));
1139   } else if ((get_irn_op(a) == op_Eor)
1140              && (get_irn_mode(a) == mode_b)
1141              && (tarval_classify(computed_value(get_Eor_right(a))) == TV_CLASSIFY_ONE)) {
1142     /* The Eor is a negate.  Generate a new Cond without the negate,
1143        simulate the negate by exchanging the results. */
1144     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_Block(n),
1145                                get_Eor_left(a)));
1146   } else if ((get_irn_op(a) == op_Not)
1147              && (get_irn_mode(a) == mode_b)) {
1148     /* A Not before the Cond.  Generate a new Cond without the Not,
1149        simulate the Not by exchanging the results. */
1150     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_Block(n),
1151                                get_Not_op(a)));
1152   }
1153   return n;
1154 }
1155
1156 static ir_node *transform_node_Eor(ir_node *n)
1157 {
1158   ir_node *a = get_Eor_left(n);
1159   ir_node *b = get_Eor_right(n);
1160
1161   if ((get_irn_mode(n) == mode_b)
1162       && (get_irn_op(a) == op_Proj)
1163       && (get_irn_mode(a) == mode_b)
1164       && (tarval_classify (computed_value (b)) == TV_CLASSIFY_ONE)
1165       && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
1166     /* The Eor negates a Cmp. The Cmp has the negated result anyways! */
1167     n = new_r_Proj(current_ir_graph, get_nodes_Block(n), get_Proj_pred(a),
1168                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1169   else if ((get_irn_mode(n) == mode_b)
1170            && (tarval_classify (computed_value (b)) == TV_CLASSIFY_ONE))
1171     /* The Eor is a Not. Replace it by a Not. */
1172     /*   ????!!!Extend to bitfield 1111111. */
1173     n = new_r_Not(current_ir_graph, get_nodes_Block(n), a, mode_b);
1174
1175   return n;
1176 }
1177
1178 static ir_node *transform_node_Not(ir_node *n)
1179 {
1180   ir_node *a = get_Not_op(n);
1181
1182   if (   (get_irn_mode(n) == mode_b)
1183       && (get_irn_op(a) == op_Proj)
1184       && (get_irn_mode(a) == mode_b)
1185       && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
1186     /* We negate a Cmp. The Cmp has the negated result anyways! */
1187     n = new_r_Proj(current_ir_graph, get_nodes_Block(n), get_Proj_pred(a),
1188                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1189
1190   return n;
1191 }
1192
1193
1194 /**
1195  * Tries several [inplace] [optimizing] transformations and returns an
1196  * equivalent node.  The difference to equivalent_node() is that these
1197  * transformations _do_ generate new nodes, and thus the old node must
1198  * not be freed even if the equivalent node isn't the old one.
1199  */
1200 static ir_node *transform_node(ir_node *n)
1201 {
1202   if (n->op->transform_node)
1203     n = n->op->transform_node(n);
1204   return n;
1205 }
1206
1207 /**
1208  * set the default transform node operation
1209  */
1210 static ir_op *firm_set_default_transform_node(ir_op *op)
1211 {
1212 #define CASE(a)                                 \
1213   case iro_##a:                                 \
1214     op->transform_node  = transform_node_##a;   \
1215     break
1216
1217   switch (op->code) {
1218   CASE(Div);
1219   CASE(Mod);
1220   CASE(DivMod);
1221   CASE(Cond);
1222   CASE(Eor);
1223   CASE(Not);
1224   default:
1225     op->transform_node  = NULL;
1226   }
1227
1228   return op;
1229 #undef CASE
1230 }
1231
1232
1233 /* **************** Common Subexpression Elimination **************** */
1234
1235 /** The size of the hash table used, should estimate the number of nodes
1236     in a graph. */
1237 #define N_IR_NODES 512
1238
1239 static int node_cmp_attr_Const(ir_node *a, ir_node *b)
1240 {
1241   return (get_Const_tarval(a) != get_Const_tarval(b))
1242       || (get_Const_type(a) != get_Const_type(b));
1243 }
1244
1245 static int node_cmp_attr_Proj(ir_node *a, ir_node *b)
1246 {
1247     return get_irn_proj_attr (a) != get_irn_proj_attr (b);
1248 }
1249
1250 static int node_cmp_attr_Filter(ir_node *a, ir_node *b)
1251 {
1252     return get_Filter_proj(a) != get_Filter_proj(b);
1253 }
1254
1255 static int node_cmp_attr_Alloc(ir_node *a, ir_node *b)
1256 {
1257     return (get_irn_alloc_attr(a).where != get_irn_alloc_attr(b).where)
1258       || (get_irn_alloc_attr(a).type != get_irn_alloc_attr(b).type);
1259 }
1260
1261 static int node_cmp_attr_Free(ir_node *a, ir_node *b)
1262 {
1263     return (get_irn_free_attr(a) != get_irn_free_attr(b));
1264 }
1265
1266 static int node_cmp_attr_SymConst(ir_node *a, ir_node *b)
1267 {
1268     return (get_irn_symconst_attr(a).num != get_irn_symconst_attr(b).num)
1269       || (get_irn_symconst_attr(a).tori.typ != get_irn_symconst_attr(b).tori.typ);
1270 }
1271
1272 static int node_cmp_attr_Call(ir_node *a, ir_node *b)
1273 {
1274     return (get_irn_call_attr(a) != get_irn_call_attr(b));
1275 }
1276
1277 static int node_cmp_attr_FuncCall(ir_node *a, ir_node *b)
1278 {
1279     return (get_irn_funccall_attr(a) != get_irn_funccall_attr(b));
1280 }
1281
1282 static int node_cmp_attr_Sel(ir_node *a, ir_node *b)
1283 {
1284     return (get_irn_sel_attr(a).ent->kind != get_irn_sel_attr(b).ent->kind)
1285       || (get_irn_sel_attr(a).ent->name != get_irn_sel_attr(b).ent->name)
1286       || (get_irn_sel_attr(a).ent->owner != get_irn_sel_attr(b).ent->owner)
1287       || (get_irn_sel_attr(a).ent->ld_name != get_irn_sel_attr(b).ent->ld_name)
1288       || (get_irn_sel_attr(a).ent->type != get_irn_sel_attr(b).ent->type);
1289 }
1290
1291 static int node_cmp_attr_Phi(ir_node *a, ir_node *b)
1292 {
1293     return get_irn_phi_attr (a) != get_irn_phi_attr (b);
1294 }
1295
1296 static int node_cmp_attr_Cast(ir_node *a, ir_node *b)
1297 {
1298     return get_Cast_type(a) != get_Cast_type(b);
1299 }
1300
1301 /**
1302  * set the default node attribute compare operation
1303  */
1304 static ir_op *firm_set_default_node_cmp_attr(ir_op *op)
1305 {
1306 #define CASE(a)                                 \
1307   case iro_##a:                                 \
1308     op->node_cmp_attr  = node_cmp_attr_##a;     \
1309     break
1310
1311   switch (op->code) {
1312   CASE(Const);
1313   CASE(Proj);
1314   CASE(Filter);
1315   CASE(Alloc);
1316   CASE(Free);
1317   CASE(SymConst);
1318   CASE(Call);
1319   CASE(FuncCall);
1320   CASE(Sel);
1321   CASE(Phi);
1322   CASE(Cast);
1323   default:
1324     op->node_cmp_attr  = NULL;
1325   }
1326
1327   return op;
1328 #undef CASE
1329 }
1330
1331 /**
1332  * Compare function for two nodes in the hash table. Gets two
1333  * nodes as parameters.  Returns 0 if the nodes are a cse.
1334  */
1335 static int
1336 vt_cmp (const void *elt, const void *key)
1337 {
1338   ir_node *a, *b;
1339   int i, irn_arity_a;
1340
1341   a = (void *)elt;
1342   b = (void *)key;
1343
1344   if (a == b) return 0;
1345
1346   if ((get_irn_op(a) != get_irn_op(b)) ||
1347       (get_irn_mode(a) != get_irn_mode(b))) return 1;
1348
1349   /* compare if a's in and b's in are equal */
1350   irn_arity_a = get_irn_arity (a);
1351   if (irn_arity_a != get_irn_arity(b))
1352     return 1;
1353
1354   /* for block-local cse and pinned nodes: */
1355   if (!get_opt_global_cse() || (get_op_pinned(get_irn_op(a)) == pinned)) {
1356     if (get_irn_n(a, -1) != get_irn_n(b, -1))
1357       return 1;
1358   }
1359
1360   /* compare a->in[0..ins] with b->in[0..ins] */
1361   for (i = 0; i < irn_arity_a; i++)
1362     if (get_irn_n(a, i) != get_irn_n(b, i))
1363       return 1;
1364
1365   /*
1366    * here, we already now that the nodes are identical except their
1367    * attributes
1368    */
1369   if (a->op->node_cmp_attr)
1370     return a->op->node_cmp_attr(a, b);
1371
1372   return 0;
1373 }
1374
1375 /**
1376  * Calculate a hash value of a node.
1377  */
1378 static unsigned
1379 ir_node_hash (ir_node *node)
1380 {
1381   unsigned h;
1382   int i, irn_arity;
1383
1384   /* hash table value = 9*(9*(9*(9*(9*arity+in[0])+in[1])+ ...)+mode)+code */
1385   h = irn_arity = get_irn_arity(node);
1386
1387   /* consider all in nodes... except the block. */
1388   for (i = 0;  i < irn_arity;  i++) {
1389     h = 9*h + (unsigned long)get_irn_n(node, i);
1390   }
1391
1392   /* ...mode,... */
1393   h = 9*h + (unsigned long) get_irn_mode (node);
1394   /* ...and code */
1395   h = 9*h + (unsigned long) get_irn_op (node);
1396
1397   return h;
1398 }
1399
1400 pset *
1401 new_identities (void)
1402 {
1403   return new_pset (vt_cmp, N_IR_NODES);
1404 }
1405
1406 void
1407 del_identities (pset *value_table)
1408 {
1409   del_pset (value_table);
1410 }
1411
1412 /**
1413  * Return the canonical node computing the same value as n.
1414  * Looks up the node in a hash table.
1415  */
1416 static INLINE ir_node *
1417 identify (pset *value_table, ir_node *n)
1418 {
1419   ir_node *o = NULL;
1420
1421   if (!value_table) return n;
1422
1423   /* TODO: use a generic commutative attribute */
1424   if (get_opt_reassociation()) {
1425     if (is_op_commutative(get_irn_op(n))) {
1426       /* for commutative operators perform  a OP b == b OP a */
1427       if (get_binop_left(n) > get_binop_right(n)) {
1428         ir_node *h = get_binop_left(n);
1429         set_binop_left(n, get_binop_right(n));
1430         set_binop_right(n, h);
1431       }
1432     }
1433   }
1434
1435   o = pset_find (value_table, n, ir_node_hash (n));
1436   if (!o) return n;
1437
1438   return o;
1439 }
1440
1441 /**
1442  * During construction we set the pinned flag in the graph right when the
1443  * optimizatin is performed.  The flag turning on procedure global cse could
1444  * be changed between two allocations.  This way we are safe.
1445  */
1446 static INLINE ir_node *
1447 identify_cons (pset *value_table, ir_node *n) {
1448   ir_node *old = n;
1449   n = identify(value_table, n);
1450   if (get_irn_n(old, -1) != get_irn_n(n, -1))
1451     set_irg_pinned(current_ir_graph, floats);
1452   return n;
1453 }
1454
1455 /**
1456  * Return the canonical node computing the same value as n.
1457  * Looks up the node in a hash table, enters it in the table
1458  * if it isn't there yet.
1459  */
1460 static ir_node *
1461 identify_remember (pset *value_table, ir_node *node)
1462 {
1463   ir_node *o = NULL;
1464
1465   if (!value_table) return node;
1466
1467   /* lookup or insert in hash table with given hash key. */
1468   o = pset_insert (value_table, node, ir_node_hash (node));
1469
1470   if (o == node) return node;
1471
1472   return o;
1473 }
1474
1475 void
1476 add_identities (pset *value_table, ir_node *node) {
1477   identify_remember (value_table, node);
1478 }
1479
1480 /**
1481  * garbage in, garbage out. If a node has a dead input, i.e., the
1482  * Bad node is input to the node, return the Bad node.
1483  */
1484 static INLINE ir_node *
1485 gigo (ir_node *node)
1486 {
1487   int i, irn_arity;
1488   ir_op* op = get_irn_op(node);
1489
1490   /* remove garbage blocks by looking at control flow that leaves the block
1491      and replacing the control flow by Bad. */
1492   if (get_irn_mode(node) == mode_X) {
1493     ir_node *block = get_nodes_block(node);
1494     if (op == op_End) return node;     /* Don't optimize End, may have Bads. */
1495     if (get_irn_op(block) == op_Block && get_Block_matured(block)) {
1496       irn_arity = get_irn_arity(block);
1497       for (i = 0; i < irn_arity; i++) {
1498         if (!is_Bad(get_irn_n(block, i))) break;
1499       }
1500       if (i == irn_arity) return new_Bad();
1501     }
1502   }
1503
1504   /* Blocks, Phis and Tuples may have dead inputs, e.g., if one of the
1505      blocks predecessors is dead. */
1506   if ( op != op_Block && op != op_Phi && op != op_Tuple) {
1507     irn_arity = get_irn_arity(node);
1508     for (i = -1; i < irn_arity; i++) {
1509       if (is_Bad(get_irn_n(node, i))) {
1510         return new_Bad();
1511       }
1512     }
1513   }
1514 #if 0
1515   /* With this code we violate the agreement that local_optimize
1516      only leaves Bads in Block, Phi and Tuple nodes. */
1517   /* If Block has only Bads as predecessors it's garbage. */
1518   /* If Phi has only Bads as predecessors it's garbage. */
1519   if ((op == op_Block && get_Block_matured(node)) || op == op_Phi)  {
1520     irn_arity = get_irn_arity(node);
1521     for (i = 0; i < irn_arity; i++) {
1522       if (!is_Bad(get_irn_n(node, i))) break;
1523     }
1524     if (i == irn_arity) node = new_Bad();
1525   }
1526 #endif
1527   return node;
1528 }
1529
1530
1531 /**
1532  * These optimizations deallocate nodes from the obstack.
1533  * It can only be called if it is guaranteed that no other nodes
1534  * reference this one, i.e., right after construction of a node.
1535  */
1536 ir_node *
1537 optimize_node (ir_node *n)
1538 {
1539   tarval *tv;
1540   ir_node *oldn = n;
1541   opcode iro = get_irn_opcode(n);
1542
1543   /* Allways optimize Phi nodes: part of the construction. */
1544   if ((!get_opt_optimize()) && (iro != iro_Phi)) return n;
1545
1546   /* constant expression evaluation / constant folding */
1547   if (get_opt_constant_folding()) {
1548     /* constants can not be evaluated */
1549     if (iro != iro_Const) {
1550       /* try to evaluate */
1551       tv = computed_value (n);
1552       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
1553         /*
1554          * we MUST copy the node here temparary, because it's still needed
1555          * for DBG_OPT_ALGSIM0
1556          */
1557         ir_node x = *n;
1558         oldn = &x;
1559         /* evaluation was successful -- replace the node. */
1560         obstack_free (current_ir_graph->obst, n);
1561         n = new_Const (get_tarval_mode (tv), tv);
1562                                                         DBG_OPT_ALGSIM0;
1563         return n;
1564       }
1565     }
1566   }
1567
1568   /* remove unnecessary nodes */
1569   if (get_opt_constant_folding() ||
1570       (iro == iro_Phi)  ||   /* always optimize these nodes. */
1571       (iro == iro_Id)   ||
1572       (iro == iro_Proj) ||
1573       (iro == iro_Block)  )  /* Flags tested local. */
1574     n = equivalent_node (n);
1575
1576   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
1577
1578   /** common subexpression elimination **/
1579   /* Checks whether n is already available. */
1580   /* The block input is used to distinguish different subexpressions. Right
1581      now all nodes are pinned to blocks, i.e., the cse only finds common
1582      subexpressions within a block. */
1583   if (get_opt_cse())
1584     n = identify_cons (current_ir_graph->value_table, n);
1585
1586   if (n != oldn) {
1587     /* We found an existing, better node, so we can deallocate the old node. */
1588     obstack_free (current_ir_graph->obst, oldn);
1589
1590     return n;
1591   }
1592
1593   /* Some more constant expression evaluation that does not allow to
1594      free the node. */
1595   iro = get_irn_opcode(n);
1596   if (get_opt_constant_folding() ||
1597       (iro == iro_Cond) ||
1598       (iro == iro_Proj))     /* Flags tested local. */
1599     n = transform_node (n);
1600
1601   /* Remove nodes with dead (Bad) input.
1602      Run always for transformation induced Bads. */
1603   n = gigo (n);
1604
1605   /* Now we have a legal, useful node. Enter it in hash table for cse */
1606   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block)) {
1607     n = identify_remember (current_ir_graph->value_table, n);
1608   }
1609
1610   return n;
1611 }
1612
1613
1614 /**
1615  * These optimizations never deallocate nodes.  This can cause dead
1616  * nodes lying on the obstack.  Remove these by a dead node elimination,
1617  * i.e., a copying garbage collection.
1618  */
1619 ir_node *
1620 optimize_in_place_2 (ir_node *n)
1621 {
1622   tarval *tv;
1623   ir_node *oldn = n;
1624   opcode iro = get_irn_opcode(n);
1625
1626   if (!get_opt_optimize() && (get_irn_op(n) != op_Phi)) return n;
1627
1628   /* if not optimize return n */
1629   if (n == NULL) {
1630     assert(0);
1631     /* Here this is possible.  Why? */
1632     return n;
1633   }
1634
1635
1636   /* constant expression evaluation / constant folding */
1637   if (get_opt_constant_folding()) {
1638     /* constants can not be evaluated */
1639     if (iro != iro_Const) {
1640       /* try to evaluate */
1641       tv = computed_value (n);
1642       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
1643         /* evaluation was successful -- replace the node. */
1644         n = new_Const (get_tarval_mode (tv), tv);
1645                                                 DBG_OPT_ALGSIM0;
1646         return n;
1647       }
1648     }
1649   }
1650
1651   /* remove unnecessary nodes */
1652   /*if (get_opt_constant_folding()) */
1653   if (get_opt_constant_folding() ||
1654       (iro == iro_Phi)  ||   /* always optimize these nodes. */
1655       (iro == iro_Id)   ||   /* ... */
1656       (iro == iro_Proj) ||   /* ... */
1657       (iro == iro_Block)  )  /* Flags tested local. */
1658     n = equivalent_node (n);
1659
1660   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
1661
1662   /** common subexpression elimination **/
1663   /* Checks whether n is already available. */
1664   /* The block input is used to distinguish different subexpressions.  Right
1665      now all nodes are pinned to blocks, i.e., the cse only finds common
1666      subexpressions within a block. */
1667   if (get_opt_cse()) {
1668     n = identify (current_ir_graph->value_table, n);
1669   }
1670
1671   /* Some more constant expression evaluation. */
1672   iro = get_irn_opcode(n);
1673   if (get_opt_constant_folding() ||
1674       (iro == iro_Cond) ||
1675       (iro == iro_Proj))     /* Flags tested local. */
1676     n = transform_node (n);
1677
1678   /* Remove nodes with dead (Bad) input.
1679      Run always for transformation induced Bads.  */
1680   n = gigo (n);
1681
1682   /* Now we can verify the node, as it has no dead inputs any more. */
1683   irn_vrfy(n);
1684
1685   /* Now we have a legal, useful node. Enter it in hash table for cse.
1686      Blocks should be unique anyways.  (Except the successor of start:
1687      is cse with the start block!) */
1688   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block))
1689     n = identify_remember (current_ir_graph->value_table, n);
1690
1691   return n;
1692 }
1693
1694 /**
1695  * Wrapper for external use, set proper status bits after optimization.
1696  */
1697 ir_node *
1698 optimize_in_place (ir_node *n)
1699 {
1700   /* Handle graph state */
1701   assert(get_irg_phase_state(current_ir_graph) != phase_building);
1702
1703   if (get_opt_global_cse())
1704     set_irg_pinned(current_ir_graph, floats);
1705   if (get_irg_outs_state(current_ir_graph) == outs_consistent)
1706     set_irg_outs_inconsistent(current_ir_graph);
1707   /* Maybe we could also test whether optimizing the node can
1708      change the control graph. */
1709   if (get_irg_dom_state(current_ir_graph) == dom_consistent)
1710     set_irg_dom_inconsistent(current_ir_graph);
1711   return optimize_in_place_2 (n);
1712 }
1713
1714 /**
1715  * set the default ir op operations
1716  */
1717 ir_op *firm_set_default_operations(ir_op *op)
1718 {
1719   op = firm_set_default_computed_value(op);
1720   op = firm_set_default_equivalent_node(op);
1721   op = firm_set_default_transform_node(op);
1722   op = firm_set_default_node_cmp_attr(op);
1723
1724   return op;
1725 }