Check that binary Cond has two successors if outs are available
[libfirm] / ir / ir / irvrfy.c
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/irvrfy.c
4  * Purpose:     Check irnodes for correctness.
5  * Author:      Christian Schaefer
6  * Modified by: Goetz Lindenmaier. Till Riedel. Michael Beck.
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 "irprog.h"
18 # include "irop_t.h"
19 # include "irgraph_t.h"
20 # include "ircgcons.h"
21 # include "irvrfy_t.h"
22 # include "irgwalk.h"
23 # include "irdump.h"
24 # include "irdom_t.h"
25 # include "irprintf.h"
26
27 /** if this flag is set, verify entity types in Load & Store nodes */
28 static int vrfy_entities = 0;
29
30 node_verification_t opt_do_node_verification = NODE_VERIFICATION_ON;
31 const char *firm_vrfy_failure_msg;
32
33 /* enable verification of Load/Store entities */
34 void vrfy_enable_entity_tests(int enable) {
35   vrfy_entities = enable;
36 }
37
38 /**
39  * little helper for NULL modes
40  */
41 static const char *get_mode_name_ex(ir_mode *mode) {
42   if (! mode)
43     return "<no mode>";
44   return get_mode_name(mode);
45 }
46
47 void do_node_verification(node_verification_t mode) {
48   opt_do_node_verification = mode;
49 }
50
51 /** the last IRG, on which a verify error was found */
52 static ir_graph *last_irg_error = NULL;
53
54 /**
55  * print the name of the entity of an verification failure
56  */
57 static void show_entity_failure(ir_node *node)
58 {
59   ir_graph *irg = get_irn_irg(node);
60
61   if (last_irg_error == irg)
62     return;
63
64   last_irg_error = irg;
65
66   if (irg == get_const_code_irg()) {
67     fprintf(stderr, "\nFIRM: irn_vrfy_irg() <of CONST_CODE_IRG> failed\n");
68   }
69   else {
70     entity *ent = get_irg_entity(irg);
71
72     if (ent) {
73       type *ent_type = get_entity_owner(ent);
74
75       if (ent_type) {
76         if (ent_type == get_glob_type())
77           fprintf(stderr, "\nFIRM: irn_vrfy_irg() %s failed\n", get_entity_name(ent));
78         else
79           fprintf(stderr, "\nFIRM: irn_vrfy_irg() %s::%s failed\n", get_type_name(ent_type), get_entity_name(ent));
80       }
81       else {
82           fprintf(stderr, "\nFIRM: irn_vrfy_irg() <NULL>::%s failed\n", get_entity_name(ent));
83       }
84     }
85     else {
86      fprintf(stderr, "\nFIRM: irn_vrfy_irg() <IRG %p> failed\n", (void *)irg);
87     }
88   }
89 }
90
91 /**
92  * Prints a failure for a Node
93  */
94 static void show_node_failure(ir_node *n)
95 {
96   show_entity_failure(n);
97   fprintf(stderr, "  node %ld %s%s\n" ,
98     get_irn_node_nr(n),
99     get_irn_opname(n), get_irn_modename(n)
100   );
101 }
102
103 /**
104  * Prints a failure message for a binop
105  */
106 static void show_binop_failure(ir_node *n, const char *text)
107 {
108   ir_node *left  = get_binop_left(n);
109   ir_node *right = get_binop_right(n);
110
111   show_entity_failure(n);
112   fprintf(stderr, "  node %ld %s%s(%s%s, %s%s) did not match (%s)\n",
113       get_irn_node_nr(n),
114       get_irn_opname(n), get_irn_modename(n),
115       get_irn_opname(left), get_irn_modename(left),
116       get_irn_opname(right), get_irn_modename(right),
117       text);
118 }
119
120 /**
121  * Prints a failure message for an unop
122  */
123 static void show_unop_failure(ir_node *n, const char *text)
124 {
125   ir_node *op  = get_unop_op(n);
126
127   show_entity_failure(n);
128   fprintf(stderr, "  node %ld %s%s(%s%s) did not match (%s)\n",
129       get_irn_node_nr(n),
130       get_irn_opname(n), get_irn_modename(n),
131       get_irn_opname(op), get_irn_modename(op),
132       text);
133 }
134
135 /**
136  * Prints a failure message for an op with 3 operands
137  */
138 static void show_triop_failure(ir_node *n, const char *text)
139 {
140   ir_node *op0  = get_irn_n(n, 0);
141   ir_node *op1  = get_irn_n(n, 1);
142   ir_node *op2  = get_irn_n(n, 2);
143
144   show_entity_failure(n);
145   fprintf(stderr, "  of node %ld %s%s(%s%s, %s%s, %s%s) did not match (%s)\n",
146       get_irn_node_nr(n),
147       get_irn_opname(n), get_irn_modename(n),
148       get_irn_opname(op0), get_irn_modename(op0),
149       get_irn_opname(op1), get_irn_modename(op1),
150       get_irn_opname(op2), get_irn_modename(op2),
151       text);
152 }
153
154 /**
155  * Prints a failure message for a proj
156  */
157 static void show_proj_failure(ir_node *n)
158 {
159   ir_node *op  = get_Proj_pred(n);
160   int proj     = get_Proj_proj(n);
161
162   show_entity_failure(n);
163   fprintf(stderr, "  node %ld %s%s %d(%s%s) failed\n" ,
164       get_irn_node_nr(n),
165       get_irn_opname(n), get_irn_modename(n), proj,
166       get_irn_opname(op), get_irn_modename(op));
167 }
168
169 /**
170  * Prints a failure message for a proj from Start
171  */
172 static void show_proj_mode_failure(ir_node *n, type *ty)
173 {
174   long proj  = get_Proj_proj(n);
175   ir_mode *m = get_type_mode(ty);
176
177   show_entity_failure(n);
178   fprintf(stderr, "  Proj %ld mode %s proj %ld (type %s mode %s) failed\n" ,
179       get_irn_node_nr(n),
180       get_irn_modename(n),
181       proj,
182       get_type_name(ty),
183       get_mode_name_ex(m));
184 }
185
186 /**
187  * Prints a failure message for a proj
188  */
189 static void show_proj_failure_ent(ir_node *n, entity *ent)
190 {
191   ir_node *op  = get_Proj_pred(n);
192   int proj     = get_Proj_proj(n);
193   ir_mode *m   = get_type_mode(get_entity_type(ent));
194
195   show_entity_failure(n);
196   fprintf(stderr, "  node %ld %s%s %d(%s%s) entity %s(type %s mode %s)failed\n" ,
197       get_irn_node_nr(n),
198       get_irn_opname(n), get_irn_modename(n), proj,
199       get_irn_opname(op), get_irn_modename(op),
200       get_entity_name(ent), get_type_name(get_entity_type(ent)),
201       get_mode_name_ex(m));
202 }
203
204 /**
205  * Show a node and a graph
206  */
207 static void show_node_on_graph(ir_graph *irg, ir_node *n)
208 {
209   entity *ent = get_irg_entity(irg);
210
211   if (ent)
212     fprintf(stderr, "\nFIRM: irn_vrfy_irg() of entity %s, node %ld %s%s\n",
213       get_entity_name(ent),
214       get_irn_node_nr(n), get_irn_opname(n), get_irn_modename(n));
215   else
216     fprintf(stderr, "\nFIRM: irn_vrfy_irg() of graph %p, node %ld %s%s\n",
217       (void *)irg,
218       get_irn_node_nr(n), get_irn_opname(n), get_irn_modename(n));
219 }
220
221 /**
222  * Show call params
223  */
224 static void show_call_param(ir_node *n, type *mt)
225 {
226   int i;
227
228   show_entity_failure(n);
229   fprintf(stderr, "  Call type-check failed: %s(", get_type_name(mt));
230   for (i = 0; i < get_method_n_params(mt); ++i) {
231     fprintf(stderr, "%s ", get_mode_name_ex(get_type_mode(get_method_param_type(mt, i))));
232   }
233   fprintf(stderr, ") != CALL(");
234
235   for (i = 0; i < get_Call_n_params(n); ++i) {
236     fprintf(stderr, "%s ", get_mode_name_ex(get_irn_mode(get_Call_param(n, i))));
237   }
238   fprintf(stderr, ")\n");
239
240 }
241
242 /**
243  * Show return modes
244  */
245 static void show_return_modes(ir_graph *irg, ir_node *n, type *mt, int i)
246 {
247   entity *ent = get_irg_entity(irg);
248
249   show_entity_failure(n);
250   fprintf(stderr, "  Return node %ld in entity \"%s\" mode %s different from type mode %s\n",
251     get_irn_node_nr(n), get_entity_name(ent),
252     get_mode_name_ex(get_irn_mode(get_Return_res(n, i))),
253     get_mode_name_ex(get_type_mode(get_method_res_type(mt, i)))
254   );
255 }
256
257 /**
258  * Show return number of results
259  */
260 static void show_return_nres(ir_graph *irg, ir_node *n, type *mt)
261 {
262   entity *ent = get_irg_entity(irg);
263
264   show_entity_failure(n);
265   fprintf(stderr, "  Return node %ld in entity \"%s\" has %d results different from type %d\n",
266     get_irn_node_nr(n), get_entity_name(ent),
267     get_Return_n_ress(n), get_method_n_ress(mt));
268 }
269
270 /**
271  * Show Phi input
272  */
273 static void show_phi_failure(ir_node *phi, ir_node *pred, int pos)
274 {
275   show_entity_failure(phi);
276   fprintf(stderr, "  Phi node %ld has mode %s different from predeccessor node %ld mode %s\n",
277     get_irn_node_nr(phi), get_mode_name_ex(get_irn_mode(phi)),
278     get_irn_node_nr(pred), get_mode_name_ex(get_irn_mode(pred)));
279 }
280
281 /**
282  * Show Phi inputs
283  */
284 static void show_phi_inputs(ir_node *phi, ir_node *block)
285 {
286   show_entity_failure(phi);
287   fprintf(stderr, "  Phi node %ld has %d inputs, its Block %ld has %d\n",
288     get_irn_node_nr(phi),   get_irn_arity(phi),
289     get_irn_node_nr(block), get_irn_arity(block));
290 }
291
292 /** If the address is Sel or SymConst, return the entity. */
293 static entity *get_ptr_entity(ir_node *ptr) {
294   if (get_irn_op(ptr) == op_Sel) {
295     return get_Sel_entity(ptr);
296   } else if ((get_irn_op(ptr) == op_SymConst) && (get_SymConst_kind(ptr) == symconst_addr_ent)) {
297     return get_SymConst_entity(ptr);
298   }
299   return NULL;
300 }
301
302 /**
303  * verify a Proj(Start) node
304  */
305 static int verify_node_Proj_Start(ir_node *n, ir_node *p) {
306   ir_mode *mode = get_irn_mode(p);
307   long proj     = get_Proj_proj(p);
308
309   ASSERT_AND_RET_DBG(
310     (
311      (proj == pn_Start_X_initial_exec && mode == mode_X) ||
312      (proj == pn_Start_M         && mode == mode_M) ||
313      (proj == pn_Start_P_frame_base && mode_is_reference(mode)) ||
314      (proj == pn_Start_P_globals && mode_is_reference(mode)) ||
315      (proj == pn_Start_T_args    && mode == mode_T) ||
316      (proj == pn_Start_P_value_arg_base && mode_is_reference(mode)) ||
317      (proj == pn_Start_P_value_arg_base && mode == mode_T)    /* FIXME: only one of those */
318     ),
319     "wrong Proj from Start", 0,
320     show_proj_failure(p);
321   );
322   return 1;
323 }
324
325 /**
326  * verify a Proj(Cond) node
327  */
328 static int verify_node_Proj_Cond(ir_node *pred, ir_node *p) {
329   ir_mode *mode = get_irn_mode(p);
330   long proj     = get_Proj_proj(p);
331
332   ASSERT_AND_RET_DBG(
333     (
334       (proj >= 0 && mode == mode_X && get_irn_mode(get_Cond_selector(pred)) == mode_b) ||   /* compare */
335       (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred)))) ||             /* switch */
336       is_Bad(get_Cond_selector(pred))                                                       /* rare */
337     ),
338     "wrong Proj from Cond", 0,
339     show_proj_failure(p);
340   );
341   return 1;
342 }
343
344 /**
345  * verify a Proj(Raise) node
346  */
347 static int verify_node_Proj_Raise(ir_node *n, ir_node *p) {
348   ir_mode *mode = get_irn_mode(p);
349   long proj     = get_Proj_proj(p);
350
351   ASSERT_AND_RET_DBG(
352     ((proj == pn_Raise_X && mode == mode_X) || (proj == pn_Raise_M && mode == mode_M)),
353     "wrong Proj from Raise", 0,
354     show_proj_failure(p);
355   );
356   return 1;
357 }
358
359 /**
360  * verify a Proj(InstOf) node
361  */
362 static int verify_node_Proj_InstOf(ir_node *n, ir_node *p) {
363   ir_mode *mode = get_irn_mode(p);
364   long proj     = get_Proj_proj(p);
365
366   ASSERT_AND_RET_DBG(
367     (proj >= 0 && mode == mode_X),
368     "wrong Proj from InstOf", 0,
369     show_proj_failure(p);
370   );
371   return 1;
372 }
373
374 /**
375  * verify a Proj(Call) node
376  */
377 static int verify_node_Proj_Call(ir_node *n, ir_node *p) {
378   ir_mode *mode = get_irn_mode(p);
379   long proj     = get_Proj_proj(p);
380
381   ASSERT_AND_RET_DBG(
382     ((proj == pn_Call_M_regular        && mode == mode_M) ||
383      (proj == pn_Call_X_except         && mode == mode_X) ||
384      (proj == pn_Call_T_result         && mode == mode_T) ||
385      (proj == pn_Call_M_except         && mode == mode_M) ||
386      (proj == pn_Call_P_value_res_base && mode == mode_P)),
387     "wrong Proj from Call", 0,
388     show_proj_failure(p);
389   );
390   if (proj == pn_Call_X_except)
391     ASSERT_AND_RET(
392       get_irn_op(get_Call_mem(n)) != op_NoMem,
393       "Exception Proj from FunctionCall", 0);
394   else if (proj == pn_Call_M_regular || proj == pn_Call_M_except)
395     ASSERT_AND_RET(
396       (get_irn_op(get_Call_mem(n)) != op_NoMem || 1),
397       "Memory Proj from FunctionCall", 0);
398   return 1;
399 }
400
401 /**
402  * verify a Proj(Quot) node
403  */
404 static int verify_node_Proj_Quot(ir_node *n, ir_node *p) {
405   ir_mode *mode = get_irn_mode(p);
406   long proj     = get_Proj_proj(p);
407
408   ASSERT_AND_RET_DBG(
409     ((proj == pn_Quot_M        && mode == mode_M) ||
410      (proj == pn_Quot_X_except && mode == mode_X) ||
411      (proj == pn_Quot_res      && mode_is_float(mode))),
412     "wrong Proj from Quot", 0,
413     show_proj_failure(p);
414   );
415   if (proj == pn_Quot_X_except)
416     ASSERT_AND_RET(
417       get_irn_pinned(n) == op_pin_state_pinned,
418       "Exception Proj from unpinned Quot", 0);
419   else if (proj == pn_Quot_M)
420     ASSERT_AND_RET(
421       get_irn_pinned(n) == op_pin_state_pinned,
422       "Memory Proj from unpinned Quot", 0);
423   return 1;
424 }
425
426 /**
427  * verify a Proj(DivMod) node
428  */
429 static int verify_node_Proj_DivMod(ir_node *n, ir_node *p) {
430   ir_mode *mode = get_irn_mode(p);
431   long proj     = get_Proj_proj(p);
432
433   ASSERT_AND_RET_DBG(
434     ((proj == pn_DivMod_M        && mode == mode_M) ||
435      (proj == pn_DivMod_X_except && mode == mode_X) ||
436      (proj == pn_DivMod_res_div  && mode_is_int(mode)) ||
437      (proj == pn_DivMod_res_mod  && mode_is_int(mode))),
438     "wrong Proj from DivMod", 0,
439     show_proj_failure(p);
440   );
441   if (proj == pn_DivMod_X_except)
442     ASSERT_AND_RET(
443       get_irn_pinned(n) == op_pin_state_pinned,
444       "Exception Proj from unpinned DivMod", 0);
445   else if (proj == pn_DivMod_M)
446     ASSERT_AND_RET(
447       get_irn_pinned(n) == op_pin_state_pinned,
448       "Memory Proj from unpinned DivMod", 0);
449   return 1;
450 }
451
452 /**
453  * verify a Proj(Div) node
454  */
455 static int verify_node_Proj_Div(ir_node *n, ir_node *p) {
456   ir_mode *mode = get_irn_mode(p);
457   long proj     = get_Proj_proj(p);
458
459   ASSERT_AND_RET_DBG(
460     ((proj == pn_Div_M        && mode == mode_M) ||
461      (proj == pn_Div_X_except && mode == mode_X) ||
462      (proj == pn_Div_res      && mode_is_int(mode))),
463     "wrong Proj from Div", 0,
464     show_proj_failure(p);
465   );
466   if (proj == pn_Div_X_except)
467     ASSERT_AND_RET(
468       get_irn_pinned(n) == op_pin_state_pinned,
469       "Exception Proj from unpinned Div", 0);
470   else if (proj == pn_Div_M)
471     ASSERT_AND_RET(
472       get_irn_pinned(n) == op_pin_state_pinned,
473       "Memory Proj from unpinned Div", 0);
474   return 1;
475 }
476
477 /**
478  * verify a Proj(Mod) node
479  */
480 static int verify_node_Proj_Mod(ir_node *n, ir_node *p) {
481   ir_mode *mode = get_irn_mode(p);
482   long proj     = get_Proj_proj(p);
483
484   ASSERT_AND_RET_DBG(
485     ((proj == pn_Mod_M        && mode == mode_M) ||
486      (proj == pn_Mod_X_except && mode == mode_X) ||
487      (proj == pn_Mod_res      && mode_is_int(mode))),
488     "wrong Proj from Mod", 0,
489     show_proj_failure(p);
490   );
491   if (proj == pn_Mod_X_except)
492     ASSERT_AND_RET(
493       get_irn_pinned(n) == op_pin_state_pinned,
494       "Exception Proj from unpinned Mod", 0);
495   else if (proj == pn_Mod_M)
496     ASSERT_AND_RET(
497       get_irn_pinned(n) == op_pin_state_pinned,
498       "Memory Proj from unpinned Div", 0);
499   return 1;
500 }
501
502 /**
503  * verify a Proj(Cmp) node
504  */
505 static int verify_node_Proj_Cmp(ir_node *n, ir_node *p) {
506   ir_mode *mode = get_irn_mode(p);
507   long proj     = get_Proj_proj(p);
508
509   ASSERT_AND_RET_DBG(
510     (proj >= 0 && proj <= 15 && mode == mode_b),
511     "wrong Proj from Cmp", 0,
512     show_proj_failure(p);
513   );
514   return 1;
515 }
516
517 /**
518  * verify a Proj(Load) node
519  */
520 static int verify_node_Proj_Load(ir_node *n, ir_node *p) {
521   ir_mode *mode = get_irn_mode(p);
522   long proj     = get_Proj_proj(p);
523
524   if (proj == pn_Load_res) {
525     ir_node *ptr = get_Load_ptr(n);
526     entity *ent = get_ptr_entity(ptr);
527
528     if (vrfy_entities && ent && get_irg_phase_state(current_ir_graph) == phase_high) {
529       /* do NOT check this for lowered phases, see comment on Store */
530       ASSERT_AND_RET_DBG(
531         (mode == get_type_mode(get_entity_type(ent))),
532         "wrong data Proj from Load, entity type_mode failed", 0,
533         show_proj_failure_ent(p, ent);
534       );
535     }
536     else {
537       ASSERT_AND_RET_DBG(
538         mode_is_data(mode) && mode == get_Load_mode(n),
539         "wrong data Proj from Load", 0,
540         show_proj_failure(p);
541       );
542     }
543   }
544   else {
545     ASSERT_AND_RET_DBG(
546       ((proj == pn_Load_M        && mode == mode_M) ||
547        (proj == pn_Load_X_except && mode == mode_X)),
548       "wrong Proj from Load", 0,
549       show_proj_failure(p);
550     );
551   }
552   if (proj == pn_Load_X_except)
553     ASSERT_AND_RET(
554       get_irn_pinned(n) == op_pin_state_pinned,
555       "Exception Proj from unpinned Load", 0);
556   return 1;
557 }
558
559 /**
560  * verify a Proj(Store) node
561  */
562 static int verify_node_Proj_Store(ir_node *n, ir_node *p) {
563   ir_mode *mode = get_irn_mode(p);
564   long proj     = get_Proj_proj(p);
565
566   ASSERT_AND_RET_DBG(
567     ((proj == pn_Store_M        && mode == mode_M) ||
568      (proj == pn_Store_X_except && mode == mode_X)),
569     "wrong Proj from Store", 0,
570     show_proj_failure(p);
571   );
572   if (proj == pn_Store_X_except)
573     ASSERT_AND_RET(
574       get_irn_pinned(n) == op_pin_state_pinned,
575       "Exception Proj from unpinned Store", 0);
576   return 1;
577 }
578
579 /**
580  * verify a Proj(Alloc) node
581  */
582 static int verify_node_Proj_Alloc(ir_node *n, ir_node *p) {
583   ir_mode *mode = get_irn_mode(p);
584   long proj     = get_Proj_proj(p);
585
586   ASSERT_AND_RET_DBG(
587     (
588      (proj == pn_Alloc_M        && mode == mode_M) ||
589      (proj == pn_Alloc_X_except /* && mode == mode_X*/) ||
590      (proj == pn_Alloc_res      && mode_is_reference(mode))
591     ),
592     "wrong Proj from Alloc", 0,
593     show_proj_failure(p);
594   );
595   return 1;
596 }
597
598 /**
599  * verify a Proj(Proj) node
600  */
601 static int verify_node_Proj_Proj(ir_node *pred, ir_node *p) {
602   ir_mode *mode = get_irn_mode(p);
603   long proj     = get_Proj_proj(p);
604   long nr       = get_Proj_proj(pred);
605   type *mt; /* A method type */
606
607   pred = skip_Id(get_Proj_pred(pred));
608   ASSERT_AND_RET((get_irn_mode(pred) == mode_T), "Proj from something not a tuple", 0);
609
610   switch (get_irn_opcode(pred)) {
611     case iro_Start:
612       mt = get_entity_type(get_irg_entity(get_irn_irg(pred)));
613
614       if (nr == pn_Start_T_args) {
615         ASSERT_AND_RET(
616           (proj >= 0 && mode_is_data(mode)),
617           "wrong Proj from Proj from Start", 0);
618         ASSERT_AND_RET(
619           (proj < get_method_n_params(mt)),
620           "More Projs for args than args in type", 0
621         );
622         if ((mode_is_reference(mode)) && is_compound_type(get_method_param_type(mt, proj)))
623           /* value argument */ break;
624
625         ASSERT_AND_RET_DBG(
626           (mode == get_type_mode(get_method_param_type(mt, proj))),
627           "Mode of Proj from Start doesn't match mode of param type.", 0,
628           show_proj_mode_failure(p, get_method_param_type(mt, proj));
629         );
630       }
631       else if (nr == pn_Start_P_value_arg_base) {
632         ASSERT_AND_RET(
633           (proj >= 0 && mode_is_reference(mode)),
634           "wrong Proj from Proj from Start", 0
635         );
636         ASSERT_AND_RET(
637           (proj < get_method_n_params(mt)),
638           "More Projs for args than args in type", 0
639         );
640       }
641       break;
642
643     case iro_Call:
644       {
645         ASSERT_AND_RET(
646           (proj >= 0 && mode_is_data(mode)),
647           "wrong Proj from Proj from Call", 0);
648         mt = get_Call_type(pred);
649         ASSERT_AND_RET(
650           (proj < get_method_n_ress(mt)),
651           "More Projs for results than results in type.", 0);
652         if ((mode_is_reference(mode)) && is_compound_type(get_method_res_type(mt, proj)))
653           /* value result */ break;
654
655         ASSERT_AND_RET(
656           (mode == get_type_mode(get_method_res_type(mt, proj))),
657           "Mode of Proj from Call doesn't match mode of result type.", 0);
658       }
659       break;
660
661     case iro_Tuple:
662       /* We don't test */
663       break;
664
665     case iro_Bad:
666       /* hmm, optimization did not remove it */
667       break;
668
669     default:
670       ASSERT_AND_RET(0, "Unknown opcode", 0);
671   }
672   return 1;
673 }
674
675 /**
676  * verify a Proj(Tuple) node
677  */
678 static int verify_node_Proj_Tuple(ir_node *n, ir_node *p) {
679   /* We don't test */
680   return 1;
681 }
682
683 /**
684  * verify a Proj(CallBegin) node
685  */
686 static int verify_node_Proj_CallBegin(ir_node *n, ir_node *p) {
687   return 1;
688 }
689
690 /**
691  * verify a Proj(EndReg) node
692  */
693 static int verify_node_Proj_EndReg(ir_node *n, ir_node *p) {
694   ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
695                   "EndReg may only appear if ip view is constructed.", 0);
696   return 1;
697 }
698
699 /**
700  * verify a Proj(EndExcept) node
701  */
702 static int verify_node_Proj_EndExcept(ir_node *n, ir_node *p) {
703   ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
704                   "EndExcept may only appear if ip view is constructed.", 0);
705   return 1;
706 }
707
708 /**
709  * verify a Proj node
710  */
711 static int
712 verify_node_Proj(ir_node *p, ir_graph *irg) {
713   ir_node *pred;
714   ir_op *op;
715
716   pred = skip_Id(get_Proj_pred(p));
717   ASSERT_AND_RET(get_irn_mode(pred) == mode_T, "mode of a 'projed' node is not Tuple", 0);
718
719   op = get_irn_op(pred);
720
721   if (op->verify_proj_node)
722     return op->verify_proj_node(pred, p);
723
724   /* all went ok */
725   return 1;
726 }
727
728 /**
729  * verify a Block node
730  */
731 static int verify_node_Block(ir_node *n, ir_graph *irg) {
732   int i;
733
734   for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
735     ir_node *pred =  get_Block_cfgpred(n, i);
736     ASSERT_AND_RET(
737       (is_Bad(pred)     ||
738        is_Unknown(pred) ||
739        (get_irn_mode(pred) == mode_X)
740       ), "Block node", 0);
741   }
742
743   /*  End block may only have Return, Raise or fragile ops as preds. */
744   if (n == get_irg_end_block(irg))
745     for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
746       ir_node *pred =  skip_Proj(get_Block_cfgpred(n, i));
747       if (is_Proj(pred) || get_irn_op(pred) == op_Tuple)
748         break;   /*  We can not test properly.  How many tuples are there? */
749       ASSERT_AND_RET(((get_irn_op(pred) == op_Return) ||
750                       is_Bad(pred)                    ||
751                       (get_irn_op(pred) == op_Raise)  ||
752                       is_fragile_op(pred)               ),
753                      "End Block node", 0);
754     }
755   /*  irg attr must == graph we are in. */
756   if (! get_interprocedural_view()) {
757     ASSERT_AND_RET(((get_irn_irg(n) && get_irn_irg(n) == irg)), "Block node has wrong irg attribute", 0);
758   }
759   return 1;
760 }
761
762 /**
763  * verify a Start node
764  */
765 static int verify_node_Start(ir_node *n, ir_graph *irg) {
766   ir_mode *mymode = get_irn_mode(n);
767
768   ASSERT_AND_RET(
769     /* Start: BB --> X x M x ref x data1 x ... x datan x ref */
770     mymode == mode_T, "Start node", 0
771   );
772   return 1;
773 }
774
775 /**
776  * verify a Jmp node
777  */
778 static int verify_node_Jmp(ir_node *n, ir_graph *irg) {
779   ir_mode *mymode = get_irn_mode(n);
780
781   ASSERT_AND_RET(
782     /* Jmp: BB --> X */
783     mymode == mode_X, "Jmp node", 0
784   );
785   return 1;
786 }
787
788 /**
789  * verify an IJmp node
790  */
791 static int verify_node_IJmp(ir_node *n, ir_graph *irg) {
792   ir_mode *mymode  = get_irn_mode(n);
793   ir_mode *op1mode = get_irn_mode(get_IJmp_target(n));
794
795   ASSERT_AND_RET(
796     /* IJmp: BB x ref --> X */
797     mymode == mode_X && mode_is_reference(op1mode), "IJmp node", 0
798   );
799   return 1;
800 }
801
802 /**
803  * verify a Break node
804  */
805 static int verify_node_Break(ir_node *n, ir_graph *irg) {
806   ir_mode *mymode = get_irn_mode(n);
807
808   ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
809                   "Break may only appear if ip view is constructed.", 0);
810   ASSERT_AND_RET(
811     /* Jmp: BB --> X */
812     mymode == mode_X, "Break node", 0
813   );
814   return 1;
815 }
816
817 /**
818  * verify a Cond node
819  */
820 static int verify_node_Cond(ir_node *n, ir_graph *irg) {
821   ir_mode *mymode  = get_irn_mode(n);
822   ir_mode *op1mode = get_irn_mode(get_Cond_selector(n));
823
824   ASSERT_AND_RET(
825     /* Cond: BB x b --> X x X */
826     (op1mode == mode_b ||
827     /* Cond: BB x int --> X^n */
828     mode_is_int(op1mode) ),  "Cond node", 0
829   );
830   ASSERT_AND_RET(mymode == mode_T, "Cond mode is not a tuple", 0);
831
832   if (op1mode == mode_b && get_irg_outs_state(irg) == outs_consistent) {
833     /* we have consistent outs, check for the right number of Proj's */
834     ASSERT_AND_RET(
835       get_irn_n_outs(n) == 2,
836       "BinaryCond node must have 2 successors", 0);
837   }
838   return 1;
839 }
840
841 /**
842  * verify a Return node
843  */
844 static int verify_node_Return(ir_node *n, ir_graph *irg) {
845   int i;
846   ir_mode *mymode   = get_irn_mode(n);
847   ir_mode *mem_mode = get_irn_mode(get_Return_mem(n));
848   type *mt;
849
850   /* Return: BB x M x data1 x ... x datan --> X */
851
852   ASSERT_AND_RET( mem_mode == mode_M, "Return node", 0 );  /* operand M */
853
854   for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
855     ASSERT_AND_RET( mode_is_data(get_irn_mode(get_Return_res(n, i))), "Return node", 0 );  /* operand datai */
856   }
857   ASSERT_AND_RET( mymode == mode_X, "Result X", 0 );   /* result X */
858   /* Compare returned results with result types of method type */
859   mt = get_entity_type(get_irg_entity(irg));
860   ASSERT_AND_RET_DBG( get_Return_n_ress(n) == get_method_n_ress(mt),
861     "Number of results for Return doesn't match number of results in type.", 0,
862   show_return_nres(irg, n, mt););
863   for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
864     type *res_type = get_method_res_type(mt, i);
865
866     if (is_atomic_type(res_type)) {
867       ASSERT_AND_RET_DBG(
868         get_irn_mode(get_Return_res(n, i)) == get_type_mode(res_type),
869         "Mode of result for Return doesn't match mode of result type.", 0,
870         show_return_modes(irg, n, mt, i);
871       );
872     }
873     else {
874       ASSERT_AND_RET_DBG(
875         mode_is_reference(get_irn_mode(get_Return_res(n, i))),
876         "Mode of result for Return doesn't match mode of result type.", 0,
877         show_return_modes(irg, n, mt, i);
878       );
879     }
880   }
881   return 1;
882 }
883
884 /**
885  * verify a Raise node
886  */
887 static int verify_node_Raise(ir_node *n, ir_graph *irg) {
888   ir_mode *mymode  = get_irn_mode(n);
889   ir_mode *op1mode = get_irn_mode(get_Raise_mem(n));
890   ir_mode *op2mode = get_irn_mode(get_Raise_exo_ptr(n));
891
892   ASSERT_AND_RET(
893     /* Sel: BB x M x ref --> X x M */
894     op1mode == mode_M && mode_is_reference(op2mode) &&
895     mymode == mode_T, "Raise node", 0
896   );
897   return 1;
898 }
899
900 /**
901  * verify a Const node
902  */
903 static int verify_node_Const(ir_node *n, ir_graph *irg) {
904   ir_mode *mymode = get_irn_mode(n);
905
906   ASSERT_AND_RET(
907     /* Const: BB --> data */
908     (mode_is_data(mymode) ||
909     mymode == mode_b)      /* we want boolean constants for static evaluation */
910     ,"Const node", 0       /* of Cmp. */
911   );
912   return 1;
913 }
914
915 /**
916  * verify a SymConst node
917  */
918 static int verify_node_SymConst(ir_node *n, ir_graph *irg) {
919   ir_mode *mymode = get_irn_mode(n);
920
921   if (get_SymConst_kind(n) == symconst_addr_ent) {
922     entity *ent = get_SymConst_entity(n);
923     if (is_Method_type(get_entity_type(ent)) &&
924         get_irn_irg(n) != get_const_code_irg()) {
925 #if 1
926       ASSERT_AND_RET((get_entity_peculiarity(ent) != peculiarity_description),
927                      "A constant must address an existing method.", 0);
928 #endif
929     }
930   }
931   ASSERT_AND_RET(
932     /* SymConst: BB --> int*/
933     (mode_is_int(mymode) ||
934     /* SymConst: BB --> ref */
935     mode_is_reference(mymode))
936     ,"SymConst node", 0);
937   return 1;
938 }
939
940 /**
941  * verify a Sel node
942  */
943 static int verify_node_Sel(ir_node *n, ir_graph *irg) {
944   int i;
945   ir_mode *mymode  = get_irn_mode(n);
946   ir_mode *op1mode = get_irn_mode(get_Sel_mem(n));
947   ir_mode *op2mode = get_irn_mode(get_Sel_ptr(n));
948   entity *ent;
949
950   ASSERT_AND_RET_DBG(
951     /* Sel: BB x M x ref x int^n --> ref */
952     (op1mode == mode_M && op2mode == mymode && mode_is_reference(mymode)),
953     "Sel node", 0, show_node_failure(n)
954   );
955
956   for (i = get_Sel_n_indexs(n) - 1; i >= 0; --i) {
957     ASSERT_AND_RET_DBG(mode_is_int(get_irn_mode(get_Sel_index(n, i))), "Sel node", 0, show_node_failure(n));
958   }
959   ent = get_Sel_entity(n);
960   ASSERT_AND_RET_DBG(ent, "Sel node with empty entity", 0, show_node_failure(n));
961   return 1;
962 }
963
964 /**
965  * verify an InstOf node
966  */
967 static int verify_node_InstOf(ir_node *n, ir_graph *irg) {
968   ir_mode *mymode  = get_irn_mode(n);
969   ir_mode *op1mode = get_irn_mode(get_InstOf_obj(n));
970
971   ASSERT_AND_RET(mode_T == mymode, "mode of Instof is not a tuple", 0);
972   ASSERT_AND_RET(mode_is_data(op1mode), "Instof not on data", 0);
973   return 1;
974 }
975
976 /**
977  * verify a Call node
978  */
979 static int verify_node_Call(ir_node *n, ir_graph *irg) {
980   ir_mode *mymode  = get_irn_mode(n);
981   ir_mode *op1mode = get_irn_mode(get_Call_mem(n));
982   ir_mode *op2mode = get_irn_mode(get_Call_ptr(n));
983   type *mt;
984   int i;
985
986   /* Call: BB x M x ref x data1 x ... x datan
987      --> M x datan+1 x ... x data n+m */
988   ASSERT_AND_RET( op1mode == mode_M && mode_is_reference(op2mode), "Call node", 0 );  /* operand M x ref */
989
990   /* NoMem nodes are only allowed as memory input if the Call is NOT pinned */
991   ASSERT_AND_RET(
992     (get_irn_op(get_Call_mem(n)) == op_NoMem) ||
993     (get_irn_op(get_Call_mem(n)) != op_NoMem && get_irn_pinned(n) == op_pin_state_pinned),
994     "Call node with wrong memory input", 0 );
995
996   mt = get_Call_type(n);
997   if(get_unknown_type() == mt) {
998     return 1;
999   }
1000
1001   for (i = get_Call_n_params(n) - 1; i >= 0; --i) {
1002     ASSERT_AND_RET( mode_is_data(get_irn_mode(get_Call_param(n, i))), "Call node", 0 );  /* operand datai */
1003   }
1004
1005   ASSERT_AND_RET( mymode == mode_T, "Call result not a tuple", 0 );   /* result T */
1006   /* Compare arguments of node with those of type */
1007
1008   if (get_method_variadicity(mt) == variadicity_variadic) {
1009     ASSERT_AND_RET_DBG(
1010                        get_Call_n_params(n) >= get_method_n_params(mt),
1011                        "Number of args for Call doesn't match number of args in variadic type.",
1012                        0,
1013                        fprintf(stderr, "Call has %d params, method %s type %d\n",
1014                                get_Call_n_params(n), get_type_name(mt), get_method_n_params(mt));
1015                        );
1016   }
1017   else {
1018     ASSERT_AND_RET(
1019                    get_Call_n_params(n) == get_method_n_params(mt),
1020                    "Number of args for Call doesn't match number of args in non variadic type.",
1021                    0);
1022   }
1023
1024   for (i = 0; i < get_method_n_params(mt); i++) {
1025     type *t = get_method_param_type(mt, i);
1026
1027     if (is_atomic_type(t)) {
1028       ASSERT_AND_RET_DBG(
1029                          get_irn_mode(get_Call_param(n, i)) == get_type_mode(t),
1030                          "Mode of arg for Call doesn't match mode of arg type.", 0,
1031                          show_call_param(n, mt);
1032                          );
1033     }
1034     else {
1035       /* call with a compound type, mode must be reference */
1036       ASSERT_AND_RET_DBG(
1037                          mode_is_reference(get_irn_mode(get_Call_param(n, i))),
1038                          "Mode of arg for Call doesn't match mode of arg type.", 0,
1039                          show_call_param(n, mt);
1040                          );
1041     }
1042   }
1043
1044 #if 0
1045   if (Call_has_callees(n)) {
1046     for (i = 0; i < get_Call_n_callees(n); i++) {
1047       ASSERT_AND_RET(is_entity(get_Call_callee(n, i)), "callee array must contain entities.", 0);
1048     }
1049   }
1050 #endif
1051   return 1;
1052 }
1053
1054 /**
1055  * verify an Add node
1056  */
1057 static int verify_node_Add(ir_node *n, ir_graph *irg) {
1058   ir_mode *mymode  = get_irn_mode(n);
1059   ir_mode *op1mode = get_irn_mode(get_Add_left(n));
1060   ir_mode *op2mode = get_irn_mode(get_Add_right(n));
1061
1062   ASSERT_AND_RET_DBG(
1063     (
1064       /* common Add: BB x numP x numP --> numP */
1065       (op1mode == mymode && op2mode == op1mode && mode_is_numP(mymode)) ||
1066       /* Pointer Add: BB x ref x int --> ref */
1067       (mode_is_reference(op1mode) && mode_is_int(op2mode) && op1mode == mymode) ||
1068       /* Pointer Add: BB x int x ref --> ref */
1069       (mode_is_int(op1mode) && op2mode == mymode && mode_is_reference(mymode))
1070     ),
1071     "Add node", 0,
1072     show_binop_failure(n, "/* common Add: BB x numP x numP --> numP */ |\n"
1073                       "/* Pointer Add: BB x ref x int --> ref */   |\n"
1074                       "/* Pointer Add: BB x int x ref --> ref */");
1075   );
1076   return 1;
1077 }
1078
1079 /**
1080  * verify a Sub node
1081  */
1082 static int verify_node_Sub(ir_node *n, ir_graph *irg) {
1083   ir_mode *mymode  = get_irn_mode(n);
1084   ir_mode *op1mode = get_irn_mode(get_Sub_left(n));
1085   ir_mode *op2mode = get_irn_mode(get_Sub_right(n));
1086
1087   ASSERT_AND_RET_DBG(
1088     /* common Sub: BB x numP x numP --> numP */
1089     ((mymode ==op1mode && mymode == op2mode && mode_is_numP(op1mode)) ||
1090     /* Pointer Sub: BB x ref x int --> ref */
1091     (op1mode == mymode && mode_is_int(op2mode) && mode_is_reference(mymode)) ||
1092     /* Pointer Sub: BB x int x ref --> ref */
1093     (mode_is_int(op1mode) && op2mode == mymode && mode_is_reference(mymode)) ||
1094     /* Pointer Sub: BB x ref x ref --> int */
1095     (op1mode == op2mode && mode_is_reference(op2mode) && mode_is_int(mymode))),
1096     "Sub node", 0,
1097     show_binop_failure(n, "/* common Sub: BB x numP x numP --> numP */ |\n"
1098                       "/* Pointer Sub: BB x ref x int --> ref */   |\n"
1099                       "/* Pointer Sub: BB x int x ref --> ref */   |\n"
1100                       "/* Pointer Sub: BB x ref x ref --> int */" );
1101   );
1102   return 1;
1103 }
1104
1105 /**
1106  * verify a Minus node
1107  */
1108 static int verify_node_Minus(ir_node *n, ir_graph *irg) {
1109   ir_mode *mymode  = get_irn_mode(n);
1110   ir_mode *op1mode = get_irn_mode(get_Minus_op(n));
1111
1112   ASSERT_AND_RET_DBG(
1113     /* Minus: BB x num --> num */
1114     op1mode == mymode && mode_is_num(op1mode), "Minus node", 0,
1115     show_unop_failure(n , "/* Minus: BB x num --> num */");
1116   );
1117   return 1;
1118 }
1119
1120 /**
1121  * verify a Mul node
1122  */
1123 static int verify_node_Mul(ir_node *n, ir_graph *irg) {
1124   ir_mode *mymode  = get_irn_mode(n);
1125   ir_mode *op1mode = get_irn_mode(get_Mul_left(n));
1126   ir_mode *op2mode = get_irn_mode(get_Mul_right(n));
1127
1128   ASSERT_AND_RET_DBG(
1129     /* Mul: BB x int1 x int1 --> int2 */
1130     ((mode_is_int(op1mode)   && op2mode == op1mode && mode_is_int(mymode)) ||
1131     /* Mul: BB x float x float --> float */
1132     (mode_is_float(op1mode) && op2mode == op1mode && mymode == op1mode)),
1133     "Mul node",0,
1134     show_binop_failure(n, "/* Mul: BB x int1 x int1 --> int2 */ |\n"
1135                          "/* Mul: BB x float x float --> float */");
1136   );
1137   return 1;
1138 }
1139
1140 /**
1141  * verify a Quot node
1142  */
1143 static int verify_node_Quot(ir_node *n, ir_graph *irg) {
1144   ir_mode *mymode  = get_irn_mode(n);
1145   ir_mode *op1mode = get_irn_mode(get_Quot_mem(n));
1146   ir_mode *op2mode = get_irn_mode(get_Quot_left(n));
1147   ir_mode *op3mode = get_irn_mode(get_Quot_right(n));
1148
1149   ASSERT_AND_RET_DBG(
1150     /* Quot: BB x M x float x float --> M x X x float */
1151     op1mode == mode_M && op2mode == op3mode &&
1152     get_mode_sort(op2mode) == irms_float_number &&
1153     mymode == mode_T,
1154     "Quot node",0,
1155     show_binop_failure(n, "/* Quot: BB x M x float x float --> M x X x float */");
1156   );
1157   return 1;
1158 }
1159
1160 /**
1161  * verify a DivMod node
1162  */
1163 static int verify_node_DivMod(ir_node *n, ir_graph *irg) {
1164   ir_mode *mymode  = get_irn_mode(n);
1165   ir_mode *op1mode = get_irn_mode(get_DivMod_mem(n));
1166   ir_mode *op2mode = get_irn_mode(get_DivMod_left(n));
1167   ir_mode *op3mode = get_irn_mode(get_DivMod_right(n));
1168
1169   ASSERT_AND_RET(
1170     /* DivMod: BB x M x int x int --> M x X x int x int */
1171     op1mode == mode_M &&
1172     mode_is_int(op2mode) &&
1173     op3mode == op2mode &&
1174     mymode == mode_T,
1175     "DivMod node", 0
1176   );
1177   return 1;
1178 }
1179
1180 /**
1181  * verify a Div node
1182  */
1183 static int verify_node_Div(ir_node *n, ir_graph *irg) {
1184   ir_mode *mymode  = get_irn_mode(n);
1185   ir_mode *op1mode = get_irn_mode(get_Div_mem(n));
1186   ir_mode *op2mode = get_irn_mode(get_Div_left(n));
1187   ir_mode *op3mode = get_irn_mode(get_Div_right(n));
1188
1189   ASSERT_AND_RET(
1190     /* Div: BB x M x int x int --> M x X x int */
1191     op1mode == mode_M &&
1192     op2mode == op3mode &&
1193     mode_is_int(op2mode) &&
1194     mymode == mode_T,
1195     "Div node", 0
1196   );
1197   return 1;
1198 }
1199
1200 /**
1201  * verify a Mod node
1202  */
1203 static int verify_node_Mod(ir_node *n, ir_graph *irg) {
1204   ir_mode *mymode  = get_irn_mode(n);
1205   ir_mode *op1mode = get_irn_mode(get_Mod_mem(n));
1206   ir_mode *op2mode = get_irn_mode(get_Mod_left(n));
1207   ir_mode *op3mode = get_irn_mode(get_Mod_right(n));
1208
1209   ASSERT_AND_RET(
1210     /* Mod: BB x M x int x int --> M x X x int */
1211     op1mode == mode_M &&
1212     op2mode == op3mode &&
1213     mode_is_int(op2mode) &&
1214     mymode == mode_T,
1215     "Mod node", 0
1216   );
1217   return 1;
1218 }
1219
1220 /**
1221  * verify an Abs node
1222  */
1223 static int verify_node_Abs(ir_node *n, ir_graph *irg) {
1224   ir_mode *mymode  = get_irn_mode(n);
1225   ir_mode *op1mode = get_irn_mode(get_Abs_op(n));
1226
1227   ASSERT_AND_RET_DBG(
1228     /* Abs: BB x num --> num */
1229     op1mode == mymode &&
1230     mode_is_num (op1mode),
1231     "Abs node", 0,
1232     show_unop_failure(n, "/* Abs: BB x num --> num */");
1233   );
1234   return 1;
1235 }
1236
1237 /**
1238  * verify a logical And, Or, Eor node
1239  */
1240 static int verify_node_Logic(ir_node *n, ir_graph *irg) {
1241   ir_mode *mymode  = get_irn_mode(n);
1242   ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1243   ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1244
1245   ASSERT_AND_RET_DBG(
1246     /* And or Or or Eor: BB x int x int --> int */
1247     mode_is_int(mymode) &&
1248     op2mode == op1mode &&
1249     mymode == op2mode,
1250     "And, Or or Eor node", 0,
1251     show_binop_failure(n, "/* And or Or or Eor: BB x int x int --> int */");
1252   );
1253   return 1;
1254 }
1255
1256 #define verify_node_And   verify_node_Logic
1257 #define verify_node_Or    verify_node_Logic
1258 #define verify_node_Eor   verify_node_Logic
1259
1260 /**
1261  * verify a Not node
1262  */
1263 static int verify_node_Not(ir_node *n, ir_graph *irg) {
1264   ir_mode *mymode  = get_irn_mode(n);
1265   ir_mode *op1mode = get_irn_mode(get_Not_op(n));
1266
1267   ASSERT_AND_RET_DBG(
1268     /* Not: BB x int --> int */
1269     mode_is_int(mymode) &&
1270     mymode == op1mode,
1271     "Not node", 0,
1272     show_unop_failure(n, "/* Not: BB x int --> int */");
1273   );
1274   return 1;
1275 }
1276
1277 /**
1278  * verify a Cmp node
1279  */
1280 static int verify_node_Cmp(ir_node *n, ir_graph *irg) {
1281   ir_mode *mymode  = get_irn_mode(n);
1282   ir_mode *op1mode = get_irn_mode(get_Cmp_left(n));
1283   ir_mode *op2mode = get_irn_mode(get_Cmp_right(n));
1284
1285   ASSERT_AND_RET_DBG(
1286     /* Cmp: BB x datab x datab --> b16 */
1287     mode_is_data (op1mode) &&
1288     op2mode == op1mode &&
1289     mymode == mode_T,
1290     "Cmp node", 0,
1291     show_binop_failure(n, "/* Cmp: BB x datab x datab --> b16 */");
1292   );
1293   return 1;
1294 }
1295
1296 /**
1297  * verify a Shift node
1298  */
1299 static int verify_node_Shift(ir_node *n, ir_graph *irg) {
1300   ir_mode *mymode  = get_irn_mode(n);
1301   ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1302   ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1303
1304   ASSERT_AND_RET_DBG(
1305     /* Shl, Shr or Shrs: BB x int x int_u --> int */
1306     mode_is_int(op1mode) &&
1307     mode_is_int(op2mode) &&
1308     !mode_is_signed(op2mode) &&
1309     mymode == op1mode,
1310     "Shl, Shr or Shrs node", 0,
1311     show_binop_failure(n, "/* Shl, Shr or Shrs: BB x int x int_u --> int */");
1312   );
1313   return 1;
1314 }
1315
1316 #define verify_node_Shl   verify_node_Shift
1317 #define verify_node_Shr   verify_node_Shift
1318 #define verify_node_Shrs  verify_node_Shift
1319
1320 /**
1321  * verify a Rot node
1322  */
1323 static int verify_node_Rot(ir_node *n, ir_graph *irg) {
1324   ir_mode *mymode  = get_irn_mode(n);
1325   ir_mode *op1mode = get_irn_mode(get_Rot_left(n));
1326   ir_mode *op2mode = get_irn_mode(get_Rot_right(n));
1327
1328   ASSERT_AND_RET_DBG(
1329     /* Rot: BB x int x int --> int */
1330     mode_is_int(op1mode) &&
1331     mode_is_int(op2mode) &&
1332     mymode == op1mode,
1333     "Rot node", 0,
1334     show_binop_failure(n, "/* Rot: BB x int x int --> int */");
1335   );
1336   return 1;
1337 }
1338
1339 /**
1340  * verify a Conv node
1341  */
1342 static int verify_node_Conv(ir_node *n, ir_graph *irg) {
1343   ir_mode *mymode  = get_irn_mode(n);
1344   ir_mode *op1mode = get_irn_mode(get_Conv_op(n));
1345
1346   ASSERT_AND_RET_DBG(
1347     /* Conv: BB x datab1 --> datab2 */
1348     mode_is_datab(op1mode) && mode_is_data(mymode),
1349     "Conv node", 0,
1350     show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
1351   );
1352   return 1;
1353 }
1354
1355 /**
1356  * verify a Cast node
1357  */
1358 static int verify_node_Cast(ir_node *n, ir_graph *irg) {
1359   ir_mode *mymode  = get_irn_mode(n);
1360   ir_mode *op1mode = get_irn_mode(get_Cast_op(n));
1361
1362   ASSERT_AND_RET_DBG(
1363     /* Conv: BB x datab1 --> datab2 */
1364     mode_is_data(op1mode) && op1mode == mymode,
1365     "Cast node", 0,
1366     show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
1367   );
1368   return 1;
1369 }
1370
1371 /**
1372  * verify a Phi node
1373  */
1374 static int verify_node_Phi(ir_node *n, ir_graph *irg) {
1375   ir_mode *mymode = get_irn_mode(n);
1376   ir_node *block  = get_nodes_block(n);
1377   int i;
1378
1379   if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building) {
1380     /* a Phi node MUST have the same number of inputs as its block */
1381     ASSERT_AND_RET_DBG(
1382       get_irn_arity(n) == get_irn_arity(block),
1383       "wrong number of inputs in Phi node", 0,
1384       show_phi_inputs(n, block);
1385     );
1386   }
1387
1388   /* Phi: BB x dataM^n --> dataM */
1389   for (i = get_irn_arity(n) - 1; i >= 0; --i) {
1390     ir_node *pred = get_irn_n(n, i);
1391     if (!is_Bad(pred) && (get_irn_op(pred) != op_Unknown))
1392       ASSERT_AND_RET_DBG(
1393         get_irn_mode(pred) == mymode,
1394         "Phi node", 0,
1395         show_phi_failure(n, pred, i);
1396       );
1397   }
1398   ASSERT_AND_RET( mode_is_dataM(mymode), "Phi node", 0 );
1399   return 1;
1400 }
1401
1402 /**
1403  * verify a Filter node
1404  */
1405 static int verify_node_Filter(ir_node *n, ir_graph *irg) {
1406   ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
1407                 "Filter may only appear if ip view is constructed.", 0);
1408   /* We should further do tests as for Proj and Phi. */
1409   return 1;
1410 }
1411
1412 /**
1413  * verify a Load node
1414  */
1415 static int verify_node_Load(ir_node *n, ir_graph *irg) {
1416   ir_mode *mymode  = get_irn_mode(n);
1417   ir_mode *op1mode = get_irn_mode(get_Load_mem(n));
1418   ir_mode *op2mode = get_irn_mode(get_Load_ptr(n));
1419
1420   ASSERT_AND_RET(
1421     /* Load: BB x M x ref --> M x X x data */
1422     op1mode == mode_M && mode_is_reference(op2mode),
1423     "Load node", 0
1424   );
1425   ASSERT_AND_RET( mymode == mode_T, "Load node", 0 );
1426
1427   /*
1428    * jack's gen_add_firm_code:simpleSel seems to build Load (Load
1429    * (Proj (Proj))) sometimes ...
1430
1431    * interprete.c:ai_eval seems to assume that this happens, too
1432
1433    * obset.c:get_abstval_any can't deal with this if the load has
1434    * mode_T
1435    *
1436   {
1437     entity *ent = hunt_for_entity (get_Load_ptr (n), n);
1438     assert ((NULL != ent) || (mymode != mode_T));
1439   }
1440   */
1441
1442   return 1;
1443 }
1444
1445 /**
1446  * verify a Store node
1447  */
1448 static int verify_node_Store(ir_node *n, ir_graph *irg) {
1449   entity *target;
1450
1451   ir_mode *mymode  = get_irn_mode(n);
1452   ir_mode *op1mode = get_irn_mode(get_Store_mem(n));
1453   ir_mode *op2mode = get_irn_mode(get_Store_ptr(n));
1454   ir_mode *op3mode = get_irn_mode(get_Store_value(n));
1455
1456   ASSERT_AND_RET(
1457     /* Store: BB x M x ref x data --> M x X */
1458     op1mode == mode_M && mode_is_reference(op2mode) && mode_is_data(op3mode),
1459     "Store node", 0
1460   );
1461   ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
1462
1463   target = get_ptr_entity(get_Store_ptr(n));
1464   if (vrfy_entities && target && get_irg_phase_state(current_ir_graph) == phase_high) {
1465     /*
1466      * If lowered code, any Sels that add 0 may be removed, causing
1467      * an direct access to entities of array or compound type.
1468      * Prevent this by checking the phase.
1469      */
1470     ASSERT_AND_RET( op3mode == get_type_mode(get_entity_type(target)),
1471                     "Store node", 0);
1472   }
1473
1474   return 1;
1475 }
1476
1477 /**
1478  * verify an Alloc node
1479  */
1480 static int verify_node_Alloc(ir_node *n, ir_graph *irg) {
1481   ir_mode *mymode  = get_irn_mode(n);
1482   ir_mode *op1mode = get_irn_mode(get_Alloc_mem(n));
1483   ir_mode *op2mode = get_irn_mode(get_Alloc_size(n));
1484
1485   ASSERT_AND_RET_DBG(
1486     /* Alloc: BB x M x int_u --> M x X x ref */
1487     op1mode == mode_M &&
1488     mode_is_int(op2mode) &&
1489     !mode_is_signed(op2mode) &&
1490     mymode == mode_T,
1491     "Alloc node", 0,
1492     show_binop_failure(n, "/* Alloc: BB x M x int_u --> M x X x ref */");
1493   );
1494   return 1;
1495 }
1496
1497 /**
1498  * verify a Free node
1499  */
1500 static int verify_node_Free(ir_node *n, ir_graph *irg) {
1501   ir_mode *mymode  = get_irn_mode(n);
1502   ir_mode *op1mode = get_irn_mode(get_Free_mem(n));
1503   ir_mode *op2mode = get_irn_mode(get_Free_ptr(n));
1504   ir_mode *op3mode = get_irn_mode(get_Free_size(n));
1505
1506   ASSERT_AND_RET_DBG(
1507     /* Free: BB x M x ref x int_u --> M */
1508     op1mode == mode_M && mode_is_reference(op2mode) &&
1509     mode_is_int(op3mode) &&
1510     !mode_is_signed(op3mode) &&
1511     mymode == mode_M,
1512     "Free node", 0,
1513     show_triop_failure(n, "/* Free: BB x M x ref x int_u --> M */");
1514   );
1515   return 1;
1516 }
1517
1518 /**
1519  * verify a Sync node
1520  */
1521 static int verify_node_Sync(ir_node *n, ir_graph *irg) {
1522   int i;
1523   ir_mode *mymode  = get_irn_mode(n);
1524
1525   /* Sync: BB x M^n --> M */
1526   for (i = get_Sync_n_preds(n) - 1; i >= 0; --i) {
1527     ASSERT_AND_RET( get_irn_mode(get_Sync_pred(n, i)) == mode_M, "Sync node", 0 );
1528   };
1529   ASSERT_AND_RET( mymode == mode_M, "Sync node", 0 );
1530   return 1;
1531 }
1532
1533 /**
1534  * verify a Confirm node
1535  */
1536 static int verify_node_Confirm(ir_node *n, ir_graph *irg) {
1537   ir_mode *mymode  = get_irn_mode(n);
1538   ir_mode *op1mode = get_irn_mode(get_Confirm_value(n));
1539   ir_mode *op2mode = get_irn_mode(get_Confirm_bound(n));
1540
1541   ASSERT_AND_RET_DBG(
1542     /* Confirm: BB x T x T --> T */
1543     op1mode == mymode &&
1544     op2mode == mymode,
1545     "Confirm node", 0,
1546     show_binop_failure(n, "/* Confirm: BB x T x T --> T */");
1547   );
1548   return 1;
1549 }
1550
1551 /**
1552  * verify a Mux node
1553  */
1554 static int verify_node_Mux(ir_node *n, ir_graph *irg) {
1555   ir_mode *mymode  = get_irn_mode(n);
1556   ir_mode *op1mode = get_irn_mode(get_Mux_sel(n));
1557   ir_mode *op2mode = get_irn_mode(get_Mux_true(n));
1558   ir_mode *op3mode = get_irn_mode(get_Mux_false(n));
1559
1560   ASSERT_AND_RET(
1561     /* Mux: BB x b x numP x numP --> numP */
1562     op1mode == mode_b &&
1563     op2mode == mymode &&
1564     op3mode == mymode &&
1565     mode_is_numP(mymode),
1566     "Mux node", 0
1567   );
1568   return 1;
1569 }
1570
1571 /*
1572  * Check dominance.
1573  * For each usage of a node, it is checked, if the block of the
1574  * node dominates the block of the usage (for phis: the predecessor
1575  * block of the phi for the corresponding edge).
1576  */
1577 static int check_dominance_for_node(ir_node *use)
1578 {
1579   /* This won't work for blocks and the end node */
1580   if (!is_Block(use) && use != get_irg_end(current_ir_graph)) {
1581     int i;
1582     ir_node *bl = get_nodes_block(use);
1583
1584     for (i = get_irn_arity(use) - 1; i >= 0; --i) {
1585       ir_node *def    = get_irn_n(use, i);
1586       ir_node *def_bl = get_nodes_block(def);
1587       ir_node *use_bl = bl;
1588
1589       /* ignore dead definition blocks, will be removed */
1590       if (is_Block_dead(def_bl) || get_Block_dom_depth(def_bl) == -1)
1591         continue;
1592
1593       if (is_Phi(use))
1594         use_bl = get_Block_cfgpred_block(bl, i);
1595
1596       /* ignore dead use blocks, will be removed */
1597       if (is_Block_dead(use_bl) || get_Block_dom_depth(use_bl) == -1)
1598         continue;
1599
1600       ASSERT_AND_RET_DBG(
1601         block_dominates(def_bl, use_bl),
1602         "the definition of a value used violates the dominance property", 0,
1603         ir_fprintf(stderr,
1604                    "graph %+F: %+F of %+F must dominate %+F of user %+F input %d\n",
1605                    current_ir_graph, def_bl, def, use_bl, use, i
1606         );
1607       );
1608     }
1609   }
1610   return 1;
1611 }
1612
1613 int irn_vrfy_irg(ir_node *n, ir_graph *irg)
1614 {
1615   int i;
1616   ir_op *op;
1617
1618   if (!opt_do_node_verification)
1619                 return 1;
1620
1621   if (!get_interprocedural_view()) {
1622     /*
1623      * do NOT check placement in interprocedural view, as we don't always know
1624      * the "right" graph ...
1625      */
1626     ASSERT_AND_RET_DBG(
1627       node_is_in_irgs_storage(irg, n),
1628       "Node is not stored on proper IR graph!", 0,
1629       show_node_on_graph(irg, n);
1630     );
1631     assert(get_irn_irg(n) == irg);
1632   }
1633
1634   op = get_irn_op(n);
1635
1636   /* We don't want to test nodes whose predecessors are Bad,
1637      as we would have to special case that for each operation. */
1638   if (op != op_Phi && op != op_Block)
1639     for (i = get_irn_arity(n) - 1; i >= 0; --i) {
1640       if (is_Bad(get_irn_n(n, i)))
1641         return 1;
1642     }
1643
1644   if (op->verify_node)
1645     return op->verify_node(n, irg);
1646
1647   /* All went ok */
1648   return 1;
1649 }
1650
1651 int irn_vrfy(ir_node *n)
1652 {
1653   int res = 1;
1654 #ifdef DEBUG_libfirm
1655   res = irn_vrfy_irg(n, current_ir_graph);
1656 #endif
1657   return res;
1658 }
1659
1660 /*-----------------------------------------------------------------*/
1661 /* Verify the whole graph.                                         */
1662 /*-----------------------------------------------------------------*/
1663
1664 #ifdef DEBUG_libfirm
1665 /**
1666  * Walker to check every node
1667  */
1668 static void vrfy_wrap(ir_node *node, void *env) {
1669   int *res = env;
1670   *res = irn_vrfy(node);
1671 }
1672
1673 /**
1674  * Walker to check every node including SSA property.
1675  * Only called if dominance info is available.
1676  */
1677 static void vrfy_wrap_ssa(ir_node *node, void *env)
1678 {
1679   int *res = env;
1680
1681   *res = irn_vrfy(node);
1682   if (*res)
1683     *res = check_dominance_for_node(node);
1684 }
1685
1686 #endif /* DEBUG_libfirm */
1687
1688 /*
1689  * Calls irn_vrfy for each node in irg.
1690  * Graph must be in state "op_pin_state_pinned".
1691  * If dominance info is available, check the SSA property.
1692  */
1693 int irg_verify(ir_graph *irg, unsigned flags)
1694 {
1695   int res = 1;
1696 #ifdef DEBUG_libfirm
1697   ir_graph *rem;
1698
1699   rem = current_ir_graph;
1700   current_ir_graph = irg;
1701   last_irg_error = NULL;
1702
1703   assert(get_irg_pinned(irg) == op_pin_state_pinned);
1704
1705   if (flags & VRFY_ENFORCE_SSA)
1706     compute_doms(irg);
1707
1708   irg_walk_graph(
1709     irg,
1710     get_irg_dom_state(irg) == dom_consistent &&
1711     get_irg_pinned(irg) == op_pin_state_pinned ?
1712       vrfy_wrap_ssa : vrfy_wrap,
1713     NULL, &res
1714   );
1715
1716   current_ir_graph = rem;
1717
1718   if (opt_do_node_verification == NODE_VERIFICATION_REPORT && ! res) {
1719     entity *ent = get_irg_entity(current_ir_graph);
1720
1721     if (ent)
1722       fprintf(stderr, "irg_verify: Verifying graph %s failed\n", get_entity_name(ent));
1723     else
1724       fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)current_ir_graph);
1725   }
1726 #endif /* DEBUG_libfirm */
1727
1728   return res;
1729 }
1730
1731 int irn_vrfy_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string)
1732 {
1733   int res;
1734   node_verification_t old = opt_do_node_verification;
1735
1736   firm_vrfy_failure_msg = NULL;
1737   opt_do_node_verification = NODE_VERIFICATION_ERROR_ONLY;
1738   res = irn_vrfy_irg(n, irg);
1739   if (! res && get_irg_dom_state(irg) == dom_consistent &&
1740       get_irg_pinned(irg) == op_pin_state_pinned)
1741     res = check_dominance_for_node(n);
1742   opt_do_node_verification = old;
1743   *bad_string = firm_vrfy_failure_msg;
1744
1745   return res;
1746 }
1747
1748
1749 typedef struct _vrfy_bad_env_t {
1750   int flags;
1751   int res;
1752 } vrfy_bad_env_t;
1753
1754 /**
1755  * Pre-Walker: check Bad predecessors of node.
1756  */
1757 static void check_bads(ir_node *node, void *env)
1758 {
1759   vrfy_bad_env_t *venv = env;
1760   int i, arity = get_irn_arity(node);
1761
1762   if (is_Block(node)) {
1763     if ((venv->flags & BAD_CF) == 0) {
1764
1765       /* check for Bad Block predecessor */
1766       for (i = 0; i < arity; ++i) {
1767         ir_node *pred = get_irn_n(node, i);
1768
1769         if (is_Bad(pred)) {
1770           venv->res |= BAD_CF;
1771
1772           if (opt_do_node_verification == NODE_VERIFICATION_REPORT) {
1773             fprintf(stderr, "irg_vrfy_bads: Block %ld has Bad predecessor\n", get_irn_node_nr(node));
1774           }
1775           if (opt_do_node_verification == NODE_VERIFICATION_ON) {
1776             assert(0 && "Bad CF detected");
1777           }
1778         }
1779       }
1780     }
1781   }
1782   else {
1783     if ((venv->flags & BAD_BLOCK) == 0) {
1784
1785       /* check for Bad Block */
1786       if (is_Bad(get_nodes_block(node))) {
1787         venv->res |= BAD_BLOCK;
1788
1789         if (opt_do_node_verification == NODE_VERIFICATION_REPORT) {
1790           fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Block\n", get_irn_node_nr(node));
1791         }
1792         if (opt_do_node_verification == NODE_VERIFICATION_ON) {
1793           assert(0 && "Bad CF detected");
1794         }
1795       }
1796     }
1797
1798     if ((venv->flags & TUPLE) == 0) {
1799       if (get_irn_op(node) == op_Tuple) {
1800         venv->res |= TUPLE;
1801
1802         if (opt_do_node_verification == NODE_VERIFICATION_REPORT) {
1803           fprintf(stderr, "irg_vrfy_bads: node %ld is a Tuple\n", get_irn_node_nr(node));
1804         }
1805         if (opt_do_node_verification == NODE_VERIFICATION_ON) {
1806           assert(0 && "Tuple detected");
1807         }
1808       }
1809     }
1810
1811     for (i = 0; i < arity; ++i) {
1812       ir_node *pred = get_irn_n(node, i);
1813
1814       if (is_Bad(pred)) {
1815         /* check for Phi with Bad inputs */
1816         if (is_Phi(node) && !is_Bad(get_nodes_block(node)) && is_Bad(get_irn_n(get_nodes_block(node), i))) {
1817           if (venv->flags & BAD_CF)
1818             continue;
1819           else {
1820             venv->res |= BAD_CF;
1821
1822             if (opt_do_node_verification == NODE_VERIFICATION_REPORT) {
1823               fprintf(stderr, "irg_vrfy_bads: Phi %ld has Bad Input\n", get_irn_node_nr(node));
1824             }
1825             if (opt_do_node_verification == NODE_VERIFICATION_ON) {
1826               assert(0 && "Bad CF detected");
1827             }
1828           }
1829         }
1830
1831         /* Bad node input */
1832         if ((venv->flags & BAD_DF) == 0) {
1833           venv->res |= BAD_DF;
1834
1835           if (opt_do_node_verification == NODE_VERIFICATION_REPORT) {
1836             fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Input\n", get_irn_node_nr(node));
1837           }
1838           if (opt_do_node_verification == NODE_VERIFICATION_ON) {
1839             assert(0 && "Bad NON-CF detected");
1840           }
1841         }
1842       }
1843     }
1844   }
1845 }
1846
1847 /*
1848  * verify occurance of bad nodes
1849  */
1850 int irg_vrfy_bads(ir_graph *irg, int flags)
1851 {
1852   vrfy_bad_env_t env;
1853
1854   env.flags = flags;
1855   env.res   = 0;
1856
1857   irg_walk_graph(irg, check_bads, NULL, &env);
1858
1859   return env.res;
1860 }
1861
1862 /*
1863  * set the default verify operation
1864  */
1865 void firm_set_default_verifyer(ir_op *op)
1866 {
1867 #define CASE(a)                          \
1868    case iro_##a:                         \
1869      op->verify_node  = verify_node_##a; \
1870      break
1871
1872    switch (op->code) {
1873    CASE(Proj);
1874    CASE(Block);
1875    CASE(Start);
1876    CASE(Jmp);
1877    CASE(IJmp);
1878    CASE(Break);
1879    CASE(Cond);
1880    CASE(Return);
1881    CASE(Raise);
1882    CASE(Const);
1883    CASE(SymConst);
1884    CASE(Sel);
1885    CASE(InstOf);
1886    CASE(Call);
1887    CASE(Add);
1888    CASE(Sub);
1889    CASE(Minus);
1890    CASE(Mul);
1891    CASE(Quot);
1892    CASE(DivMod);
1893    CASE(Div);
1894    CASE(Mod);
1895    CASE(Abs);
1896    CASE(And);
1897    CASE(Or);
1898    CASE(Eor);
1899    CASE(Not);
1900    CASE(Cmp);
1901    CASE(Shl);
1902    CASE(Shr);
1903    CASE(Shrs);
1904    CASE(Rot);
1905    CASE(Conv);
1906    CASE(Cast);
1907    CASE(Phi);
1908    CASE(Filter);
1909    CASE(Load);
1910    CASE(Store);
1911    CASE(Alloc);
1912    CASE(Free);
1913    CASE(Sync);
1914    CASE(Confirm);
1915    CASE(Mux);
1916    default:
1917      op->verify_node = NULL;
1918    }
1919 #undef CASE
1920
1921 #define CASE(a)                          \
1922    case iro_##a:                         \
1923      op->verify_proj_node  = verify_node_Proj_##a; \
1924      break
1925
1926    switch (op->code) {
1927    CASE(Start);
1928    CASE(Cond);
1929    CASE(Raise);
1930    CASE(InstOf);
1931    CASE(Call);
1932    CASE(Quot);
1933    CASE(DivMod);
1934    CASE(Div);
1935    CASE(Mod);
1936    CASE(Cmp);
1937    CASE(Load);
1938    CASE(Store);
1939    CASE(Alloc);
1940    CASE(Proj);
1941    CASE(Tuple);
1942    CASE(CallBegin);
1943    CASE(EndReg);
1944    CASE(EndExcept);
1945    default:
1946      op->verify_proj_node = NULL;
1947    }
1948 #undef CASE
1949 }