Consistently place the mem in for AM directly after base and index.
[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 int_n x int_n --> int_n|int_2n */
1272                         (mode_is_int(op1mode)   && op2mode == op1mode && mode_is_int(mymode) &&
1273                          (op1mode == mymode || get_mode_size_bits(op1mode) * 2 == get_mode_size_bits(mymode))) ||
1274                         /* Mul: BB x float x float --> float */
1275                         (mode_is_float(op1mode) && op2mode == op1mode && mymode == op1mode)
1276                 ),
1277                 "Mul node",0,
1278                 show_binop_failure(n, "/* Mul: BB x int_n x int_n --> int_n|int_2n */ |\n"
1279                 "/* Mul: BB x float x float --> float */");
1280         );
1281         return 1;
1282 }
1283
1284 /**
1285  * verify a Mulh node
1286  */
1287 static int verify_node_Mulh(ir_node *n, ir_graph *irg) {
1288         ir_mode *mymode  = get_irn_mode(n);
1289         ir_mode *op1mode = get_irn_mode(get_Mulh_left(n));
1290         ir_mode *op2mode = get_irn_mode(get_Mulh_right(n));
1291         (void) irg;
1292
1293         ASSERT_AND_RET_DBG(
1294                 (
1295                         /* Mulh: BB x int x int --> int */
1296                         (mode_is_int(op1mode) && op2mode == op1mode && op1mode == mymode)
1297                 ),
1298                 "Mulh node",0,
1299                 show_binop_failure(n, "/* Mulh: BB x int x int --> int */");
1300         );
1301         return 1;
1302 }
1303
1304 /**
1305  * verify a Quot node
1306  */
1307 static int verify_node_Quot(ir_node *n, ir_graph *irg) {
1308         ir_mode *mymode  = get_irn_mode(n);
1309         ir_mode *op1mode = get_irn_mode(get_Quot_mem(n));
1310         ir_mode *op2mode = get_irn_mode(get_Quot_left(n));
1311         ir_mode *op3mode = get_irn_mode(get_Quot_right(n));
1312         (void) irg;
1313
1314         ASSERT_AND_RET_DBG(
1315                 /* Quot: BB x M x float x float --> M x X x float */
1316                 op1mode == mode_M && op2mode == op3mode &&
1317                 get_mode_sort(op2mode) == irms_float_number &&
1318                 mymode == mode_T,
1319                 "Quot node",0,
1320                 show_binop_failure(n, "/* Quot: BB x M x float x float --> M x X x float */");
1321         );
1322         return 1;
1323 }
1324
1325 /**
1326  * verify a DivMod node
1327  */
1328 static int verify_node_DivMod(ir_node *n, ir_graph *irg) {
1329         ir_mode *mymode  = get_irn_mode(n);
1330         ir_mode *op1mode = get_irn_mode(get_DivMod_mem(n));
1331         ir_mode *op2mode = get_irn_mode(get_DivMod_left(n));
1332         ir_mode *op3mode = get_irn_mode(get_DivMod_right(n));
1333         (void) irg;
1334
1335         ASSERT_AND_RET(
1336                 /* DivMod: BB x M x int x int --> M x X x int x int */
1337                 op1mode == mode_M &&
1338                 mode_is_int(op2mode) &&
1339                 op3mode == op2mode &&
1340                 mymode == mode_T,
1341                 "DivMod node", 0
1342                 );
1343         return 1;
1344 }
1345
1346 /**
1347  * verify a Div node
1348  */
1349 static int verify_node_Div(ir_node *n, ir_graph *irg) {
1350         ir_mode *mymode  = get_irn_mode(n);
1351         ir_mode *op1mode = get_irn_mode(get_Div_mem(n));
1352         ir_mode *op2mode = get_irn_mode(get_Div_left(n));
1353         ir_mode *op3mode = get_irn_mode(get_Div_right(n));
1354         (void) irg;
1355
1356         ASSERT_AND_RET(
1357                 /* Div: 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                 "Div node", 0
1363                 );
1364         return 1;
1365 }
1366
1367 /**
1368  * verify a Mod node
1369  */
1370 static int verify_node_Mod(ir_node *n, ir_graph *irg) {
1371         ir_mode *mymode  = get_irn_mode(n);
1372         ir_mode *op1mode = get_irn_mode(get_Mod_mem(n));
1373         ir_mode *op2mode = get_irn_mode(get_Mod_left(n));
1374         ir_mode *op3mode = get_irn_mode(get_Mod_right(n));
1375         (void) irg;
1376
1377         ASSERT_AND_RET(
1378                 /* Mod: BB x M x int x int --> M x X x int */
1379                 op1mode == mode_M &&
1380                 op2mode == op3mode &&
1381                 mode_is_int(op2mode) &&
1382                 mymode == mode_T,
1383                 "Mod node", 0
1384                 );
1385         return 1;
1386 }
1387
1388 /**
1389  * verify an Abs node
1390  */
1391 static int verify_node_Abs(ir_node *n, ir_graph *irg) {
1392         ir_mode *mymode  = get_irn_mode(n);
1393         ir_mode *op1mode = get_irn_mode(get_Abs_op(n));
1394         (void) irg;
1395
1396         ASSERT_AND_RET_DBG(
1397                 /* Abs: BB x num --> num */
1398                 op1mode == mymode &&
1399                 mode_is_num (op1mode),
1400                 "Abs node", 0,
1401                 show_unop_failure(n, "/* Abs: BB x num --> num */");
1402         );
1403         return 1;
1404 }
1405
1406 /**
1407  * verify a logical And, Or, Eor node
1408  */
1409 static int verify_node_Logic(ir_node *n, ir_graph *irg) {
1410         ir_mode *mymode  = get_irn_mode(n);
1411         ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1412         ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1413         (void) irg;
1414
1415         ASSERT_AND_RET_DBG(
1416                 /* And or Or or Eor: BB x int x int --> int */
1417                 (mode_is_int(mymode) || mymode == mode_b) &&
1418                 op2mode == op1mode &&
1419                 mymode == op2mode,
1420                 "And, Or or Eor node", 0,
1421                 show_binop_failure(n, "/* And or Or or Eor: BB x int x int --> int */");
1422         );
1423         return 1;
1424 }
1425
1426 #define verify_node_And   verify_node_Logic
1427 #define verify_node_Or    verify_node_Logic
1428 #define verify_node_Eor   verify_node_Logic
1429
1430 /**
1431  * verify a Not node
1432  */
1433 static int verify_node_Not(ir_node *n, ir_graph *irg) {
1434         ir_mode *mymode  = get_irn_mode(n);
1435         ir_mode *op1mode = get_irn_mode(get_Not_op(n));
1436         (void) irg;
1437
1438         ASSERT_AND_RET_DBG(
1439                 /* Not: BB x int --> int */
1440                 (mode_is_int(mymode) || mymode == mode_b) &&
1441                 mymode == op1mode,
1442                 "Not node", 0,
1443                 show_unop_failure(n, "/* Not: BB x int --> int */");
1444         );
1445         return 1;
1446 }
1447
1448 /**
1449  * verify a Cmp node
1450  */
1451 static int verify_node_Cmp(ir_node *n, ir_graph *irg) {
1452         ir_mode *mymode  = get_irn_mode(n);
1453         ir_mode *op1mode = get_irn_mode(get_Cmp_left(n));
1454         ir_mode *op2mode = get_irn_mode(get_Cmp_right(n));
1455         (void) irg;
1456
1457         ASSERT_AND_RET_DBG(
1458                 /* Cmp: BB x datab x datab --> b16 */
1459                 mode_is_datab(op1mode) &&
1460                 op2mode == op1mode &&
1461                 mymode == mode_T,
1462                 "Cmp node", 0,
1463                 show_binop_failure(n, "/* Cmp: BB x datab x datab --> b16 */");
1464         );
1465         return 1;
1466 }
1467
1468 /**
1469  * verify a Shift node
1470  */
1471 static int verify_node_Shift(ir_node *n, ir_graph *irg) {
1472         ir_mode *mymode  = get_irn_mode(n);
1473         ir_mode *op1mode = get_irn_mode(get_binop_left(n));
1474         ir_mode *op2mode = get_irn_mode(get_binop_right(n));
1475         (void) irg;
1476
1477         ASSERT_AND_RET_DBG(
1478                 /* Shl, Shr or Shrs: BB x int x int_u --> int */
1479                 mode_is_int(op1mode) &&
1480                 mode_is_int(op2mode) &&
1481                 !mode_is_signed(op2mode) &&
1482                 mymode == op1mode,
1483                 "Shl, Shr or Shrs node", 0,
1484                 show_binop_failure(n, "/* Shl, Shr or Shrs: BB x int x int_u --> int */");
1485         );
1486         return 1;
1487 }
1488
1489 #define verify_node_Shl   verify_node_Shift
1490 #define verify_node_Shr   verify_node_Shift
1491 #define verify_node_Shrs  verify_node_Shift
1492
1493 /**
1494  * verify a Rot node
1495  */
1496 static int verify_node_Rot(ir_node *n, ir_graph *irg) {
1497         ir_mode *mymode  = get_irn_mode(n);
1498         ir_mode *op1mode = get_irn_mode(get_Rot_left(n));
1499         ir_mode *op2mode = get_irn_mode(get_Rot_right(n));
1500         (void) irg;
1501
1502         ASSERT_AND_RET_DBG(
1503                 /* Rot: BB x int x int --> int */
1504                 mode_is_int(op1mode) &&
1505                 mode_is_int(op2mode) &&
1506                 mymode == op1mode,
1507                 "Rot node", 0,
1508                 show_binop_failure(n, "/* Rot: BB x int x int --> int */");
1509         );
1510         return 1;
1511 }
1512
1513 /**
1514  * verify a Conv node
1515  */
1516 static int verify_node_Conv(ir_node *n, ir_graph *irg) {
1517         ir_mode *mymode  = get_irn_mode(n);
1518         ir_mode *op1mode = get_irn_mode(get_Conv_op(n));
1519         (void) irg;
1520
1521         ASSERT_AND_RET_DBG(
1522                 /* Conv: BB x datab1 --> datab2 */
1523                 mode_is_datab(op1mode) && mode_is_datab(mymode),
1524                 "Conv node", 0,
1525                 show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
1526         );
1527         return 1;
1528 }
1529
1530 /**
1531  * verify a Cast node
1532  */
1533 static int verify_node_Cast(ir_node *n, ir_graph *irg) {
1534         ir_mode *mymode  = get_irn_mode(n);
1535         ir_mode *op1mode = get_irn_mode(get_Cast_op(n));
1536         (void) irg;
1537
1538         ASSERT_AND_RET_DBG(
1539                 /* Conv: BB x datab1 --> datab2 */
1540                 mode_is_data(op1mode) && op1mode == mymode,
1541                 "Cast node", 0,
1542                 show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
1543         );
1544         return 1;
1545 }
1546
1547 /**
1548  * verify a Phi node
1549  */
1550 static int verify_node_Phi(ir_node *n, ir_graph *irg) {
1551         ir_mode *mymode = get_irn_mode(n);
1552         ir_node *block  = get_nodes_block(n);
1553         int i;
1554         (void) irg;
1555
1556         if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building) {
1557                 /* a Phi node MUST have the same number of inputs as its block */
1558                 ASSERT_AND_RET_DBG(
1559                         get_irn_arity(n) == get_irn_arity(block),
1560                         "wrong number of inputs in Phi node", 0,
1561                         show_phi_inputs(n, block);
1562                 );
1563         }
1564
1565         /* Phi: BB x dataM^n --> dataM */
1566         for (i = get_irn_arity(n) - 1; i >= 0; --i) {
1567                 ir_node *pred = get_irn_n(n, i);
1568                 if (!is_Bad(pred) && (get_irn_op(pred) != op_Unknown)) {
1569                         ASSERT_AND_RET_DBG(
1570                                 get_irn_mode(pred) == mymode,
1571                                 "Phi node", 0,
1572                                 show_phi_failure(n, pred, i);
1573                         );
1574                 }
1575         }
1576         ASSERT_AND_RET(mode_is_dataM(mymode) || mymode == mode_b, "Phi node", 0 );
1577
1578         if (mymode == mode_M) {
1579                 for (i = get_Phi_n_preds(n) - 1; i >= 0; --i) {
1580                         int j;
1581                         ir_node *pred_i = get_Phi_pred(n, i);
1582
1583                         if (is_Bad(pred_i))
1584                                 continue;
1585                         for (j = i - 1; j >= 0; --j) {
1586                                 ir_node *pred_j = get_Phi_pred(n, j);
1587
1588                                 if (is_Bad(pred_j))
1589                                         continue;
1590 #if 0
1591                                 /* currently this checks fails for blocks with exception
1592                                    outputs (and these are NOT basic blocks).  So it is disabled yet. */
1593                                 ASSERT_AND_RET_DBG(
1594                                         (pred_i == pred_j) || (get_irn_n(pred_i, -1) != get_irn_n(pred_j, -1)),
1595                                         "At least two different PhiM predecessors are in the same block",
1596                                         0,
1597                                         ir_printf("%+F and %+F of %+F are in %+F\n", pred_i, pred_j, n, get_irn_n(pred_i, -1))
1598                                 );
1599 #endif
1600                         }
1601                 }
1602         }
1603         return 1;
1604 }
1605
1606 /**
1607  * verify a Filter node
1608  */
1609 static int verify_node_Filter(ir_node *n, ir_graph *irg) {
1610         (void) n;
1611         (void) irg;
1612         ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
1613                 "Filter may only appear if ip view is constructed.", 0);
1614         /* We should further do tests as for Proj and Phi. */
1615         return 1;
1616 }
1617
1618 /**
1619  * verify a Load node
1620  */
1621 static int verify_node_Load(ir_node *n, ir_graph *irg) {
1622         ir_mode *mymode  = get_irn_mode(n);
1623         ir_mode *op1mode = get_irn_mode(get_Load_mem(n));
1624         ir_mode *op2mode = get_irn_mode(get_Load_ptr(n));
1625
1626         ASSERT_AND_RET(op1mode == mode_M, "Load node", 0);
1627         if (get_irg_phase_state(irg) != phase_backend) {
1628                 ASSERT_AND_RET(mode_is_reference(op2mode), "Load node", 0 );
1629         } else {
1630                 ASSERT_AND_RET(mode_is_reference(op2mode) ||
1631                         (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "Load node", 0 );
1632         }
1633         ASSERT_AND_RET( mymode == mode_T, "Load node", 0 );
1634
1635         /*
1636          * jack's gen_add_firm_code:simpleSel seems to build Load (Load
1637          * (Proj (Proj))) sometimes ...
1638
1639          * interprete.c:ai_eval seems to assume that this happens, too
1640
1641          * obset.c:get_abstval_any can't deal with this if the load has
1642          * mode_T
1643          *
1644           {
1645           ir_entity *ent = hunt_for_entity (get_Load_ptr (n), n);
1646           assert ((NULL != ent) || (mymode != mode_T));
1647           }
1648          */
1649
1650         return 1;
1651 }
1652
1653 /**
1654  * verify a Store node
1655  */
1656 static int verify_node_Store(ir_node *n, ir_graph *irg) {
1657         ir_entity *target;
1658
1659         ir_mode *mymode  = get_irn_mode(n);
1660         ir_mode *op1mode = get_irn_mode(get_Store_mem(n));
1661         ir_mode *op2mode = get_irn_mode(get_Store_ptr(n));
1662         ir_mode *op3mode = get_irn_mode(get_Store_value(n));
1663
1664         ASSERT_AND_RET(op1mode == mode_M && mode_is_datab(op3mode), "Store node", 0 );
1665         if (get_irg_phase_state(irg) != phase_backend) {
1666                 ASSERT_AND_RET(mode_is_reference(op2mode), "Store node", 0 );
1667         } else {
1668                 ASSERT_AND_RET(mode_is_reference(op2mode) ||
1669                         (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "Store node", 0 );
1670         }
1671         ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
1672
1673         target = get_ptr_entity(get_Store_ptr(n));
1674         if (vrfy_entities && target && get_irg_phase_state(current_ir_graph) == phase_high) {
1675                 /*
1676                  * If lowered code, any Sels that add 0 may be removed, causing
1677                  * an direct access to entities of array or compound type.
1678                  * Prevent this by checking the phase.
1679                  */
1680                 ASSERT_AND_RET( op3mode == get_type_mode(get_entity_type(target)),
1681                         "Store node", 0);
1682         }
1683
1684         return 1;
1685 }
1686
1687 /**
1688  * verify an Alloc node
1689  */
1690 static int verify_node_Alloc(ir_node *n, ir_graph *irg) {
1691         ir_mode *mymode  = get_irn_mode(n);
1692         ir_mode *op1mode = get_irn_mode(get_Alloc_mem(n));
1693         ir_mode *op2mode = get_irn_mode(get_Alloc_size(n));
1694         (void) irg;
1695
1696         ASSERT_AND_RET_DBG(
1697                 /* Alloc: BB x M x int_u --> M x X x ref */
1698                 op1mode == mode_M &&
1699                 mode_is_int(op2mode) &&
1700                 !mode_is_signed(op2mode) &&
1701                 mymode == mode_T,
1702                 "Alloc node", 0,
1703                 show_binop_failure(n, "/* Alloc: BB x M x int_u --> M x X x ref */");
1704         );
1705         return 1;
1706 }
1707
1708 /**
1709  * verify a Free node
1710  */
1711 static int verify_node_Free(ir_node *n, ir_graph *irg) {
1712         ir_mode *mymode  = get_irn_mode(n);
1713         ir_mode *op1mode = get_irn_mode(get_Free_mem(n));
1714         ir_mode *op2mode = get_irn_mode(get_Free_ptr(n));
1715         ir_mode *op3mode = get_irn_mode(get_Free_size(n));
1716         (void) irg;
1717
1718         ASSERT_AND_RET_DBG(
1719                 /* Free: BB x M x ref x int_u --> M */
1720                 op1mode == mode_M && mode_is_reference(op2mode) &&
1721                 mode_is_int(op3mode) &&
1722                 !mode_is_signed(op3mode) &&
1723                 mymode == mode_M,
1724                 "Free node", 0,
1725                 show_triop_failure(n, "/* Free: BB x M x ref x int_u --> M */");
1726         );
1727         return 1;
1728 }
1729
1730 /**
1731  * verify a Sync node
1732  */
1733 static int verify_node_Sync(ir_node *n, ir_graph *irg) {
1734         int i;
1735         ir_mode *mymode  = get_irn_mode(n);
1736         (void) irg;
1737
1738         /* Sync: BB x M^n --> M */
1739         for (i = get_Sync_n_preds(n) - 1; i >= 0; --i) {
1740                 ASSERT_AND_RET( get_irn_mode(get_Sync_pred(n, i)) == mode_M, "Sync node", 0 );
1741         };
1742         ASSERT_AND_RET( mymode == mode_M, "Sync node", 0 );
1743         return 1;
1744 }
1745
1746 /**
1747  * verify a Confirm node
1748  */
1749 static int verify_node_Confirm(ir_node *n, ir_graph *irg) {
1750         ir_mode *mymode  = get_irn_mode(n);
1751         ir_mode *op1mode = get_irn_mode(get_Confirm_value(n));
1752         ir_mode *op2mode = get_irn_mode(get_Confirm_bound(n));
1753         (void) irg;
1754
1755         ASSERT_AND_RET_DBG(
1756                 /* Confirm: BB x T x T --> T */
1757                 op1mode == mymode &&
1758                 op2mode == mymode,
1759                 "Confirm node", 0,
1760                 show_binop_failure(n, "/* Confirm: BB x T x T --> T */");
1761         );
1762         return 1;
1763 }
1764
1765 /**
1766  * verify a Mux node
1767  */
1768 static int verify_node_Mux(ir_node *n, ir_graph *irg) {
1769         ir_mode *mymode  = get_irn_mode(n);
1770         ir_mode *op1mode = get_irn_mode(get_Mux_sel(n));
1771         ir_mode *op2mode = get_irn_mode(get_Mux_true(n));
1772         ir_mode *op3mode = get_irn_mode(get_Mux_false(n));
1773         (void) irg;
1774
1775         ASSERT_AND_RET(
1776                 /* Mux: BB x b x numP x numP --> numP */
1777                 op1mode == mode_b &&
1778                 op2mode == mymode &&
1779                 op3mode == mymode &&
1780                 mode_is_data(mymode),
1781                 "Mux node", 0
1782                 );
1783         return 1;
1784 }
1785
1786 /**
1787  * verify a CopyB node
1788  */
1789 static int verify_node_CopyB(ir_node *n, ir_graph *irg) {
1790         ir_mode *mymode  = get_irn_mode(n);
1791         ir_mode *op1mode = get_irn_mode(get_CopyB_mem(n));
1792         ir_mode *op2mode = get_irn_mode(get_CopyB_dst(n));
1793         ir_mode *op3mode = get_irn_mode(get_CopyB_src(n));
1794         ir_type *t = get_CopyB_type(n);
1795
1796         /* CopyB: BB x M x ref x ref --> M x X */
1797         ASSERT_AND_RET(mymode == mode_T && op1mode == mode_M, "CopyB node", 0);
1798         if (get_irg_phase_state(irg) != phase_backend) {
1799                 ASSERT_AND_RET(mode_is_reference(op2mode) && mode_is_reference(op3mode),
1800                         "CopyB node", 0 );
1801         } else {
1802                 ASSERT_AND_RET(mode_is_reference(op2mode) ||
1803                         (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "CopyB node", 0 );
1804                 ASSERT_AND_RET(mode_is_reference(op3mode) ||
1805                         (mode_is_int(op3mode) && get_mode_size_bits(op3mode) == get_mode_size_bits(mode_P)), "CopyB node", 0 );
1806         }
1807
1808         ASSERT_AND_RET(
1809                 is_compound_type(t),
1810                 "CopyB node should copy compound types only", 0 );
1811
1812         /* NoMem nodes are only allowed as memory input if the CopyB is NOT pinned.
1813            This should happen RARELY, as CopyB COPIES MEMORY */
1814         ASSERT_AND_RET(verify_right_pinned(n), "CopyB node with wrong memory input", 0 );
1815         return 1;
1816 }
1817
1818 /**
1819  * verify a Bound node
1820  */
1821 static int verify_node_Bound(ir_node *n, ir_graph *irg) {
1822         ir_mode *mymode  = get_irn_mode(n);
1823         ir_mode *op1mode = get_irn_mode(get_Bound_mem(n));
1824         ir_mode *op2mode = get_irn_mode(get_Bound_index(n));
1825         ir_mode *op3mode = get_irn_mode(get_Bound_lower(n));
1826         ir_mode *op4mode = get_irn_mode(get_Bound_upper(n));
1827         (void) irg;
1828
1829         /* Bound: BB x M x int x int x int --> M x X */
1830         ASSERT_AND_RET(
1831                 mymode == mode_T &&
1832                 op1mode == mode_M &&
1833                 op2mode == op3mode &&
1834                 op3mode == op4mode &&
1835                 mode_is_int(op3mode),
1836                 "Bound node", 0 );
1837         return 1;
1838 }
1839
1840 /**
1841  * Check dominance.
1842  * For each usage of a node, it is checked, if the block of the
1843  * node dominates the block of the usage (for phis: the predecessor
1844  * block of the phi for the corresponding edge).
1845  *
1846  * @return non-zero on success, 0 on dominance error
1847  */
1848 static int check_dominance_for_node(ir_node *use) {
1849         /* This won't work for blocks and the end node */
1850         if (!is_Block(use) && use != get_irg_end(current_ir_graph) && use != current_ir_graph->anchor) {
1851                 int i;
1852                 ir_node *bl = get_nodes_block(use);
1853
1854                 for (i = get_irn_arity(use) - 1; i >= 0; --i) {
1855                         ir_node *def    = get_irn_n(use, i);
1856                         ir_node *def_bl = get_nodes_block(def);
1857                         ir_node *use_bl = bl;
1858
1859                         /* ignore dead definition blocks, will be removed */
1860                         if (is_Block_dead(def_bl) || get_Block_dom_depth(def_bl) == -1)
1861                                 continue;
1862
1863                         if (is_Phi(use))
1864                                 use_bl = get_Block_cfgpred_block(bl, i);
1865
1866                         /* ignore dead use blocks, will be removed */
1867                         if (is_Block_dead(use_bl) || get_Block_dom_depth(use_bl) == -1)
1868                                 continue;
1869
1870                         ASSERT_AND_RET_DBG(
1871                                 block_dominates(def_bl, use_bl),
1872                                 "the definition of a value used violates the dominance property", 0,
1873                                 ir_fprintf(stderr,
1874                                 "graph %+F: %+F of %+F must dominate %+F of user %+F input %d\n",
1875                                 current_ir_graph, def_bl, def, use_bl, use, i
1876                                 );
1877                         );
1878                 }
1879         }
1880         return 1;
1881 }
1882
1883 /* Tests the modes of n and its predecessors. */
1884 int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
1885         int i;
1886         ir_op *op;
1887
1888         if (!get_node_verification_mode())
1889                 return 1;
1890
1891         if (!get_interprocedural_view()) {
1892                 /*
1893                  * do NOT check placement in interprocedural view, as we don't always know
1894                  * the "right" graph ...
1895                  */
1896                 ASSERT_AND_RET_DBG(
1897                         node_is_in_irgs_storage(irg, n),
1898                         "Node is not stored on proper IR graph!", 0,
1899                         show_node_on_graph(irg, n);
1900                 );
1901                 assert(get_irn_irg(n) == irg);
1902                 {
1903                         unsigned idx           = get_irn_idx(n);
1904                         ir_node *node_from_map = get_idx_irn(irg, idx);
1905                         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));
1906                 }
1907         }
1908
1909         op = get_irn_op(n);
1910
1911         /* We don't want to test nodes whose predecessors are Bad,
1912            as we would have to special case that for each operation. */
1913         if (op != op_Phi && op != op_Block) {
1914                 for (i = get_irn_arity(n) - 1; i >= 0; --i) {
1915                         if (is_Bad(get_irn_n(n, i)))
1916                                 return 1;
1917                 }
1918         }
1919
1920         if (_get_op_pinned(op) >= op_pin_state_exc_pinned) {
1921                 op_pin_state state = get_irn_pinned(n);
1922                 ASSERT_AND_RET_DBG(
1923                         state == op_pin_state_floats ||
1924                         state == op_pin_state_pinned,
1925                         "invalid pin state", 0,
1926                         ir_printf("node %+F", n));
1927         }
1928
1929         if (op->ops.verify_node)
1930                 return op->ops.verify_node(n, irg);
1931
1932         /* All went ok */
1933         return 1;
1934 }
1935
1936 int irn_vrfy(ir_node *n) {
1937         int res = 1;
1938 #ifdef DEBUG_libfirm
1939         res = irn_vrfy_irg(n, current_ir_graph);
1940 #endif
1941         return res;
1942 }
1943
1944 /*-----------------------------------------------------------------*/
1945 /* Verify the whole graph.                                         */
1946 /*-----------------------------------------------------------------*/
1947
1948 #ifdef DEBUG_libfirm
1949 /**
1950  * Walker to check every node
1951  */
1952 static void vrfy_wrap(ir_node *node, void *env) {
1953         int *res = env;
1954         *res = irn_vrfy(node);
1955 }
1956
1957 /**
1958  * Walker to check every node including SSA property.
1959  * Only called if dominance info is available.
1960  */
1961 static void vrfy_wrap_ssa(ir_node *node, void *env) {
1962         int *res = env;
1963
1964         *res = irn_vrfy(node);
1965         if (*res) {
1966                 *res = check_dominance_for_node(node);
1967         }
1968 }
1969
1970 #endif /* DEBUG_libfirm */
1971
1972 /*
1973  * Calls irn_vrfy for each node in irg.
1974  * Graph must be in state "op_pin_state_pinned".
1975  * If dominance info is available, check the SSA property.
1976  */
1977 int irg_verify(ir_graph *irg, unsigned flags) {
1978         int res = 1;
1979 #ifdef DEBUG_libfirm
1980         ir_graph *rem;
1981
1982         rem = current_ir_graph;
1983         current_ir_graph = irg;
1984         last_irg_error = NULL;
1985
1986         assert(get_irg_pinned(irg) == op_pin_state_pinned && "Verification need pinned graph");
1987
1988         if (flags & VRFY_ENFORCE_SSA)
1989                 compute_doms(irg);
1990
1991         irg_walk_anchors(
1992                 irg,
1993                 get_irg_dom_state(irg) == dom_consistent &&
1994                 get_irg_pinned(irg) == op_pin_state_pinned ? vrfy_wrap_ssa : vrfy_wrap,
1995                 NULL, &res
1996         );
1997
1998         current_ir_graph = rem;
1999
2000         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT && ! res) {
2001                 ir_entity *ent = get_irg_entity(current_ir_graph);
2002
2003                 if (ent)
2004                         fprintf(stderr, "irg_verify: Verifying graph %s failed\n", get_entity_name(ent));
2005                 else
2006                         fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)current_ir_graph);
2007         }
2008 #endif /* DEBUG_libfirm */
2009
2010         return res;
2011 }
2012
2013 int irn_vrfy_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string) {
2014         int res;
2015         firm_verification_t old = get_node_verification_mode();
2016
2017         firm_vrfy_failure_msg = NULL;
2018         do_node_verification(FIRM_VERIFICATION_ERROR_ONLY);
2019         res = irn_vrfy_irg(n, irg);
2020         if (res && get_irg_dom_state(irg) == dom_consistent &&
2021             get_irg_pinned(irg) == op_pin_state_pinned)
2022                 res = check_dominance_for_node(n);
2023         do_node_verification(old);
2024         *bad_string = firm_vrfy_failure_msg;
2025
2026         return res;
2027 }
2028
2029
2030 typedef struct _vrfy_bad_env_t {
2031         int flags;
2032         int res;
2033 } vrfy_bad_env_t;
2034
2035 /**
2036  * Pre-Walker: check Bad predecessors of node.
2037  */
2038 static void check_bads(ir_node *node, void *env) {
2039         vrfy_bad_env_t *venv = env;
2040         int i, arity = get_irn_arity(node);
2041
2042         if (is_Block(node)) {
2043                 if ((venv->flags & BAD_CF) == 0) {
2044
2045                         /* check for Bad Block predecessor */
2046                         for (i = 0; i < arity; ++i) {
2047                                 ir_node *pred = get_irn_n(node, i);
2048
2049                                 if (is_Bad(pred)) {
2050                                         venv->res |= BAD_CF;
2051
2052                                         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2053                                                 fprintf(stderr, "irg_vrfy_bads: Block %ld has Bad predecessor\n", get_irn_node_nr(node));
2054                                         }
2055                                         if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2056                                                 dump_ir_block_graph(current_ir_graph, "-assert");
2057                                                 assert(0 && "Bad CF detected");
2058                                         }
2059                                 }
2060                         }
2061                 }
2062         } else {
2063                 if ((venv->flags & BAD_BLOCK) == 0) {
2064
2065                         /* check for Bad Block */
2066                         if (is_Bad(get_nodes_block(node))) {
2067                                 venv->res |= BAD_BLOCK;
2068
2069                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2070                                         fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Block\n", get_irn_node_nr(node));
2071                                 }
2072                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2073                                         dump_ir_block_graph(current_ir_graph, "-assert");
2074                                         assert(0 && "Bad CF detected");
2075                                 }
2076                         }
2077                 }
2078
2079                 if ((venv->flags & TUPLE) == 0) {
2080                         if (get_irn_op(node) == op_Tuple) {
2081                                 venv->res |= TUPLE;
2082
2083                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2084                                         fprintf(stderr, "irg_vrfy_bads: node %ld is a Tuple\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 && "Tuple detected");
2089                                 }
2090                         }
2091                 }
2092
2093                 for (i = 0; i < arity; ++i) {
2094                         ir_node *pred = get_irn_n(node, i);
2095
2096                         if (is_Bad(pred)) {
2097                                 /* check for Phi with Bad inputs */
2098                                 if (is_Phi(node) && !is_Bad(get_nodes_block(node)) && is_Bad(get_irn_n(get_nodes_block(node), i))) {
2099                                         if (venv->flags & BAD_CF)
2100                                                 continue;
2101                                         else {
2102                                                 venv->res |= BAD_CF;
2103
2104                                                 if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2105                                                         fprintf(stderr, "irg_vrfy_bads: Phi %ld has Bad Input\n", get_irn_node_nr(node));
2106                                                 }
2107                                                 if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2108                                                         dump_ir_block_graph(current_ir_graph, "-assert");
2109                                                         assert(0 && "Bad CF detected");
2110                                                 }
2111                                         }
2112                                 }
2113
2114                                 /* Bad node input */
2115                                 if ((venv->flags & BAD_DF) == 0) {
2116                                         venv->res |= BAD_DF;
2117
2118                                         if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
2119                                                 fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Input\n", get_irn_node_nr(node));
2120                                         }
2121                                         if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
2122                                                 dump_ir_block_graph(current_ir_graph, "-assert");
2123                                                 assert(0 && "Bad NON-CF detected");
2124                                         }
2125                                 }
2126                         }
2127                 }
2128         }
2129 }
2130
2131 /*
2132  * verify occurrence of bad nodes
2133  */
2134 int irg_vrfy_bads(ir_graph *irg, int flags) {
2135         vrfy_bad_env_t env;
2136
2137         env.flags = flags;
2138         env.res   = 0;
2139
2140         irg_walk_graph(irg, check_bads, NULL, &env);
2141
2142         return env.res;
2143 }
2144
2145 /*
2146  * set the default verify operation
2147  */
2148 void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops) {
2149 #define CASE(a)                           \
2150    case iro_##a:                          \
2151      ops->verify_node  = verify_node_##a; \
2152      break
2153
2154         switch (code) {
2155         CASE(Proj);
2156         CASE(Block);
2157         CASE(Start);
2158         CASE(Jmp);
2159         CASE(IJmp);
2160         CASE(Break);
2161         CASE(Cond);
2162         CASE(Return);
2163         CASE(Raise);
2164         CASE(Const);
2165         CASE(SymConst);
2166         CASE(Sel);
2167         CASE(InstOf);
2168         CASE(Call);
2169         CASE(Add);
2170         CASE(Sub);
2171         CASE(Minus);
2172         CASE(Mul);
2173         CASE(Mulh);
2174         CASE(Quot);
2175         CASE(DivMod);
2176         CASE(Div);
2177         CASE(Mod);
2178         CASE(Abs);
2179         CASE(And);
2180         CASE(Or);
2181         CASE(Eor);
2182         CASE(Not);
2183         CASE(Cmp);
2184         CASE(Shl);
2185         CASE(Shr);
2186         CASE(Shrs);
2187         CASE(Rot);
2188         CASE(Conv);
2189         CASE(Cast);
2190         CASE(Phi);
2191         CASE(Filter);
2192         CASE(Load);
2193         CASE(Store);
2194         CASE(Alloc);
2195         CASE(Free);
2196         CASE(Sync);
2197         CASE(Confirm);
2198         CASE(Mux);
2199         CASE(CopyB);
2200         CASE(Bound);
2201         default:
2202                 /* leave NULL */;
2203         }
2204 #undef CASE
2205
2206 #define CASE(a)                          \
2207    case iro_##a:                         \
2208      ops->verify_proj_node  = verify_node_Proj_##a; \
2209      break
2210
2211         switch (code) {
2212         CASE(Start);
2213         CASE(Cond);
2214         CASE(Raise);
2215         CASE(InstOf);
2216         CASE(Call);
2217         CASE(Quot);
2218         CASE(DivMod);
2219         CASE(Div);
2220         CASE(Mod);
2221         CASE(Cmp);
2222         CASE(Load);
2223         CASE(Store);
2224         CASE(Alloc);
2225         CASE(Proj);
2226         CASE(Tuple);
2227         CASE(CallBegin);
2228         CASE(EndReg);
2229         CASE(EndExcept);
2230         CASE(CopyB);
2231         CASE(Bound);
2232         default:
2233                 /* leave NULL */;
2234         }
2235 #undef CASE
2236 }