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