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