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