CVS:
[libfirm] / ir / ir / iropt.c
1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
3 **
4 ** Authors: Christian Schaefer, Goetz Lindenmaier
5 **
6 ** iropt --- optimizations intertwined with IR construction.
7 */
8
9 # include "irnode_t.h"
10 # include "irgraph_t.h"
11 # include "iropt_t.h"
12 # include "ircons.h"
13 # include "irgmod.h"
14 # include "irvrfy.h"
15 # include "tv.h"
16 # include "tune.h"
17 # include "debinfo.h"
18
19 /* Make types visible to allow most efficient access */
20 # include "entity_t.h"
21
22 /* Trivial inlineable routine for copy propagation.
23    Does follow Ids, needed to optimize inlined code. */
24 static inline ir_node *
25 follow_Id (ir_node *n)
26 {
27   while (get_irn_op (n) == op_Id) n = get_Id_pred (n);
28   return n;
29 }
30
31 static inline tarval *
32 value_of (ir_node *n)
33 {
34   if ((n != NULL) && (get_irn_op(n) == op_Const))
35     return get_Const_tarval(n);
36   else
37     return NULL;
38 }
39
40 /* if n can be computed, return the value, else NULL. Performs
41    constant folding. GL: Only if n is arithmetic operator? */
42 tarval *
43 computed_value (ir_node *n)
44 {
45   tarval *res;
46
47   ir_node *a = NULL, *b = NULL;  /* initialized to shut up gcc */
48   tarval *ta = NULL, *tb = NULL; /* initialized to shut up gcc */
49
50   res = NULL;
51
52   /* get the operands we will work on for simple cases. */
53   if (is_binop(n)) {
54     a = get_binop_left(n);
55     b = get_binop_right(n);
56   } else if (is_unop(n)) {
57     a = get_unop_op(n);
58   }
59
60   /* if the operands are constants, get the target value, else set it NULL.
61      (a and b may be NULL if we treat a node that is no computation.) */
62   ta = value_of (a);
63   tb = value_of (b);
64
65   /* Perform the constant evaluation / computation. */
66   switch (get_irn_opcode(n)) {
67   case iro_Const:
68     res = get_Const_tarval(n);
69   case iro_Add:
70     if (ta && tb && (get_irn_mode(a) == get_irn_mode(b))
71         && (get_irn_mode(a) != mode_p)) {
72       res = tarval_add (ta, tb);
73     }
74     break;
75   case iro_Sub:
76     if (ta && tb && (get_irn_mode(a) == get_irn_mode(b))
77         && (get_irn_mode(a) != mode_p)) {
78       res = tarval_sub (ta, tb);
79     } else if (a == b) {
80       res = tarval_mode_null [get_irn_modecode (n)];
81     }
82     break;
83   case iro_Minus:
84       if (ta && mode_is_float(get_irn_mode(a)))
85         res = /*tarval_minus (ta);*/ res;
86     break;
87   case iro_Mul:
88     if (ta && tb) /* tarval_mul tests for equivalent modes itself */ {
89       res = tarval_mul (ta, tb);
90     } else {
91       /* calls computed_value recursive and returns the 0 with proper
92          mode.  Why is this an extra case? */
93       tarval *v;
94       if (   (tarval_classify ((v = computed_value (a))) == 0)
95           || (tarval_classify ((v = computed_value (b))) == 0)) {
96         res = v;
97       }
98     }
99     break;
100   case iro_Abs:
101     if (ta)
102       res = /*tarval_abs (ta);*/ res;
103     /* allowed or problems with max/min ?? */
104     break;
105   case iro_And:
106     if (ta && tb) {
107       res = tarval_and (ta, tb);
108     } else {
109       tarval *v;
110       if (   (tarval_classify ((v = computed_value (a))) == 0)
111           || (tarval_classify ((v = computed_value (b))) == 0)) {
112         res = v;
113       }
114     }
115     break;
116   case iro_Or:
117     if (ta && tb) {
118       res = tarval_or (ta, tb);
119     } else {
120       tarval *v;
121       if (   (tarval_classify ((v = computed_value (a))) == -1)
122           || (tarval_classify ((v = computed_value (b))) == -1)) {
123         res = v;
124       }
125     }
126     break;
127   case iro_Eor: if (ta && tb) { res = tarval_eor (ta, tb); } break;
128   case iro_Not: if (ta)       { /*res = tarval_not (ta)*/; } break;
129   case iro_Shl: if (ta && tb) { res = tarval_shl (ta, tb); } break;
130   case iro_Shr: if (ta && tb) { res = tarval_shr (ta, tb); } break;
131   case iro_Shrs: if(ta && tb) { /*res = tarval_shrs (ta, tb)*/; } break;
132   case iro_Rot: if (ta && tb) { /*res = tarval_rot (ta, tb)*/; } break;
133   case iro_Conv: if(ta)    { res = tarval_convert_to (ta, get_irn_mode (n)); }
134     break;
135   case iro_Proj:
136     {
137       ir_node *aa, *ab;
138
139       a = get_Proj_pred(n);
140       /* Optimize Cmp nodes.
141          This performs a first step of unreachable code elimination.
142          Proj can not be computed, but folding a Cmp above the Proj here is
143          not as wasteful as folding a Cmp into a Tuple of 16 Consts of which
144          only 1 is used.
145          There are several case where we can evaluate a Cmp node:
146          1. The nodes compared are both the same.  If we compare for
147             equal, this will return true, else it will return false.
148             This step relies on cse.
149          2. The predecessors of Cmp are target values.  We can evaluate
150             the Cmp.
151          3. The predecessors are Allocs or void* constants.  Allocs never
152             return NULL, they raise an exception.   Therefore we can predict
153             the Cmp result. */
154       if (get_irn_op(a) == op_Cmp) {
155         aa = get_Cmp_left(a);
156         ab = get_Cmp_right(a);
157         if (aa == ab) { /* 1.: */
158           /* This is a tric with the bits used for encoding the Cmp
159              Proj numbers, the following statement is not the same:
160           res = tarval_from_long (mode_b, (get_Proj_proj(n) == Eq)):    */
161           res = tarval_from_long (mode_b, (get_Proj_proj(n) & irpn_Eq));
162         } else {
163           tarval *taa = computed_value (aa);
164           tarval *tab = computed_value (ab);
165           if (taa && tab) { /* 2.: */
166             /* strange checks... */
167             ir_pncmp flags = tarval_comp (taa, tab);
168             if (flags != irpn_False) {
169               res = tarval_from_long (mode_b, get_Proj_proj(n) & flags);
170             }
171           } else {  /* check for 3.: */
172             ir_node *aaa = skip_nop(skip_Proj(aa));
173             ir_node *aba = skip_nop(skip_Proj(ab));
174             if (   (   (/* aa is ProjP and aaa is Alloc */
175                            (get_irn_op(aa) == op_Proj)
176                         && (get_irn_mode(aa) == mode_p)
177                         && (get_irn_op(aaa) == op_Alloc))
178                     && (   (/* ab is constant void */
179                                (get_irn_op(ab) == op_Const)
180                             && (get_irn_mode(ab) == mode_p)
181                             && (get_Const_tarval(ab) == tarval_p_void))
182                         || (/* ab is other Alloc */
183                                (get_irn_op(ab) == op_Proj)
184                             && (get_irn_mode(ab) == mode_p)
185                             && (get_irn_op(aba) == op_Alloc)
186                             && (aaa != aba))))
187                 || (/* aa is void and aba is Alloc */
188                        (get_irn_op(aa) == op_Const)
189                     && (get_irn_mode(aa) == mode_p)
190                     && (get_Const_tarval(aa) == tarval_p_void)
191                     && (get_irn_op(ab) == op_Proj)
192                     && (get_irn_mode(ab) == mode_p)
193                     && (get_irn_op(aba) == op_Alloc)))
194               /* 3.: */
195               res = tarval_from_long (mode_b, get_Proj_proj(n) & irpn_Ne);
196           }
197         }
198       } else {
199         /* printf(" # comp_val: Proj node, not optimized\n"); */
200       }
201     }
202     break;
203   default:  ;
204   }
205
206   return res;
207 }  /* compute node */
208
209
210
211 /* returns 1 if the a and b are pointers to different locations. */
212 bool
213 different_identity (ir_node *a, ir_node *b)
214 {
215   assert (get_irn_mode (a) == mode_p
216           && get_irn_mode (b) == mode_p);
217
218   if (get_irn_op (a) == op_Proj && get_irn_op(b) == op_Proj) {
219     ir_node *a1 = get_Proj_pred (a);
220     ir_node *b1 = get_Proj_pred (b);
221     if (a1 != b1 && get_irn_op (a1) == op_Alloc
222                  && get_irn_op (b1) == op_Alloc)
223       return 1;
224   }
225   return 0;
226 }
227
228
229 /* equivalent_node returns a node equivalent to N.  It skips all nodes that
230    perform no actual computation, as, e.g., the Id nodes.  It does not create
231    new nodes.  It is therefore safe to free N if the node returned is not N.
232    If a node returns a Tuple we can not just skip it.  If the size of the
233    in array fits, we transform n into a tuple (e.g., Div). */
234 static ir_node *
235 equivalent_node (ir_node *n)
236 {
237   int ins;
238   ir_node *a = NULL; /* to shutup gcc */
239   ir_node *b = NULL; /* to shutup gcc */
240   ir_node *c = NULL; /* to shutup gcc */
241
242   ins = get_irn_arity (n);
243
244   /* get the operands we will work on */
245   if (is_binop(n)) {
246     a = get_binop_left(n);
247     b = get_binop_right(n);
248   } else if (is_unop(n)) {
249     a = get_unop_op(n);
250   }
251
252   /* skip unnecessary nodes. */
253   switch (get_irn_opcode (n)) {
254   case iro_Block:
255     {
256       /* The Block constructor does not call optimize, but mature_block
257          calls the optimization. */
258       assert(get_Block_matured(n));
259
260       /* A single entry Block following a single exit Block can be merged,
261          if it is not the Start block. */
262       /* !!! Beware, all Phi-nodes of n must have been optimized away.
263          This is true, as the block is matured before optimize is called.   */
264       if (get_Block_n_cfgpreds(n) == 1
265           && get_irn_op(get_Block_cfgpred(n, 0)) == op_Jmp) {
266         n = get_nodes_Block(get_Block_cfgpred(n, 0));
267
268       } else if (n != current_ir_graph->start_block) {
269         int i;
270         /* If all inputs are dead, this block is dead too, except if it is
271            the start block.  This is a step of unreachable code elimination */
272         for (i = 0; i < get_Block_n_cfgpreds(n); i++) {
273           if (!is_Bad(get_Block_cfgpred(n, i))) break;
274         }
275         if (i == get_Block_n_cfgpreds(n))
276           n = new_Bad();
277       }
278     }
279     break;
280
281   case iro_Jmp:  /* GL: Why not same for op_Raise?? */
282     /* unreachable code elimination */
283     if (is_Bad(get_nodes_Block(n)))  n = new_Bad();
284     break;
285   /* We do not evaluate Cond here as we replace it by a new node, a Jmp.
286      See cases for iro_Cond and iro_Proj in transform_node. */
287   /** remove stuff as x+0, x*1 x&true ... constant expression evaluation **/
288   case iro_Or:  if (a == b) {n = a; break;}
289   case iro_Add:
290   case iro_Eor:
291     { tarval *tv;
292       ir_node *on;
293       /* After running compute_node there is only one constant predecessor.
294          Find this predecessors value and remember the other node: */
295       if ((tv = computed_value (a))) {
296         on = b;
297       } else if ((tv = computed_value (b))) {
298         on = a;
299       } else break;
300
301       /* If this predecessors constant value is zero, the operation is
302          unnecessary. Remove it: */
303       if (tarval_classify (tv) == 0) {
304         n = on;
305       }
306     }
307     break;
308   case iro_Sub:
309   case iro_Shl:
310   case iro_Shr:
311   case iro_Shrs:
312   case iro_Rot:
313     /* these operations are not commutative.  Test only one predecessor. */
314     if (tarval_classify (computed_value (b)) == 0) {
315       n = a;
316       /* Test if b > #bits of a ==> return 0 / divide b by #bits
317          --> transform node? */
318     }
319     break;
320   case iro_Not:   /* NotNot x == x */
321   case iro_Minus: /* --x == x */  /* ??? Is this possible or can --x raise an
322                                      out of bounds exception if min =! max? */
323     if (get_irn_op(get_unop_op(n)) == get_irn_op(n))
324       n = get_unop_op(get_unop_op(n));
325     break;
326   case iro_Mul:
327     /* Mul is commutative and has again an other neutral element. */
328     if (tarval_classify (computed_value (a)) == 1) {
329       n = b;
330     } else if (tarval_classify (computed_value (b)) == 1) {
331       n = a;
332     }
333     break;
334   case iro_Div:
335     /* Div is not commutative. */
336     if (tarval_classify (computed_value (b)) == 1) { /* div(x, 1) == x */
337       /* Turn Div into a tuple (mem, bad, a) */
338       ir_node *mem = get_Div_mem(n);
339       turn_into_tuple(n, 3);
340       set_Tuple_pred(n, 0, mem);
341       set_Tuple_pred(n, 1, new_Bad());
342       set_Tuple_pred(n, 2, a);
343     }
344     break;
345     /* GL: Why are they skipped?  DivMod allocates new nodes --> it's
346        teated in transform node.
347   case iro_Mod, Quot, DivMod
348     */
349   case iro_And:
350     if (a == b) n = a;
351     /* And has it's own neutral element */
352     else if (tarval_classify (computed_value (a)) == -1) {
353       n = b;
354     } else if (tarval_classify (computed_value (b)) == -1) {
355       n = a;
356     }
357     break;
358   case iro_Conv:
359     if (get_irn_mode(n) == get_irn_mode(a)) { /* No Conv necessary */
360       n = a;
361     } else if (get_irn_mode(n) == mode_b) {
362       if (get_irn_op(a) == op_Conv &&
363           get_irn_mode (get_Conv_op(a)) == mode_b) {
364         n = get_Conv_op(a);     /* Convb(Conv*(xxxb(...))) == xxxb(...) */
365       }
366     }
367     break;
368
369   case iro_Phi:
370     {
371       /* Several optimizations:
372          - no Phi in start block.
373          - remove Id operators that are inputs to Phi
374          - fold Phi-nodes, iff they have only one predecessor except
375            themselves.
376       */
377       int i, n_preds;
378
379
380       ir_node *block = NULL;     /* to shutup gcc */
381       ir_node *first_val = NULL; /* to shutup gcc */
382       ir_node *scnd_val = NULL;  /* to shutup gcc */
383
384       n_preds = get_Phi_n_preds(n);
385
386       block = get_nodes_Block(n);
387       assert(get_irn_op (block) == op_Block);
388
389       /* there should be no Phi nodes in the Start region. */
390       if (block == current_ir_graph->start_block) {
391         n = new_Bad();
392         break;
393       }
394
395       if (n_preds == 0) {       /* Phi of dead Region without predecessors. */
396         /* GL: why not return new_Bad? */
397         break;
398       }
399
400 #if 0
401       /* first we test for a special case: */
402       /* Confirm is a special node fixing additional information for a
403          value that is known at a certain point.  This is useful for
404          dataflow analysis. */
405       if (n_preds == 2) {
406         ir_node *a = follow_Id (get_Phi_pred(n, 0));
407         ir_node *b = follow_Id (get_Phi_pred(n, 1));
408         if (   (get_irn_op(a) == op_Confirm)
409             && (get_irn_op(b) == op_Confirm)
410             && (follow_Id (get_irn_n(a, 0)) == follow_Id(get_irn_n(b, 0)))
411             && (get_irn_n(a, 1) == get_irn_n (b, 1))
412             && (a->data.num == (~b->data.num & irpn_True) )) {
413           n = follow_Id (get_irn_n(a, 0));
414           break;
415         }
416       }
417 #endif
418
419       /* Find first non-self-referencing input */
420       for (i = 0;  i < n_preds;  ++i) {
421         first_val = follow_Id(get_Phi_pred(n, i));
422         /* skip Id's */
423         set_Phi_pred(n, i, first_val);
424         if (   (first_val != n)                            /* not self pointer */
425                && (get_irn_op(first_val) != op_Bad)        /* value not dead */
426             && !(is_Bad (get_Block_cfgpred(block, i))) ) { /* not dead control flow */
427           break;                         /* then found first value. */
428         }
429       }
430
431       /* A totally Bad or self-referencing Phi (we didn't break the above loop) */
432       if (i >= n_preds) { n = new_Bad();  break; }
433
434       scnd_val = NULL;
435
436       /* follow_Id () for rest of inputs, determine if any of these
437          are non-self-referencing */
438       while (++i < n_preds) {
439         scnd_val = follow_Id(get_Phi_pred(n, i));
440         /* skip Id's */
441         set_Phi_pred(n, i, scnd_val);
442         if (   (scnd_val != n)
443             && (scnd_val != first_val)
444             && (get_irn_op(scnd_val) != op_Bad)
445             && !(is_Bad (get_Block_cfgpred(block, i))) ) {
446           break;
447         }
448       }
449
450       /* Fold, if no multiple distinct non-self-referencing inputs */
451       if (i >= n_preds) {
452         n = first_val;
453       } else {
454       /* skip the remaining Ids. */
455         while (++i < n_preds) {
456           set_Phi_pred(n, i, follow_Id(get_Phi_pred(n, i)));
457         }
458       }
459     }
460     break;
461
462   case iro_Load:
463     {
464       a = skip_Proj(get_Load_mem(n));
465       b = skip_Proj(get_Load_ptr(n));
466
467       if (get_irn_op(a) == op_Store) {
468         if ( different_identity (b, get_Store_ptr(a))) {
469           /* load and store use different pointers, therefore load
470              needs not take store's memory but the state before. */
471           set_Load_mem (n, get_Store_mem(a));
472         } else if (( 0 /* ???didn't get cryptic test that returns 0 */ )) {
473         }
474       }
475     }
476       break;
477   case iro_Store:
478     /* remove unnecessary store. */
479     {
480       a = skip_Proj(get_Store_mem(n));
481       b = get_Store_ptr(n);
482       c = skip_Proj(get_Store_value(n));
483
484       if (get_irn_op(a) == op_Store
485           && get_Store_ptr(a) == b
486           && skip_Proj(get_Store_value(a)) == c) {
487         /* We have twice exactly the same store -- a write after write. */
488         n = a;
489       } else if (get_irn_op(c) == op_Load
490                  && (a == c || skip_Proj(get_Load_mem(c)) == a)
491                  && get_Load_ptr(c) == b )
492                  /* !!!??? and a cryptic test */ {
493         /* We just loaded the value from the same memory, i.e., the store
494            doesn't change the memory -- a write after read. */
495         turn_into_tuple(n, 2);
496         set_Tuple_pred(n, 0, a);
497         set_Tuple_pred(n, 1, new_Bad());
498       }
499     }
500     break;
501
502   case iro_Proj:
503     {
504       a = get_Proj_pred(n);
505
506       if ( get_irn_op(a) == op_Tuple) {
507         /* Remove the Tuple/Proj combination. */
508         if ( get_Proj_proj(n) <= get_Tuple_n_preds(a) ) {
509           n = get_Tuple_pred(a, get_Proj_proj(n));
510         } else {
511           assert(0); /* This should not happen! (GL added this assert) */
512           n = new_Bad();
513         }
514       } else if (get_irn_mode(n) == mode_X &&
515                  is_Bad(get_nodes_Block(n))) {
516         /* Remove dead control flow. */
517         n = new_Bad();
518       }
519     }
520     break;
521
522   case iro_Id:
523     n = follow_Id (n);
524     break;
525
526   default: break;
527   }
528
529   return n;
530 } /* end equivalent_node() */
531
532
533 /* tries several [inplace] [optimizing] transformations and returns a
534    equivalent node.  The difference to equivalent_node is that these
535    transformations _do_ generate new nodes, and thus the old node must
536    not be freed even if the equivalent node isn't the old one. */
537 static ir_node *
538 transform_node (ir_node *n)
539 {
540
541   ir_node *a = NULL, *b;
542   tarval *ta, *tb;
543
544   switch (get_irn_opcode(n)) {
545   case iro_DivMod: {
546
547     int evaluated = 0;
548     ir_mode *mode;
549
550     a = get_DivMod_left(n);
551     b = get_DivMod_right(n);
552     mode = get_irn_mode(a);
553
554     if (!(   mode_is_int(get_irn_mode(a))
555           && mode_is_int(get_irn_mode(b))))
556       break;
557
558     if (a == b) {
559       a = new_Const (mode, tarval_from_long (mode, 1));
560       b = new_Const (mode, tarval_from_long (mode, 0));
561       evaluated = 1;
562     } else {
563       ta = value_of(a);
564       tb = value_of(b);
565
566       if (tb) {
567         if (tarval_classify(tb) == 1) {
568           b = new_Const (mode, tarval_from_long (mode, 0));
569           evaluated = 1;
570         } else if (ta) {
571           tarval *resa, *resb;
572           resa = tarval_div (ta, tb);
573           if (!resa) break; /* Causes exception!!! Model by replacing through
574                                Jmp for X result!? */
575           resb = tarval_mod (ta, tb);
576           if (!resb) break; /* Causes exception! */
577           a = new_Const (mode, resa);
578           b = new_Const (mode, resb);
579           evaluated = 1;
580         }
581       } else if (tarval_classify (ta) == 0) {
582         b = a;
583         evaluated = 1;
584       }
585     }
586     if (evaluated) { /* replace by tuple */
587       ir_node *mem = get_DivMod_mem(n);
588       turn_into_tuple(n, 4);
589       set_Tuple_pred(n, 0, mem);
590       set_Tuple_pred(n, 1, new_Bad());  /* no exception */
591       set_Tuple_pred(n, 2, a);
592       set_Tuple_pred(n, 3, b);
593       assert(get_nodes_Block(n));
594     }
595   }
596   break;
597
598   case iro_Cond: {
599     /* Replace the Cond by a Jmp if it branches on a constant
600        condition. */
601     ir_node *jmp;
602     a = get_Cond_selector(n);
603     ta = value_of(a);
604
605     if (ta && (get_irn_mode(a) == mode_b)) {
606       /* It's a boolean Cond, branching on a boolean constant.
607          Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */
608       jmp = new_r_Jmp(current_ir_graph, get_nodes_Block(n));
609       turn_into_tuple(n, 2);
610       if (tv_val_b(ta) == 1)  /* GL: I hope this returns 1 if true */ {
611         set_Tuple_pred(n, 0, new_Bad());
612         set_Tuple_pred(n, 1, jmp);
613       } else {
614         set_Tuple_pred(n, 0, jmp);
615         set_Tuple_pred(n, 1, new_Bad());
616       }
617     } else if (ta && (get_irn_mode(a) == mode_I)) {
618       /* I don't want to allow Tuples smaller than the biggest Proj.
619          Also this tuple might get really big...
620          I generate the Jmp here, and remember it in link.  Link is used
621          when optimizing Proj. */
622       set_irn_link(n, new_r_Jmp(current_ir_graph, get_nodes_Block(n)));
623     } else if (   (get_irn_op(get_Cond_selector(n)) == op_Eor)
624                && (get_irn_mode(get_Cond_selector(n)) == mode_b)
625                && (tarval_classify(computed_value(get_Eor_right(a))) == 1)) {
626       /* The Eor is a negate.  Generate a new Cond without the negate,
627          simulate the negate by exchanging the results. */
628       set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_Block(n),
629                                  get_Eor_left(a)));
630     } else if (   (get_irn_op(get_Cond_selector(n)) == op_Not)
631                && (get_irn_mode(get_Cond_selector(n)) == mode_b)) {
632       /* A Not before the Cond.  Generate a new Cond without the Not,
633          simulate the Not by exchanging the results. */
634       set_irn_link(n, new_r_Cond(current_ir_graph, get_nodes_Block(n),
635                                  get_Not_op(a)));
636     }
637   }
638   break;
639
640   case iro_Proj: {
641     a = get_Proj_pred(n);
642
643     if (  (get_irn_op(a) == op_Cond)
644         && get_irn_link(a)
645         && get_irn_op(get_irn_link(a)) == op_Cond) {
646     /* Use the better Cond if the Proj projs from a Cond which get's
647        its result from an Eor/Not. */
648       assert (   (   (get_irn_op(get_Cond_selector(a)) == op_Eor)
649                      || (get_irn_op(get_Cond_selector(a)) == op_Not))
650               && (get_irn_mode(get_Cond_selector(a)) == mode_b)
651               && (get_irn_op(get_irn_link(a)) == op_Cond)
652               && (get_Cond_selector(get_irn_link(a)) ==
653                   get_Eor_left(get_Cond_selector(a))));
654       set_Proj_pred(n, get_irn_link(a));
655       if (get_Proj_proj(n) == 0)
656         set_Proj_proj(n, 1);
657       else
658         set_Proj_proj(n, 0);
659     } else if (   (get_irn_op(a) == op_Cond)
660                && (get_irn_mode(get_Cond_selector(a)) == mode_I)
661                && value_of(a)) {
662       /* The Cond is a Switch on a Constant */
663       if (get_Proj_proj(n) == tv_val_CHIL(value_of(a))) {
664         /* The always taken branch, reuse the existing Jmp. */
665         if (!get_irn_link(a)) /* well, if it exists ;-> */
666           set_irn_link(a, new_r_Jmp(current_ir_graph, get_nodes_Block(n)));
667         assert(get_irn_op(get_irn_link(a)) == op_Jmp);
668         n = get_irn_link(a);
669       } else {
670         /* a never taken branch */
671         n = new_Bad();
672       }
673     }
674   }
675   break;
676   case iro_Eor: { /* @@@ not tested as boolean Eor not allowed any more. */
677     a = get_Eor_left(n);
678     b = get_Eor_right(n);
679
680     if (   (get_irn_mode(n) == mode_b)
681         && (get_irn_op(a) == op_Proj)
682         && (get_irn_mode(a) == mode_b)
683         && (tarval_classify (computed_value (b)) == 1)
684         && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
685       /* The Eor negates a Cmp. The Cmp has the negated result anyways! */
686       n = new_r_Proj(current_ir_graph, get_nodes_Block(n), get_Proj_pred(a),
687                      mode_b, get_negated_pnc(get_Proj_proj(a)));
688     else if (   (get_irn_mode(n) == mode_b)
689              && (tarval_classify (computed_value (b)) == 1))
690       /* The Eor is a Not. Replace it by a Not. */
691       /*   ????!!!Extend to bitfield 1111111. */
692       n = new_r_Not(current_ir_graph, get_nodes_Block(n), a, mode_b);
693   }
694   break;
695   case iro_Not: {
696     a = get_Not_op(n);
697
698     if (   (get_irn_mode(n) == mode_b)
699         && (get_irn_op(a) == op_Proj)
700         && (get_irn_mode(a) == mode_b)
701         && (get_irn_op(get_Proj_pred(a)) == op_Cmp))
702       /* We negate a Cmp. The Cmp has the negated result anyways! */
703       n = new_r_Proj(current_ir_graph, get_nodes_Block(n), get_Proj_pred(a),
704                      mode_b, get_negated_pnc(get_Proj_proj(a)));
705   }
706   break;
707   default: ;
708   }
709   return n;
710 }
711
712 /***************** Common Subexpression Elimination *****************/
713
714 /* Compare function for two nodes in the hash table.   Gets two     */
715 /* nodes as parameters.                                             */
716 /* @@@  a+b != b+a ? */
717 static int
718 vt_cmp (const void *elt, const void *key)
719 {
720   ir_node *a, *b;
721   int i;
722
723   a = (void *)elt;
724   b = (void *)key;
725
726   if (a == b) return 0;
727
728   if ((get_irn_op(a) != get_irn_op(b)) ||
729       (get_irn_mode(a) != get_irn_mode(b))) return 1;
730
731   /* compare if a's in and b's in are equal */
732   /* GL: we optimize only nodes with in arrays of fixed sizes.
733   if (get_irn_arity (a) != -2) {
734     ins = get_irn_arity (a);
735     if (ins != get_irn_arity (b)) return 1;
736     ain = get_irn_in (a);
737     bin = get_irn_in (b);
738   }
739   */
740   if (get_irn_arity (a) != get_irn_arity(b))
741     return 1;
742
743   /* compare a->in[0..ins] with b->in[0..ins], i.e., include the block. */
744   /* do if (*ain++ != *bin++) return 1; while (ins--); */
745   for (i = -1; i < get_irn_arity(a); i++)
746     if (get_irn_n(a, i) != get_irn_n(b, i))
747       return 1;
748
749
750   switch (get_irn_opcode(a)) {
751   case iro_Const:
752     return get_irn_const_attr (a) != get_irn_const_attr (b);
753   case iro_Proj:
754     return get_irn_proj_attr (a) != get_irn_proj_attr (b);
755   case iro_Alloc:
756     return (get_irn_alloc_attr(a).where != get_irn_alloc_attr(b).where)
757       || (get_irn_alloc_attr(a).type != get_irn_alloc_attr(b).type);
758   case iro_Free:
759     return (get_irn_free_attr(a) != get_irn_free_attr(b));
760   case iro_SymConst:
761     return (get_irn_symconst_attr(a).num != get_irn_symconst_attr(b).num)
762       || (get_irn_symconst_attr(a).tori.typ != get_irn_symconst_attr(b).tori.typ);
763   case iro_Call:
764     return (get_irn_call_attr(a)->kind != get_irn_call_attr(b)->kind)
765       || (get_irn_call_attr(a)->arity != get_irn_call_attr(b)->arity);
766   case iro_Sel:
767     return (get_irn_sel_attr(a).ent->kind != get_irn_sel_attr(b).ent->kind)
768       || (get_irn_sel_attr(a).ent->name != get_irn_sel_attr(b).ent->name)
769       || (get_irn_sel_attr(a).ent->owner != get_irn_sel_attr(b).ent->owner)
770       || (get_irn_sel_attr(a).ent->ld_name != get_irn_sel_attr(b).ent->ld_name)
771       || (get_irn_sel_attr(a).ent->type != get_irn_sel_attr(b).ent->type)
772       || (get_irn_sel_attr(a).ltyp != get_irn_sel_attr(b).ltyp);
773   case iro_Phi:
774     return get_irn_phi_attr (a) != get_irn_phi_attr (b);
775   default: ;
776   }
777
778   return 0;
779 }
780
781 static unsigned
782 ir_node_hash (ir_node *node)
783 {
784   unsigned h;
785   int i;
786
787   /* hash table value = 9*(9*(9*(9*(9*arity+in[0])+in[1])+ ...)+mode)+code */
788   h = get_irn_arity(node);
789
790   /* consider all in nodes... except the block. */
791   for (i = 0;  i < get_irn_arity(node);  i++) {
792     h = 9*h + (unsigned long)get_irn_n(node, i);
793   }
794
795   /* ...mode,... */
796   h = 9*h + (unsigned long) get_irn_mode (node);
797   /* ...and code */
798   h = 9*h + (unsigned long) get_irn_op (node);
799
800   return h;
801 }
802
803 pset *
804 new_identities (void)
805 {
806   return new_pset (vt_cmp, TUNE_NIR_NODES);
807 }
808
809 void
810 del_identities (pset *value_table)
811 {
812   del_pset (value_table);
813 }
814
815 /* Return the canonical node computing the same value as n.
816    Looks up the node in a hash table. */
817 static inline ir_node *
818 identify (pset *value_table, ir_node *n)
819 {
820   ir_node *o = NULL;
821
822   if (!value_table) return n;
823
824   switch (get_irn_opcode (n)) {
825   case iro_Add:
826   case iro_Mul:
827   case iro_Or:
828   case iro_And:
829   case iro_Eor:
830     {
831       /* for commutative operators perform  a OP b == b OP a */
832       if (get_binop_left(n) > get_binop_right(n)) {
833         ir_node *h = get_binop_left(n);
834         set_binop_left(n, get_binop_right(n));
835         set_binop_right(n, h);
836       }
837     }
838   break;
839   default: break;
840   }
841   o = pset_find (value_table, n, ir_node_hash (n));
842   if (!o) return n;
843
844   return o;
845 }
846
847 /* Return the canonical node computing the same value as n.
848    Looks up the node in a hash table, enters it in the table
849    if it isn't there yet. */
850 static ir_node *
851 identify_remember (pset *value_table, ir_node *node)
852 {
853   ir_node *o = NULL;
854
855   if (!value_table) return node;
856
857   /* lookup or insert in hash table with given hash key. */
858   o = pset_insert (value_table, node, ir_node_hash (node));
859
860   if (o == node) return node;
861
862   return o;
863 }
864
865 /* garbage in, garbage out. If a node has a dead input, i.e., the
866    Bad node is input to the node, return the Bad node.  */
867 static inline ir_node *
868 gigo (ir_node *node)
869 {
870   int i;
871   ir_op* op = get_irn_op(node);
872
873   /* Blocks, Phis and Tuples may have dead inputs, e.g., if one of the
874      blocks predecessors is dead. */
875   if ( op != op_Block && op != op_Phi && op != op_Tuple) {
876     for (i = -1; i < get_irn_arity(node); i++) {
877       if (is_Bad(get_irn_n(node, i))) {
878         return new_Bad();
879       }
880     }
881   }
882 #if 0
883   /* If Block has only Bads as predecessors it's garbage. */
884   /* If Phi has only Bads as predecessors it's garbage. */
885   if (op == op_Block || op == op_Phi)  {
886     for (i = 0; i < get_irn_arity(node); i++) {
887       if (!is_Bad(get_irn_n(node, i))) break;
888     }
889     if (i = get_irn_arity(node)) node = new_Bad();
890   }
891 #endif
892   return node;
893 }
894
895
896 /* These optimizations deallocate nodes from the obstack.
897    It can only be called if it is guaranteed that no other nodes
898    reference this one, i.e., right after construction of a node.  */
899 ir_node *
900 optimize (ir_node *n)
901 {
902   tarval *tv;
903   ir_node *old_n = n;
904
905   /* Allways optimize Phi nodes: part of the construction. */
906   if ((!get_optimize()) && (get_irn_op(n) != op_Phi)) return n;
907
908   /* if not optimize return n */
909   if (n == NULL) {
910     printf(" attention: empty node!!! \n");
911     return n;
912   }
913
914   /* constant expression evaluation / constant folding */
915   if (get_opt_constant_folding()) {
916     /* constants can not be evaluated */
917     if  (get_irn_op(n) != op_Const) {
918       /* try to evaluate */
919       tv = computed_value (n);
920       if (tv != NULL) {
921         /* evaluation was succesful -- replace the node. */
922         obstack_free (current_ir_graph->obst, n);
923         return new_Const (get_tv_mode (tv), tv);
924       }
925     }
926   }
927
928   /* remove unnecessary nodes */
929   if (get_opt_constant_folding() || get_irn_op(n) == op_Phi)
930     n = equivalent_node (n);
931
932   /** common subexpression elimination **/
933   /* Checks whether n is already available. */
934   /* The block input is used to distinguish different subexpressions. Right
935      now all nodes are pinned to blocks, i.e., the cse only finds common
936      subexpressions within a block. */
937   if (get_opt_cse())
938     n = identify (current_ir_graph->value_table, n);
939   /* identify found a cse, so deallocate the old node. */
940   if (n != old_n) {
941     obstack_free (current_ir_graph->obst, old_n);
942     /* The AmRoq fiasco returns n here.  Martin's version doesn't. */
943   }
944
945   /* Some more constant expression evaluation that does not allow to
946      free the node. */
947   if (get_opt_constant_folding())
948     n = transform_node (n);
949
950   /* Remove nodes with dead (Bad) input. */
951   n = gigo (n);
952   /* Now we can verify the node, as it has no dead inputs any more. */
953   irn_vrfy(n);
954
955   /* Now we have a legal, useful node. Enter it in hash table for cse */
956   if (get_opt_cse()) {
957     n = identify_remember (current_ir_graph->value_table, n);
958   }
959
960 #if 0  /* GL: what's the use of this?? */
961   if ((current_ir_graph->state & irgs_building) && IR_KEEP_ALIVE (n)) {
962     assert (~current_ir_graph->state & irgs_keep_alives_in_arr);
963     pdeq_putr (current_ir_graph->keep.living, n);
964   }
965 #endif
966   return n;
967 }
968
969
970 /* These optimizations never deallocate nodes.  This can cause dead
971    nodes lying on the obstack.  Remove these by a dead node elimination,
972    i.e., a copying garbage collection. */
973 ir_node *
974 optimize_in_place (ir_node *n)
975 {
976
977   tarval *tv;
978   ir_node *old_n = n;
979
980   if (!get_optimize()) return n;
981
982   /* if not optimize return n */
983   if (n == NULL) {
984     /* Here this is possible.  Why? */
985     return n;
986   }
987
988   /* constant expression evaluation / constant folding */
989   if (get_opt_constant_folding()) {
990     /* constants can not be evaluated */
991     if  (get_irn_op(n) != op_Const) {
992       /* try to evaluate */
993       tv = computed_value (n);
994       if (tv != NULL) {
995         /* evaluation was succesful -- replace the node. */
996         n = new_Const (get_tv_mode (tv), tv);
997         deb_info_copy(n, old_n, id_from_str("const_eval", 10));
998         return n;
999         /* xprintf("* optimize: computed node %I\n", n->op->name);*/
1000       }
1001     }
1002   }
1003
1004   /* remove unnecessary nodes */
1005   //if (get_opt_constant_folding())
1006   if (get_opt_constant_folding() || get_irn_op(n) == op_Phi)
1007     n = equivalent_node (n);
1008
1009   /** common subexpression elimination **/
1010   /* Checks whether n is already available. */
1011   /* The block input is used to distinguish different subexpressions.  Right
1012      now all nodes are pinned to blocks, i.e., the cse only finds common
1013      subexpressions within a block. */
1014   if (get_opt_cse())
1015     n = identify (current_ir_graph->value_table, n);
1016
1017   /* identify found a cse, so deallocate the old node. */
1018   if (n != old_n) {
1019     /* The AmRoq fiasco returns n here.  Martin's version doesn't. */
1020   }
1021
1022   /* Some more constant expression evaluation. */
1023   if (get_opt_constant_folding())
1024     n = transform_node (n);
1025
1026   /* Remove nodes with dead (Bad) input. */
1027   n = gigo (n);
1028   /* Now we can verify the node, as it has no dead inputs any more. */
1029   irn_vrfy(n);
1030
1031   /* Now we have a legal, useful node. Enter it in hash table for cse */
1032   if (get_opt_cse()) {
1033     /* aborts ??! set/pset can not handle several hash tables??!
1034        No, suddenly it works. */
1035     n = identify_remember (current_ir_graph->value_table, n);
1036   }
1037
1038   return n;
1039 }