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