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