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