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