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