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