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