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