0218eccdb5892b071be12377b2165274346cf0dd
[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   ir_node *pred = get_unop_op(n);
696
697   /* optimize symmetric unop */
698   if (get_irn_op(pred) == get_irn_op(n)) {
699     n = get_unop_op(pred);                                             DBG_OPT_ALGSIM2;
700   }
701   return n;
702 }
703
704 /* NotNot x == x */
705 #define equivalent_node_Not    equivalent_node_symmetric_unop
706
707 /* --x == x */  /* ??? Is this possible or can --x raise an
708                        out of bounds exception if min =! max? */
709 #define equivalent_node_Minus  equivalent_node_symmetric_unop
710
711 /**
712  * Optimize a * 1 = 1 * a = a.
713  */
714 static ir_node *equivalent_node_Mul(ir_node *n)
715 {
716   ir_node *oldn = n;
717
718   ir_node *a = get_Mul_left(n);
719   ir_node *b = get_Mul_right(n);
720
721   /* Mul is commutative and has again an other neutral element. */
722   if (classify_tarval (computed_value (a)) == TV_CLASSIFY_ONE) {
723     n = b;                                                              DBG_OPT_ALGSIM1;
724   } else if (classify_tarval (computed_value (b)) == TV_CLASSIFY_ONE) {
725     n = a;                                                              DBG_OPT_ALGSIM1;
726   }
727   return n;
728 }
729
730 /**
731  * Optimize a / 1 = a.
732  */
733 static ir_node *equivalent_node_Div(ir_node *n)
734 {
735   ir_node *a = get_Div_left(n);
736   ir_node *b = get_Div_right(n);
737
738   /* Div is not commutative. */
739   if (classify_tarval(computed_value(b)) == TV_CLASSIFY_ONE) { /* div(x, 1) == x */
740     /* Turn Div into a tuple (mem, bad, a) */
741     ir_node *mem = get_Div_mem(n);
742     turn_into_tuple(n, 3);
743     set_Tuple_pred(n, pn_Div_M,        mem);
744     set_Tuple_pred(n, pn_Div_X_except, new_Bad());        /* no exception */
745     set_Tuple_pred(n, pn_Div_res,      a);
746   }
747   return n;
748 }
749
750 /**
751  * Optimize a & 0b1...1 = 0b1...1 & a =  a & a = a.
752  */
753 static ir_node *equivalent_node_And(ir_node *n)
754 {
755   ir_node *oldn = n;
756
757   ir_node *a = get_And_left(n);
758   ir_node *b = get_And_right(n);
759
760   if (a == b) {
761     n = a;    /* And has it's own neutral element */
762   } else if (classify_tarval(computed_value(a)) == TV_CLASSIFY_ALL_ONE) {
763     n = b;
764   } else if (classify_tarval(computed_value(b)) == TV_CLASSIFY_ALL_ONE) {
765     n = a;
766   }
767   if (n != oldn)                                                        DBG_OPT_ALGSIM1;
768   return n;
769 }
770
771 /**
772  * Try to remove useless conv's:
773  */
774 static ir_node *equivalent_node_Conv(ir_node *n)
775 {
776   ir_node *oldn = n;
777   ir_node *a = get_Conv_op(n);
778   ir_node *b;
779
780   ir_mode *n_mode = get_irn_mode(n);
781   ir_mode *a_mode = get_irn_mode(a);
782
783   if (n_mode == a_mode) { /* No Conv necessary */
784     n = a;                                                              DBG_OPT_ALGSIM3;
785   } else if (get_irn_op(a) == op_Conv) { /* Conv(Conv(b)) */
786     ir_mode *b_mode;
787
788     b = get_Conv_op(a);
789     n_mode = get_irn_mode(n);
790     b_mode = get_irn_mode(b);
791
792     if (n_mode == b_mode) {
793       if (n_mode == mode_b) {
794         n = b; /* Convb(Conv*(xxxb(...))) == xxxb(...) */               DBG_OPT_ALGSIM1;
795       }
796       else if (mode_is_int(n_mode) || mode_is_character(n_mode)) {
797         if (smaller_mode(b_mode, a_mode)){
798           n = b;        /* ConvS(ConvL(xxxS(...))) == xxxS(...) */      DBG_OPT_ALGSIM1;
799         }
800       }
801     }
802   }
803   return n;
804 }
805
806 static ir_node *equivalent_node_Phi(ir_node *n)
807 {
808   /* Several optimizations:
809      - no Phi in start block.
810      - remove Id operators that are inputs to Phi
811      - fold Phi-nodes, iff they have only one predecessor except
812              themselves.
813   */
814   int i, n_preds;
815
816   ir_node *oldn = n;
817   ir_node *block = NULL;     /* to shutup gcc */
818   ir_node *first_val = NULL; /* to shutup gcc */
819   ir_node *scnd_val = NULL;  /* to shutup gcc */
820
821   if (!get_opt_normalize()) return n;
822
823   n_preds = get_Phi_n_preds(n);
824
825   block = get_nodes_block(n);
826   /* @@@ fliegt 'raus, sollte aber doch immer wahr sein!!!
827      assert(get_irn_arity(block) == n_preds && "phi in wrong block!"); */
828   if ((is_Bad(block)) ||                         /* Control dead */
829       (block == current_ir_graph->start_block))  /* There should be no Phi nodes */
830     return new_Bad();                            /* in the Start Block. */
831
832   if (n_preds == 0) return n;           /* Phi of dead Region without predecessors. */
833
834 #if 0
835   /* first we test for a special case: */
836   /* Confirm is a special node fixing additional information for a
837      value that is known at a certain point.  This is useful for
838      dataflow analysis. */
839   if (n_preds == 2) {
840     ir_node *a = get_Phi_pred(n, 0);
841     ir_node *b = get_Phi_pred(n, 1);
842     if (   (get_irn_op(a) == op_Confirm)
843         && (get_irn_op(b) == op_Confirm)
844         && follow_Id (get_irn_n(a, 0) == get_irn_n(b, 0))
845         && (get_irn_n(a, 1) == get_irn_n (b, 1))
846         && (a->data.num == (~b->data.num & irpn_True) )) {
847       return get_irn_n(a, 0);
848     }
849   }
850 #endif
851
852   /* If the Block has a Bad pred, we also have one. */
853   for (i = 0;  i < n_preds;  ++i)
854     if (is_Bad (get_Block_cfgpred(block, i)))
855       set_Phi_pred(n, i, new_Bad());
856
857   /* Find first non-self-referencing input */
858   for (i = 0;  i < n_preds;  ++i) {
859     first_val = get_Phi_pred(n, i);
860     if (   (first_val != n)                            /* not self pointer */
861 #if 1
862         && (get_irn_op(first_val) != op_Bad)
863 #endif
864            ) {        /* value not dead */
865       break;          /* then found first value. */
866     }
867   }
868
869   /* A totally Bad or self-referencing Phi (we didn't break the above loop) */
870   if (i >= n_preds) { return new_Bad(); }
871
872   scnd_val = NULL;
873
874   /* follow_Id () for rest of inputs, determine if any of these
875      are non-self-referencing */
876   while (++i < n_preds) {
877     scnd_val = get_Phi_pred(n, i);
878     if (   (scnd_val != n)
879         && (scnd_val != first_val)
880 #if 1
881         && (get_irn_op(scnd_val) != op_Bad)
882 #endif
883            ) {
884       break;
885     }
886   }
887
888   /* Fold, if no multiple distinct non-self-referencing inputs */
889   if (i >= n_preds) {
890     n = first_val;                                     DBG_OPT_PHI;
891   } else {
892     /* skip the remaining Ids (done in get_Phi_pred). */
893     /* superfluous, since we walk all to propagate Block's Bads.
894        while (++i < n_preds) get_Phi_pred(n, i);     */
895   }
896   return n;
897 }
898
899 /**
900  * optimize Proj(Tuple) and gigo for ProjX in Bad block
901  */
902 static ir_node *equivalent_node_Proj(ir_node *n)
903 {
904   ir_node *oldn = n;
905
906   ir_node *a = get_Proj_pred(n);
907
908   if ( get_irn_op(a) == op_Tuple) {
909     /* Remove the Tuple/Proj combination. */
910     if ( get_Proj_proj(n) <= get_Tuple_n_preds(a) ) {
911       n = get_Tuple_pred(a, get_Proj_proj(n));                     DBG_OPT_TUPLE;
912     } else {
913       assert(0); /* This should not happen! */
914       n = new_Bad();
915     }
916   } else if (get_irn_mode(n) == mode_X &&
917              is_Bad(get_nodes_block(n))) {
918     /* Remove dead control flow -- early gigo. */
919     n = new_Bad();
920   }
921   return n;
922 }
923
924 /**
925  * Remove Id's.
926  */
927 static ir_node *equivalent_node_Id(ir_node *n)
928 {
929   ir_node *oldn = n;
930
931   n = follow_Id(n);                                                 DBG_OPT_ID;
932   return n;
933 }
934
935 /**
936  * equivalent_node() returns a node equivalent to input n. It skips all nodes that
937  * perform no actual computation, as, e.g., the Id nodes.  It does not create
938  * new nodes.  It is therefore safe to free n if the node returned is not n.
939  * If a node returns a Tuple we can not just skip it.  If the size of the
940  * in array fits, we transform n into a tuple (e.g., Div).
941  */
942 ir_node *
943 equivalent_node(ir_node *n)
944 {
945   if (n->op->equivalent_node)
946     return n->op->equivalent_node(n);
947   return n;
948 }
949
950 /**
951  * set the default equivalent node operation
952  */
953 static ir_op *firm_set_default_equivalent_node(ir_op *op)
954 {
955 #define CASE(a)                                 \
956   case iro_##a:                                 \
957     op->equivalent_node  = equivalent_node_##a; \
958     break
959
960   switch (op->code) {
961   CASE(Block);
962   CASE(Jmp);
963   CASE(Cond);
964   CASE(Or);
965   CASE(Add);
966   CASE(Eor);
967   CASE(Sub);
968   CASE(Shl);
969   CASE(Shr);
970   CASE(Shrs);
971   CASE(Rot);
972   CASE(Not);
973   CASE(Minus);
974   CASE(Mul);
975   CASE(Div);
976   CASE(And);
977   CASE(Conv);
978   CASE(Phi);
979   CASE(Proj);
980   CASE(Id);
981   default:
982     op->equivalent_node  = NULL;
983   }
984
985   return op;
986 #undef CASE
987 }
988
989 /**
990  * Do node specific optimizations of nodes predecessors.
991  */
992 static void
993 optimize_preds(ir_node *n) {
994   ir_node *a = NULL, *b = NULL;
995
996   /* get the operands we will work on for simple cases. */
997   if (is_binop(n)) {
998     a = get_binop_left(n);
999     b = get_binop_right(n);
1000   } else if (is_unop(n)) {
1001     a = get_unop_op(n);
1002   }
1003
1004   switch (get_irn_opcode(n)) {
1005
1006   case iro_Cmp:
1007     /* We don't want Cast as input to Cmp. */
1008     if (get_irn_op(a) == op_Cast) {
1009       a = get_Cast_op(a);
1010       set_Cmp_left(n, a);
1011     }
1012     if (get_irn_op(b) == op_Cast) {
1013       b = get_Cast_op(b);
1014       set_Cmp_right(n, b);
1015     }
1016     break;
1017
1018   default: break;
1019   } /* end switch */
1020 }
1021
1022 static ir_node *transform_node_Div(ir_node *n)
1023 {
1024   tarval *tv = computed_value(n);
1025
1026   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1027
1028   if (tv != tarval_bad) {
1029     /* Turn Div into a tuple (mem, bad, value) */
1030     ir_node *mem = get_Div_mem(n);
1031
1032     turn_into_tuple(n, 3);
1033     set_Tuple_pred(n, pn_Div_M, mem);
1034     set_Tuple_pred(n, pn_Div_X_except, new_Bad());
1035     set_Tuple_pred(n, pn_Div_res, new_Const(get_tarval_mode(tv), tv));
1036   }
1037   return n;
1038 }
1039
1040 static ir_node *transform_node_Mod(ir_node *n)
1041 {
1042   tarval *tv = computed_value(n);
1043
1044   /* BEWARE: it is NOT possible to optimize a%a to 0, as this may cause a exception */
1045
1046   if (tv != tarval_bad) {
1047     /* Turn Mod into a tuple (mem, bad, value) */
1048     ir_node *mem = get_Mod_mem(n);
1049     turn_into_tuple(n, 3);
1050     set_Tuple_pred(n, pn_Mod_M, mem);
1051     set_Tuple_pred(n, pn_Mod_X_except, new_Bad());
1052     set_Tuple_pred(n, pn_Mod_res, new_Const(get_tarval_mode(tv), tv));
1053   }
1054   return n;
1055 }
1056
1057 static ir_node *transform_node_DivMod(ir_node *n)
1058 {
1059   int evaluated = 0;
1060
1061   ir_node *a = get_DivMod_left(n);
1062   ir_node *b = get_DivMod_right(n);
1063   ir_mode *mode = get_irn_mode(a);
1064   tarval *ta = value_of(a);
1065   tarval *tb = value_of(b);
1066
1067   if (!(mode_is_int(mode) && mode_is_int(get_irn_mode(b))))
1068     return n;
1069
1070   /* BEWARE: it is NOT possible to optimize a/a to 1, as this may cause a exception */
1071
1072   if (tb != tarval_bad) {
1073     if (tb == get_mode_one(get_tarval_mode(tb))) {
1074       b = new_Const (mode, get_mode_null(mode));
1075       evaluated = 1;
1076     } else if (ta != tarval_bad) {
1077       tarval *resa, *resb;
1078       resa = tarval_div (ta, tb);
1079       if (resa == tarval_bad) return n; /* Causes exception!!! Model by replacing through
1080                                         Jmp for X result!? */
1081       resb = tarval_mod (ta, tb);
1082       if (resb == tarval_bad) return n; /* Causes exception! */
1083       a = new_Const (mode, resa);
1084       b = new_Const (mode, resb);
1085       evaluated = 1;
1086     }
1087   } else if (ta == get_mode_null(mode)) {
1088     b = a;
1089     evaluated = 1;
1090   }
1091   if (evaluated) { /* replace by tuple */
1092     ir_node *mem = get_DivMod_mem(n);
1093     turn_into_tuple(n, 4);
1094     set_Tuple_pred(n, pn_DivMod_M,        mem);
1095     set_Tuple_pred(n, pn_DivMod_X_except, new_Bad());  /* no exception */
1096     set_Tuple_pred(n, pn_DivMod_res_div,  a);
1097     set_Tuple_pred(n, pn_DivMod_res_mod,  b);
1098     assert(get_nodes_block(n));
1099   }
1100
1101   return n;
1102 }
1103
1104 static ir_node *transform_node_Cond(ir_node *n)
1105 {
1106   /* Replace the Cond by a Jmp if it branches on a constant
1107      condition. */
1108   ir_node *jmp;
1109   ir_node *a = get_Cond_selector(n);
1110   tarval *ta = value_of(a);
1111
1112   if ((ta != tarval_bad) &&
1113       (get_irn_mode(a) == mode_b) &&
1114       (get_opt_unreachable_code())) {
1115     /* It's a boolean Cond, branching on a boolean constant.
1116                Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */
1117     jmp = new_r_Jmp(current_ir_graph, get_nodes_block(n));
1118     turn_into_tuple(n, 2);
1119     if (ta == tarval_b_true) {
1120       set_Tuple_pred(n, pn_Cond_false, new_Bad());
1121       set_Tuple_pred(n, pn_Cond_true, jmp);
1122     } else {
1123       set_Tuple_pred(n, pn_Cond_false, jmp);
1124       set_Tuple_pred(n, pn_Cond_true, new_Bad());
1125     }
1126     /* We might generate an endless loop, so keep it alive. */
1127     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1128   } else if ((ta != tarval_bad) &&
1129              (get_irn_mode(a) == mode_Iu) &&
1130              (get_Cond_kind(n) == dense) &&
1131              (get_opt_unreachable_code())) {
1132     /* I don't want to allow Tuples smaller than the biggest Proj.
1133        Also this tuple might get really big...
1134        I generate the Jmp here, and remember it in link.  Link is used
1135        when optimizing Proj. */
1136     set_irn_link(n, new_r_Jmp(current_ir_graph, get_nodes_block(n)));
1137     /* We might generate an endless loop, so keep it alive. */
1138     add_End_keepalive(get_irg_end(current_ir_graph), get_nodes_block(n));
1139   } else if ((get_irn_op(a) == op_Eor)
1140              && (get_irn_mode(a) == mode_b)
1141              && (classify_tarval(computed_value(get_Eor_right(a))) == TV_CLASSIFY_ONE)) {
1142     /* The Eor is a negate.  Generate a new Cond without the negate,
1143        simulate the negate by exchanging the results. */
1144     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1145                                get_Eor_left(a)));
1146   } else if ((get_irn_op(a) == op_Not)
1147              && (get_irn_mode(a) == mode_b)) {
1148     /* A Not before the Cond.  Generate a new Cond without the Not,
1149        simulate the Not by exchanging the results. */
1150     set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_block(n),
1151                                get_Not_op(a)));
1152   }
1153   return n;
1154 }
1155
1156 static ir_node *transform_node_Eor(ir_node *n)
1157 {
1158   ir_node *a = get_Eor_left(n);
1159   ir_node *b = get_Eor_right(n);
1160
1161   if ((get_irn_mode(n) == mode_b)
1162       && (get_irn_op(a) == op_Proj)
1163       && (get_irn_mode(a) == mode_b)
1164       && (classify_tarval (computed_value (b)) == TV_CLASSIFY_ONE)
1165       && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
1166     /* The Eor negates a Cmp. The Cmp has the negated result anyways! */
1167     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1168                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1169   else if ((get_irn_mode(n) == mode_b)
1170            && (classify_tarval (computed_value (b)) == TV_CLASSIFY_ONE))
1171     /* The Eor is a Not. Replace it by a Not. */
1172     /*   ????!!!Extend to bitfield 1111111. */
1173     n = new_r_Not(current_ir_graph, get_nodes_block(n), a, mode_b);
1174
1175   return n;
1176 }
1177
1178 /**
1179  * Transfor a boolean Not.
1180  */
1181 static ir_node *transform_node_Not(ir_node *n)
1182 {
1183   ir_node *a = get_Not_op(n);
1184
1185   if (   (get_irn_mode(n) == mode_b)
1186       && (get_irn_op(a) == op_Proj)
1187       && (get_irn_mode(a) == mode_b)
1188       && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
1189     /* We negate a Cmp. The Cmp has the negated result anyways! */
1190     n = new_r_Proj(current_ir_graph, get_nodes_block(n), get_Proj_pred(a),
1191                    mode_b, get_negated_pnc(get_Proj_proj(a)));
1192
1193   return n;
1194 }
1195
1196 /**
1197  * Transform a Div/Mod/DivMod with a non-zero constant. Must be
1198  * done here instead of equivalent node because in creates new
1199  * nodes.
1200  */
1201 static ir_node *transform_node_Proj(ir_node *proj)
1202 {
1203   ir_node *n = get_Proj_pred(proj);
1204   ir_node *b;
1205   tarval *tb;
1206
1207   switch (get_irn_opcode(n)) {
1208   case iro_Div:
1209     if (get_Proj_proj(proj) == pn_Div_X_except) {
1210       b  = get_Div_right(n);
1211       tb = computed_value(b);
1212
1213       /* we found an exception handler, see if we can remove it */
1214       if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* div(x, c) && c != 0 */
1215         return new_Bad();
1216       }
1217     }
1218     break;
1219   case iro_Mod:
1220     if (get_Proj_proj(proj) == pn_Mod_X_except) {
1221       b  = get_Mod_right(n);
1222       tb = computed_value(b);
1223
1224       if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* mod(x, c) && c != 0 */
1225         return new_Bad();
1226       }
1227     }
1228     break;
1229   case iro_DivMod:
1230     if (get_Proj_proj(proj) == pn_DivMod_X_except) {
1231       b  = get_DivMod_right(n);
1232       tb = computed_value(b);
1233
1234       if (tb != tarval_bad && classify_tarval(tb) != TV_CLASSIFY_NULL) { /* DivMod(x, c) && c != 0 */
1235         return new_Bad();
1236       }
1237     }
1238     break;
1239
1240   case iro_Cond:
1241     if (get_opt_unreachable_code()) {
1242       b = get_Cond_selector(n);
1243       tb = computed_value(b);
1244
1245       if (tb != tarval_bad && mode_is_int(get_tarval_mode(tb))) {
1246         /* we have a constant switch */
1247         long num = get_Proj_proj(proj);
1248
1249         if (num != get_Cond_defaultProj(n)) { /* we cannot optimize default Proj's yet */
1250           if (get_tarval_long(tb) == num) {
1251             /* Do NOT create a jump here, or we will have 2 control flow ops
1252              * in a block. This case is optimized away in optimize_cf(). */
1253             return proj;
1254           }
1255           else
1256             return new_Bad();
1257         }
1258       }
1259     }
1260     return proj;
1261
1262   case iro_Tuple:
1263     /* should not happen, but if it does will optimize */
1264     break;
1265
1266   default:
1267     /* do nothing */
1268     return proj;
1269   }
1270
1271   /* we have added a Tuple, optimize it for the current Proj away */
1272   return equivalent_node_Proj(proj);
1273 }
1274
1275 /**
1276  * returns the operands of a commutative bin-op, if one operand is
1277  * a const, it is returned as the second one.
1278  */
1279 static void get_comm_Binop_Ops(ir_node *binop, ir_node **a, ir_node **c)
1280 {
1281   ir_node *op_a = get_binop_left(binop);
1282   ir_node *op_b = get_binop_right(binop);
1283
1284   assert(is_op_commutative(get_irn_op(binop)));
1285
1286   if (get_irn_op(op_a) == op_Const) {
1287     *a = op_b;
1288     *c = op_a;
1289   }
1290   else {
1291     *a = op_a;
1292     *c = op_b;
1293   }
1294 }
1295
1296 /**
1297  * Optimize a Or(And(Or(And(v,c4),c3),c2),c1) pattern if possible.
1298  * Such pattern may arise in bitfield stores.
1299  *
1300  * value  c4                  value      c4 & c2
1301  *    AND     c3                    AND           c1 | c3
1302  *        OR     c2      ===>               OR
1303  *           AND    c1
1304  *               OR
1305  */
1306 static ir_node *transform_node_Or(ir_node *or)
1307 {
1308   ir_node *and, *c1;
1309   ir_node *or_l, *c2;
1310   ir_node *and_l, *c3;
1311   ir_node *value, *c4;
1312   ir_node *new_and, *new_const, *block;
1313   ir_mode *mode = get_irn_mode(or);
1314
1315   tarval *tv1, *tv2, *tv3, *tv4, *tv, *n_tv4, *n_tv2;
1316
1317   get_comm_Binop_Ops(or, &and, &c1);
1318   if ((get_irn_op(c1) != op_Const) || (get_irn_op(and) != op_And))
1319     return or;
1320
1321   get_comm_Binop_Ops(and, &or_l, &c2);
1322   if ((get_irn_op(c2) != op_Const) || (get_irn_op(or_l) != op_Or))
1323     return or;
1324
1325   get_comm_Binop_Ops(or_l, &and_l, &c3);
1326   if ((get_irn_op(c3) != op_Const) || (get_irn_op(and_l) != op_And))
1327     return or;
1328
1329   get_comm_Binop_Ops(and_l, &value, &c4);
1330   if (get_irn_op(c4) != op_Const)
1331     return or;
1332
1333   /* ok, found the pattern, check for conditions */
1334   assert(mode == get_irn_mode(and));
1335   assert(mode == get_irn_mode(or_l));
1336   assert(mode == get_irn_mode(and_l));
1337
1338   tv1 = get_Const_tarval(c1);
1339   tv2 = get_Const_tarval(c2);
1340   tv3 = get_Const_tarval(c3);
1341   tv4 = get_Const_tarval(c4);
1342
1343   tv = tarval_or(tv4, tv2);
1344   if (classify_tarval(tv) != TV_CLASSIFY_ALL_ONE) {
1345     /* have at least one 0 at the same bit position */
1346     return or;
1347   }
1348
1349   n_tv4 = tarval_not(tv4);
1350   if (tv3 != tarval_and(tv3, n_tv4)) {
1351     /* bit in the or_mask is outside the and_mask */
1352     return or;
1353   }
1354
1355   n_tv2 = tarval_not(tv2);
1356   if (tv1 != tarval_and(tv1, n_tv2)) {
1357     /* bit in the or_mask is outside the and_mask */
1358     return or;
1359   }
1360
1361   /* ok, all conditions met */
1362   block = get_nodes_block(or);
1363
1364   new_and = new_r_And(current_ir_graph, block,
1365       value, new_r_Const(current_ir_graph, block, mode, tarval_and(tv4, tv2)), mode);
1366
1367   new_const = new_r_Const(current_ir_graph, block, mode, tarval_or(tv3, tv1));
1368
1369   set_Or_left(or, new_and);
1370   set_Or_right(or, new_const);
1371
1372   /* check for more */
1373   return transform_node_Or(or);
1374 }
1375
1376 /**
1377  * Tries several [inplace] [optimizing] transformations and returns an
1378  * equivalent node.  The difference to equivalent_node() is that these
1379  * transformations _do_ generate new nodes, and thus the old node must
1380  * not be freed even if the equivalent node isn't the old one.
1381  */
1382 static ir_node *transform_node(ir_node *n)
1383 {
1384   if (n->op->transform_node)
1385     n = n->op->transform_node(n);
1386   return n;
1387 }
1388
1389 /**
1390  * set the default transform node operation
1391  */
1392 static ir_op *firm_set_default_transform_node(ir_op *op)
1393 {
1394 #define CASE(a)                                 \
1395   case iro_##a:                                 \
1396     op->transform_node  = transform_node_##a;   \
1397     break
1398
1399   switch (op->code) {
1400   CASE(Div);
1401   CASE(Mod);
1402   CASE(DivMod);
1403   CASE(Cond);
1404   CASE(Eor);
1405   CASE(Not);
1406   CASE(Proj);
1407   CASE(Or);
1408   default:
1409     op->transform_node  = NULL;
1410   }
1411
1412   return op;
1413 #undef CASE
1414 }
1415
1416
1417 /* **************** Common Subexpression Elimination **************** */
1418
1419 /** The size of the hash table used, should estimate the number of nodes
1420     in a graph. */
1421 #define N_IR_NODES 512
1422
1423 static int node_cmp_attr_Const(ir_node *a, ir_node *b)
1424 {
1425   return (get_Const_tarval(a) != get_Const_tarval(b))
1426       || (get_Const_type(a) != get_Const_type(b));
1427 }
1428
1429 static int node_cmp_attr_Proj(ir_node *a, ir_node *b)
1430 {
1431     return get_irn_proj_attr (a) != get_irn_proj_attr (b);
1432 }
1433
1434 static int node_cmp_attr_Filter(ir_node *a, ir_node *b)
1435 {
1436     return get_Filter_proj(a) != get_Filter_proj(b);
1437 }
1438
1439 static int node_cmp_attr_Alloc(ir_node *a, ir_node *b)
1440 {
1441     return (get_irn_alloc_attr(a).where != get_irn_alloc_attr(b).where)
1442       || (get_irn_alloc_attr(a).type != get_irn_alloc_attr(b).type);
1443 }
1444
1445 static int node_cmp_attr_Free(ir_node *a, ir_node *b)
1446 {
1447     return (get_irn_free_attr(a) != get_irn_free_attr(b));
1448 }
1449
1450 static int node_cmp_attr_SymConst(ir_node *a, ir_node *b)
1451 {
1452     return (get_irn_symconst_attr(a).num != get_irn_symconst_attr(b).num)
1453       || (get_irn_symconst_attr(a).sym.type_p != get_irn_symconst_attr(b).sym.type_p);
1454 }
1455
1456 static int node_cmp_attr_Call(ir_node *a, ir_node *b)
1457 {
1458     return (get_irn_call_attr(a) != get_irn_call_attr(b));
1459 }
1460
1461 static int node_cmp_attr_FuncCall(ir_node *a, ir_node *b)
1462 {
1463     return (get_irn_funccall_attr(a) != get_irn_funccall_attr(b));
1464 }
1465
1466 static int node_cmp_attr_Sel(ir_node *a, ir_node *b)
1467 {
1468     return (get_irn_sel_attr(a).ent->kind != get_irn_sel_attr(b).ent->kind)
1469       || (get_irn_sel_attr(a).ent->name != get_irn_sel_attr(b).ent->name)
1470       || (get_irn_sel_attr(a).ent->owner != get_irn_sel_attr(b).ent->owner)
1471       || (get_irn_sel_attr(a).ent->ld_name != get_irn_sel_attr(b).ent->ld_name)
1472       || (get_irn_sel_attr(a).ent->type != get_irn_sel_attr(b).ent->type);
1473 }
1474
1475 static int node_cmp_attr_Phi(ir_node *a, ir_node *b)
1476 {
1477     return get_irn_phi_attr (a) != get_irn_phi_attr (b);
1478 }
1479
1480 static int node_cmp_attr_Cast(ir_node *a, ir_node *b)
1481 {
1482     return get_Cast_type(a) != get_Cast_type(b);
1483 }
1484
1485 static int node_cmp_attr_Load(ir_node *a, ir_node *b)
1486 {
1487   if (get_Load_volatility(a) == volatility_is_volatile ||
1488       get_Load_volatility(b) == volatility_is_volatile)
1489     /* NEVER do CSE on volatile Loads */
1490     return 1;
1491
1492   return get_Load_mode(a) != get_Load_mode(b);
1493 }
1494
1495 static int node_cmp_attr_Store(ir_node *a, ir_node *b)
1496 {
1497   /* NEVER do CSE on volatile Stores */
1498   return (get_Store_volatility(a) == volatility_is_volatile ||
1499       get_Load_volatility(b) == volatility_is_volatile);
1500 }
1501
1502 /**
1503  * set the default node attribute compare operation
1504  */
1505 static ir_op *firm_set_default_node_cmp_attr(ir_op *op)
1506 {
1507 #define CASE(a)                             \
1508   case iro_##a:                             \
1509     op->node_cmp_attr  = node_cmp_attr_##a; \
1510     break
1511
1512   switch (op->code) {
1513   CASE(Const);
1514   CASE(Proj);
1515   CASE(Filter);
1516   CASE(Alloc);
1517   CASE(Free);
1518   CASE(SymConst);
1519   CASE(Call);
1520   CASE(FuncCall);
1521   CASE(Sel);
1522   CASE(Phi);
1523   CASE(Cast);
1524   CASE(Load);
1525   CASE(Store);
1526   default:
1527     op->node_cmp_attr  = NULL;
1528   }
1529
1530   return op;
1531 #undef CASE
1532 }
1533
1534 /**
1535  * Compare function for two nodes in the hash table. Gets two
1536  * nodes as parameters.  Returns 0 if the nodes are a cse.
1537  */
1538 static int
1539 vt_cmp (const void *elt, const void *key)
1540 {
1541   ir_node *a, *b;
1542   int i, irn_arity_a;
1543
1544   a = (void *)elt;
1545   b = (void *)key;
1546
1547   if (a == b) return 0;
1548
1549   if ((get_irn_op(a) != get_irn_op(b)) ||
1550       (get_irn_mode(a) != get_irn_mode(b))) return 1;
1551
1552   /* compare if a's in and b's in are equal */
1553   irn_arity_a = get_irn_arity (a);
1554   if (irn_arity_a != get_irn_arity(b))
1555     return 1;
1556
1557   /* for block-local cse and op_pin_state_pinned nodes: */
1558   if (!get_opt_global_cse() || (get_op_pinned(get_irn_op(a)) == op_pin_state_pinned)) {
1559     if (get_irn_n(a, -1) != get_irn_n(b, -1))
1560       return 1;
1561   }
1562
1563   /* compare a->in[0..ins] with b->in[0..ins] */
1564   for (i = 0; i < irn_arity_a; i++)
1565     if (get_irn_n(a, i) != get_irn_n(b, i))
1566       return 1;
1567
1568   /*
1569    * here, we already now that the nodes are identical except their
1570    * attributes
1571    */
1572   if (a->op->node_cmp_attr)
1573     return a->op->node_cmp_attr(a, b);
1574
1575   return 0;
1576 }
1577
1578 /*
1579  * Calculate a hash value of a node.
1580  */
1581 unsigned
1582 ir_node_hash (ir_node *node)
1583 {
1584   unsigned h;
1585   int i, irn_arity;
1586
1587   if (node->op == op_Const) {
1588     /* special value for const, as they only differ in their tarval. */
1589     h = ((unsigned) node->attr.con.tv)>>3 ;
1590     h = 9*h + (unsigned)get_irn_mode(node);
1591   } else if (node->op == op_SymConst) {
1592     /* special value for const, as they only differ in their symbol. */
1593     h = ((unsigned) node->attr.i.sym.type_p)>>3 ;
1594     h = 9*h + (unsigned)get_irn_mode(node);
1595   } else {
1596
1597     /* hash table value = 9*(9*(9*(9*(9*arity+in[0])+in[1])+ ...)+mode)+code */
1598     h = irn_arity = get_irn_arity(node);
1599
1600     /* consider all in nodes... except the block. */
1601     for (i = 0;  i < irn_arity;  i++) {
1602       h = 9*h + (unsigned)get_irn_n(node, i);
1603     }
1604
1605     /* ...mode,... */
1606     h = 9*h + (unsigned) get_irn_mode (node);
1607     /* ...and code */
1608     h = 9*h + (unsigned) get_irn_op (node);
1609   }
1610
1611   return h;
1612 }
1613
1614 pset *
1615 new_identities (void)
1616 {
1617   return new_pset (vt_cmp, N_IR_NODES);
1618 }
1619
1620 void
1621 del_identities (pset *value_table)
1622 {
1623   del_pset (value_table);
1624 }
1625
1626 /**
1627  * Return the canonical node computing the same value as n.
1628  * Looks up the node in a hash table.
1629  *
1630  * For Const nodes this is performed in the constructor, too.  Const
1631  * nodes are extremely time critical because of their frequent use in
1632  * constant string arrays.
1633  */
1634 static INLINE ir_node *
1635 identify (pset *value_table, ir_node *n)
1636 {
1637   ir_node *o = NULL;
1638
1639   if (!value_table) return n;
1640
1641   /* TODO: use a generic commutative attribute */
1642   if (get_opt_reassociation()) {
1643     if (is_op_commutative(get_irn_op(n))) {
1644       ir_node *l = get_binop_left(n);
1645       ir_node *r = get_binop_right(n);
1646
1647       /* for commutative operators perform  a OP b == b OP a */
1648       if (l > r) {
1649         set_binop_left(n, r);
1650         set_binop_right(n, l);
1651       }
1652     }
1653   }
1654
1655   o = pset_find (value_table, n, ir_node_hash (n));
1656   if (!o) return n;
1657
1658   return o;
1659 }
1660
1661 /**
1662  * During construction we set the op_pin_state_pinned flag in the graph right when the
1663  * optimization is performed.  The flag turning on procedure global cse could
1664  * be changed between two allocations.  This way we are safe.
1665  */
1666 static INLINE ir_node *
1667 identify_cons (pset *value_table, ir_node *n) {
1668   ir_node *old = n;
1669
1670   n = identify(value_table, n);
1671   if (get_irn_n(old, -1) != get_irn_n(n, -1))
1672     set_irg_pinned(current_ir_graph, op_pin_state_floats);
1673   return n;
1674 }
1675
1676 /**
1677  * Return the canonical node computing the same value as n.
1678  * Looks up the node in a hash table, enters it in the table
1679  * if it isn't there yet.
1680  */
1681 static ir_node *
1682 identify_remember (pset *value_table, ir_node *node)
1683 {
1684   ir_node *o = NULL;
1685
1686   if (!value_table) return node;
1687
1688   /* lookup or insert in hash table with given hash key. */
1689   o = pset_insert (value_table, node, ir_node_hash (node));
1690
1691   if (o == node) return node;
1692
1693   return o;
1694 }
1695
1696 void
1697 add_identities (pset *value_table, ir_node *node) {
1698   identify_remember (value_table, node);
1699 }
1700
1701 /**
1702  * garbage in, garbage out. If a node has a dead input, i.e., the
1703  * Bad node is input to the node, return the Bad node.
1704  */
1705 static INLINE ir_node *
1706 gigo (ir_node *node)
1707 {
1708   int i, irn_arity;
1709   ir_op* op = get_irn_op(node);
1710
1711   /* remove garbage blocks by looking at control flow that leaves the block
1712      and replacing the control flow by Bad. */
1713   if (get_irn_mode(node) == mode_X) {
1714     ir_node *block = get_nodes_block(node);
1715     if (op == op_End) return node;     /* Don't optimize End, may have Bads. */
1716     if (get_irn_op(block) == op_Block && get_Block_matured(block)) {
1717       irn_arity = get_irn_arity(block);
1718       for (i = 0; i < irn_arity; i++) {
1719         if (!is_Bad(get_irn_n(block, i))) break;
1720       }
1721       if (i == irn_arity) return new_Bad();
1722     }
1723   }
1724
1725   /* Blocks, Phis and Tuples may have dead inputs, e.g., if one of the
1726      blocks predecessors is dead. */
1727   if ( op != op_Block && op != op_Phi && op != op_Tuple) {
1728     irn_arity = get_irn_arity(node);
1729     for (i = -1; i < irn_arity; i++) {
1730       if (is_Bad(get_irn_n(node, i))) {
1731         return new_Bad();
1732       }
1733     }
1734   }
1735 #if 0
1736   /* With this code we violate the agreement that local_optimize
1737      only leaves Bads in Block, Phi and Tuple nodes. */
1738   /* If Block has only Bads as predecessors it's garbage. */
1739   /* If Phi has only Bads as predecessors it's garbage. */
1740   if ((op == op_Block && get_Block_matured(node)) || op == op_Phi)  {
1741     irn_arity = get_irn_arity(node);
1742     for (i = 0; i < irn_arity; i++) {
1743       if (!is_Bad(get_irn_n(node, i))) break;
1744     }
1745     if (i == irn_arity) node = new_Bad();
1746   }
1747 #endif
1748   return node;
1749 }
1750
1751
1752 /**
1753  * These optimizations deallocate nodes from the obstack.
1754  * It can only be called if it is guaranteed that no other nodes
1755  * reference this one, i.e., right after construction of a node.
1756  */
1757 ir_node *
1758 optimize_node (ir_node *n)
1759 {
1760   tarval *tv;
1761   ir_node *oldn = n;
1762   opcode iro = get_irn_opcode(n);
1763
1764   /* Allways optimize Phi nodes: part of the construction. */
1765   if ((!get_opt_optimize()) && (iro != iro_Phi)) return n;
1766
1767   /* constant expression evaluation / constant folding */
1768   if (get_opt_constant_folding()) {
1769     /* constants can not be evaluated */
1770     if (iro != iro_Const) {
1771       /* try to evaluate */
1772       tv = computed_value (n);
1773       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
1774         /*
1775          * we MUST copy the node here temporary, because it's still needed
1776          * for DBG_OPT_ALGSIM0
1777          */
1778         int node_size = offsetof(ir_node, attr) +  n->op->attr_size;
1779         ir_node *x = alloca(node_size);
1780
1781         memcpy(x, n, node_size);
1782         oldn = x;
1783
1784         /* evaluation was successful -- replace the node. */
1785         obstack_free (current_ir_graph->obst, n);
1786         n = new_Const (get_tarval_mode (tv), tv);
1787                                                         DBG_OPT_ALGSIM0;
1788         return n;
1789       }
1790     }
1791   }
1792
1793   /* remove unnecessary nodes */
1794   if (get_opt_constant_folding() ||
1795       (iro == iro_Phi)  ||   /* always optimize these nodes. */
1796       (iro == iro_Id)   ||
1797       (iro == iro_Proj) ||
1798       (iro == iro_Block)  )  /* Flags tested local. */
1799     n = equivalent_node (n);
1800
1801   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
1802
1803   /** common subexpression elimination **/
1804   /* Checks whether n is already available. */
1805   /* The block input is used to distinguish different subexpressions. Right
1806      now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
1807      subexpressions within a block. */
1808   if (get_opt_cse())
1809     n = identify_cons (current_ir_graph->value_table, n);
1810
1811   if (n != oldn) {
1812     /* We found an existing, better node, so we can deallocate the old node. */
1813     obstack_free (current_ir_graph->obst, oldn);
1814
1815     return n;
1816   }
1817
1818   /* Some more constant expression evaluation that does not allow to
1819      free the node. */
1820   iro = get_irn_opcode(n);
1821   if (get_opt_constant_folding() ||
1822       (iro == iro_Cond) ||
1823       (iro == iro_Proj))     /* Flags tested local. */
1824     n = transform_node (n);
1825
1826   /* Remove nodes with dead (Bad) input.
1827      Run always for transformation induced Bads. */
1828   n = gigo (n);
1829
1830   /* Now we have a legal, useful node. Enter it in hash table for cse */
1831   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block)) {
1832     n = identify_remember (current_ir_graph->value_table, n);
1833   }
1834
1835   return n;
1836 }
1837
1838
1839 /**
1840  * These optimizations never deallocate nodes.  This can cause dead
1841  * nodes lying on the obstack.  Remove these by a dead node elimination,
1842  * i.e., a copying garbage collection.
1843  */
1844 ir_node *
1845 optimize_in_place_2 (ir_node *n)
1846 {
1847   tarval *tv;
1848   ir_node *oldn = n;
1849   opcode iro = get_irn_opcode(n);
1850
1851   if (!get_opt_optimize() && (get_irn_op(n) != op_Phi)) return n;
1852
1853   /* if not optimize return n */
1854   if (n == NULL) {
1855     assert(0);
1856     /* Here this is possible.  Why? */
1857     return n;
1858   }
1859
1860
1861   /* constant expression evaluation / constant folding */
1862   if (get_opt_constant_folding()) {
1863     /* constants can not be evaluated */
1864     if (iro != iro_Const) {
1865       /* try to evaluate */
1866       tv = computed_value (n);
1867       if ((get_irn_mode(n) != mode_T) && (tv != tarval_bad)) {
1868         /* evaluation was successful -- replace the node. */
1869         n = new_Const (get_tarval_mode (tv), tv);
1870                                                 DBG_OPT_ALGSIM0;
1871         return n;
1872       }
1873     }
1874   }
1875
1876   /* remove unnecessary nodes */
1877   if (get_opt_constant_folding() ||
1878       (iro == iro_Phi)  ||   /* always optimize these nodes. */
1879       (iro == iro_Id)   ||   /* ... */
1880       (iro == iro_Proj) ||   /* ... */
1881       (iro == iro_Block)  )  /* Flags tested local. */
1882     n = equivalent_node (n);
1883
1884   optimize_preds(n);                  /* do node specific optimizations of nodes predecessors. */
1885
1886   /** common subexpression elimination **/
1887   /* Checks whether n is already available. */
1888   /* The block input is used to distinguish different subexpressions.  Right
1889      now all nodes are op_pin_state_pinned to blocks, i.e., the cse only finds common
1890      subexpressions within a block. */
1891   if (get_opt_cse()) {
1892     n = identify (current_ir_graph->value_table, n);
1893   }
1894
1895   /* Some more constant expression evaluation. */
1896   iro = get_irn_opcode(n);
1897   if (get_opt_constant_folding() ||
1898       (iro == iro_Cond) ||
1899       (iro == iro_Proj))     /* Flags tested local. */
1900     n = transform_node (n);
1901
1902   /* Remove nodes with dead (Bad) input.
1903      Run always for transformation induced Bads.  */
1904   n = gigo (n);
1905
1906   /* Now we can verify the node, as it has no dead inputs any more. */
1907   irn_vrfy(n);
1908
1909   /* Now we have a legal, useful node. Enter it in hash table for cse.
1910      Blocks should be unique anyways.  (Except the successor of start:
1911      is cse with the start block!) */
1912   if (get_opt_cse() && (get_irn_opcode(n) != iro_Block))
1913     n = identify_remember (current_ir_graph->value_table, n);
1914
1915   return n;
1916 }
1917
1918 /**
1919  * Wrapper for external use, set proper status bits after optimization.
1920  */
1921 ir_node *
1922 optimize_in_place (ir_node *n)
1923 {
1924   /* Handle graph state */
1925   assert(get_irg_phase_state(current_ir_graph) != phase_building);
1926
1927   if (get_opt_global_cse())
1928     set_irg_pinned(current_ir_graph, op_pin_state_floats);
1929   if (get_irg_outs_state(current_ir_graph) == outs_consistent)
1930     set_irg_outs_inconsistent(current_ir_graph);
1931
1932   /* Maybe we could also test whether optimizing the node can
1933      change the control graph. */
1934   if (get_irg_dom_state(current_ir_graph) == dom_consistent)
1935     set_irg_dom_inconsistent(current_ir_graph);
1936   return optimize_in_place_2 (n);
1937 }
1938
1939 /**
1940  * set the default ir op operations
1941  */
1942 ir_op *firm_set_default_operations(ir_op *op)
1943 {
1944   op = firm_set_default_computed_value(op);
1945   op = firm_set_default_equivalent_node(op);
1946   op = firm_set_default_transform_node(op);
1947   op = firm_set_default_node_cmp_attr(op);
1948
1949   return op;
1950 }