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