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