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