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