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