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