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