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