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