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