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