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