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