96b27ddcdd5f3bdbdf5eacd1f27486385ad39155
[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     }
972   } else if (get_irn_mode(n) == mode_X &&
973              is_Bad(get_nodes_block(n))) {
974     /* Remove dead control flow -- early gigo. */
975     n = new_Bad();
976   }
977   return n;
978 }
979
980 /**
981  * Remove Id's.
982  */
983 static ir_node *equivalent_node_Id(ir_node *n)
984 {
985   ir_node *oldn = n;
986
987   n = follow_Id(n);                                                 DBG_OPT_ID;
988   return n;
989 }
990
991 /*
992 case iro_Mod, Quot, DivMod
993   DivMod allocates new nodes --> it's treated in transform node.
994   What about Quot, DivMod?
995 */
996
997 /**
998  * equivalent_node() returns a node equivalent to input n. It skips all nodes that
999  * perform no actual computation, as, e.g., the Id nodes.  It does not create
1000  * new nodes.  It is therefore safe to free n if the node returned is not n.
1001  * If a node returns a Tuple we can not just skip it.  If the size of the
1002  * in array fits, we transform n into a tuple (e.g., Div).
1003  */
1004 ir_node *
1005 equivalent_node(ir_node *n)
1006 {
1007   if (n->op->equivalent_node)
1008     return n->op->equivalent_node(n);
1009   return n;
1010 }
1011
1012 /**
1013  * set the default equivalent node operation
1014  */
1015 static ir_op *firm_set_default_equivalent_node(ir_op *op)
1016 {
1017 #define CASE(a)                                 \
1018   case iro_##a:                                 \
1019     op->equivalent_node  = equivalent_node_##a; \
1020     break
1021
1022   switch (op->code) {
1023   CASE(Block);
1024   CASE(Jmp);
1025   CASE(Cond);
1026   CASE(Or);
1027   CASE(Add);
1028   CASE(Eor);
1029   CASE(Sub);
1030   CASE(Shl);
1031   CASE(Shr);
1032   CASE(Shrs);
1033   CASE(Rot);
1034   CASE(Not);
1035   CASE(Minus);
1036   CASE(Mul);
1037   CASE(Div);
1038   CASE(And);
1039   CASE(Conv);
1040   CASE(Phi);
1041 //  CASE(Load);         /* dangerous */
1042 //  CASE(Store);                /* dangerous, see todo */
1043   CASE(Proj);
1044   CASE(Id);
1045   default:
1046     op->equivalent_node  = NULL;
1047   }
1048
1049   return op;
1050 #undef CASE
1051 }
1052
1053 /**
1054  * Do node specific optimizations of nodes predecessors.
1055  */
1056 static void
1057 optimize_preds(ir_node *n) {
1058   ir_node *a = NULL, *b = NULL;
1059
1060   /* get the operands we will work on for simple cases. */
1061   if (is_binop(n)) {
1062     a = get_binop_left(n);
1063     b = get_binop_right(n);
1064   } else if (is_unop(n)) {
1065     a = get_unop_op(n);
1066   }
1067
1068   switch (get_irn_opcode(n)) {
1069
1070   case iro_Cmp:
1071     /* We don't want Cast as input to Cmp. */
1072     if (get_irn_op(a) == op_Cast) {
1073       a = get_Cast_op(a);
1074       set_Cmp_left(n, a);
1075     }
1076     if (get_irn_op(b) == op_Cast) {
1077       b = get_Cast_op(b);
1078       set_Cmp_right(n, b);
1079     }
1080     break;
1081
1082   default: break;
1083   } /* end switch */
1084 }
1085
1086 static ir_node *transform_node_Div(ir_node *n)
1087 {
1088   tarval *tv = computed_value(n);
1089
1090   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1091
1092   if (tv != tarval_bad) {
1093     /* Turn Div into a tuple (mem, bad, value) */
1094     ir_node *mem = get_Div_mem(n);
1095
1096     turn_into_tuple(n, 3);
1097     set_Tuple_pred(n, pn_Div_M, mem);
1098     set_Tuple_pred(n, pn_Div_X_except, new_Bad());
1099     set_Tuple_pred(n, pn_Div_res, new_Const(get_tarval_mode(tv), tv));
1100   }
1101   return n;
1102 }
1103
1104 static ir_node *transform_node_Mod(ir_node *n)
1105 {
1106   tarval *tv = computed_value(n);
1107
1108   /* BEWARE: it is NOT possible to optimize a%a to 0, as this may cause a exception */
1109
1110   if (tv != tarval_bad) {
1111     /* Turn Mod into a tuple (mem, bad, value) */
1112     ir_node *mem = get_Mod_mem(n);
1113     turn_into_tuple(n, 3);
1114     set_Tuple_pred(n, pn_Mod_M, mem);
1115     set_Tuple_pred(n, pn_Mod_X_except, new_Bad());
1116     set_Tuple_pred(n, pn_Mod_res, new_Const(get_tarval_mode(tv), tv));
1117   }
1118   return n;
1119 }
1120
1121 static ir_node *transform_node_DivMod(ir_node *n)
1122 {
1123   int evaluated = 0;
1124
1125   ir_node *a = get_DivMod_left(n);
1126   ir_node *b = get_DivMod_right(n);
1127   ir_mode *mode = get_irn_mode(a);
1128   tarval *ta = value_of(a);
1129   tarval *tb = value_of(b);
1130
1131   if (!(mode_is_int(mode) && mode_is_int(get_irn_mode(b))))
1132     return n;
1133
1134   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1135
1136   if (tb != tarval_bad) {
1137     if (tb == get_mode_one(get_tarval_mode(tb))) {
1138       b = new_Const (mode, get_mode_null(mode));
1139       evaluated = 1;
1140     } else if (ta != tarval_bad) {
1141       tarval *resa, *resb;
1142       resa = tarval_div (ta, tb);
1143       if (resa == tarval_bad) return n; /* Causes exception!!! Model by replacing through
1144                                         Jmp for X result!? */
1145       resb = tarval_mod (ta, tb);
1146       if (resb == tarval_bad) return n; /* Causes exception! */
1147       a = new_Const (mode, resa);
1148       b = new_Const (mode, resb);
1149       evaluated = 1;
1150     }
1151   } else if (ta == get_mode_null(mode)) {
1152     b = a;
1153     evaluated = 1;
1154   }
1155   if (evaluated) { /* replace by tuple */
1156     ir_node *mem = get_DivMod_mem(n);
1157     turn_into_tuple(n, 4);
1158     set_Tuple_pred(n, pn_DivMod_M,        mem);
1159     set_Tuple_pred(n, pn_DivMod_X_except, new_Bad());  /* no exception */
1160     set_Tuple_pred(n, pn_DivMod_res_div,  a);
1161     set_Tuple_pred(n, pn_DivMod_res_mod,  b);
1162     assert(get_nodes_block(n));
1163   }
1164
1165   return n;
1166 }
1167
1168 static ir_node *transform_node_Cond(ir_node *n)
1169 {
1170   /* Replace the Cond by a Jmp if it branches on a constant
1171      condition. */
1172   ir_node *jmp;
1173   ir_node *a = get_Cond_selector(n);
1174   tarval *ta = value_of(a);
1175
1176   if ((ta != tarval_bad) &&
1177       (get_irn_mode(a) == mode_b) &&
1178       (get_opt_unreachable_code())) {
1179     /* It's a boolean Cond, branching on a boolean constant.
1180                Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */
1181     jmp = new_r_Jmp(current_ir_graph, get_nodes_block(n));
1182     turn_into_tuple(n, 2);
1183     if (ta == tarval_b_true) {
1184       set_Tuple_pred(n, pn_Cond_false, new_Bad());
1185       set_Tuple_pred(n, pn_Cond_true, jmp);
1186     } else {
1187       set_Tuple_pred(n, pn_Cond_false, jmp);
1188       set_Tuple_pred(n, pn_Cond_true, new_Bad());
1189     }
1190     /* We might generate an endless loop, so keep it alive. */
1191     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1192   } else if ((ta != tarval_bad) &&
1193              (get_irn_mode(a) == mode_Iu) &&
1194              (get_Cond_kind(n) == dense) &&
1195              (get_opt_unreachable_code())) {
1196     /* I don't want to allow Tuples smaller than the biggest Proj.
1197        Also this tuple might get really big...
1198        I generate the Jmp here, and remember it in link.  Link is used
1199        when optimizing Proj. */
1200     set_irn_link(n, new_r_Jmp(current_ir_graph, get_nodes_block(n)));
1201     /* We might generate an endless loop, so keep it alive. */
1202     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1203   } else if ((get_irn_op(a) == op_Eor)
1204              && (get_irn_mode(a) == mode_b)
1205              && (classify_tarval(computed_value(get_Eor_right(a))) == TV_CLASSIFY_ONE)) {
1206     /* The Eor is a negate.  Generate a new Cond without the negate,
1207        simulate the negate by exchanging the results. */
1208     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1209                                get_Eor_left(a)));
1210   } else if ((get_irn_op(a) == op_Not)
1211              && (get_irn_mode(a) == mode_b)) {
1212     /* A Not before the Cond.  Generate a new Cond without the Not,
1213        simulate the Not by exchanging the results. */
1214     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1215                                get_Not_op(a)));
1216   }
1217   return n;
1218 }
1219
1220 static ir_node *transform_node_Eor(ir_node *n)
1221 {
1222   ir_node *a = get_Eor_left(n);
1223   ir_node *b = get_Eor_right(n);
1224
1225   if ((get_irn_mode(n) == mode_b)
1226       && (get_irn_op(a) == op_Proj)
1227       && (get_irn_mode(a) == mode_b)
1228       && (classify_tarval (computed_value (b)) == TV_CLASSIFY_ONE)
1229       && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
1230     /* The Eor negates a Cmp. The Cmp has the negated result anyways! */
1231     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1232                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1233   else if ((get_irn_mode(n) == mode_b)
1234            && (classify_tarval (computed_value (b)) == TV_CLASSIFY_ONE))
1235     /* The Eor is a Not. Replace it by a Not. */
1236     /*   ????!!!Extend to bitfield 1111111. */
1237     n = new_r_Not(current_ir_graph, get_nodes_block(n), a, mode_b);
1238
1239   return n;
1240 }
1241
1242 /**
1243  * Transfor a boolean Not.
1244  */
1245 static ir_node *transform_node_Not(ir_node *n)
1246 {
1247   ir_node *a = get_Not_op(n);
1248
1249   if (   (get_irn_mode(n) == mode_b)
1250       && (get_irn_op(a) == op_Proj)
1251       && (get_irn_mode(a) == mode_b)
1252       && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
1253     /* We negate a Cmp. The Cmp has the negated result anyways! */
1254     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1255                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1256
1257   return n;
1258 }
1259
1260 /**
1261  * Transform a Div/Mod/DivMod with a non-zero constant. Must be
1262  * done here to avoid that this optimization runs more than once...
1263  */
1264 static ir_node *transform_node_Proj(ir_node *proj)
1265 {
1266   ir_node *n = get_Proj_pred(proj);
1267   ir_node *b;
1268   tarval *tb;
1269
1270   switch (get_irn_opcode(n)) {
1271   case iro_Div:
1272     b = get_Div_right(n);
1273     tb = computed_value(b);
1274
1275     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* div(x, c) && c != 0 */
1276       ir_node *div, *proj;
1277       ir_node *a = get_Div_left(n);
1278       ir_node *mem = get_Div_mem(n);
1279       int rem = get_optimize();
1280
1281       set_optimize(0);
1282       {
1283         div = new_rd_Div(get_irn_dbg_info(n), current_ir_graph,
1284           get_nodes_block(n), get_irg_initial_mem(current_ir_graph), a, b);
1285
1286         proj = new_r_Proj(current_ir_graph, get_nodes_block(n), div, get_irn_mode(a), pn_Div_res);
1287       }
1288       set_optimize(rem);
1289
1290       turn_into_tuple(n, 3);
1291       set_Tuple_pred(n, pn_Mod_M, mem);
1292       set_Tuple_pred(n, pn_Mod_X_except, new_Bad());
1293       set_Tuple_pred(n, pn_Mod_res, proj);
1294     }
1295     break;
1296   case iro_Mod:
1297     b = get_Mod_right(n);
1298     tb = computed_value(b);
1299
1300     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* mod(x, c) && c != 0 */
1301       ir_node *mod, *proj;
1302       ir_node *a = get_Mod_left(n);
1303       ir_node *mem = get_Mod_mem(n);
1304       int rem = get_optimize();
1305
1306       set_optimize(0);
1307       {
1308         mod = new_rd_Mod(get_irn_dbg_info(n), current_ir_graph,
1309           get_nodes_block(n), get_irg_initial_mem(current_ir_graph), a, b);
1310
1311         proj = new_r_Proj(current_ir_graph, get_nodes_block(n), mod, get_irn_mode(a), pn_Mod_res);
1312       }
1313       set_optimize(rem);
1314
1315       turn_into_tuple(n, 3);
1316       set_Tuple_pred(n, pn_Mod_M, mem);
1317       set_Tuple_pred(n, pn_Mod_X_except, new_Bad());
1318       set_Tuple_pred(n, pn_Mod_res, proj);
1319     }
1320     break;
1321   case iro_DivMod:
1322     b = get_DivMod_right(n);
1323     tb = computed_value(b);
1324
1325     if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* DivMod(x, c) && c != 0 */
1326       ir_node *div_mod, *proj_div, *proj_mod;
1327       ir_node *a = get_Mod_left(n);
1328       ir_node *mem = get_Mod_mem(n);
1329       int rem = get_optimize();
1330
1331       set_optimize(0);
1332       {
1333         div_mod = new_rd_DivMod(get_irn_dbg_info(n), current_ir_graph,
1334           get_nodes_block(n), get_irg_initial_mem(current_ir_graph), a, b);
1335
1336         proj_div = new_r_Proj(current_ir_graph, get_nodes_block(n), div_mod, get_irn_mode(a), pn_DivMod_res_div);
1337         proj_mod = new_r_Proj(current_ir_graph, get_nodes_block(n), div_mod, get_irn_mode(a), pn_DivMod_res_mod);
1338       }
1339       set_optimize(rem);
1340
1341       turn_into_tuple(n, 4);
1342       set_Tuple_pred(n, pn_DivMod_M, mem);
1343       set_Tuple_pred(n, pn_DivMod_X_except, new_Bad());
1344       set_Tuple_pred(n, pn_DivMod_res_div, proj_div);
1345       set_Tuple_pred(n, pn_DivMod_res_mod, proj_mod);
1346     }
1347     break;
1348
1349   case iro_Cond:
1350     if (get_opt_unreachable_code()) {
1351       b = get_Cond_selector(n);
1352       tb = computed_value(b);
1353
1354       if (tb != tarval_bad && mode_is_int(get_tarval_mode(tb))) {
1355         /* we have a constant switch */
1356         long num = get_Proj_proj(proj);
1357
1358         if (num != get_Cond_defaultProj(n)) { /* we cannot optimize default Proj's yet */
1359           if (get_tarval_long(tb) == num) {
1360             /* Do NOT create a jump here, or we will have 2 control flow ops
1361              * in a block. This case is optimized away in optimize_cf(). */
1362             return proj;
1363           }
1364           else
1365             return new_Bad();
1366         }
1367       }
1368     }
1369     return proj;
1370
1371   default:
1372     /* do nothing */
1373     return proj;
1374   }
1375
1376   /* we have added a Tuple, optimize it for the current Proj away */
1377   return equivalent_node_Proj(proj);
1378 }
1379
1380 /**
1381  * Transform a Store before a Store to the same address...
1382  * Both nodes must be in the same block.
1383  *
1384  * @todo Check for volatile! Moreover, what if the first store
1385  *       has a exception handler while the other has not?
1386  */
1387 static ir_node *transform_node_Store(ir_node *store)
1388 {
1389   ir_node *pred = skip_Proj(get_Store_mem(store));
1390   ir_node *ptr  = get_Store_ptr(store);
1391
1392   if (get_irn_op(pred) == op_Store &&
1393       get_Store_ptr(pred) == ptr   &&
1394       get_nodes_block(pred) == get_nodes_block(store)) {
1395     /* the Store n is useless, as it is overwritten by the store store */
1396     ir_node *mem = get_Store_mem(pred);
1397
1398     turn_into_tuple(pred, 2);
1399     set_Tuple_pred(pred, pn_Store_M,        mem);
1400     set_Tuple_pred(pred, pn_Store_X_except, new_Bad());
1401   }
1402   return store;
1403 }
1404
1405 /**
1406  * returns the operands of a commutative bin-op, if one operand is
1407  * a const, it is returned as the second one.
1408  */
1409 static void get_comm_Binop_Ops(ir_node *binop, ir_node **a, ir_node **c)
1410 {
1411   ir_node *op_a = get_binop_left(binop);
1412   ir_node *op_b = get_binop_right(binop);
1413
1414   assert(is_op_commutative(get_irn_op(binop)));
1415
1416   if (get_irn_op(op_a) == op_Const) {
1417     *a = op_b;
1418     *c = op_a;
1419   }
1420   else {
1421     *a = op_a;
1422     *c = op_b;
1423   }
1424 }
1425
1426 /**
1427  * Optimize a Or(And(Or(And(v,c4),c3),c2),c1) pattern if possible.
1428  * Such pattern may arise in bitfield stores.
1429  *
1430  * value  c4                  value      c4 & c2
1431  *    AND     c3                    AND           c1 | c3
1432  *        OR     c2      ===>               OR
1433  *           AND    c1
1434  *               OR
1435  */
1436 static ir_node *transform_node_Or(ir_node *or)
1437 {
1438   ir_node *and, *c1;
1439   ir_node *or_l, *c2;
1440   ir_node *and_l, *c3;
1441   ir_node *value, *c4;
1442   ir_node *new_and, *new_const, *block;
1443   ir_mode *mode = get_irn_mode(or);
1444
1445   tarval *tv1, *tv2, *tv3, *tv4, *tv, *n_tv4, *n_tv2;
1446
1447   get_comm_Binop_Ops(or, &and, &c1);
1448   if ((get_irn_op(c1) != op_Const) || (get_irn_op(and) != op_And))
1449     return or;
1450
1451   get_comm_Binop_Ops(and, &or_l, &c2);
1452   if ((get_irn_op(c2) != op_Const) || (get_irn_op(or_l) != op_Or))
1453     return or;
1454
1455   get_comm_Binop_Ops(or_l, &and_l, &c3);
1456   if ((get_irn_op(c3) != op_Const) || (get_irn_op(and_l) != op_And))
1457     return or;
1458
1459   get_comm_Binop_Ops(and_l, &value, &c4);
1460   if (get_irn_op(c4) != op_Const)
1461     return or;
1462
1463   /* ok, found the pattern, check for conditions */
1464   assert(mode == get_irn_mode(and));
1465   assert(mode == get_irn_mode(or_l));
1466   assert(mode == get_irn_mode(and_l));
1467
1468   tv1 = get_Const_tarval(c1);
1469   tv2 = get_Const_tarval(c2);
1470   tv3 = get_Const_tarval(c3);
1471   tv4 = get_Const_tarval(c4);
1472
1473   tv = tarval_or(tv4, tv2);
1474   if (classify_tarval(tv) != TV_CLASSIFY_ALL_ONE) {
1475     /* have at least one 0 at the same bit position */
1476     return or;
1477   }
1478
1479   n_tv4 = tarval_not(tv4);
1480   if (tv3 != tarval_and(tv3, n_tv4)) {
1481     /* bit in the or_mask is outside the and_mask */
1482     return or;
1483   }
1484
1485   n_tv2 = tarval_not(tv2);
1486   if (tv1 != tarval_and(tv1, n_tv2)) {
1487     /* bit in the or_mask is outside the and_mask */
1488     return or;
1489   }
1490
1491   /* ok, all conditions met */
1492   block = get_nodes_block(or);
1493
1494   new_and = new_r_And(current_ir_graph, block,
1495       value, new_r_Const(current_ir_graph, block, mode, tarval_and(tv4, tv2)), mode);
1496
1497   new_const = new_r_Const(current_ir_graph, block, mode, tarval_or(tv3, tv1));
1498
1499   set_Or_left(or, new_and);
1500   set_Or_right(or, new_const);
1501
1502   /* check for more */
1503   return transform_node_Or(or);
1504 }
1505
1506 /**
1507  * Tries several [inplace] [optimizing] transformations and returns an
1508  * equivalent node.  The difference to equivalent_node() is that these
1509  * transformations _do_ generate new nodes, and thus the old node must
1510  * not be freed even if the equivalent node isn't the old one.
1511  */
1512 static ir_node *transform_node(ir_node *n)
1513 {
1514   if (n->op->transform_node)
1515     n = n->op->transform_node(n);
1516   return n;
1517 }
1518
1519 /**
1520  * set the default transform node operation
1521  */
1522 static ir_op *firm_set_default_transform_node(ir_op *op)
1523 {
1524 #define CASE(a)                                 \
1525   case iro_##a:                                 \
1526     op->transform_node  = transform_node_##a;   \
1527     break
1528
1529   switch (op->code) {
1530   CASE(Div);
1531   CASE(Mod);
1532   CASE(DivMod);
1533   CASE(Cond);
1534   CASE(Eor);
1535   CASE(Not);
1536   CASE(Proj);
1537 //  CASE(Store);        /* dangerous, see todo */
1538   CASE(Or);
1539   default:
1540     op->transform_node  = NULL;
1541   }
1542
1543   return op;
1544 #undef CASE
1545 }
1546
1547
1548 /* **************** Common Subexpression Elimination **************** */
1549
1550 /** The size of the hash table used, should estimate the number of nodes
1551     in a graph. */
1552 #define N_IR_NODES 512
1553
1554 static int node_cmp_attr_Const(ir_node *a, ir_node *b)
1555 {
1556   return (get_Const_tarval(a) != get_Const_tarval(b))
1557       || (get_Const_type(a) != get_Const_type(b));
1558 }
1559
1560 static int node_cmp_attr_Proj(ir_node *a, ir_node *b)
1561 {
1562     return get_irn_proj_attr (a) != get_irn_proj_attr (b);
1563 }
1564
1565 static int node_cmp_attr_Filter(ir_node *a, ir_node *b)
1566 {
1567     return get_Filter_proj(a) != get_Filter_proj(b);
1568 }
1569
1570 static int node_cmp_attr_Alloc(ir_node *a, ir_node *b)
1571 {
1572     return (get_irn_alloc_attr(a).where != get_irn_alloc_attr(b).where)
1573       || (get_irn_alloc_attr(a).type != get_irn_alloc_attr(b).type);
1574 }
1575
1576 static int node_cmp_attr_Free(ir_node *a, ir_node *b)
1577 {
1578     return (get_irn_free_attr(a) != get_irn_free_attr(b));
1579 }
1580
1581 static int node_cmp_attr_SymConst(ir_node *a, ir_node *b)
1582 {
1583     return (get_irn_symconst_attr(a).num != get_irn_symconst_attr(b).num)
1584       || (get_irn_symconst_attr(a).sym.type_p != get_irn_symconst_attr(b).sym.type_p);
1585 }
1586
1587 static int node_cmp_attr_Call(ir_node *a, ir_node *b)
1588 {
1589     return (get_irn_call_attr(a) != get_irn_call_attr(b));
1590 }
1591
1592 static int node_cmp_attr_FuncCall(ir_node *a, ir_node *b)
1593 {
1594     return (get_irn_funccall_attr(a) != get_irn_funccall_attr(b));
1595 }
1596
1597 static int node_cmp_attr_Sel(ir_node *a, ir_node *b)
1598 {
1599     return (get_irn_sel_attr(a).ent->kind != get_irn_sel_attr(b).ent->kind)
1600       || (get_irn_sel_attr(a).ent->name != get_irn_sel_attr(b).ent->name)
1601       || (get_irn_sel_attr(a).ent->owner != get_irn_sel_attr(b).ent->owner)
1602       || (get_irn_sel_attr(a).ent->ld_name != get_irn_sel_attr(b).ent->ld_name)
1603       || (get_irn_sel_attr(a).ent->type != get_irn_sel_attr(b).ent->type);
1604 }
1605
1606 static int node_cmp_attr_Phi(ir_node *a, ir_node *b)
1607 {
1608     return get_irn_phi_attr (a) != get_irn_phi_attr (b);
1609 }
1610
1611 static int node_cmp_attr_Cast(ir_node *a, ir_node *b)
1612 {
1613     return get_Cast_type(a) != get_Cast_type(b);
1614 }
1615
1616 /**
1617  * set the default node attribute compare operation
1618  */
1619 static ir_op *firm_set_default_node_cmp_attr(ir_op *op)
1620 {
1621 #define CASE(a)                                 \
1622   case iro_##a:                                 \
1623     op->node_cmp_attr  = node_cmp_attr_##a;     \
1624     break
1625
1626   switch (op->code) {
1627   CASE(Const);
1628   CASE(Proj);
1629   CASE(Filter);
1630   CASE(Alloc);
1631   CASE(Free);
1632   CASE(SymConst);
1633   CASE(Call);
1634   CASE(FuncCall);
1635   CASE(Sel);
1636   CASE(Phi);
1637   CASE(Cast);
1638   default:
1639     op->node_cmp_attr  = NULL;
1640   }
1641
1642   return op;
1643 #undef CASE
1644 }
1645
1646 /**
1647  * Compare function for two nodes in the hash table. Gets two
1648  * nodes as parameters.  Returns 0 if the nodes are a cse.
1649  */
1650 static int
1651 vt_cmp (const void *elt, const void *key)
1652 {
1653   ir_node *a, *b;
1654   int i, irn_arity_a;
1655
1656   a = (void *)elt;
1657   b = (void *)key;
1658
1659   if (a == b) return 0;
1660
1661   if ((get_irn_op(a) != get_irn_op(b)) ||
1662       (get_irn_mode(a) != get_irn_mode(b))) return 1;
1663
1664   /* compare if a's in and b's in are equal */
1665   irn_arity_a = get_irn_arity (a);
1666   if (irn_arity_a != get_irn_arity(b))
1667     return 1;
1668
1669   /* for block-local cse and op_pin_state_pinned nodes: */
1670   if (!get_opt_global_cse() || (get_op_pinned(get_irn_op(a)) == op_pin_state_pinned)) {
1671     if (get_irn_n(a, -1) != get_irn_n(b, -1))
1672       return 1;
1673   }
1674
1675   /* compare a->in[0..ins] with b->in[0..ins] */
1676   for (i = 0; i < irn_arity_a; i++)
1677     if (get_irn_n(a, i) != get_irn_n(b, i))
1678       return 1;
1679
1680   /*
1681    * here, we already now that the nodes are identical except their
1682    * attributes
1683    */
1684   if (a->op->node_cmp_attr)
1685     return a->op->node_cmp_attr(a, b);
1686
1687   return 0;
1688 }
1689
1690 /*
1691  * Calculate a hash value of a node.
1692  */
1693 unsigned
1694 ir_node_hash (ir_node *node)
1695 {
1696   unsigned h;
1697   int i, irn_arity;
1698
1699   if (node->op == op_Const) {
1700     /* special value for const, as they only differ in their tarval. */
1701     h = ((unsigned) node->attr.con.tv)>>3 ;
1702     h = 9*h + (unsigned)get_irn_mode(node);
1703   } else if (node->op == op_SymConst) {
1704     /* special value for const, as they only differ in their symbol. */
1705     h = ((unsigned) node->attr.i.sym.type_p)>>3 ;
1706     h = 9*h + (unsigned)get_irn_mode(node);
1707   } else {
1708
1709     /* hash table value = 9*(9*(9*(9*(9*arity+in[0])+in[1])+ ...)+mode)+code */
1710     h = irn_arity = get_irn_arity(node);
1711
1712     /* consider all in nodes... except the block. */
1713     for (i = 0;  i < irn_arity;  i++) {
1714       h = 9*h + (unsigned)get_irn_n(node, i);
1715     }
1716
1717     /* ...mode,... */
1718     h = 9*h + (unsigned) get_irn_mode (node);
1719     /* ...and code */
1720     h = 9*h + (unsigned) get_irn_op (node);
1721   }
1722
1723   return h;
1724 }
1725
1726 pset *
1727 new_identities (void)
1728 {
1729   return new_pset (vt_cmp, N_IR_NODES);
1730 }
1731
1732 void
1733 del_identities (pset *value_table)
1734 {
1735   del_pset (value_table);
1736 }
1737
1738 /**
1739  * Return the canonical node computing the same value as n.
1740  * Looks up the node in a hash table.
1741  *
1742  * For Const nodes this is performed in the constructor, too.  Const
1743  * nodes are extremely time critical because of their frequent use in
1744  * constant string arrays.
1745  */
1746 static INLINE ir_node *
1747 identify (pset *value_table, ir_node *n)
1748 {
1749   ir_node *o = NULL;
1750
1751   if (!value_table) return n;
1752
1753   /* TODO: use a generic commutative attribute */
1754   if (get_opt_reassociation()) {
1755     if (is_op_commutative(get_irn_op(n))) {
1756       /* for commutative operators perform  a OP b == b OP a */
1757       if (get_binop_left(n) > get_binop_right(n)) {
1758         ir_node *h = get_binop_left(n);
1759         set_binop_left(n, get_binop_right(n));
1760         set_binop_right(n, h);
1761       }
1762     }
1763   }
1764
1765   o = pset_find (value_table, n, ir_node_hash (n));
1766   if (!o) return n;
1767
1768   return o;
1769 }
1770
1771 /**
1772  * During construction we set the op_pin_state_pinned flag in the graph right when the
1773  * optimization is performed.  The flag turning on procedure global cse could
1774  * be changed between two allocations.  This way we are safe.
1775  */
1776 static INLINE ir_node *
1777 identify_cons (pset *value_table, ir_node *n) {
1778   ir_node *old = n;
1779   n = identify(value_table, n);
1780   if (get_irn_n(old, -1) != get_irn_n(n, -1))
1781     set_irg_pinned(current_ir_graph, op_pin_state_floats);
1782   return n;
1783 }
1784
1785 /**
1786  * Return the canonical node computing the same value as n.
1787  * Looks up the node in a hash table, enters it in the table
1788  * if it isn't there yet.
1789  */
1790 static ir_node *
1791 identify_remember (pset *value_table, ir_node *node)
1792 {
1793   ir_node *o = NULL;
1794
1795   if (!value_table) return node;
1796
1797   /* lookup or insert in hash table with given hash key. */
1798   o = pset_insert (value_table, node, ir_node_hash (node));
1799
1800   if (o == node) return node;
1801
1802   return o;
1803 }
1804
1805 void
1806 add_identities (pset *value_table, ir_node *node) {
1807   identify_remember (value_table, node);
1808 }
1809
1810 /**
1811  * garbage in, garbage out. If a node has a dead input, i.e., the
1812  * Bad node is input to the node, return the Bad node.
1813  */
1814 static INLINE ir_node *
1815 gigo (ir_node *node)
1816 {
1817   int i, irn_arity;
1818   ir_op* op = get_irn_op(node);
1819
1820   /* remove garbage blocks by looking at control flow that leaves the block
1821      and replacing the control flow by Bad. */
1822   if (get_irn_mode(node) == mode_X) {
1823     ir_node *block = get_nodes_block(node);
1824     if (op == op_End) return node;     /* Don't optimize End, may have Bads. */
1825     if (get_irn_op(block) == op_Block && get_Block_matured(block)) {
1826       irn_arity = get_irn_arity(block);
1827       for (i = 0; i < irn_arity; i++) {
1828         if (!is_Bad(get_irn_n(block, i))) break;
1829       }
1830       if (i == irn_arity) return new_Bad();
1831     }
1832   }
1833
1834   /* Blocks, Phis and Tuples may have dead inputs, e.g., if one of the
1835      blocks predecessors is dead. */
1836   if ( op != op_Block && op != op_Phi && op != op_Tuple) {
1837     irn_arity = get_irn_arity(node);
1838     for (i = -1; i < irn_arity; i++) {
1839       if (is_Bad(get_irn_n(node, i))) {
1840         return new_Bad();
1841       }
1842     }
1843   }
1844 #if 0
1845   /* With this code we violate the agreement that local_optimize
1846      only leaves Bads in Block, Phi and Tuple nodes. */
1847   /* If Block has only Bads as predecessors it's garbage. */
1848   /* If Phi has only Bads as predecessors it's garbage. */
1849   if ((op == op_Block && get_Block_matured(node)) || op == op_Phi)  {
1850     irn_arity = get_irn_arity(node);
1851     for (i = 0; i < irn_arity; i++) {
1852       if (!is_Bad(get_irn_n(node, i))) break;
1853     }
1854     if (i == irn_arity) node = new_Bad();
1855   }
1856 #endif
1857   return node;
1858 }
1859
1860
1861 /**
1862  * These optimizations deallocate nodes from the obstack.
1863  * It can only be called if it is guaranteed that no other nodes
1864  * reference this one, i.e., right after construction of a node.
1865  */
1866 ir_node *
1867 optimize_node (ir_node *n)
1868 {
1869   tarval *tv;
1870   ir_node *oldn = n;
1871   opcode iro = get_irn_opcode(n);
1872
1873   /* Allways optimize Phi nodes: part of the construction. */
1874   if ((!get_opt_optimize()) && (iro != iro_Phi)) return n;
1875
1876   /* constant expression evaluation / constant folding */
1877   if (get_opt_constant_folding()) {
1878     /* constants can not be evaluated */
1879     if (iro != iro_Const) {
1880       /* try to evaluate */
1881       tv = computed_value (n);
1882       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
1883         /*
1884          * we MUST copy the node here temparary, because it's still needed
1885          * for DBG_OPT_ALGSIM0
1886          */
1887         int node_size = offsetof(ir_node, attr) +  n->op->attr_size;
1888         ir_node *x = alloca(node_size);
1889
1890         memcpy(x, n, node_size);
1891         oldn = x;
1892
1893         /* evaluation was successful -- replace the node. */
1894         obstack_free (current_ir_graph->obst, n);
1895         n = new_Const (get_tarval_mode (tv), tv);
1896                                                         DBG_OPT_ALGSIM0;
1897         return n;
1898       }
1899     }
1900   }
1901
1902   /* remove unnecessary nodes */
1903   if (get_opt_constant_folding() ||
1904       (iro == iro_Phi)  ||   /* always optimize these nodes. */
1905       (iro == iro_Id)   ||
1906       (iro == iro_Proj) ||
1907       (iro == iro_Block)  )  /* Flags tested local. */
1908     n = equivalent_node (n);
1909
1910   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
1911
1912   /** common subexpression elimination **/
1913   /* Checks whether n is already available. */
1914   /* The block input is used to distinguish different subexpressions. Right
1915      now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
1916      subexpressions within a block. */
1917   if (get_opt_cse())
1918     n = identify_cons (current_ir_graph->value_table, n);
1919
1920   if (n != oldn) {
1921     /* We found an existing, better node, so we can deallocate the old node. */
1922     obstack_free (current_ir_graph->obst, oldn);
1923
1924     return n;
1925   }
1926
1927   /* Some more constant expression evaluation that does not allow to
1928      free the node. */
1929   iro = get_irn_opcode(n);
1930   if (get_opt_constant_folding() ||
1931       (iro == iro_Cond) ||
1932       (iro == iro_Proj))     /* Flags tested local. */
1933     n = transform_node (n);
1934
1935   /* Remove nodes with dead (Bad) input.
1936      Run always for transformation induced Bads. */
1937   n = gigo (n);
1938
1939   /* Now we have a legal, useful node. Enter it in hash table for cse */
1940   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block)) {
1941     n = identify_remember (current_ir_graph->value_table, n);
1942   }
1943
1944   return n;
1945 }
1946
1947
1948 /**
1949  * These optimizations never deallocate nodes.  This can cause dead
1950  * nodes lying on the obstack.  Remove these by a dead node elimination,
1951  * i.e., a copying garbage collection.
1952  */
1953 ir_node *
1954 optimize_in_place_2 (ir_node *n)
1955 {
1956   tarval *tv;
1957   ir_node *oldn = n;
1958   opcode iro = get_irn_opcode(n);
1959
1960   if (!get_opt_optimize() && (get_irn_op(n) != op_Phi)) return n;
1961
1962   /* if not optimize return n */
1963   if (n == NULL) {
1964     assert(0);
1965     /* Here this is possible.  Why? */
1966     return n;
1967   }
1968
1969
1970   /* constant expression evaluation / constant folding */
1971   if (get_opt_constant_folding()) {
1972     /* constants can not be evaluated */
1973     if (iro != iro_Const) {
1974       /* try to evaluate */
1975       tv = computed_value (n);
1976       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
1977         /* evaluation was successful -- replace the node. */
1978         n = new_Const (get_tarval_mode (tv), tv);
1979                                                 DBG_OPT_ALGSIM0;
1980         return n;
1981       }
1982     }
1983   }
1984
1985   /* remove unnecessary nodes */
1986   /*if (get_opt_constant_folding()) */
1987   if (get_opt_constant_folding() ||
1988       (iro == iro_Phi)  ||   /* always optimize these nodes. */
1989       (iro == iro_Id)   ||   /* ... */
1990       (iro == iro_Proj) ||   /* ... */
1991       (iro == iro_Block)  )  /* Flags tested local. */
1992     n = equivalent_node (n);
1993
1994   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
1995
1996   /** common subexpression elimination **/
1997   /* Checks whether n is already available. */
1998   /* The block input is used to distinguish different subexpressions.  Right
1999      now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
2000      subexpressions within a block. */
2001   if (get_opt_cse()) {
2002     n = identify (current_ir_graph->value_table, n);
2003   }
2004
2005   /* Some more constant expression evaluation. */
2006   iro = get_irn_opcode(n);
2007   if (get_opt_constant_folding() ||
2008       (iro == iro_Cond) ||
2009       (iro == iro_Proj))     /* Flags tested local. */
2010     n = transform_node (n);
2011
2012   /* Remove nodes with dead (Bad) input.
2013      Run always for transformation induced Bads.  */
2014   n = gigo (n);
2015
2016   /* Now we can verify the node, as it has no dead inputs any more. */
2017   irn_vrfy(n);
2018
2019   /* Now we have a legal, useful node. Enter it in hash table for cse.
2020      Blocks should be unique anyways.  (Except the successor of start:
2021      is cse with the start block!) */
2022   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block))
2023     n = identify_remember (current_ir_graph->value_table, n);
2024
2025   return n;
2026 }
2027
2028 /**
2029  * Wrapper for external use, set proper status bits after optimization.
2030  */
2031 ir_node *
2032 optimize_in_place (ir_node *n)
2033 {
2034   /* Handle graph state */
2035   assert(get_irg_phase_state(current_ir_graph) != phase_building);
2036
2037   if (get_opt_global_cse())
2038     set_irg_pinned(current_ir_graph, op_pin_state_floats);
2039   if (get_irg_outs_state(current_ir_graph) == outs_consistent)
2040     set_irg_outs_inconsistent(current_ir_graph);
2041   /* Maybe we could also test whether optimizing the node can
2042      change the control graph. */
2043   if (get_irg_dom_state(current_ir_graph) == dom_consistent)
2044     set_irg_dom_inconsistent(current_ir_graph);
2045   return optimize_in_place_2 (n);
2046 }
2047
2048 /**
2049  * set the default ir op operations
2050  */
2051 ir_op *firm_set_default_operations(ir_op *op)
2052 {
2053   op = firm_set_default_computed_value(op);
2054   op = firm_set_default_equivalent_node(op);
2055   op = firm_set_default_transform_node(op);
2056   op = firm_set_default_node_cmp_attr(op);
2057
2058   return op;
2059 }