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