- reenabled callgraph
[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_irn_n(n, -1);
854
855         if (mb != n) {
856                 /* must be a partBlock */
857                 ASSERT_AND_RET(mb != NULL && (is_Block(mb) || is_Bad(mb)), "wrong MacroBlock header", 0);
858                 ASSERT_AND_RET(get_Block_n_cfgpreds(n) == 1, "partBlock with more than one predecessor", 0);
859         }
860         for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
861                 ir_node *pred =  get_Block_cfgpred(n, i);
862                 ASSERT_AND_RET(
863                         (
864                                 is_Bad(pred)     ||
865                                 is_Unknown(pred) ||
866                                 (get_irn_mode(pred) == mode_X)
867                         ),
868                         "Block node", 0);
869         }
870
871         if (n == get_irg_end_block(irg) && get_irg_phase_state(irg) != phase_backend)
872                 /*  End block may only have Return, Raise or fragile ops as preds. */
873                 for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
874                         ir_node *pred =  skip_Proj(get_Block_cfgpred(n, i));
875                         if (is_Proj(pred) || is_Tuple(pred))
876                                 break;   /*  We can not test properly.  How many tuples are there? */
877                         ASSERT_AND_RET(
878                                 (
879                                         is_Return(pred) ||
880                                         is_Bad(pred)    ||
881                                         is_Raise(pred)  ||
882                                         is_fragile_op(pred)
883                                 ),
884                                 "End Block node", 0);
885                 }
886                 /*  irg attr must == graph we are in. */
887                 if (! get_interprocedural_view()) {
888                         ASSERT_AND_RET(((get_irn_irg(n) && get_irn_irg(n) == irg)), "Block node has wrong irg attribute", 0);
889                 }
890                 return 1;
891 }
892
893 /**
894  * verify a Start node
895  */
896 static int verify_node_Start(ir_node *n, ir_graph *irg) {
897         ir_mode *mymode = get_irn_mode(n);
898         (void) irg;
899
900         ASSERT_AND_RET(
901                 /* Start: BB --> X x M x ref x data1 x ... x datan x ref */
902                 mymode == mode_T, "Start node", 0
903                 );
904         return 1;
905 }
906
907 /**
908  * verify a Jmp node
909  */
910 static int verify_node_Jmp(ir_node *n, ir_graph *irg) {
911         ir_mode *mymode = get_irn_mode(n);
912         (void) irg;
913
914         ASSERT_AND_RET(
915                 /* Jmp: BB --> X */
916                 mymode == mode_X, "Jmp node", 0
917         );
918         return 1;
919 }
920
921 /**
922  * verify an IJmp node
923  */
924 static int verify_node_IJmp(ir_node *n, ir_graph *irg) {
925         ir_mode *mymode  = get_irn_mode(n);
926         ir_mode *op1mode = get_irn_mode(get_IJmp_target(n));
927         (void) irg;
928
929         ASSERT_AND_RET(
930                 /* IJmp: BB x ref --> X */
931                 mymode == mode_X && mode_is_reference(op1mode), "IJmp node", 0
932         );
933         return 1;
934 }
935
936 /**
937  * verify a Break node
938  */
939 static int verify_node_Break(ir_node *n, ir_graph *irg) {
940         ir_mode *mymode = get_irn_mode(n);
941         (void) irg;
942
943 #ifdef INTERPROCEDURAL_VIEW
944         ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
945                 "Break may only appear if ip view is constructed.", 0);
946 #endif
947         ASSERT_AND_RET(
948                 /* Jmp: BB --> X */
949                 mymode == mode_X, "Break node", 0
950         );
951         return 1;
952 }
953
954 /**
955  * verify a Cond node
956  */
957 static int verify_node_Cond(ir_node *n, ir_graph *irg) {
958         ir_mode *mymode  = get_irn_mode(n);
959         ir_mode *op1mode = get_irn_mode(get_Cond_selector(n));
960         (void) irg;
961
962         ASSERT_AND_RET(
963                 /* Cond: BB x b --> X x X */
964                 (op1mode == mode_b ||
965                 /* Cond: BB x int --> X^n */
966                 mode_is_int(op1mode) ),  "Cond node", 0
967                 );
968         ASSERT_AND_RET(mymode == mode_T, "Cond mode is not a tuple", 0);
969
970         return 1;
971 }
972
973 /**
974  * verify a Return node
975  */
976 static int verify_node_Return(ir_node *n, ir_graph *irg) {
977         int i;
978         ir_mode *mymode   = get_irn_mode(n);
979         ir_mode *mem_mode = get_irn_mode(get_Return_mem(n));
980         ir_type *mt;
981
982         /* Return: BB x M x data1 x ... x datan --> X */
983
984         ASSERT_AND_RET( mem_mode == mode_M, "Return node", 0 );  /* operand M */
985
986         for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
987                 ASSERT_AND_RET( mode_is_datab(get_irn_mode(get_Return_res(n, i))), "Return node", 0 );  /* operand datai */
988         }
989         ASSERT_AND_RET( mymode == mode_X, "Result X", 0 );   /* result X */
990         /* Compare returned results with result types of method type */
991         mt = get_entity_type(get_irg_entity(irg));
992         ASSERT_AND_RET_DBG( get_Return_n_ress(n) == get_method_n_ress(mt),
993                 "Number of results for Return doesn't match number of results in type.", 0,
994                 show_return_nres(irg, n, mt););
995         for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
996                 ir_type *res_type = get_method_res_type(mt, i);
997
998                 if (get_irg_phase_state(irg) != phase_backend) {
999                         if (is_atomic_type(res_type)) {
1000                                 ASSERT_AND_RET_DBG(
1001                                         get_irn_mode(get_Return_res(n, i)) == get_type_mode(res_type),
1002                                         "Mode of result for Return doesn't match mode of result type.", 0,
1003                                         show_return_modes(irg, n, mt, i);
1004                                 );
1005                         } else {
1006                                 ASSERT_AND_RET_DBG(
1007                                         mode_is_reference(get_irn_mode(get_Return_res(n, i))),
1008                                         "Mode of result for Return doesn't match mode of result type.", 0,
1009                                         show_return_modes(irg, n, mt, i);
1010                                 );
1011                         }
1012                 }
1013         }
1014         return 1;
1015 }
1016
1017 /**
1018  * verify a Raise node
1019  */
1020 static int verify_node_Raise(ir_node *n, ir_graph *irg) {
1021         ir_mode *mymode  = get_irn_mode(n);
1022         ir_mode *op1mode = get_irn_mode(get_Raise_mem(n));
1023         ir_mode *op2mode = get_irn_mode(get_Raise_exo_ptr(n));
1024         (void) irg;
1025
1026         ASSERT_AND_RET(
1027                 /* Sel: BB x M x ref --> X x M */
1028                 op1mode == mode_M && mode_is_reference(op2mode) &&
1029                 mymode == mode_T, "Raise node", 0
1030         );
1031         return 1;
1032 }
1033
1034 /**
1035  * verify a Const node
1036  */
1037 static int verify_node_Const(ir_node *n, ir_graph *irg) {
1038         ir_mode *mymode = get_irn_mode(n);
1039         (void) irg;
1040
1041         ASSERT_AND_RET(
1042                 /* Const: BB --> data */
1043                 (mode_is_data(mymode) ||
1044                 mymode == mode_b)      /* we want boolean constants for static evaluation */
1045                 ,"Const node", 0       /* of Cmp. */
1046         );
1047         ASSERT_AND_RET(
1048                 /* the modes of the constant and teh tarval must match */
1049                 mymode == get_tarval_mode(get_Const_tarval(n)),
1050                 "Const node, tarval and node mode mismatch", 0
1051         );
1052         return 1;
1053 }
1054
1055 /**
1056  * verify a SymConst node
1057  */
1058 static int verify_node_SymConst(ir_node *n, ir_graph *irg) {
1059         ir_mode *mymode = get_irn_mode(n);
1060         (void) irg;
1061
1062         if (get_SymConst_kind(n) == symconst_addr_ent) {
1063                 ir_entity *ent = get_SymConst_entity(n);
1064                 if (is_Method_type(get_entity_type(ent)) &&
1065                         get_irn_irg(n) != get_const_code_irg()) {
1066 #if 1
1067                         ASSERT_AND_RET((get_entity_peculiarity(ent) != peculiarity_description),
1068                                 "A constant must address an existing method.", 0);
1069 #endif
1070                 }
1071         }
1072         ASSERT_AND_RET(
1073                 /* SymConst: BB --> int*/
1074                 (mode_is_int(mymode) ||
1075                 /* SymConst: BB --> ref */
1076                 mode_is_reference(mymode))
1077                 ,"SymConst node", 0);
1078         return 1;
1079 }
1080
1081 /**
1082  * verify a Sel node
1083  */
1084 static int verify_node_Sel(ir_node *n, ir_graph *irg) {
1085         int i;
1086         ir_mode *mymode  = get_irn_mode(n);
1087         ir_mode *op1mode = get_irn_mode(get_Sel_mem(n));
1088         ir_mode *op2mode = get_irn_mode(get_Sel_ptr(n));
1089         ir_entity *ent;
1090         (void) irg;
1091
1092         ASSERT_AND_RET_DBG(
1093                 /* Sel: BB x M x ref x int^n --> ref */
1094                 (op1mode == mode_M && op2mode == mymode && mode_is_reference(mymode)),
1095                 "Sel node", 0, show_node_failure(n)
1096         );
1097
1098         for (i = get_Sel_n_indexs(n) - 1; i >= 0; --i) {
1099                 ASSERT_AND_RET_DBG(mode_is_int(get_irn_mode(get_Sel_index(n, i))), "Sel node", 0, show_node_failure(n));
1100         }
1101         ent = get_Sel_entity(n);
1102         ASSERT_AND_RET_DBG(ent, "Sel node with empty entity", 0, show_node_failure(n));
1103         return 1;
1104 }
1105
1106 /**
1107  * verify an InstOf node
1108  */
1109 static int verify_node_InstOf(ir_node *n, ir_graph *irg) {
1110         ir_mode *mymode  = get_irn_mode(n);
1111         ir_mode *op1mode = get_irn_mode(get_InstOf_obj(n));
1112         (void) irg;
1113
1114         ASSERT_AND_RET(mode_T == mymode, "mode of Instof is not a tuple", 0);
1115         ASSERT_AND_RET(mode_is_data(op1mode), "Instof not on data", 0);
1116         return 1;
1117 }
1118
1119 /**
1120  * Check if the pinned state is right.
1121  */
1122 static int verify_right_pinned(ir_node *n) {
1123         ir_node *mem;
1124
1125         if (get_irn_pinned(n) == op_pin_state_pinned)
1126                 return 1;
1127         mem = get_Call_mem(n);
1128
1129         /* if it's not pinned, its memory predecessor must be NoMem or Pin */
1130         if (is_NoMem(mem) || is_Pin(mem))
1131                 return 1;
1132         return 0;
1133 }
1134
1135 /**
1136  * verify a Call node
1137  */
1138 static int verify_node_Call(ir_node *n, ir_graph *irg) {
1139         ir_mode *mymode  = get_irn_mode(n);
1140         ir_mode *op1mode = get_irn_mode(get_Call_mem(n));
1141         ir_mode *op2mode = get_irn_mode(get_Call_ptr(n));
1142         ir_type *mt;
1143         int i;
1144         (void) irg;
1145
1146         /* Call: BB x M x ref x data1 x ... x datan
1147         --> M x datan+1 x ... x data n+m */
1148         ASSERT_AND_RET( op1mode == mode_M && mode_is_reference(op2mode), "Call node", 0 );  /* operand M x ref */
1149
1150         /* NoMem nodes are only allowed as memory input if the Call is NOT pinned */
1151         ASSERT_AND_RET(verify_right_pinned(n),"Call node with wrong memory input", 0 );
1152
1153         mt = get_Call_type(n);
1154         if(get_unknown_type() == mt) {
1155                 return 1;
1156         }
1157
1158         for (i = get_Call_n_params(n) - 1; i >= 0; --i) {
1159                 ASSERT_AND_RET( mode_is_datab(get_irn_mode(get_Call_param(n, i))), "Call node", 0 );  /* operand datai */
1160         }
1161
1162         ASSERT_AND_RET( mymode == mode_T, "Call result not a tuple", 0 );   /* result T */
1163         /* Compare arguments of node with those of type */
1164
1165         if (get_method_variadicity(mt) == variadicity_variadic) {
1166                 ASSERT_AND_RET_DBG(
1167                         get_Call_n_params(n) >= get_method_n_params(mt),
1168                         "Number of args for Call doesn't match number of args in variadic type.",
1169                         0,
1170                         fprintf(stderr, "Call has %d params, method %s type %d\n",
1171                         get_Call_n_params(n), get_type_name(mt), get_method_n_params(mt));
1172                 );
1173         } else {
1174                 ASSERT_AND_RET(
1175                         get_Call_n_params(n) == get_method_n_params(mt),
1176                         "Number of args for Call doesn't match number of args in non variadic type.",
1177                         0);
1178         }
1179
1180         for (i = 0; i < get_method_n_params(mt); i++) {
1181                 ir_type *t = get_method_param_type(mt, i);
1182
1183                 if (get_irg_phase_state(irg) != phase_backend) {
1184                         if (is_atomic_type(t)) {
1185                                 ASSERT_AND_RET_DBG(
1186                                         get_irn_mode(get_Call_param(n, i)) == get_type_mode(t),
1187                                         "Mode of arg for Call doesn't match mode of arg type.", 0,
1188                                         show_call_param(n, mt);
1189                                 );
1190                         } else {
1191                                 /* call with a compound type, mode must be reference */
1192                                 ASSERT_AND_RET_DBG(
1193                                         mode_is_reference(get_irn_mode(get_Call_param(n, i))),
1194                                         "Mode of arg for Call doesn't match mode of arg type.", 0,
1195                                         show_call_param(n, mt);
1196                                 );
1197                         }
1198                 }
1199         }
1200
1201 #if 0
1202         if (Call_has_callees(n)) {
1203                 for (i = 0; i < get_Call_n_callees(n); i++) {
1204                         ASSERT_AND_RET(is_entity(get_Call_callee(n, i)), "callee array must contain entities.", 0);
1205                 }
1206         }
1207 #endif
1208         return 1;
1209 }
1210
1211 /**
1212  * verify an Add node
1213  */
1214 static int verify_node_Add(ir_node *n, ir_graph *irg) {
1215         ir_mode *mymode  = get_irn_mode(n);
1216         ir_mode *op1mode = get_irn_mode(get_Add_left(n));
1217         ir_mode *op2mode = get_irn_mode(get_Add_right(n));
1218         (void) irg;
1219
1220         ASSERT_AND_RET_DBG(
1221                 (
1222                         /* common Add: BB x numP x numP --> numP */
1223                         (op1mode == mymode && op2mode == op1mode && mode_is_data(mymode)) ||
1224                         /* Pointer Add: BB x ref x int --> ref */
1225                         (mode_is_reference(op1mode) && mode_is_int(op2mode) && op1mode == mymode) ||
1226                         /* Pointer Add: BB x int x ref --> ref */
1227                         (mode_is_int(op1mode) && op2mode == mymode && mode_is_reference(mymode))
1228                 ),
1229                 "Add node", 0,
1230                 show_binop_failure(n, "/* common Add: BB x numP x numP --> numP */ |\n"
1231                         "/* Pointer Add: BB x ref x int --> ref */   |\n"
1232                         "/* Pointer Add: BB x int x ref --> ref */");
1233         );
1234         return 1;
1235 }
1236
1237 /**
1238  * verify a Sub node
1239  */
1240 static int verify_node_Sub(ir_node *n, ir_graph *irg) {
1241         ir_mode *mymode  = get_irn_mode(n);
1242         ir_mode *op1mode = get_irn_mode(get_Sub_left(n));
1243         ir_mode *op2mode = get_irn_mode(get_Sub_right(n));
1244         (void) irg;
1245
1246         ASSERT_AND_RET_DBG(
1247                 (
1248                         /* common Sub: BB x numP x numP --> numP */
1249                         (mymode ==op1mode && mymode == op2mode && mode_is_data(op1mode)) ||
1250                         /* Pointer Sub: BB x ref x int --> ref */
1251                         (op1mode == mymode && mode_is_int(op2mode) && mode_is_reference(mymode)) ||
1252                         /* Pointer Sub: BB x int x ref --> ref */
1253                         (mode_is_int(op1mode) && op2mode == mymode && mode_is_reference(mymode)) ||
1254                         /* Pointer Sub: BB x ref x ref --> int */
1255                         (op1mode == op2mode && mode_is_reference(op2mode) && mode_is_int(mymode))
1256                 ),
1257                 "Sub node", 0,
1258                 show_binop_failure(n, "/* common Sub: BB x numP x numP --> numP */ |\n"
1259                         "/* Pointer Sub: BB x ref x int --> ref */   |\n"
1260                         "/* Pointer Sub: BB x int x ref --> ref */   |\n"
1261                         "/* Pointer Sub: BB x ref x ref --> int */" );
1262                 );
1263         return 1;
1264 }
1265
1266 /**
1267  * verify a Minus node
1268  */
1269 static int verify_node_Minus(ir_node *n, ir_graph *irg) {
1270         ir_mode *mymode  = get_irn_mode(n);
1271         ir_mode *op1mode = get_irn_mode(get_Minus_op(n));
1272         (void) irg;
1273
1274         ASSERT_AND_RET_DBG(
1275                 /* Minus: BB x num --> num */
1276                 op1mode == mymode && mode_is_num(op1mode), "Minus node", 0,
1277                 show_unop_failure(n , "/* Minus: BB x num --> num */");
1278         );
1279         return 1;
1280 }
1281
1282 /**
1283  * verify a Mul node
1284  */
1285 static int verify_node_Mul(ir_node *n, ir_graph *irg) {
1286         ir_mode *mymode  = get_irn_mode(n);
1287         ir_mode *op1mode = get_irn_mode(get_Mul_left(n));
1288         ir_mode *op2mode = get_irn_mode(get_Mul_right(n));
1289         (void) irg;
1290
1291         ASSERT_AND_RET_DBG(
1292                 (
1293                         /* Mul: BB x int_n x int_n --> int_n|int_2n */
1294                         (mode_is_int(op1mode)   && op2mode == op1mode && mode_is_int(mymode) &&
1295                          (op1mode == mymode || get_mode_size_bits(op1mode) * 2 == get_mode_size_bits(mymode))) ||
1296                         /* Mul: BB x float x float --> float */
1297                         (mode_is_float(op1mode) && op2mode == op1mode && mymode == op1mode)
1298                 ),
1299                 "Mul node",0,
1300                 show_binop_failure(n, "/* Mul: BB x int_n x int_n --> int_n|int_2n */ |\n"
1301                 "/* Mul: BB x float x float --> float */");
1302         );
1303         return 1;
1304 }
1305
1306 /**
1307  * verify a Mulh node
1308  */
1309 static int verify_node_Mulh(ir_node *n, ir_graph *irg) {
1310         ir_mode *mymode  = get_irn_mode(n);
1311         ir_mode *op1mode = get_irn_mode(get_Mulh_left(n));
1312         ir_mode *op2mode = get_irn_mode(get_Mulh_right(n));
1313         (void) irg;
1314
1315         ASSERT_AND_RET_DBG(
1316                 (
1317                         /* Mulh: BB x int x int --> int */
1318                         (mode_is_int(op1mode) && op2mode == op1mode && op1mode == mymode)
1319                 ),
1320                 "Mulh node",0,
1321                 show_binop_failure(n, "/* Mulh: BB x int x int --> int */");
1322         );
1323         return 1;
1324 }
1325
1326 /**
1327  * verify a Quot node
1328  */
1329 static int verify_node_Quot(ir_node *n, ir_graph *irg) {
1330         ir_mode *mymode  = get_irn_mode(n);
1331         ir_mode *op1mode = get_irn_mode(get_Quot_mem(n));
1332         ir_mode *op2mode = get_irn_mode(get_Quot_left(n));
1333         ir_mode *op3mode = get_irn_mode(get_Quot_right(n));
1334         (void) irg;
1335
1336         ASSERT_AND_RET_DBG(
1337                 /* Quot: BB x M x float x float --> M x X x float */
1338                 op1mode == mode_M && op2mode == op3mode &&
1339                 get_mode_sort(op2mode) == irms_float_number &&
1340                 mymode == mode_T,
1341                 "Quot node",0,
1342                 show_binop_failure(n, "/* Quot: BB x M x float x float --> M x X x float */");
1343         );
1344         return 1;
1345 }
1346
1347 /**
1348  * verify a DivMod node
1349  */
1350 static int verify_node_DivMod(ir_node *n, ir_graph *irg) {
1351         ir_mode *mymode  = get_irn_mode(n);
1352         ir_mode *op1mode = get_irn_mode(get_DivMod_mem(n));
1353         ir_mode *op2mode = get_irn_mode(get_DivMod_left(n));
1354         ir_mode *op3mode = get_irn_mode(get_DivMod_right(n));
1355         (void) irg;
1356
1357         ASSERT_AND_RET(
1358                 /* DivMod: BB x M x int x int --> M x X x int x int */
1359                 op1mode == mode_M &&
1360                 mode_is_int(op2mode) &&
1361                 op3mode == op2mode &&
1362                 mymode == mode_T,
1363                 "DivMod node", 0
1364                 );
1365         return 1;
1366 }
1367
1368 /**
1369  * verify a Div node
1370  */
1371 static int verify_node_Div(ir_node *n, ir_graph *irg) {
1372         ir_mode *mymode  = get_irn_mode(n);
1373         ir_mode *op1mode = get_irn_mode(get_Div_mem(n));
1374         ir_mode *op2mode = get_irn_mode(get_Div_left(n));
1375         ir_mode *op3mode = get_irn_mode(get_Div_right(n));
1376         (void) irg;
1377
1378         ASSERT_AND_RET(
1379                 /* Div: BB x M x int x int --> M x X x int */
1380                 op1mode == mode_M &&
1381                 op2mode == op3mode &&
1382                 mode_is_int(op2mode) &&
1383                 mymode == mode_T,
1384                 "Div node", 0
1385                 );
1386         return 1;
1387 }
1388
1389 /**
1390  * verify a Mod node
1391  */
1392 static int verify_node_Mod(ir_node *n, ir_graph *irg) {
1393         ir_mode *mymode  = get_irn_mode(n);
1394         ir_mode *op1mode = get_irn_mode(get_Mod_mem(n));
1395         ir_mode *op2mode = get_irn_mode(get_Mod_left(n));
1396         ir_mode *op3mode = get_irn_mode(get_Mod_right(n));
1397         (void) irg;
1398
1399         ASSERT_AND_RET(
1400                 /* Mod: BB x M x int x int --> M x X x int */
1401                 op1mode == mode_M &&
1402                 op2mode == op3mode &&
1403                 mode_is_int(op2mode) &&
1404                 mymode == mode_T,
1405                 "Mod node", 0
1406                 );
1407         return 1;
1408 }
1409
1410 /**
1411  * verify an Abs node
1412  */
1413 static int verify_node_Abs(ir_node *n, ir_graph *irg) {
1414         ir_mode *mymode  = get_irn_mode(n);
1415         ir_mode *op1mode = get_irn_mode(get_Abs_op(n));
1416         (void) irg;
1417
1418         ASSERT_AND_RET_DBG(
1419                 /* Abs: BB x num --> num */
1420                 op1mode == mymode &&
1421                 mode_is_num (op1mode),
1422                 "Abs node", 0,
1423                 show_unop_failure(n, "/* Abs: BB x num --> num */");
1424         );
1425         return 1;
1426 }
1427
1428 /**
1429  * verify a logical And, Or, Eor node
1430  */
1431 static int verify_node_Logic(ir_node *n, ir_graph *irg) {
1432         ir_mode *mymode  = get_irn_mode(n);
1433         ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1434         ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1435         (void) irg;
1436
1437         ASSERT_AND_RET_DBG(
1438                 /* And or Or or Eor: BB x int x int --> int */
1439                 (mode_is_int(mymode) || mymode == mode_b) &&
1440                 op2mode == op1mode &&
1441                 mymode == op2mode,
1442                 "And, Or or Eor node", 0,
1443                 show_binop_failure(n, "/* And or Or or Eor: BB x int x int --> int */");
1444         );
1445         return 1;
1446 }
1447
1448 #define verify_node_And   verify_node_Logic
1449 #define verify_node_Or    verify_node_Logic
1450 #define verify_node_Eor   verify_node_Logic
1451
1452 /**
1453  * verify a Not node
1454  */
1455 static int verify_node_Not(ir_node *n, ir_graph *irg) {
1456         ir_mode *mymode  = get_irn_mode(n);
1457         ir_mode *op1mode = get_irn_mode(get_Not_op(n));
1458         (void) irg;
1459
1460         ASSERT_AND_RET_DBG(
1461                 /* Not: BB x int --> int */
1462                 (mode_is_int(mymode) || mymode == mode_b) &&
1463                 mymode == op1mode,
1464                 "Not node", 0,
1465                 show_unop_failure(n, "/* Not: BB x int --> int */");
1466         );
1467         return 1;
1468 }
1469
1470 /**
1471  * verify a Cmp node
1472  */
1473 static int verify_node_Cmp(ir_node *n, ir_graph *irg) {
1474         ir_mode *mymode  = get_irn_mode(n);
1475         ir_mode *op1mode = get_irn_mode(get_Cmp_left(n));
1476         ir_mode *op2mode = get_irn_mode(get_Cmp_right(n));
1477         (void) irg;
1478
1479         ASSERT_AND_RET_DBG(
1480                 /* Cmp: BB x datab x datab --> b16 */
1481                 mode_is_datab(op1mode) &&
1482                 op2mode == op1mode &&
1483                 mymode == mode_T,
1484                 "Cmp node", 0,
1485                 show_binop_failure(n, "/* Cmp: BB x datab x datab --> b16 */");
1486         );
1487         return 1;
1488 }
1489
1490 /**
1491  * verify a Shift node
1492  */
1493 static int verify_node_Shift(ir_node *n, ir_graph *irg) {
1494         ir_mode *mymode  = get_irn_mode(n);
1495         ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1496         ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1497         (void) irg;
1498
1499         ASSERT_AND_RET_DBG(
1500                 /* Shl, Shr or Shrs: BB x int x int_u --> int */
1501                 mode_is_int(op1mode) &&
1502                 mode_is_int(op2mode) &&
1503                 !mode_is_signed(op2mode) &&
1504                 mymode == op1mode,
1505                 "Shl, Shr or Shrs node", 0,
1506                 show_binop_failure(n, "/* Shl, Shr or Shrs: BB x int x int_u --> int */");
1507         );
1508         return 1;
1509 }
1510
1511 #define verify_node_Shl   verify_node_Shift
1512 #define verify_node_Shr   verify_node_Shift
1513 #define verify_node_Shrs  verify_node_Shift
1514
1515 /**
1516  * verify a Rot node
1517  */
1518 static int verify_node_Rot(ir_node *n, ir_graph *irg) {
1519         ir_mode *mymode  = get_irn_mode(n);
1520         ir_mode *op1mode = get_irn_mode(get_Rot_left(n));
1521         ir_mode *op2mode = get_irn_mode(get_Rot_right(n));
1522         (void) irg;
1523
1524         ASSERT_AND_RET_DBG(
1525                 /* Rot: BB x int x int --> int */
1526                 mode_is_int(op1mode) &&
1527                 mode_is_int(op2mode) &&
1528                 mymode == op1mode,
1529                 "Rot node", 0,
1530                 show_binop_failure(n, "/* Rot: BB x int x int --> int */");
1531         );
1532         return 1;
1533 }
1534
1535 /**
1536  * verify a Conv node
1537  */
1538 static int verify_node_Conv(ir_node *n, ir_graph *irg) {
1539         ir_mode *mymode  = get_irn_mode(n);
1540         ir_mode *op1mode = get_irn_mode(get_Conv_op(n));
1541         (void) irg;
1542
1543         ASSERT_AND_RET_DBG(
1544                 get_irg_phase_state(irg) == phase_backend ||
1545                 (mode_is_datab(op1mode) && mode_is_data(mymode)),
1546                 "Conv node", 0,
1547                 show_unop_failure(n, "/* Conv: BB x datab --> data */");
1548         );
1549         return 1;
1550 }
1551
1552 /**
1553  * verify a Cast node
1554  */
1555 static int verify_node_Cast(ir_node *n, ir_graph *irg) {
1556         ir_mode *mymode  = get_irn_mode(n);
1557         ir_mode *op1mode = get_irn_mode(get_Cast_op(n));
1558         (void) irg;
1559
1560         ASSERT_AND_RET_DBG(
1561                 /* Conv: BB x datab1 --> datab2 */
1562                 mode_is_data(op1mode) && op1mode == mymode,
1563                 "Cast node", 0,
1564                 show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
1565         );
1566         return 1;
1567 }
1568
1569 /**
1570  * verify a Phi node
1571  */
1572 static int verify_node_Phi(ir_node *n, ir_graph *irg) {
1573         ir_mode *mymode = get_irn_mode(n);
1574         ir_node *block  = get_nodes_block(n);
1575         int i;
1576         (void) irg;
1577
1578         if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building && get_irn_arity(n) > 0) {
1579                 /* a Phi node MUST have the same number of inputs as its block */
1580                 ASSERT_AND_RET_DBG(
1581                         get_irn_arity(n) == get_irn_arity(block),
1582                         "wrong number of inputs in Phi node", 0,
1583                         show_phi_inputs(n, block);
1584                 );
1585         }
1586
1587         /* Phi: BB x dataM^n --> dataM */
1588         for (i = get_irn_arity(n) - 1; i >= 0; --i) {
1589                 ir_node *pred = get_irn_n(n, i);
1590                 if (!is_Bad(pred) && (get_irn_op(pred) != op_Unknown)) {
1591                         ASSERT_AND_RET_DBG(
1592                                 get_irn_mode(pred) == mymode,
1593                                 "Phi node", 0,
1594                                 show_phi_failure(n, pred, i);
1595                         );
1596                 }
1597         }
1598         ASSERT_AND_RET(mode_is_dataM(mymode) || mymode == mode_b, "Phi node", 0 );
1599
1600         if (mymode == mode_M) {
1601                 for (i = get_Phi_n_preds(n) - 1; i >= 0; --i) {
1602                         int j;
1603                         ir_node *pred_i = get_Phi_pred(n, i);
1604
1605                         if (is_Bad(pred_i))
1606                                 continue;
1607                         for (j = i - 1; j >= 0; --j) {
1608                                 ir_node *pred_j = get_Phi_pred(n, j);
1609
1610                                 if (is_Bad(pred_j))
1611                                         continue;
1612 #if 0
1613                                 /* currently this checks fails for blocks with exception
1614                                    outputs (and these are NOT basic blocks).  So it is disabled yet. */
1615                                 ASSERT_AND_RET_DBG(
1616                                         (pred_i == pred_j) || (get_irn_n(pred_i, -1) != get_irn_n(pred_j, -1)),
1617                                         "At least two different PhiM predecessors are in the same block",
1618                                         0,
1619                                         ir_printf("%+F and %+F of %+F are in %+F\n", pred_i, pred_j, n, get_irn_n(pred_i, -1))
1620                                 );
1621 #endif
1622                         }
1623                 }
1624         }
1625         return 1;
1626 }
1627
1628 /**
1629  * verify a Filter node
1630  */
1631 static int verify_node_Filter(ir_node *n, ir_graph *irg) {
1632         (void) n;
1633         (void) irg;
1634 #ifdef INTERPROCEDURAL_VIEW
1635         ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
1636                 "Filter may only appear if ip view is constructed.", 0);
1637 #endif
1638         /* We should further do tests as for Proj and Phi. */
1639         return 1;
1640 }
1641
1642 /**
1643  * verify a Load node
1644  */
1645 static int verify_node_Load(ir_node *n, ir_graph *irg) {
1646         ir_mode *mymode  = get_irn_mode(n);
1647         ir_mode *op1mode = get_irn_mode(get_Load_mem(n));
1648         ir_mode *op2mode = get_irn_mode(get_Load_ptr(n));
1649
1650         ASSERT_AND_RET(op1mode == mode_M, "Load node", 0);
1651         if (get_irg_phase_state(irg) != phase_backend) {
1652                 ASSERT_AND_RET(mode_is_reference(op2mode), "Load node", 0 );
1653         } else {
1654                 ASSERT_AND_RET(mode_is_reference(op2mode) ||
1655                         (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "Load node", 0 );
1656         }
1657         ASSERT_AND_RET( mymode == mode_T, "Load node", 0 );
1658
1659         /*
1660          * jack's gen_add_firm_code:simpleSel seems to build Load (Load
1661          * (Proj (Proj))) sometimes ...
1662
1663          * interprete.c:ai_eval seems to assume that this happens, too
1664
1665          * obset.c:get_abstval_any can't deal with this if the load has
1666          * mode_T
1667          *
1668           {
1669           ir_entity *ent = hunt_for_entity (get_Load_ptr (n), n);
1670           assert ((NULL != ent) || (mymode != mode_T));
1671           }
1672          */
1673
1674         return 1;
1675 }
1676
1677 /**
1678  * verify a Store node
1679  */
1680 static int verify_node_Store(ir_node *n, ir_graph *irg) {
1681         ir_entity *target;
1682
1683         ir_mode *mymode  = get_irn_mode(n);
1684         ir_mode *op1mode = get_irn_mode(get_Store_mem(n));
1685         ir_mode *op2mode = get_irn_mode(get_Store_ptr(n));
1686         ir_mode *op3mode = get_irn_mode(get_Store_value(n));
1687
1688         ASSERT_AND_RET(op1mode == mode_M && mode_is_datab(op3mode), "Store node", 0 );
1689         if (get_irg_phase_state(irg) != phase_backend) {
1690                 ASSERT_AND_RET(mode_is_reference(op2mode), "Store node", 0 );
1691         } else {
1692                 ASSERT_AND_RET(mode_is_reference(op2mode) ||
1693                         (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "Store node", 0 );
1694         }
1695         ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
1696
1697         target = get_ptr_entity(get_Store_ptr(n));
1698         if (vrfy_entities && target && get_irg_phase_state(current_ir_graph) == phase_high) {
1699                 /*
1700                  * If lowered code, any Sels that add 0 may be removed, causing
1701                  * an direct access to entities of array or compound type.
1702                  * Prevent this by checking the phase.
1703                  */
1704                 ASSERT_AND_RET( op3mode == get_type_mode(get_entity_type(target)),
1705                         "Store node", 0);
1706         }
1707
1708         return 1;
1709 }
1710
1711 /**
1712  * verify an Alloc node
1713  */
1714 static int verify_node_Alloc(ir_node *n, ir_graph *irg) {
1715         ir_mode *mymode  = get_irn_mode(n);
1716         ir_mode *op1mode = get_irn_mode(get_Alloc_mem(n));
1717         ir_mode *op2mode = get_irn_mode(get_Alloc_size(n));
1718         (void) irg;
1719
1720         ASSERT_AND_RET_DBG(
1721                 /* Alloc: BB x M x int_u --> M x X x ref */
1722                 op1mode == mode_M &&
1723                 mode_is_int(op2mode) &&
1724                 !mode_is_signed(op2mode) &&
1725                 mymode == mode_T,
1726                 "Alloc node", 0,
1727                 show_binop_failure(n, "/* Alloc: BB x M x int_u --> M x X x ref */");
1728         );
1729         return 1;
1730 }
1731
1732 /**
1733  * verify a Free node
1734  */
1735 static int verify_node_Free(ir_node *n, ir_graph *irg) {
1736         ir_mode *mymode  = get_irn_mode(n);
1737         ir_mode *op1mode = get_irn_mode(get_Free_mem(n));
1738         ir_mode *op2mode = get_irn_mode(get_Free_ptr(n));
1739         ir_mode *op3mode = get_irn_mode(get_Free_size(n));
1740         (void) irg;
1741
1742         ASSERT_AND_RET_DBG(
1743                 /* Free: BB x M x ref x int_u --> M */
1744                 op1mode == mode_M && mode_is_reference(op2mode) &&
1745                 mode_is_int(op3mode) &&
1746                 !mode_is_signed(op3mode) &&
1747                 mymode == mode_M,
1748                 "Free node", 0,
1749                 show_triop_failure(n, "/* Free: BB x M x ref x int_u --> M */");
1750         );
1751         return 1;
1752 }
1753
1754 /**
1755  * verify a Sync node
1756  */
1757 static int verify_node_Sync(ir_node *n, ir_graph *irg) {
1758         int i;
1759         ir_mode *mymode  = get_irn_mode(n);
1760         (void) irg;
1761
1762         /* Sync: BB x M^n --> M */
1763         for (i = get_Sync_n_preds(n) - 1; i >= 0; --i) {
1764                 ASSERT_AND_RET( get_irn_mode(get_Sync_pred(n, i)) == mode_M, "Sync node", 0 );
1765         };
1766         ASSERT_AND_RET( mymode == mode_M, "Sync node", 0 );
1767         return 1;
1768 }
1769
1770 /**
1771  * verify a Confirm node
1772  */
1773 static int verify_node_Confirm(ir_node *n, ir_graph *irg) {
1774         ir_mode *mymode  = get_irn_mode(n);
1775         ir_mode *op1mode = get_irn_mode(get_Confirm_value(n));
1776         ir_mode *op2mode = get_irn_mode(get_Confirm_bound(n));
1777         (void) irg;
1778
1779         ASSERT_AND_RET_DBG(
1780                 /* Confirm: BB x T x T --> T */
1781                 op1mode == mymode &&
1782                 op2mode == mymode,
1783                 "Confirm node", 0,
1784                 show_binop_failure(n, "/* Confirm: BB x T x T --> T */");
1785         );
1786         return 1;
1787 }
1788
1789 /**
1790  * verify a Mux node
1791  */
1792 static int verify_node_Mux(ir_node *n, ir_graph *irg) {
1793         ir_mode *mymode  = get_irn_mode(n);
1794         ir_mode *op1mode = get_irn_mode(get_Mux_sel(n));
1795         ir_mode *op2mode = get_irn_mode(get_Mux_true(n));
1796         ir_mode *op3mode = get_irn_mode(get_Mux_false(n));
1797         (void) irg;
1798
1799         ASSERT_AND_RET(
1800                 /* Mux: BB x b x numP x numP --> numP */
1801                 op1mode == mode_b &&
1802                 op2mode == mymode &&
1803                 op3mode == mymode &&
1804                 mode_is_data(mymode),
1805                 "Mux node", 0
1806                 );
1807         return 1;
1808 }
1809
1810 /**
1811  * verify a CopyB node
1812  */
1813 static int verify_node_CopyB(ir_node *n, ir_graph *irg) {
1814         ir_mode *mymode  = get_irn_mode(n);
1815         ir_mode *op1mode = get_irn_mode(get_CopyB_mem(n));
1816         ir_mode *op2mode = get_irn_mode(get_CopyB_dst(n));
1817         ir_mode *op3mode = get_irn_mode(get_CopyB_src(n));
1818         ir_type *t = get_CopyB_type(n);
1819
1820         /* CopyB: BB x M x ref x ref --> M x X */
1821         ASSERT_AND_RET(mymode == mode_T && op1mode == mode_M, "CopyB node", 0);
1822         if (get_irg_phase_state(irg) != phase_backend) {
1823                 ASSERT_AND_RET(mode_is_reference(op2mode) && mode_is_reference(op3mode),
1824                         "CopyB node", 0 );
1825         } else {
1826                 ASSERT_AND_RET(mode_is_reference(op2mode) ||
1827                         (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "CopyB node", 0 );
1828                 ASSERT_AND_RET(mode_is_reference(op3mode) ||
1829                         (mode_is_int(op3mode) && get_mode_size_bits(op3mode) == get_mode_size_bits(mode_P)), "CopyB node", 0 );
1830         }
1831
1832         ASSERT_AND_RET(
1833                 is_compound_type(t),
1834                 "CopyB node should copy compound types only", 0 );
1835
1836         /* NoMem nodes are only allowed as memory input if the CopyB is NOT pinned.
1837            This should happen RARELY, as CopyB COPIES MEMORY */
1838         ASSERT_AND_RET(verify_right_pinned(n), "CopyB node with wrong memory input", 0 );
1839         return 1;
1840 }
1841
1842 /**
1843  * verify a Bound node
1844  */
1845 static int verify_node_Bound(ir_node *n, ir_graph *irg) {
1846         ir_mode *mymode  = get_irn_mode(n);
1847         ir_mode *op1mode = get_irn_mode(get_Bound_mem(n));
1848         ir_mode *op2mode = get_irn_mode(get_Bound_index(n));
1849         ir_mode *op3mode = get_irn_mode(get_Bound_lower(n));
1850         ir_mode *op4mode = get_irn_mode(get_Bound_upper(n));
1851         (void) irg;
1852
1853         /* Bound: BB x M x int x int x int --> M x X */
1854         ASSERT_AND_RET(
1855                 mymode == mode_T &&
1856                 op1mode == mode_M &&
1857                 op2mode == op3mode &&
1858                 op3mode == op4mode &&
1859                 mode_is_int(op3mode),
1860                 "Bound node", 0 );
1861         return 1;
1862 }
1863
1864 /**
1865  * Check dominance.
1866  * For each usage of a node, it is checked, if the block of the
1867  * node dominates the block of the usage (for phis: the predecessor
1868  * block of the phi for the corresponding edge).
1869  *
1870  * @return non-zero on success, 0 on dominance error
1871  */
1872 static int check_dominance_for_node(ir_node *use) {
1873         if (is_Block(use)) {
1874                 ir_node *mbh = get_Block_MacroBlock(use);
1875
1876                 if (mbh != use) {
1877                         /* must be a partBlock */
1878                         if (is_Block(mbh)) {
1879                                 ASSERT_AND_RET(block_dominates(mbh, use), "MacroBlock header must dominate a partBlock", 0);
1880                         }
1881                 }
1882         }
1883         /* This won't work for blocks and the end node */
1884         else if (use != get_irg_end(current_ir_graph) && use != current_ir_graph->anchor) {
1885                 int i;
1886                 ir_node *bl = get_nodes_block(use);
1887
1888                 for (i = get_irn_arity(use) - 1; i >= 0; --i) {
1889                         ir_node *def    = get_irn_n(use, i);
1890                         ir_node *def_bl = get_nodes_block(def);
1891                         ir_node *use_bl = bl;
1892
1893                         /* ignore dead definition blocks, will be removed */
1894                         if (is_Block_dead(def_bl) || get_Block_dom_depth(def_bl) == -1)
1895                                 continue;
1896
1897                         if (is_Phi(use))
1898                                 use_bl = get_Block_cfgpred_block(bl, i);
1899
1900                         /* ignore dead use blocks, will be removed */
1901                         if (is_Block_dead(use_bl) || get_Block_dom_depth(use_bl) == -1)
1902                                 continue;
1903
1904                         ASSERT_AND_RET_DBG(
1905                                 block_dominates(def_bl, use_bl),
1906                                 "the definition of a value used violates the dominance property", 0,
1907                                 ir_fprintf(stderr,
1908                                 "graph %+F: %+F of %+F must dominate %+F of user %+F input %d\n",
1909                                 current_ir_graph, def_bl, def, use_bl, use, i
1910                                 );
1911                         );
1912                 }
1913         }
1914         return 1;
1915 }
1916
1917 /* Tests the modes of n and its predecessors. */
1918 int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
1919         int i;
1920         ir_op *op;
1921
1922         if (!get_node_verification_mode())
1923                 return 1;
1924
1925         if (!get_interprocedural_view()) {
1926                 /*
1927                  * do NOT check placement in interprocedural view, as we don't always know
1928                  * the "right" graph ...
1929                  */
1930                 ASSERT_AND_RET_DBG(
1931                         node_is_in_irgs_storage(irg, n),
1932                         "Node is not stored on proper IR graph!", 0,
1933                         show_node_on_graph(irg, n);
1934                 );
1935                 assert(get_irn_irg(n) == irg);
1936                 {
1937                         unsigned idx           = get_irn_idx(n);
1938                         ir_node *node_from_map = get_idx_irn(irg, idx);
1939                         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));
1940                 }
1941         }
1942
1943         op = get_irn_op(n);
1944
1945         /* We don't want to test nodes whose predecessors are Bad,
1946            as we would have to special case that for each operation. */
1947         if (op != op_Phi && op != op_Block) {
1948                 for (i = get_irn_arity(n) - 1; i >= 0; --i) {
1949                         if (is_Bad(get_irn_n(n, i)))
1950                                 return 1;
1951                 }
1952         }
1953
1954         if (_get_op_pinned(op) >= op_pin_state_exc_pinned) {
1955                 op_pin_state state = get_irn_pinned(n);
1956                 ASSERT_AND_RET_DBG(
1957                         state == op_pin_state_floats ||
1958                         state == op_pin_state_pinned,
1959                         "invalid pin state", 0,
1960                         ir_printf("node %+F", n));
1961         }
1962
1963         if (op->ops.verify_node)
1964                 return op->ops.verify_node(n, irg);
1965
1966         /* All went ok */
1967         return 1;
1968 }
1969
1970 int irn_vrfy(ir_node *n) {
1971 #ifdef DEBUG_libfirm
1972         return irn_vrfy_irg(n, current_ir_graph);
1973 #else
1974         (void)n;
1975         return 1;
1976 #endif
1977 }
1978
1979 /*-----------------------------------------------------------------*/
1980 /* Verify the whole graph.                                         */
1981 /*-----------------------------------------------------------------*/
1982
1983 #ifdef DEBUG_libfirm
1984 /**
1985  * Walker to check every node
1986  */
1987 static void vrfy_wrap(ir_node *node, void *env) {
1988         int *res = env;
1989         *res = irn_vrfy(node);
1990 }
1991
1992 /**
1993  * Walker to check every node including SSA property.
1994  * Only called if dominance info is available.
1995  */
1996 static void vrfy_wrap_ssa(ir_node *node, void *env) {
1997         int *res = env;
1998
1999         *res = irn_vrfy(node);
2000         if (*res) {
2001                 *res = check_dominance_for_node(node);
2002         }
2003 }
2004
2005 #endif /* DEBUG_libfirm */
2006
2007 /*
2008  * Calls irn_vrfy for each node in irg.
2009  * Graph must be in state "op_pin_state_pinned".
2010  * If dominance info is available, check the SSA property.
2011  */
2012 int irg_verify(ir_graph *irg, unsigned flags) {
2013         int res = 1;
2014 #ifdef DEBUG_libfirm
2015         ir_graph *rem;
2016
2017         rem = current_ir_graph;
2018         current_ir_graph = irg;
2019         last_irg_error = NULL;
2020
2021         assert(get_irg_pinned(irg) == op_pin_state_pinned && "Verification need pinned graph");
2022
2023         if (flags & VRFY_ENFORCE_SSA)
2024                 compute_doms(irg);
2025
2026         irg_walk_anchors(
2027                 irg,
2028                 get_irg_dom_state(irg) == dom_consistent &&
2029                 get_irg_pinned(irg) == op_pin_state_pinned ? vrfy_wrap_ssa : vrfy_wrap,
2030                 NULL, &res
2031         );
2032
2033         current_ir_graph = rem;
2034
2035         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT && ! res) {
2036                 ir_entity *ent = get_irg_entity(current_ir_graph);
2037
2038                 if (ent)
2039                         fprintf(stderr, "irg_verify: Verifying graph %s failed\n", get_entity_name(ent));
2040                 else
2041                         fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)current_ir_graph);
2042         }
2043 #else
2044         (void)irg;
2045         (void)flags;
2046 #endif /* DEBUG_libfirm */
2047
2048         return res;
2049 }
2050
2051 int irn_vrfy_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string) {
2052         int res;
2053         firm_verification_t old = get_node_verification_mode();
2054
2055         firm_vrfy_failure_msg = NULL;
2056         do_node_verification(FIRM_VERIFICATION_ERROR_ONLY);
2057         res = irn_vrfy_irg(n, irg);
2058         if (res && get_irg_dom_state(irg) == dom_consistent &&
2059             get_irg_pinned(irg) == op_pin_state_pinned)
2060                 res = check_dominance_for_node(n);
2061         do_node_verification(old);
2062         *bad_string = firm_vrfy_failure_msg;
2063
2064         return res;
2065 }
2066
2067
2068 typedef struct _vrfy_bad_env_t {
2069         int flags;
2070         int res;
2071 } vrfy_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         vrfy_bad_env_t *venv = env;
2078         int i, arity = get_irn_arity(node);
2079
2080         if (is_Block(node)) {
2081                 if ((venv->flags & BAD_CF) == 0) {
2082
2083                         /* check for Bad Block predecessor */
2084                         for (i = 0; i < arity; ++i) {
2085                                 ir_node *pred = get_irn_n(node, i);
2086
2087                                 if (is_Bad(pred)) {
2088                                         venv->res |= BAD_CF;
2089
2090                                         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2091                                                 fprintf(stderr, "irg_vrfy_bads: Block %ld has Bad predecessor\n", get_irn_node_nr(node));
2092                                         }
2093                                         if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2094                                                 dump_ir_block_graph(current_ir_graph, "-assert");
2095                                                 assert(0 && "Bad CF detected");
2096                                         }
2097                                 }
2098                         }
2099                 }
2100         } else {
2101                 if ((venv->flags & BAD_BLOCK) == 0) {
2102
2103                         /* check for Bad Block */
2104                         if (is_Bad(get_nodes_block(node))) {
2105                                 venv->res |= BAD_BLOCK;
2106
2107                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2108                                         fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Block\n", get_irn_node_nr(node));
2109                                 }
2110                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2111                                         dump_ir_block_graph(current_ir_graph, "-assert");
2112                                         assert(0 && "Bad CF detected");
2113                                 }
2114                         }
2115                 }
2116
2117                 if ((venv->flags & TUPLE) == 0) {
2118                         if (get_irn_op(node) == op_Tuple) {
2119                                 venv->res |= TUPLE;
2120
2121                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2122                                         fprintf(stderr, "irg_vrfy_bads: node %ld is a Tuple\n", get_irn_node_nr(node));
2123                                 }
2124                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2125                                         dump_ir_block_graph(current_ir_graph, "-assert");
2126                                         assert(0 && "Tuple detected");
2127                                 }
2128                         }
2129                 }
2130
2131                 for (i = 0; i < arity; ++i) {
2132                         ir_node *pred = get_irn_n(node, i);
2133
2134                         if (is_Bad(pred)) {
2135                                 /* check for Phi with Bad inputs */
2136                                 if (is_Phi(node) && !is_Bad(get_nodes_block(node)) && is_Bad(get_irn_n(get_nodes_block(node), i))) {
2137                                         if (venv->flags & BAD_CF)
2138                                                 continue;
2139                                         else {
2140                                                 venv->res |= BAD_CF;
2141
2142                                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2143                                                         fprintf(stderr, "irg_vrfy_bads: Phi %ld has Bad Input\n", get_irn_node_nr(node));
2144                                                 }
2145                                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2146                                                         dump_ir_block_graph(current_ir_graph, "-assert");
2147                                                         assert(0 && "Bad CF detected");
2148                                                 }
2149                                         }
2150                                 }
2151
2152                                 /* Bad node input */
2153                                 if ((venv->flags & BAD_DF) == 0) {
2154                                         venv->res |= BAD_DF;
2155
2156                                         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2157                                                 fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Input\n", get_irn_node_nr(node));
2158                                         }
2159                                         if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2160                                                 dump_ir_block_graph(current_ir_graph, "-assert");
2161                                                 assert(0 && "Bad NON-CF detected");
2162                                         }
2163                                 }
2164                         }
2165                 }
2166         }
2167 }
2168
2169 /*
2170  * verify occurrence of bad nodes
2171  */
2172 int irg_vrfy_bads(ir_graph *irg, int flags) {
2173         vrfy_bad_env_t env;
2174
2175         env.flags = flags;
2176         env.res   = 0;
2177
2178         irg_walk_graph(irg, check_bads, NULL, &env);
2179
2180         return env.res;
2181 }
2182
2183 /*
2184  * set the default verify operation
2185  */
2186 void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops) {
2187 #define CASE(a)                           \
2188    case iro_##a:                          \
2189      ops->verify_node  = verify_node_##a; \
2190      break
2191
2192         switch (code) {
2193         CASE(Proj);
2194         CASE(Block);
2195         CASE(Start);
2196         CASE(Jmp);
2197         CASE(IJmp);
2198         CASE(Break);
2199         CASE(Cond);
2200         CASE(Return);
2201         CASE(Raise);
2202         CASE(Const);
2203         CASE(SymConst);
2204         CASE(Sel);
2205         CASE(InstOf);
2206         CASE(Call);
2207         CASE(Add);
2208         CASE(Sub);
2209         CASE(Minus);
2210         CASE(Mul);
2211         CASE(Mulh);
2212         CASE(Quot);
2213         CASE(DivMod);
2214         CASE(Div);
2215         CASE(Mod);
2216         CASE(Abs);
2217         CASE(And);
2218         CASE(Or);
2219         CASE(Eor);
2220         CASE(Not);
2221         CASE(Cmp);
2222         CASE(Shl);
2223         CASE(Shr);
2224         CASE(Shrs);
2225         CASE(Rot);
2226         CASE(Conv);
2227         CASE(Cast);
2228         CASE(Phi);
2229         CASE(Filter);
2230         CASE(Load);
2231         CASE(Store);
2232         CASE(Alloc);
2233         CASE(Free);
2234         CASE(Sync);
2235         CASE(Confirm);
2236         CASE(Mux);
2237         CASE(CopyB);
2238         CASE(Bound);
2239         default:
2240                 /* leave NULL */;
2241         }
2242 #undef CASE
2243
2244 #define CASE(a)                          \
2245    case iro_##a:                         \
2246      ops->verify_proj_node  = verify_node_Proj_##a; \
2247      break
2248
2249         switch (code) {
2250         CASE(Start);
2251         CASE(Cond);
2252         CASE(Raise);
2253         CASE(InstOf);
2254         CASE(Call);
2255         CASE(Quot);
2256         CASE(DivMod);
2257         CASE(Div);
2258         CASE(Mod);
2259         CASE(Cmp);
2260         CASE(Load);
2261         CASE(Store);
2262         CASE(Alloc);
2263         CASE(Proj);
2264         CASE(Tuple);
2265         CASE(CallBegin);
2266         CASE(EndReg);
2267         CASE(EndExcept);
2268         CASE(CopyB);
2269         CASE(Bound);
2270         default:
2271                 /* leave NULL */;
2272         }
2273 #undef CASE
2274 }