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