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