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