1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Christian Schaefer
13 # include "irgraph_t.h"
22 ir_mode *mymode, *op1mode, *op2mode, *op3mode;
23 int op_is_symmetric = 1; /* 0: asymmetric
24 1: operands have identical modes
25 2: modes of operands == mode of this node */
29 opcode = get_irn_opcode (n);
30 mymode = get_irn_mode (n);
37 /* Start: BB --> X x M x P x data1 x ... x datan */
48 op1mode = get_irn_mode(in[1]);
50 /* Cond: BB x b --> X x X */
52 /* Cond: BB x Iu --> X^n */
55 assert (mymode == mode_T);
58 op1mode = get_irn_mode(in[1]);
59 /* Return: BB x M x data1 x ... x datan --> X */
60 /* printf("mode: %s, code %s\n", ID_TO_STR(n->mode->name), ID_TO_STR(n->op->name));*/
61 assert ( op1mode == mode_M ); /* operand M */
62 for (i=2; i < get_irn_arity(n); i++) {
63 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
65 assert ( mymode == mode_X ); /* result X */
68 op1mode = get_irn_mode(in[1]);
69 op2mode = get_irn_mode(in[2]);
71 /* Sel: BB x M x P --> X x M */
72 op1mode == mode_M && op2mode == mode_p
78 /* Const: BB --> data */
79 mode_is_data (mymode) ||
80 mymode == mode_b /* we want boolean constants for static evaluation
86 /* SymConst: BB --> Iu or
88 (mymode == mode_I) || (mymode == mode_p)
92 op1mode = get_irn_mode(in[1]);
93 op2mode = get_irn_mode(in[2]);
95 /* Sel: BB x M x P x Iu^n --> P */
96 op1mode == mode_M && op2mode == mode_p
99 for (i=3; i < get_irn_arity(n); i++) {
100 assert (get_irn_mode(in[i]) == mode_I); }
103 op1mode = get_irn_mode(in[1]);
104 op2mode = get_irn_mode(in[2]);
105 /* Call: BB x M x P x data1 x ... x datan
106 --> M x datan+1 x ... x data n+m */
107 assert ( op1mode == mode_M && op2mode == mode_p ); /* operand M x P */
108 for (i=3; i < get_irn_arity(n); i++) {
109 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
111 assert ( mymode == mode_T ); /* result T */
114 op1mode = get_irn_mode(in[1]);
115 op2mode = get_irn_mode(in[2]);
117 /* common Add: BB x num x num --> num */
118 (mymode == op1mode && mymode == op2mode
119 && mode_is_num(mymode))
120 || /* Pointer Add: BB x P x Is --> P */
121 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
122 || /* Pointer Add: BB x Is x P --> P */
123 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
125 if (op1mode == mode_p || op2mode == mode_p) {
126 /* BB x P x Is --> P or BB x Is x P --> P */
127 op_is_symmetric = 0; /* ArmRoq */
129 /* BB x num x num --> num */
134 op1mode = get_irn_mode(in[1]);
135 op2mode = get_irn_mode(in[2]);
137 /* common Sub: BB x num x num --> num */
138 (mymode ==op1mode && mymode == op2mode
139 && mode_is_num(op1mode))
140 || /* Pointer Sub: BB x P x Is --> P */
141 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
142 || /* Pointer Sub: BB x Is x P --> P */
143 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
144 || /* Pointer Sub: BB x P x P --> Is */
145 (op1mode == mode_p && op2mode == mode_p && mymode == mode_i)
147 if (op1mode == mode_p && op2mode == mode_p) {
148 op_is_symmetric = 1; /* ArmRoq */
149 } else if (op1mode == mode_p || op2mode == mode_p) {
150 op_is_symmetric = 0; /* ArmRoq */
156 op1mode = get_irn_mode(in[1]);
158 /* Minus: BB x float --> float */
159 op1mode == mymode && mode_is_float (op1mode)
164 op1mode = get_irn_mode(in[1]);
165 op2mode = get_irn_mode(in[2]);
167 /* Mul: BB x num x num --> num */
168 mymode == op1mode && mymode == op2mode
169 && mode_is_num (op1mode)
174 op1mode = get_irn_mode(in[1]);
175 op2mode = get_irn_mode(in[2]);
176 op3mode = get_irn_mode(in[3]);
178 /* Quot: BB x M x float x float --> M x X x float */
179 op1mode == mode_M && op2mode == op3mode
180 && mode_is_float(op2mode) && mymode == mode_T
185 op1mode = get_irn_mode(in[1]);
186 op2mode = get_irn_mode(in[2]);
187 op3mode = get_irn_mode(in[3]);
189 /* DivMod: BB x M x num x num --> M x X x Is x Is */
190 op1mode == mode_M && op2mode == op3mode
191 && mode_is_num (op2mode) && mymode == mode_T
197 op1mode = get_irn_mode(in[1]);
198 op2mode = get_irn_mode(in[2]);
199 op3mode = get_irn_mode(in[3]);
201 /* Div or Mod: BB x M x num x num --> M x X x Is */
202 op1mode == mode_M && op2mode == op3mode &&
203 mode_is_num (op2mode) && mymode == mode_T
208 op1mode = get_irn_mode(in[1]);
210 /* Abs: BB x num --> num */
211 op1mode == mymode && mode_is_num (op1mode)
218 op1mode = get_irn_mode(in[1]);
219 op2mode = get_irn_mode(in[2]);
221 /* And or Or or Eor: BB x int x int --> int */
222 mymode == op1mode && mymode == op2mode
223 && mode_is_int (mymode)
228 op1mode = get_irn_mode(in[1]);
230 /* Not: BB x int --> int */
232 && mode_is_int (mymode)
238 op1mode = get_irn_mode(in[1]);
239 op2mode = get_irn_mode(in[2]);
241 /* Cmp: BB x datab x datab --> b16 */
242 op1mode == op2mode && mode_is_data (op1mode)
250 op1mode = get_irn_mode(in[1]);
251 op2mode = get_irn_mode(in[2]);
253 /* Shl, Shr, Shrs or Rot: BB x int x Iu --> int */
254 mode_is_int (op1mode) && op2mode == mode_I
259 op1mode = get_irn_mode(in[1]);
261 /* Conv: BB x datab1 --> datab2 */
262 mode_is_datab (op1mode)
263 && mode_is_data (mymode)
267 /* Phi: BB x dataM^n --> dataM */
268 /* for some reason "<=" aborts. Is there a problem with get_store? */
269 for (i=1; i < get_irn_arity(n); i++) {
271 assert ( get_irn_mode(in[i]) == mymode );
273 assert ( mode_is_dataM(mymode) );
276 op1mode = get_irn_mode(in[1]);
277 op2mode = get_irn_mode(in[2]);
279 /* Load: BB x M x P --> M x X x data */
280 op1mode == mode_M && op2mode == mode_p
282 assert ( mymode == mode_T );
285 op1mode = get_irn_mode(in[1]);
286 op2mode = get_irn_mode(in[2]);
287 op3mode = get_irn_mode(in[3]);
289 /* Load: BB x M x P x data --> M x X */
290 op1mode == mode_M && op2mode == mode_p
291 && mode_is_data (op3mode)
293 assert(mymode == mode_T);
296 op1mode = get_irn_mode(in[1]);
297 op2mode = get_irn_mode(in[2]);
299 /* Alloc: BB x M x Iu --> M x X x P */
300 op1mode == mode_M && op2mode == mode_I
305 op1mode = get_irn_mode(in[1]);
306 op2mode = get_irn_mode(in[2]);
307 op3mode = get_irn_mode(in[3]);
309 /* Free: BB x M x P x Iu --> M */
310 op1mode == mode_M && op2mode == mode_p && op3mode == mode_I
315 /* Sync: BB x M^n --> M */
316 for (i=1; i < get_irn_arity(n); i++) {
317 assert ( get_irn_mode(in[i]) == mode_M );
319 assert ( mymode == mode_M );
326 /*******************************************************************/
327 /* Verify the whole graph. */
328 /*******************************************************************/
331 vrfy_wrap (ir_node *node, void *env) {
336 irg_vrfy (ir_graph *irg)
338 irg_walk(irg->end, vrfy_wrap, NULL, NULL);