verify that the predecessor of a block is a cfop
[libfirm] / ir / ir / irverify.c
1 /*
2  * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief    Check irnodes for correctness.
23  * @author   Christian Schaefer, Goetz Lindenmaier, Till Riedel, Michael Beck
24  * @version  $Id$
25  */
26 #include "config.h"
27
28 #include "irprog.h"
29 #include "irop_t.h"
30 #include "irgraph_t.h"
31 #include "irverify_t.h"
32 #include "irgwalk.h"
33 #include "irdump.h"
34 #include "irdom_t.h"
35 #include "irprintf.h"
36 #include "irouts.h"
37 #include "irflag_t.h"
38 #include "irpass_t.h"
39
40 /** if this flag is set, verify entity types in Load & Store nodes */
41 static int verify_entities = 0;
42
43 const char *firm_verify_failure_msg;
44
45 /* enable verification of Load/Store entities */
46 void verify_enable_entity_tests(int enable)
47 {
48         verify_entities = enable;
49 }
50
51 #ifndef NDEBUG
52
53 /**
54  * little helper for NULL modes
55  */
56 static const char *get_mode_name_ex(ir_mode *mode)
57 {
58         if (! mode)
59                 return "<no mode>";
60         return get_mode_name(mode);
61 }
62
63 /** the last IRG, on which a verification error was found */
64 static ir_graph *last_irg_error = NULL;
65
66 /**
67  * print the name of the entity of an verification failure
68  *
69  * @param node  the node caused the failure
70  */
71 static void show_entity_failure(ir_node *node)
72 {
73         ir_graph *irg = get_irn_irg(node);
74
75         if (last_irg_error == irg)
76                 return;
77
78         last_irg_error = irg;
79
80         if (irg == get_const_code_irg()) {
81                 fprintf(stderr, "\nFIRM: irn_verify_irg() <of CONST_CODE_IRG> failed\n");
82         } else {
83                 ir_entity *ent = get_irg_entity(irg);
84
85                 if (ent) {
86                         ir_type *ent_type = get_entity_owner(ent);
87
88                         if (ent_type) {
89                                 ir_fprintf(stderr, "\nFIRM: irn_verify_irg() %+F::%s failed\n",
90                                            ent_type, get_entity_name(ent));
91                         } else {
92                                 fprintf(stderr, "\nFIRM: irn_verify_irg() <NULL>::%s failed\n", get_entity_name(ent));
93                         }
94                 } else {
95                         fprintf(stderr, "\nFIRM: irn_verify_irg() <IRG %p> failed\n", (void *)irg);
96                 }
97         }
98 }
99
100 static const char *get_irn_modename(const ir_node *node)
101 {
102         ir_mode *mode = get_irn_mode(node);
103         return get_mode_name(mode);
104 }
105
106 /**
107  * Prints a failure for a Node
108  */
109 static void show_node_failure(ir_node *n)
110 {
111         show_entity_failure(n);
112         fprintf(stderr, "  node %ld %s%s\n" ,
113                 get_irn_node_nr(n),
114                 get_irn_opname(n), get_irn_modename(n)
115         );
116 }
117
118 /**
119  * Prints a failure message for a binop
120  */
121 static void show_binop_failure(ir_node *n, const char *text)
122 {
123         ir_node *left  = get_binop_left(n);
124         ir_node *right = get_binop_right(n);
125
126         show_entity_failure(n);
127         fprintf(stderr, "  node %ld %s%s(%s%s, %s%s) did not match (%s)\n",
128                 get_irn_node_nr(n),
129                 get_irn_opname(n), get_irn_modename(n),
130                 get_irn_opname(left), get_irn_modename(left),
131                 get_irn_opname(right), get_irn_modename(right),
132                 text);
133 }
134
135 /**
136  * Prints a failure message for an unop
137  */
138 static void show_unop_failure(ir_node *n, const char *text)
139 {
140         ir_node *op  = get_unop_op(n);
141
142         show_entity_failure(n);
143         fprintf(stderr, "  node %ld %s%s(%s%s) did not match (%s)\n",
144                 get_irn_node_nr(n),
145                 get_irn_opname(n), get_irn_modename(n),
146                 get_irn_opname(op), get_irn_modename(op),
147                 text);
148 }
149
150 /**
151  * Prints a failure message for an op with 3 operands
152  */
153 static void show_triop_failure(ir_node *n, const char *text)
154 {
155         ir_node *op0  = get_irn_n(n, 0);
156         ir_node *op1  = get_irn_n(n, 1);
157         ir_node *op2  = get_irn_n(n, 2);
158
159         show_entity_failure(n);
160         fprintf(stderr, "  of node %ld %s%s(%s%s, %s%s, %s%s) did not match (%s)\n",
161                 get_irn_node_nr(n),
162                 get_irn_opname(n), get_irn_modename(n),
163                 get_irn_opname(op0), get_irn_modename(op0),
164                 get_irn_opname(op1), get_irn_modename(op1),
165                 get_irn_opname(op2), get_irn_modename(op2),
166                 text);
167 }
168
169 /**
170  * Prints a failure message for a proj
171  */
172 static void show_proj_failure(ir_node *n)
173 {
174         ir_node *op  = get_Proj_pred(n);
175         int proj     = get_Proj_proj(n);
176
177         show_entity_failure(n);
178         fprintf(stderr, "  node %ld %s%s %d(%s%s) failed\n" ,
179                 get_irn_node_nr(n),
180                 get_irn_opname(n), get_irn_modename(n), proj,
181                 get_irn_opname(op), get_irn_modename(op));
182 }
183
184 /**
185  * Prints a failure message for a proj from Start
186  */
187 static void show_proj_mode_failure(ir_node *n, ir_type *ty)
188 {
189         long proj  = get_Proj_proj(n);
190         ir_mode *m = get_type_mode(ty);
191         char type_name[256];
192         ir_print_type(type_name, sizeof(type_name), ty);
193
194         show_entity_failure(n);
195         fprintf(stderr, "  Proj %ld mode %s proj %ld (type %s mode %s) failed\n" ,
196                 get_irn_node_nr(n),
197                 get_irn_modename(n),
198                 proj,
199                 type_name,
200                 get_mode_name_ex(m));
201 }
202
203 /**
204  * Prints a failure message for a proj
205  */
206 static void show_proj_failure_ent(ir_node *n, ir_entity *ent)
207 {
208         ir_node *op  = get_Proj_pred(n);
209         int proj     = get_Proj_proj(n);
210         ir_mode *m   = get_type_mode(get_entity_type(ent));
211         char type_name[256];
212         ir_print_type(type_name, sizeof(type_name), get_entity_type(ent));
213
214         show_entity_failure(n);
215         fprintf(stderr, "  node %ld %s%s %d(%s%s) entity %s(type %s mode %s)failed\n" ,
216                 get_irn_node_nr(n),
217                 get_irn_opname(n), get_irn_modename(n), proj,
218                 get_irn_opname(op), get_irn_modename(op),
219                 get_entity_name(ent), type_name,
220                 get_mode_name_ex(m));
221 }
222
223 /**
224  * Show a node and a graph
225  */
226 static void show_node_on_graph(ir_graph *irg, ir_node *n)
227 {
228         ir_fprintf(stderr, "\nFIRM: irn_verify_irg() of %+F, node %+F\n", irg, n);
229 }
230
231 /**
232  * Show call parameters
233  */
234 static void show_call_param(ir_node *n, ir_type *mt)
235 {
236         size_t i;
237         char type_name[256];
238         ir_print_type(type_name, sizeof(type_name), mt);
239
240         show_entity_failure(n);
241         fprintf(stderr, "  Call type-check failed: %s(", type_name);
242         for (i = 0; i < get_method_n_params(mt); ++i) {
243                 fprintf(stderr, "%s ", get_mode_name_ex(get_type_mode(get_method_param_type(mt, i))));
244         }
245         fprintf(stderr, ") != CALL(");
246
247         for (i = 0; i < get_Call_n_params(n); ++i) {
248                 fprintf(stderr, "%s ", get_mode_name_ex(get_irn_mode(get_Call_param(n, i))));
249         }
250         fprintf(stderr, ")\n");
251 }
252
253 /**
254  * Show return modes
255  */
256 static void show_return_modes(ir_graph *irg, ir_node *n, ir_type *mt, int i)
257 {
258         ir_entity *ent = get_irg_entity(irg);
259
260         show_entity_failure(n);
261         fprintf(stderr, "  Return node %ld in entity \"%s\" mode %s different from type mode %s\n",
262                 get_irn_node_nr(n), get_entity_name(ent),
263                 get_mode_name_ex(get_irn_mode(get_Return_res(n, i))),
264                 get_mode_name_ex(get_type_mode(get_method_res_type(mt, i)))
265         );
266 }
267
268 /**
269  * Show return number of results
270  */
271 static void show_return_nres(ir_graph *irg, ir_node *n, ir_type *mt)
272 {
273         ir_entity *ent = get_irg_entity(irg);
274
275         show_entity_failure(n);
276         fprintf(stderr, "  Return node %ld in entity \"%s\" has %lu results different from type %lu\n",
277                 get_irn_node_nr(n), get_entity_name(ent),
278                 (unsigned long) get_Return_n_ress(n),
279                 (unsigned long) get_method_n_ress(mt));
280 }
281
282 /**
283  * Show Phi input
284  */
285 static void show_phi_failure(ir_node *phi, ir_node *pred, int pos)
286 {
287         (void) pos;
288         show_entity_failure(phi);
289         fprintf(stderr, "  Phi node %ld has mode %s different from predeccessor node %ld mode %s\n",
290                 get_irn_node_nr(phi), get_mode_name_ex(get_irn_mode(phi)),
291                 get_irn_node_nr(pred), get_mode_name_ex(get_irn_mode(pred)));
292 }
293
294 /**
295  * Show Phi inputs
296  */
297 static void show_phi_inputs(ir_node *phi, ir_node *block)
298 {
299         show_entity_failure(phi);
300         fprintf(stderr, "  Phi node %ld has %d inputs, its Block %ld has %d\n",
301                 get_irn_node_nr(phi),   get_irn_arity(phi),
302                 get_irn_node_nr(block), get_irn_arity(block));
303 }
304
305 #endif /* #ifndef NDEBUG */
306
307 /**
308  * If the address is Sel or SymConst, return the entity.
309  *
310  * @param ptr  the node representing the address
311  */
312 static ir_entity *get_ptr_entity(ir_node *ptr)
313 {
314         if (is_Sel(ptr)) {
315                 return get_Sel_entity(ptr);
316         } else if (is_SymConst_addr_ent(ptr)) {
317                 return get_SymConst_entity(ptr);
318         }
319         return NULL;
320 }
321
322 /**
323  * verify a Proj(Start) node
324  */
325 static int verify_node_Proj_Start(ir_node *n, ir_node *p)
326 {
327         ir_mode *mode = get_irn_mode(p);
328         long proj     = get_Proj_proj(p);
329         (void) n;
330
331         ASSERT_AND_RET_DBG(
332                 (
333                         (proj == pn_Start_X_initial_exec && mode == mode_X) ||
334                         (proj == pn_Start_M              && mode == mode_M) ||
335                         (proj == pn_Start_P_frame_base   && mode_is_reference(mode)) ||
336                         (proj == pn_Start_T_args         && mode == mode_T)
337                 ),
338                 "wrong Proj from Start", 0,
339                 show_proj_failure(p);
340         );
341         return 1;
342 }
343
344 /**
345  * verify a Proj(Cond) node
346  */
347 static int verify_node_Proj_Cond(ir_node *pred, ir_node *p)
348 {
349         ir_mode *mode = get_irn_mode(p);
350         long proj     = get_Proj_proj(p);
351
352         ASSERT_AND_RET_DBG(
353                 (
354                         (proj >= 0 && mode == mode_X && get_irn_mode(get_Cond_selector(pred)) == mode_b) ||   /* compare */
355                         (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred)))) ||             /* switch */
356                         is_Bad(get_Cond_selector(pred))                                                       /* rare */
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         case iro_Bad:
665                 /* hmm, optimization did not remove it */
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(ir_node *n, ir_node *p)
679 {
680         (void) n;
681         (void) p;
682         /* We don't test */
683         return 1;
684 }
685
686 /**
687  * verify a Proj(CopyB) node
688  */
689 static int verify_node_Proj_CopyB(ir_node *n, ir_node *p)
690 {
691         ir_mode *mode = get_irn_mode(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(ir_node *n, ir_node *p)
718 {
719         ir_mode *mode = get_irn_mode(p);
720         long proj     = get_Proj_proj(p);
721
722         /* ignore Bound checks of Bad */
723         if (is_Bad(get_Bound_index(n)))
724                 return 1;
725         ASSERT_AND_RET_DBG(
726                 (
727                         (proj == pn_Bound_M         && mode == mode_M) ||
728                         (proj == pn_Bound_X_regular && mode == mode_X) ||
729                         (proj == pn_Bound_X_except  && mode == mode_X) ||
730                         (proj == pn_Bound_res       && mode == get_irn_mode(get_Bound_index(n)))
731                 ),
732                 "wrong Proj from Bound", 0,
733                 show_proj_failure(p);
734         );
735         return 1;
736 }
737
738 /**
739  * verify a Proj node
740  */
741 static int verify_node_Proj(ir_node *p, ir_graph *irg)
742 {
743         ir_node *pred;
744         ir_op *op;
745
746         pred = skip_Id(get_Proj_pred(p));
747         ASSERT_AND_RET(get_irn_mode(pred) == mode_T, "mode of a 'projed' node is not Tuple", 0);
748         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);
749
750         op = get_irn_op(pred);
751
752         if (op->ops.verify_proj_node)
753                 return op->ops.verify_proj_node(pred, p);
754
755         /* all went ok */
756         return 1;
757 }
758
759 /**
760  * verify a Block node
761  */
762 static int verify_node_Block(ir_node *n, ir_graph *irg)
763 {
764         int i;
765
766         for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
767                 ir_node *pred = get_Block_cfgpred(n, i);
768                 ASSERT_AND_RET(
769                         is_Bad(pred) || (get_irn_mode(pred) == mode_X),
770                         "Block node must have a mode_X predecessor", 0);
771                 ASSERT_AND_RET(is_cfop(skip_Proj(pred)), "Block predecessor must be a cfop", 0);
772         }
773
774         if (n == get_irg_start_block(irg)) {
775                 ASSERT_AND_RET(get_Block_n_cfgpreds(n) == 0, "Start Block node", 0);
776         }
777
778         if (n == get_irg_end_block(irg) && get_irg_phase_state(irg) != phase_backend) {
779                 /* End block may only have Return, Raise or fragile ops as preds. */
780                 for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
781                         ir_node *pred =  skip_Proj(get_Block_cfgpred(n, i));
782                         if (is_Proj(pred) || is_Tuple(pred))
783                                 break;   /*  We can not test properly.  How many tuples are there? */
784                         ASSERT_AND_RET(
785                                 (
786                                         is_Return(pred) ||
787                                         is_Bad(pred)    ||
788                                         is_Raise(pred)  ||
789                                         is_fragile_op(pred)
790                                 ),
791                                 "End Block node", 0);
792                 }
793         }
794         /*  irg attr must == graph we are in. */
795         ASSERT_AND_RET(((get_irn_irg(n) && get_irn_irg(n) == irg)), "Block node has wrong irg attribute", 0);
796         return 1;
797 }
798
799 /**
800  * verify a Start node
801  */
802 static int verify_node_Start(ir_node *n, ir_graph *irg)
803 {
804         ir_mode *mymode = get_irn_mode(n);
805         (void) irg;
806
807         ASSERT_AND_RET(
808                 /* Start: BB --> X x M x ref x data1 x ... x datan x ref */
809                 mymode == mode_T, "Start node", 0
810                 );
811         return 1;
812 }
813
814 /**
815  * verify a Jmp node
816  */
817 static int verify_node_Jmp(ir_node *n, ir_graph *irg)
818 {
819         ir_mode *mymode = get_irn_mode(n);
820         (void) irg;
821
822         ASSERT_AND_RET(
823                 /* Jmp: BB --> X */
824                 mymode == mode_X, "Jmp node", 0
825         );
826         return 1;
827 }
828
829 /**
830  * verify an IJmp node
831  */
832 static int verify_node_IJmp(ir_node *n, ir_graph *irg)
833 {
834         ir_mode *mymode  = get_irn_mode(n);
835         ir_mode *op1mode = get_irn_mode(get_IJmp_target(n));
836         (void) irg;
837
838         ASSERT_AND_RET(
839                 /* IJmp: BB x ref --> X */
840                 mymode == mode_X && mode_is_reference(op1mode), "IJmp node", 0
841         );
842         return 1;
843 }
844
845 /**
846  * verify a Cond node
847  */
848 static int verify_node_Cond(ir_node *n, ir_graph *irg)
849 {
850         ir_mode *mymode  = get_irn_mode(n);
851         ir_mode *op1mode = get_irn_mode(get_Cond_selector(n));
852         (void) irg;
853
854         ASSERT_AND_RET(
855                 /* Cond: BB x b --> X x X */
856                 (op1mode == mode_b ||
857                 /* Cond: BB x int --> X^n */
858                 mode_is_int(op1mode) ),  "Cond node", 0
859                 );
860         ASSERT_AND_RET(mymode == mode_T, "Cond mode is not a tuple", 0);
861
862         return 1;
863 }
864
865 /**
866  * verify a Return node
867  */
868 static int verify_node_Return(ir_node *n, ir_graph *irg)
869 {
870         int i;
871         ir_mode *mymode   = get_irn_mode(n);
872         ir_mode *mem_mode = get_irn_mode(get_Return_mem(n));
873         ir_type *mt;
874
875         /* Return: BB x M x data1 x ... x datan --> X */
876
877         ASSERT_AND_RET( mem_mode == mode_M, "Return node", 0 );  /* operand M */
878
879         for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
880                 ASSERT_AND_RET( mode_is_datab(get_irn_mode(get_Return_res(n, i))), "Return node", 0 );  /* operand datai */
881         }
882         ASSERT_AND_RET( mymode == mode_X, "Result X", 0 );   /* result X */
883         /* Compare returned results with result types of method type */
884         mt = get_entity_type(get_irg_entity(irg));
885         ASSERT_AND_RET_DBG(get_Return_n_ress(n) == get_method_n_ress(mt),
886                 "Number of results for Return doesn't match number of results in type.", 0,
887                 show_return_nres(irg, n, mt););
888         for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
889                 ir_type *res_type = get_method_res_type(mt, i);
890
891                 if (get_irg_phase_state(irg) != phase_backend) {
892                         if (is_atomic_type(res_type)) {
893                                 ASSERT_AND_RET_DBG(
894                                         get_irn_mode(get_Return_res(n, i)) == get_type_mode(res_type),
895                                         "Mode of result for Return doesn't match mode of result type.", 0,
896                                         show_return_modes(irg, n, mt, i);
897                                 );
898                         } else {
899                                 ASSERT_AND_RET_DBG(
900                                         mode_is_reference(get_irn_mode(get_Return_res(n, i))),
901                                         "Mode of result for Return doesn't match mode of result type.", 0,
902                                         show_return_modes(irg, n, mt, i);
903                                 );
904                         }
905                 }
906         }
907         return 1;
908 }
909
910 /**
911  * verify a Raise node
912  */
913 static int verify_node_Raise(ir_node *n, ir_graph *irg)
914 {
915         ir_mode *mymode  = get_irn_mode(n);
916         ir_mode *op1mode = get_irn_mode(get_Raise_mem(n));
917         ir_mode *op2mode = get_irn_mode(get_Raise_exo_ptr(n));
918         (void) irg;
919
920         ASSERT_AND_RET(
921                 /* Sel: BB x M x ref --> X x M */
922                 op1mode == mode_M && mode_is_reference(op2mode) &&
923                 mymode == mode_T, "Raise node", 0
924         );
925         return 1;
926 }
927
928 /**
929  * verify a Const node
930  */
931 static int verify_node_Const(ir_node *n, ir_graph *irg)
932 {
933         ir_mode *mymode = get_irn_mode(n);
934         (void) irg;
935
936         ASSERT_AND_RET(
937                 /* Const: BB --> data */
938                 (mode_is_data(mymode) ||
939                 mymode == mode_b)      /* we want boolean constants for static evaluation */
940                 ,"Const node", 0       /* of Cmp. */
941         );
942         ASSERT_AND_RET(
943                 /* the modes of the constant and teh tarval must match */
944                 mymode == get_tarval_mode(get_Const_tarval(n)),
945                 "Const node, tarval and node mode mismatch", 0
946         );
947         return 1;
948 }
949
950 /**
951  * verify a SymConst node
952  */
953 static int verify_node_SymConst(ir_node *n, ir_graph *irg)
954 {
955         ir_mode *mymode = get_irn_mode(n);
956         (void) irg;
957
958         ASSERT_AND_RET(
959                 /* SymConst: BB --> int*/
960                 (mode_is_int(mymode) ||
961                 /* SymConst: BB --> ref */
962                 mode_is_reference(mymode))
963                 ,"SymConst node", 0);
964         return 1;
965 }
966
967 /**
968  * verify a Sel node
969  */
970 static int verify_node_Sel(ir_node *n, ir_graph *irg)
971 {
972         int i;
973         ir_mode *mymode  = get_irn_mode(n);
974         ir_mode *op1mode = get_irn_mode(get_Sel_mem(n));
975         ir_mode *op2mode = get_irn_mode(get_Sel_ptr(n));
976         ir_entity *ent;
977         (void) irg;
978
979         ASSERT_AND_RET_DBG(
980                 /* Sel: BB x M x ref x int^n --> ref */
981                 (op1mode == mode_M && op2mode == mymode && mode_is_reference(mymode)),
982                 "Sel node", 0, show_node_failure(n)
983         );
984
985         for (i = get_Sel_n_indexs(n) - 1; i >= 0; --i) {
986                 ASSERT_AND_RET_DBG(mode_is_int(get_irn_mode(get_Sel_index(n, i))), "Sel node", 0, show_node_failure(n));
987         }
988         ent = get_Sel_entity(n);
989         ASSERT_AND_RET_DBG(ent, "Sel node with empty entity", 0, show_node_failure(n));
990         return 1;
991 }
992
993 /**
994  * verify an InstOf node
995  */
996 static int verify_node_InstOf(ir_node *n, ir_graph *irg)
997 {
998         ir_mode *mymode  = get_irn_mode(n);
999         ir_mode *op1mode = get_irn_mode(get_InstOf_obj(n));
1000         (void) irg;
1001
1002         ASSERT_AND_RET(mode_T == mymode, "mode of Instof is not a tuple", 0);
1003         ASSERT_AND_RET(mode_is_data(op1mode), "Instof not on data", 0);
1004         return 1;
1005 }
1006
1007 /**
1008  * Check if the pinned state is right.
1009  */
1010 static int verify_right_pinned(ir_node *n)
1011 {
1012         ir_node *mem;
1013
1014         if (get_irn_pinned(n) == op_pin_state_pinned)
1015                 return 1;
1016         mem = get_Call_mem(n);
1017
1018         /* if it's not pinned, its memory predecessor must be NoMem or Pin */
1019         if (is_NoMem(mem) || is_Pin(mem))
1020                 return 1;
1021         return 0;
1022 }
1023
1024 /**
1025  * verify a Call node
1026  */
1027 static int verify_node_Call(ir_node *n, ir_graph *irg)
1028 {
1029         ir_mode *mymode  = get_irn_mode(n);
1030         ir_mode *op1mode = get_irn_mode(get_Call_mem(n));
1031         ir_mode *op2mode = get_irn_mode(get_Call_ptr(n));
1032         ir_type *mt;
1033         size_t i;
1034         size_t n_params;
1035         (void) irg;
1036
1037         /* Call: BB x M x ref x data1 x ... x datan
1038         --> M x datan+1 x ... x data n+m */
1039         ASSERT_AND_RET( op1mode == mode_M && mode_is_reference(op2mode), "Call node", 0 );  /* operand M x ref */
1040
1041         /* NoMem nodes are only allowed as memory input if the Call is NOT pinned */
1042         ASSERT_AND_RET(verify_right_pinned(n),"Call node with wrong memory input", 0 );
1043
1044         mt = get_Call_type(n);
1045         if (get_unknown_type() == mt) {
1046                 return 1;
1047         }
1048
1049         n_params = get_Call_n_params(n);
1050         for (i = 0; i < n_params; ++i) {
1051                 ASSERT_AND_RET( mode_is_datab(get_irn_mode(get_Call_param(n, i))), "Call node", 0 );  /* operand datai */
1052         }
1053
1054         ASSERT_AND_RET( mymode == mode_T, "Call result not a tuple", 0 );   /* result T */
1055         /* Compare arguments of node with those of type */
1056
1057         if (get_method_variadicity(mt) == variadicity_variadic) {
1058                 ASSERT_AND_RET_DBG(
1059                         get_Call_n_params(n) >= get_method_n_params(mt),
1060                         "Number of args for Call doesn't match number of args in variadic type.",
1061                         0,
1062                         ir_fprintf(stderr, "Call %+F has %d params, type %d\n",
1063                         n, get_Call_n_params(n), get_method_n_params(mt));
1064                 );
1065         } else {
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 non 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         }
1074
1075         for (i = 0; i < get_method_n_params(mt); i++) {
1076                 ir_type *t = get_method_param_type(mt, i);
1077
1078                 if (get_irg_phase_state(irg) != phase_backend) {
1079                         if (is_atomic_type(t)) {
1080                                 ASSERT_AND_RET_DBG(
1081                                         get_irn_mode(get_Call_param(n, i)) == get_type_mode(t),
1082                                         "Mode of arg for Call doesn't match mode of arg type.", 0,
1083                                         show_call_param(n, mt);
1084                                 );
1085                         } else {
1086                                 /* call with a compound type, mode must be reference */
1087                                 ASSERT_AND_RET_DBG(
1088                                         mode_is_reference(get_irn_mode(get_Call_param(n, i))),
1089                                         "Mode of arg for Call doesn't match mode of arg type.", 0,
1090                                         show_call_param(n, mt);
1091                                 );
1092                         }
1093                 }
1094         }
1095
1096 #if 0
1097         if (Call_has_callees(n)) {
1098                 for (i = 0; i < get_Call_n_callees(n); i++) {
1099                         ASSERT_AND_RET(is_entity(get_Call_callee(n, i)), "callee array must contain entities.", 0);
1100                 }
1101         }
1102 #endif
1103         return 1;
1104 }
1105
1106 /**
1107  * verify an Add node
1108  */
1109 static int verify_node_Add(ir_node *n, ir_graph *irg)
1110 {
1111         ir_mode *mymode  = get_irn_mode(n);
1112         ir_mode *op1mode = get_irn_mode(get_Add_left(n));
1113         ir_mode *op2mode = get_irn_mode(get_Add_right(n));
1114         (void) irg;
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(ir_node *n, ir_graph *irg)
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         (void) irg;
1142
1143         ASSERT_AND_RET_DBG(
1144                 (
1145                         /* common Sub: BB x numP x numP --> numP */
1146                         (mymode ==op1mode && mymode == op2mode && mode_is_data(op1mode)) ||
1147                         /* Pointer Sub: BB x ref x int --> ref */
1148                         (op1mode == mymode && mode_is_int(op2mode) && mode_is_reference(mymode)) ||
1149                         /* Pointer Sub: BB x ref x ref --> int */
1150                         (op1mode == op2mode && mode_is_reference(op2mode) && mode_is_int(mymode))
1151                 ),
1152                 "Sub node", 0,
1153                 show_binop_failure(n, "/* common Sub: BB x numP x numP --> numP */ |\n"
1154                         "/* Pointer Sub: BB x ref x int --> ref */   |\n"
1155                         "/* Pointer Sub: BB x ref x ref --> int */" );
1156                 );
1157         return 1;
1158 }
1159
1160 /**
1161  * verify a Minus node
1162  */
1163 static int verify_node_Minus(ir_node *n, ir_graph *irg)
1164 {
1165         ir_mode *mymode  = get_irn_mode(n);
1166         ir_mode *op1mode = get_irn_mode(get_Minus_op(n));
1167         (void) irg;
1168
1169         ASSERT_AND_RET_DBG(
1170                 /* Minus: BB x num --> num */
1171                 op1mode == mymode && mode_is_num(op1mode), "Minus node", 0,
1172                 show_unop_failure(n , "/* Minus: BB x num --> num */");
1173         );
1174         return 1;
1175 }
1176
1177 /**
1178  * verify a Mul node
1179  */
1180 static int verify_node_Mul(ir_node *n, ir_graph *irg)
1181 {
1182         ir_mode *mymode  = get_irn_mode(n);
1183         ir_mode *op1mode = get_irn_mode(get_Mul_left(n));
1184         ir_mode *op2mode = get_irn_mode(get_Mul_right(n));
1185         (void) irg;
1186
1187         ASSERT_AND_RET_DBG(
1188                 (
1189                         /* Mul: BB x int_n x int_n --> int_n|int_2n */
1190                         (mode_is_int(op1mode)   && op2mode == op1mode && mode_is_int(mymode) &&
1191                          (op1mode == mymode || get_mode_size_bits(op1mode) * 2 == get_mode_size_bits(mymode))) ||
1192                         /* Mul: BB x float x float --> float */
1193                         (mode_is_float(op1mode) && op2mode == op1mode && mymode == op1mode)
1194                 ),
1195                 "Mul node",0,
1196                 show_binop_failure(n, "/* Mul: BB x int_n x int_n --> int_n|int_2n */ |\n"
1197                 "/* Mul: BB x float x float --> float */");
1198         );
1199         return 1;
1200 }
1201
1202 /**
1203  * verify a Mulh node
1204  */
1205 static int verify_node_Mulh(ir_node *n, ir_graph *irg)
1206 {
1207         ir_mode *mymode  = get_irn_mode(n);
1208         ir_mode *op1mode = get_irn_mode(get_Mulh_left(n));
1209         ir_mode *op2mode = get_irn_mode(get_Mulh_right(n));
1210         (void) irg;
1211
1212         ASSERT_AND_RET_DBG(
1213                 (
1214                         /* Mulh: BB x int x int --> int */
1215                         (mode_is_int(op1mode) && op2mode == op1mode && op1mode == mymode)
1216                 ),
1217                 "Mulh node",0,
1218                 show_binop_failure(n, "/* Mulh: BB x int x int --> int */");
1219         );
1220         return 1;
1221 }
1222
1223 /**
1224  * verify a Div node
1225  */
1226 static int verify_node_Div(ir_node *n, ir_graph *irg)
1227 {
1228         ir_mode *mymode  = get_irn_mode(n);
1229         ir_mode *op1mode = get_irn_mode(get_Div_mem(n));
1230         ir_mode *op2mode = get_irn_mode(get_Div_left(n));
1231         ir_mode *op3mode = get_irn_mode(get_Div_right(n));
1232         (void) irg;
1233
1234         ASSERT_AND_RET(
1235                 /* Div: BB x M x data x data --> M x X x data */
1236                 op1mode == mode_M &&
1237                 op2mode == op3mode &&
1238                 mode_is_data(op2mode) &&
1239                 mymode == mode_T,
1240                 "Div node", 0
1241                 );
1242         return 1;
1243 }
1244
1245 /**
1246  * verify a Mod node
1247  */
1248 static int verify_node_Mod(ir_node *n, ir_graph *irg)
1249 {
1250         ir_mode *mymode  = get_irn_mode(n);
1251         ir_mode *op1mode = get_irn_mode(get_Mod_mem(n));
1252         ir_mode *op2mode = get_irn_mode(get_Mod_left(n));
1253         ir_mode *op3mode = get_irn_mode(get_Mod_right(n));
1254         (void) irg;
1255
1256         ASSERT_AND_RET(
1257                 /* Mod: BB x M x int x int --> M x X x int */
1258                 op1mode == mode_M &&
1259                 op2mode == op3mode &&
1260                 mode_is_int(op2mode) &&
1261                 mymode == mode_T,
1262                 "Mod node", 0
1263                 );
1264         return 1;
1265 }
1266
1267 /**
1268  * verify a logical And, Or, Eor node
1269  */
1270 static int verify_node_Logic(ir_node *n, ir_graph *irg)
1271 {
1272         ir_mode *mymode  = get_irn_mode(n);
1273         ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1274         ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1275         (void) irg;
1276
1277         ASSERT_AND_RET_DBG(
1278                 /* And or Or or Eor: BB x int x int --> int */
1279                 (mode_is_int(mymode) || mode_is_reference(mymode) || mymode == mode_b) &&
1280                 op2mode == op1mode &&
1281                 mymode == op2mode,
1282                 "And, Or or Eor node", 0,
1283                 show_binop_failure(n, "/* And or Or or Eor: BB x int x int --> int */");
1284         );
1285         return 1;
1286 }
1287
1288 #define verify_node_And   verify_node_Logic
1289 #define verify_node_Or    verify_node_Logic
1290 #define verify_node_Eor   verify_node_Logic
1291
1292 /**
1293  * verify a Not node
1294  */
1295 static int verify_node_Not(ir_node *n, ir_graph *irg)
1296 {
1297         ir_mode *mymode  = get_irn_mode(n);
1298         ir_mode *op1mode = get_irn_mode(get_Not_op(n));
1299         (void) irg;
1300
1301         ASSERT_AND_RET_DBG(
1302                 /* Not: BB x int --> int */
1303                 (mode_is_int(mymode) || mymode == mode_b) &&
1304                 mymode == op1mode,
1305                 "Not node", 0,
1306                 show_unop_failure(n, "/* Not: BB x int --> int */");
1307         );
1308         return 1;
1309 }
1310
1311 /**
1312  * verify a Cmp node
1313  */
1314 static int verify_node_Cmp(ir_node *n, ir_graph *irg)
1315 {
1316         ir_mode *mymode  = get_irn_mode(n);
1317         ir_mode *op1mode = get_irn_mode(get_Cmp_left(n));
1318         ir_mode *op2mode = get_irn_mode(get_Cmp_right(n));
1319         (void) irg;
1320
1321         ASSERT_AND_RET_DBG(
1322                 /* Cmp: BB x datab x datab --> b16 */
1323                 mode_is_datab(op1mode) &&
1324                 op2mode == op1mode &&
1325                 mymode == mode_b,
1326                 "Cmp node", 0,
1327                 show_binop_failure(n, "/* Cmp: BB x datab x datab --> b16 */");
1328         );
1329         return 1;
1330 }
1331
1332 /**
1333  * verify a Shift node
1334  */
1335 static int verify_node_Shift(ir_node *n, ir_graph *irg)
1336 {
1337         ir_mode *mymode  = get_irn_mode(n);
1338         ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1339         ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1340         (void) irg;
1341
1342         ASSERT_AND_RET_DBG(
1343                 /* Shl, Shr or Shrs: BB x int x int_u --> int */
1344                 mode_is_int(op1mode) &&
1345                 mode_is_int(op2mode) &&
1346                 !mode_is_signed(op2mode) &&
1347                 mymode == op1mode,
1348                 "Shl, Shr or Shrs node", 0,
1349                 show_binop_failure(n, "/* Shl, Shr or Shrs: BB x int x int_u --> int */");
1350         );
1351         return 1;
1352 }
1353
1354 #define verify_node_Shl   verify_node_Shift
1355 #define verify_node_Shr   verify_node_Shift
1356 #define verify_node_Shrs  verify_node_Shift
1357
1358 /**
1359  * verify a Rotl node
1360  */
1361 static int verify_node_Rotl(ir_node *n, ir_graph *irg)
1362 {
1363         ir_mode *mymode  = get_irn_mode(n);
1364         ir_mode *op1mode = get_irn_mode(get_Rotl_left(n));
1365         ir_mode *op2mode = get_irn_mode(get_Rotl_right(n));
1366         (void) irg;
1367
1368         ASSERT_AND_RET_DBG(
1369                 /* Rotl: BB x int x int --> int */
1370                 mode_is_int(op1mode) &&
1371                 mode_is_int(op2mode) &&
1372                 mymode == op1mode,
1373                 "Rotl node", 0,
1374                 show_binop_failure(n, "/* Rotl: BB x int x int --> int */");
1375         );
1376         return 1;
1377 }
1378
1379 /**
1380  * verify a Conv node
1381  */
1382 static int verify_node_Conv(ir_node *n, ir_graph *irg)
1383 {
1384         ir_mode *mymode  = get_irn_mode(n);
1385         ir_mode *op1mode = get_irn_mode(get_Conv_op(n));
1386         (void) irg;
1387
1388         ASSERT_AND_RET_DBG(
1389                 is_irg_state(irg, IR_GRAPH_STATE_BCONV_ALLOWED) ||
1390                 (mode_is_datab(op1mode) && mode_is_data(mymode)),
1391                 "Conv node", 0,
1392                 show_unop_failure(n, "/* Conv: BB x datab --> data */");
1393         );
1394         return 1;
1395 }
1396
1397 /**
1398  * verify a Cast node
1399  */
1400 static int verify_node_Cast(ir_node *n, ir_graph *irg)
1401 {
1402         ir_mode *mymode  = get_irn_mode(n);
1403         ir_mode *op1mode = get_irn_mode(get_Cast_op(n));
1404         (void) irg;
1405
1406         ASSERT_AND_RET_DBG(
1407                 /* Conv: BB x datab1 --> datab2 */
1408                 mode_is_data(op1mode) && op1mode == mymode,
1409                 "Cast node", 0,
1410                 show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
1411         );
1412         return 1;
1413 }
1414
1415 /**
1416  * verify a Phi node
1417  */
1418 static int verify_node_Phi(ir_node *n, ir_graph *irg)
1419 {
1420         ir_mode *mymode = get_irn_mode(n);
1421         ir_node *block  = get_nodes_block(n);
1422         int i;
1423         (void) irg;
1424
1425         /* a Phi node MUST have the same number of inputs as its block
1426          * Exception is a phi with 0 inputs which is used when (re)constructing the
1427          * SSA form */
1428         if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building && get_irn_arity(n) > 0) {
1429                 ASSERT_AND_RET_DBG(
1430                         get_irn_arity(n) == get_irn_arity(block),
1431                         "wrong number of inputs in Phi node", 0,
1432                         show_phi_inputs(n, block);
1433                 );
1434         }
1435
1436         /* Phi: BB x dataM^n --> dataM */
1437         for (i = get_Phi_n_preds(n) - 1; i >= 0; --i) {
1438                 ir_node *pred = get_Phi_pred(n, i);
1439                 if (!is_Bad(pred)) {
1440                         ASSERT_AND_RET_DBG(
1441                                 get_irn_mode(pred) == mymode,
1442                                 "Phi node", 0,
1443                                 show_phi_failure(n, pred, i);
1444                         );
1445                 }
1446         }
1447         ASSERT_AND_RET(mode_is_dataM(mymode) || mymode == mode_b, "Phi node", 0 );
1448
1449         if (mymode == mode_M) {
1450                 for (i = get_Phi_n_preds(n) - 1; i >= 0; --i) {
1451                         int j;
1452                         ir_node *pred_i = get_Phi_pred(n, i);
1453
1454                         if (is_Bad(pred_i))
1455                                 continue;
1456                         for (j = i - 1; j >= 0; --j) {
1457                                 ir_node *pred_j = get_Phi_pred(n, j);
1458
1459                                 if (is_Bad(pred_j))
1460                                         continue;
1461 #if 0
1462                                 /* currently this checks fails for blocks with exception
1463                                    outputs (and these are NOT basic blocks).  So it is disabled yet. */
1464                                 ASSERT_AND_RET_DBG(
1465                                         (pred_i == pred_j) || (get_irn_n(pred_i, -1) != get_irn_n(pred_j, -1)),
1466                                         "At least two different PhiM predecessors are in the same block",
1467                                         0,
1468                                         ir_printf("%+F and %+F of %+F are in %+F\n", pred_i, pred_j, n, get_irn_n(pred_i, -1))
1469                                 );
1470 #endif
1471                         }
1472                 }
1473         }
1474         return 1;
1475 }
1476
1477 /**
1478  * verify a Load node
1479  */
1480 static int verify_node_Load(ir_node *n, ir_graph *irg)
1481 {
1482         ir_mode *mymode  = get_irn_mode(n);
1483         ir_mode *op1mode = get_irn_mode(get_Load_mem(n));
1484         ir_mode *op2mode = get_irn_mode(get_Load_ptr(n));
1485
1486         ASSERT_AND_RET(op1mode == mode_M, "Load node", 0);
1487         if (get_irg_phase_state(irg) != phase_backend) {
1488                 ASSERT_AND_RET(mode_is_reference(op2mode), "Load node", 0 );
1489         }
1490         ASSERT_AND_RET( mymode == mode_T, "Load node", 0 );
1491
1492         /*
1493          * jack's gen_add_firm_code:simpleSel seems to build Load (Load
1494          * (Proj (Proj))) sometimes ...
1495
1496          * interprete.c:ai_eval seems to assume that this happens, too
1497
1498          * obset.c:get_abstval_any can't deal with this if the load has
1499          * mode_T
1500          *
1501           {
1502           ir_entity *ent = hunt_for_entity (get_Load_ptr (n), n);
1503           assert ((NULL != ent) || (mymode != mode_T));
1504           }
1505          */
1506
1507         return 1;
1508 }
1509
1510 /**
1511  * verify a Store node
1512  */
1513 static int verify_node_Store(ir_node *n, ir_graph *irg)
1514 {
1515         ir_entity *target;
1516
1517         ir_mode *mymode  = get_irn_mode(n);
1518         ir_mode *op1mode = get_irn_mode(get_Store_mem(n));
1519         ir_mode *op2mode = get_irn_mode(get_Store_ptr(n));
1520         ir_mode *op3mode = get_irn_mode(get_Store_value(n));
1521
1522         ASSERT_AND_RET(op1mode == mode_M && mode_is_datab(op3mode), "Store node", 0 );
1523         if (get_irg_phase_state(irg) != phase_backend) {
1524                 ASSERT_AND_RET(mode_is_reference(op2mode), "Store node", 0 );
1525         }
1526         ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
1527
1528         target = get_ptr_entity(get_Store_ptr(n));
1529         if (verify_entities && target && get_irg_phase_state(irg) == phase_high) {
1530                 /*
1531                  * If lowered code, any Sels that add 0 may be removed, causing
1532                  * an direct access to entities of array or compound type.
1533                  * Prevent this by checking the phase.
1534                  */
1535                 ASSERT_AND_RET( op3mode == get_type_mode(get_entity_type(target)),
1536                         "Store node", 0);
1537         }
1538
1539         return 1;
1540 }
1541
1542 /**
1543  * verify an Alloc node
1544  */
1545 static int verify_node_Alloc(ir_node *n, ir_graph *irg)
1546 {
1547         ir_mode *mymode  = get_irn_mode(n);
1548         ir_mode *op1mode = get_irn_mode(get_Alloc_mem(n));
1549         ir_mode *op2mode = get_irn_mode(get_Alloc_count(n));
1550         (void) irg;
1551
1552         ASSERT_AND_RET_DBG(
1553                 /* Alloc: BB x M x int_u --> M x X x ref */
1554                 op1mode == mode_M &&
1555                 mode_is_int(op2mode) &&
1556                 !mode_is_signed(op2mode) &&
1557                 mymode == mode_T,
1558                 "Alloc node", 0,
1559                 show_node_failure(n);
1560         );
1561         return 1;
1562 }
1563
1564 /**
1565  * verify a Free node
1566  */
1567 static int verify_node_Free(ir_node *n, ir_graph *irg)
1568 {
1569         ir_mode *mymode  = get_irn_mode(n);
1570         ir_mode *op1mode = get_irn_mode(get_Free_mem(n));
1571         ir_mode *op2mode = get_irn_mode(get_Free_ptr(n));
1572         ir_mode *op3mode = get_irn_mode(get_Free_size(n));
1573         (void) irg;
1574
1575         ASSERT_AND_RET_DBG(
1576                 /* Free: BB x M x ref x int_u --> M */
1577                 op1mode == mode_M && mode_is_reference(op2mode) &&
1578                 mode_is_int(op3mode) &&
1579                 !mode_is_signed(op3mode) &&
1580                 mymode == mode_M,
1581                 "Free node", 0,
1582                 show_triop_failure(n, "/* Free: BB x M x ref x int_u --> M */");
1583         );
1584         return 1;
1585 }
1586
1587 /**
1588  * verify a Sync node
1589  */
1590 static int verify_node_Sync(ir_node *n, ir_graph *irg)
1591 {
1592         int i;
1593         ir_mode *mymode  = get_irn_mode(n);
1594         (void) irg;
1595
1596         /* Sync: BB x M^n --> M */
1597         for (i = get_Sync_n_preds(n) - 1; i >= 0; --i) {
1598                 ASSERT_AND_RET( get_irn_mode(get_Sync_pred(n, i)) == mode_M, "Sync node", 0 );
1599         };
1600         ASSERT_AND_RET( mymode == mode_M, "Sync node", 0 );
1601         return 1;
1602 }
1603
1604 /**
1605  * verify a Confirm node
1606  */
1607 static int verify_node_Confirm(ir_node *n, ir_graph *irg)
1608 {
1609         ir_mode *mymode  = get_irn_mode(n);
1610         ir_mode *op1mode = get_irn_mode(get_Confirm_value(n));
1611         ir_mode *op2mode = get_irn_mode(get_Confirm_bound(n));
1612         (void) irg;
1613
1614         ASSERT_AND_RET_DBG(
1615                 /* Confirm: BB x T x T --> T */
1616                 op1mode == mymode &&
1617                 op2mode == mymode,
1618                 "Confirm node", 0,
1619                 show_binop_failure(n, "/* Confirm: BB x T x T --> T */");
1620         );
1621         return 1;
1622 }
1623
1624 /**
1625  * verify a Mux node
1626  */
1627 static int verify_node_Mux(ir_node *n, ir_graph *irg)
1628 {
1629         ir_mode *mymode  = get_irn_mode(n);
1630         ir_mode *op1mode = get_irn_mode(get_Mux_sel(n));
1631         ir_mode *op2mode = get_irn_mode(get_Mux_true(n));
1632         ir_mode *op3mode = get_irn_mode(get_Mux_false(n));
1633         (void) irg;
1634
1635         ASSERT_AND_RET(
1636                 /* Mux: BB x b x datab x datab --> datab */
1637                 op1mode == mode_b &&
1638                 op2mode == mymode &&
1639                 op3mode == mymode &&
1640                 mode_is_datab(mymode),
1641                 "Mux node", 0
1642                 );
1643         return 1;
1644 }
1645
1646 /**
1647  * verify a CopyB node
1648  */
1649 static int verify_node_CopyB(ir_node *n, ir_graph *irg)
1650 {
1651         ir_mode *mymode  = get_irn_mode(n);
1652         ir_mode *op1mode = get_irn_mode(get_CopyB_mem(n));
1653         ir_mode *op2mode = get_irn_mode(get_CopyB_dst(n));
1654         ir_mode *op3mode = get_irn_mode(get_CopyB_src(n));
1655         ir_type *t = get_CopyB_type(n);
1656
1657         /* CopyB: BB x M x ref x ref --> M x X */
1658         ASSERT_AND_RET(mymode == mode_T && op1mode == mode_M, "CopyB node", 0);
1659         if (get_irg_phase_state(irg) != phase_backend) {
1660                 ASSERT_AND_RET(mode_is_reference(op2mode) && mode_is_reference(op3mode),
1661                         "CopyB node", 0 );
1662         }
1663
1664         ASSERT_AND_RET(
1665                 is_compound_type(t) || is_Array_type(t),
1666                 "CopyB node should copy compound types only", 0 );
1667
1668         /* NoMem nodes are only allowed as memory input if the CopyB is NOT pinned.
1669            This should happen RARELY, as CopyB COPIES MEMORY */
1670         ASSERT_AND_RET(verify_right_pinned(n), "CopyB node with wrong memory input", 0 );
1671         return 1;
1672 }
1673
1674 /**
1675  * verify a Bound node
1676  */
1677 static int verify_node_Bound(ir_node *n, ir_graph *irg)
1678 {
1679         ir_mode *mymode  = get_irn_mode(n);
1680         ir_mode *op1mode = get_irn_mode(get_Bound_mem(n));
1681         ir_mode *op2mode = get_irn_mode(get_Bound_index(n));
1682         ir_mode *op3mode = get_irn_mode(get_Bound_lower(n));
1683         ir_mode *op4mode = get_irn_mode(get_Bound_upper(n));
1684         (void) irg;
1685
1686         /* Bound: BB x M x int x int x int --> M x X */
1687         ASSERT_AND_RET(
1688                 mymode == mode_T &&
1689                 op1mode == mode_M &&
1690                 op2mode == op3mode &&
1691                 op3mode == op4mode &&
1692                 mode_is_int(op3mode),
1693                 "Bound node", 0 );
1694         return 1;
1695 }
1696
1697 /**
1698  * Check dominance.
1699  * For each usage of a node, it is checked, if the block of the
1700  * node dominates the block of the usage (for phis: the predecessor
1701  * block of the phi for the corresponding edge).
1702  *
1703  * @return non-zero on success, 0 on dominance error
1704  */
1705 static int check_dominance_for_node(ir_node *use)
1706 {
1707         /* This won't work for blocks and the end node */
1708         if (!is_Block(use) && !is_End(use) && !is_Anchor(use)) {
1709                 int i;
1710                 ir_node *bl = get_nodes_block(use);
1711
1712                 for (i = get_irn_arity(use) - 1; i >= 0; --i) {
1713                         ir_node *def    = get_irn_n(use, i);
1714                         ir_node *def_bl = get_nodes_block(def);
1715                         ir_node *use_bl = bl;
1716                         ir_graph *irg;
1717
1718                         /* ignore dead definition blocks, will be removed */
1719                         if (is_Block_dead(def_bl) || get_Block_dom_depth(def_bl) == -1)
1720                                 continue;
1721
1722                         if (is_Phi(use))
1723                                 use_bl = get_Block_cfgpred_block(bl, i);
1724
1725                         /* ignore dead use blocks, will be removed */
1726                         if (is_Block_dead(use_bl) || get_Block_dom_depth(use_bl) == -1)
1727                                 continue;
1728
1729                         irg = get_irn_irg(use);
1730                         ASSERT_AND_RET_DBG(
1731                                 block_dominates(def_bl, use_bl),
1732                                 "the definition of a value used violates the dominance property", 0,
1733                                 ir_fprintf(stderr,
1734                                 "graph %+F: %+F of %+F must dominate %+F of user %+F input %d\n",
1735                                 irg, def_bl, def, use_bl, use, i
1736                                 );
1737                         );
1738                 }
1739         }
1740         return 1;
1741 }
1742
1743 /* Tests the modes of n and its predecessors. */
1744 int irn_verify_irg(ir_node *n, ir_graph *irg)
1745 {
1746         int i;
1747         ir_op *op;
1748
1749         if (!get_node_verification_mode())
1750                 return 1;
1751
1752         /*
1753          * do NOT check placement in interprocedural view, as we don't always
1754          * know the "right" graph ...
1755          */
1756
1757 #ifndef NDEBUG
1758         /* this is an expensive check for large graphs (it has a quadratic
1759          * runtime but with a small constant); so do NOT run it in release mode
1760          */
1761         ASSERT_AND_RET_DBG(
1762                 node_is_in_irgs_storage(irg, n),
1763                 "Node is not stored on proper IR graph!", 0,
1764                 show_node_on_graph(irg, n);
1765         );
1766 #endif
1767         assert(get_irn_irg(n) == irg);
1768         {
1769                 unsigned idx           = get_irn_idx(n);
1770                 ir_node *node_from_map = get_idx_irn(irg, idx);
1771                 ASSERT_AND_RET_DBG(node_from_map == n, "Node index and index map entry differ", 0,
1772                         ir_printf("node %+F node in map %+F(%p)\n", n, node_from_map, node_from_map));
1773         }
1774
1775         op = get_irn_op(n);
1776
1777         /* We don't want to test nodes whose predecessors are Bad,
1778            as we would have to special case that for each operation. */
1779         if (op != op_Phi && op != op_Block) {
1780                 for (i = get_irn_arity(n) - 1; i >= 0; --i) {
1781                         if (is_Bad(get_irn_n(n, i)))
1782                                 return 1;
1783                 }
1784         }
1785
1786         if (_get_op_pinned(op) >= op_pin_state_exc_pinned) {
1787                 op_pin_state state = get_irn_pinned(n);
1788                 ASSERT_AND_RET_DBG(
1789                         state == op_pin_state_floats ||
1790                         state == op_pin_state_pinned,
1791                         "invalid pin state", 0,
1792                         ir_printf("node %+F", n));
1793         }
1794
1795         if (op->ops.verify_node)
1796                 return op->ops.verify_node(n, irg);
1797
1798         /* All went ok */
1799         return 1;
1800 }
1801
1802 int irn_verify(ir_node *n)
1803 {
1804 #ifdef DEBUG_libfirm
1805         return irn_verify_irg(n, get_irn_irg(n));
1806 #else
1807         (void)n;
1808         return 1;
1809 #endif
1810 }
1811
1812 /*-----------------------------------------------------------------*/
1813 /* Verify the whole graph.                                         */
1814 /*-----------------------------------------------------------------*/
1815
1816 #ifdef DEBUG_libfirm
1817 /**
1818  * Walker to check every node
1819  */
1820 static void verify_wrap(ir_node *node, void *env)
1821 {
1822         int *res = (int*)env;
1823         *res = irn_verify_irg(node, get_irn_irg(node));
1824 }
1825
1826 /**
1827  * Walker to check every node including SSA property.
1828  * Only called if dominance info is available.
1829  */
1830 static void verify_wrap_ssa(ir_node *node, void *env)
1831 {
1832         int *res = (int*)env;
1833
1834         *res = irn_verify_irg(node, get_irn_irg(node));
1835         if (*res) {
1836                 *res = check_dominance_for_node(node);
1837         }
1838 }
1839
1840 #endif /* DEBUG_libfirm */
1841
1842 /*
1843  * Calls irn_verify for each node in irg.
1844  * Graph must be in state "op_pin_state_pinned".
1845  * If dominance info is available, check the SSA property.
1846  */
1847 int irg_verify(ir_graph *irg, unsigned flags)
1848 {
1849         int res = 1;
1850 #ifdef DEBUG_libfirm
1851         int pinned = get_irg_pinned(irg) == op_pin_state_pinned;
1852
1853 #ifndef NDEBUG
1854         last_irg_error = NULL;
1855 #endif /* NDEBUG */
1856
1857         if ((flags & VERIFY_ENFORCE_SSA) && pinned)
1858                 compute_doms(irg);
1859
1860         irg_walk_anchors(
1861                 irg,
1862                 pinned && get_irg_dom_state(irg) == dom_consistent
1863                         ? verify_wrap_ssa : verify_wrap,
1864                 NULL,
1865                 &res
1866         );
1867
1868         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT && ! res) {
1869                 ir_entity *ent = get_irg_entity(irg);
1870
1871                 if (ent)
1872                         fprintf(stderr, "irg_verify: Verifying graph %s failed\n", get_entity_name(ent));
1873                 else
1874                         fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)irg);
1875         }
1876
1877 #else
1878         (void)irg;
1879         (void)flags;
1880 #endif /* DEBUG_libfirm */
1881
1882         return res;
1883 }
1884
1885 typedef struct pass_t {
1886         ir_graph_pass_t pass;
1887         unsigned        flags;
1888 } pass_t;
1889
1890 /**
1891  * Wrapper to irg_verify to be run as an ir_graph pass.
1892  */
1893 static int irg_verify_wrapper(ir_graph *irg, void *context)
1894 {
1895         pass_t *pass = (pass_t*)context;
1896         irg_verify(irg, pass->flags);
1897         /* do NOT rerun the pass if verify is ok :-) */
1898         return 0;
1899 }
1900
1901 /* Creates an ir_graph pass for irg_verify(). */
1902 ir_graph_pass_t *irg_verify_pass(const char *name, unsigned flags)
1903 {
1904         pass_t *pass = XMALLOCZ(pass_t);
1905
1906         def_graph_pass_constructor(
1907                 &pass->pass, name ? name : "irg_verify", irg_verify_wrapper);
1908
1909         /* neither dump for verify */
1910         pass->pass.dump_irg   = (DUMP_ON_IRG_FUNC)ir_prog_no_dump;
1911         pass->pass.verify_irg = (RUN_ON_IRG_FUNC)ir_prog_no_verify;
1912
1913         pass->flags = flags;
1914         return &pass->pass;
1915 }
1916
1917 /* create a verify pass */
1918 int irn_verify_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string)
1919 {
1920         int res;
1921         firm_verification_t old = get_node_verification_mode();
1922
1923         firm_verify_failure_msg = NULL;
1924         do_node_verification(FIRM_VERIFICATION_ERROR_ONLY);
1925         res = irn_verify_irg(n, irg);
1926         if (res && get_irg_dom_state(irg) == dom_consistent &&
1927             get_irg_pinned(irg) == op_pin_state_pinned)
1928                 res = check_dominance_for_node(n);
1929         do_node_verification(old);
1930         *bad_string = firm_verify_failure_msg;
1931
1932         return res;
1933 }
1934
1935 typedef struct verify_bad_env_t {
1936         int flags;
1937         int res;
1938 } verify_bad_env_t;
1939
1940 /**
1941  * Pre-Walker: check Bad predecessors of node.
1942  */
1943 static void check_bads(ir_node *node, void *env)
1944 {
1945         verify_bad_env_t *venv = (verify_bad_env_t*)env;
1946         int i, arity = get_irn_arity(node);
1947         ir_graph *irg = get_irn_irg(node);
1948
1949         if (is_Block(node)) {
1950                 if ((venv->flags & BAD_CF) == 0) {
1951
1952                         /* check for Bad Block predecessor */
1953                         for (i = 0; i < arity; ++i) {
1954                                 ir_node *pred = get_irn_n(node, i);
1955
1956                                 if (is_Bad(pred)) {
1957                                         venv->res |= BAD_CF;
1958
1959                                         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
1960                                                 fprintf(stderr, "irg_verify_bads: Block %ld has Bad predecessor\n", get_irn_node_nr(node));
1961                                         }
1962                                         if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
1963                                                 dump_ir_graph(irg, "-assert");
1964                                                 assert(0 && "Bad CF detected");
1965                                         }
1966                                 }
1967                         }
1968                 }
1969         } else {
1970                 if ((venv->flags & BAD_BLOCK) == 0) {
1971
1972                         /* check for Bad Block */
1973                         if (is_Bad(get_nodes_block(node))) {
1974                                 venv->res |= BAD_BLOCK;
1975
1976                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
1977                                         fprintf(stderr, "irg_verify_bads: node %ld has Bad Block\n", get_irn_node_nr(node));
1978                                 }
1979                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
1980                                         dump_ir_graph(irg, "-assert");
1981                                         assert(0 && "Bad CF detected");
1982                                 }
1983                         }
1984                 }
1985
1986                 if ((venv->flags & TUPLE) == 0) {
1987                         if (is_Tuple(node)) {
1988                                 venv->res |= TUPLE;
1989
1990                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
1991                                         fprintf(stderr, "irg_verify_bads: node %ld is a Tuple\n", get_irn_node_nr(node));
1992                                 }
1993                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
1994                                         dump_ir_graph(irg, "-assert");
1995                                         assert(0 && "Tuple detected");
1996                                 }
1997                         }
1998                 }
1999
2000                 for (i = 0; i < arity; ++i) {
2001                         ir_node *pred = get_irn_n(node, i);
2002
2003                         if (is_Bad(pred)) {
2004                                 /* check for Phi with Bad inputs */
2005                                 if (is_Phi(node) && !is_Bad(get_nodes_block(node)) && is_Bad(get_irn_n(get_nodes_block(node), i))) {
2006                                         if (venv->flags & BAD_CF)
2007                                                 continue;
2008                                         else {
2009                                                 venv->res |= BAD_CF;
2010
2011                                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2012                                                         fprintf(stderr, "irg_verify_bads: Phi %ld has Bad Input\n", get_irn_node_nr(node));
2013                                                 }
2014                                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2015                                                         dump_ir_graph(irg, "-assert");
2016                                                         assert(0 && "Bad CF detected");
2017                                                 }
2018                                         }
2019                                 }
2020
2021                                 /* Bad node input */
2022                                 if ((venv->flags & BAD_DF) == 0) {
2023                                         venv->res |= BAD_DF;
2024
2025                                         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2026                                                 fprintf(stderr, "irg_verify_bads: node %ld has Bad Input\n", get_irn_node_nr(node));
2027                                         }
2028                                         if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2029                                                 dump_ir_graph(irg, "-assert");
2030                                                 assert(0 && "Bad NON-CF detected");
2031                                         }
2032                                 }
2033                         }
2034                 }
2035         }
2036 }
2037
2038 /*
2039  * verify occurrence of bad nodes
2040  */
2041 int irg_verify_bads(ir_graph *irg, int flags)
2042 {
2043         verify_bad_env_t env;
2044
2045         env.flags = flags;
2046         env.res   = 0;
2047
2048         irg_walk_graph(irg, check_bads, NULL, &env);
2049
2050         return env.res;
2051 }
2052
2053 /*
2054  * set the default verify operation
2055  */
2056 void firm_set_default_verifier(unsigned code, ir_op_ops *ops)
2057 {
2058 #define CASE(a)                           \
2059    case iro_##a:                          \
2060      ops->verify_node  = verify_node_##a; \
2061      break
2062
2063         switch (code) {
2064         CASE(Proj);
2065         CASE(Block);
2066         CASE(Start);
2067         CASE(Jmp);
2068         CASE(IJmp);
2069         CASE(Cond);
2070         CASE(Return);
2071         CASE(Raise);
2072         CASE(Const);
2073         CASE(SymConst);
2074         CASE(Sel);
2075         CASE(InstOf);
2076         CASE(Call);
2077         CASE(Add);
2078         CASE(Sub);
2079         CASE(Minus);
2080         CASE(Mul);
2081         CASE(Mulh);
2082         CASE(Div);
2083         CASE(Mod);
2084         CASE(And);
2085         CASE(Or);
2086         CASE(Eor);
2087         CASE(Not);
2088         CASE(Cmp);
2089         CASE(Shl);
2090         CASE(Shr);
2091         CASE(Shrs);
2092         CASE(Rotl);
2093         CASE(Conv);
2094         CASE(Cast);
2095         CASE(Phi);
2096         CASE(Load);
2097         CASE(Store);
2098         CASE(Alloc);
2099         CASE(Free);
2100         CASE(Sync);
2101         CASE(Confirm);
2102         CASE(Mux);
2103         CASE(CopyB);
2104         CASE(Bound);
2105         default:
2106                 /* leave NULL */;
2107         }
2108 #undef CASE
2109
2110 #define CASE(a)                          \
2111    case iro_##a:                         \
2112      ops->verify_proj_node  = verify_node_Proj_##a; \
2113      break
2114
2115         switch (code) {
2116         CASE(Start);
2117         CASE(Cond);
2118         CASE(Raise);
2119         CASE(InstOf);
2120         CASE(Call);
2121         CASE(Div);
2122         CASE(Mod);
2123         CASE(Load);
2124         CASE(Store);
2125         CASE(Alloc);
2126         CASE(Proj);
2127         CASE(Tuple);
2128         CASE(CopyB);
2129         CASE(Bound);
2130         default:
2131                 /* leave NULL */;
2132         }
2133 #undef CASE
2134 }