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