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);
31 if (opcode != iro_Phi && opcode != iro_Block)
32 for (i = 0; i < get_irn_arity(n); i++)
33 if (get_irn_opcode(get_irn_n(n, i)) == iro_Bad)
36 mymode = get_irn_mode (n);
43 /* Start: BB --> X x M x P x data1 x ... x datan */
54 op1mode = get_irn_mode(in[1]);
56 /* Cond: BB x b --> X x X */
58 /* Cond: BB x Iu --> X^n */
61 assert (mymode == mode_T);
64 op1mode = get_irn_mode(in[1]);
65 /* Return: BB x M x data1 x ... x datan --> X */
66 /* printf("mode: %s, code %s\n", ID_TO_STR(n->mode->name), ID_TO_STR(n->op->name));*/
67 assert ( op1mode == mode_M ); /* operand M */
68 for (i=2; i < get_irn_arity(n); i++) {
69 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
71 assert ( mymode == mode_X ); /* result X */
74 op1mode = get_irn_mode(in[1]);
75 op2mode = get_irn_mode(in[2]);
77 /* Sel: BB x M x P --> X x M */
78 op1mode == mode_M && op2mode == mode_p
84 /* Const: BB --> data */
85 mode_is_data (mymode) ||
86 mymode == mode_b /* we want boolean constants for static evaluation
92 /* SymConst: BB --> Iu or
94 (mymode == mode_I) || (mymode == mode_p)
98 op1mode = get_irn_mode(in[1]);
99 op2mode = get_irn_mode(in[2]);
101 /* Sel: BB x M x P x Iu^n --> P */
102 op1mode == mode_M && op2mode == mode_p
105 for (i=3; i < get_irn_arity(n); i++) {
106 assert (get_irn_mode(in[i]) == mode_I); }
109 op1mode = get_irn_mode(in[1]);
110 op2mode = get_irn_mode(in[2]);
111 /* Call: BB x M x P x data1 x ... x datan
112 --> M x datan+1 x ... x data n+m */
113 assert ( op1mode == mode_M && op2mode == mode_p ); /* operand M x P */
114 for (i=3; i < get_irn_arity(n); i++) {
115 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
117 assert ( mymode == mode_T ); /* result T */
120 op1mode = get_irn_mode(in[1]);
121 op2mode = get_irn_mode(in[2]);
123 /* common Add: BB x num x num --> num */
124 (mymode == op1mode && mymode == op2mode
125 && mode_is_num(mymode))
126 || /* Pointer Add: BB x P x Is --> P */
127 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
128 || /* Pointer Add: BB x Is x P --> P */
129 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
131 if (op1mode == mode_p || op2mode == mode_p) {
132 /* BB x P x Is --> P or BB x Is x P --> P */
133 op_is_symmetric = 0; /* ArmRoq */
135 /* BB x num x num --> num */
140 op1mode = get_irn_mode(in[1]);
141 op2mode = get_irn_mode(in[2]);
143 /* common Sub: BB x num x num --> num */
144 (mymode ==op1mode && mymode == op2mode
145 && mode_is_num(op1mode))
146 || /* Pointer Sub: BB x P x Is --> P */
147 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
148 || /* Pointer Sub: BB x Is x P --> P */
149 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
150 || /* Pointer Sub: BB x P x P --> Is */
151 (op1mode == mode_p && op2mode == mode_p && mymode == mode_i)
153 if (op1mode == mode_p && op2mode == mode_p) {
154 op_is_symmetric = 1; /* ArmRoq */
155 } else if (op1mode == mode_p || op2mode == mode_p) {
156 op_is_symmetric = 0; /* ArmRoq */
162 op1mode = get_irn_mode(in[1]);
164 /* Minus: BB x float --> float */
165 op1mode == mymode && mode_is_float (op1mode)
170 op1mode = get_irn_mode(in[1]);
171 op2mode = get_irn_mode(in[2]);
173 /* Mul: BB x num x num --> num */
174 mymode == op1mode && mymode == op2mode
175 && mode_is_num (op1mode)
180 op1mode = get_irn_mode(in[1]);
181 op2mode = get_irn_mode(in[2]);
182 op3mode = get_irn_mode(in[3]);
184 /* Quot: BB x M x float x float --> M x X x float */
185 op1mode == mode_M && op2mode == op3mode
186 && mode_is_float(op2mode) && mymode == mode_T
191 op1mode = get_irn_mode(in[1]);
192 op2mode = get_irn_mode(in[2]);
193 op3mode = get_irn_mode(in[3]);
195 /* DivMod: BB x M x num x num --> M x X x Is x Is */
196 op1mode == mode_M && op2mode == op3mode
197 && mode_is_num (op2mode) && mymode == mode_T
203 op1mode = get_irn_mode(in[1]);
204 op2mode = get_irn_mode(in[2]);
205 op3mode = get_irn_mode(in[3]);
207 /* Div or Mod: BB x M x num x num --> M x X x Is */
208 op1mode == mode_M && op2mode == op3mode &&
209 mode_is_num (op2mode) && mymode == mode_T
214 op1mode = get_irn_mode(in[1]);
216 /* Abs: BB x num --> num */
217 op1mode == mymode && mode_is_num (op1mode)
224 op1mode = get_irn_mode(in[1]);
225 op2mode = get_irn_mode(in[2]);
227 /* And or Or or Eor: BB x int x int --> int */
228 mymode == op1mode && mymode == op2mode
229 && mode_is_int (mymode)
234 op1mode = get_irn_mode(in[1]);
236 /* Not: BB x int --> int */
238 && mode_is_int (mymode)
244 op1mode = get_irn_mode(in[1]);
245 op2mode = get_irn_mode(in[2]);
247 /* Cmp: BB x datab x datab --> b16 */
248 op1mode == op2mode && mode_is_data (op1mode)
256 op1mode = get_irn_mode(in[1]);
257 op2mode = get_irn_mode(in[2]);
259 /* Shl, Shr, Shrs or Rot: BB x int x Iu --> int */
260 mode_is_int (op1mode) && op2mode == mode_I
265 op1mode = get_irn_mode(in[1]);
267 /* Conv: BB x datab1 --> datab2 */
268 mode_is_datab (op1mode)
269 && mode_is_data (mymode)
273 /* Phi: BB x dataM^n --> dataM */
274 /* for some reason "<=" aborts. Is there a problem with get_store? */
275 for (i=1; i < get_irn_arity(n); i++) {
277 assert ( get_irn_mode(in[i]) == mymode );
279 assert ( mode_is_dataM(mymode) );
282 op1mode = get_irn_mode(in[1]);
283 op2mode = get_irn_mode(in[2]);
285 /* Load: BB x M x P --> M x X x data */
286 op1mode == mode_M && op2mode == mode_p
288 assert ( mymode == mode_T );
291 op1mode = get_irn_mode(in[1]);
292 op2mode = get_irn_mode(in[2]);
293 op3mode = get_irn_mode(in[3]);
295 /* Load: BB x M x P x data --> M x X */
296 op1mode == mode_M && op2mode == mode_p
297 && mode_is_data (op3mode)
299 assert(mymode == mode_T);
302 op1mode = get_irn_mode(in[1]);
303 op2mode = get_irn_mode(in[2]);
305 /* Alloc: BB x M x Iu --> M x X x P */
306 op1mode == mode_M && op2mode == mode_I
311 op1mode = get_irn_mode(in[1]);
312 op2mode = get_irn_mode(in[2]);
313 op3mode = get_irn_mode(in[3]);
315 /* Free: BB x M x P x Iu --> M */
316 op1mode == mode_M && op2mode == mode_p && op3mode == mode_I
321 /* Sync: BB x M^n --> M */
322 for (i=1; i < get_irn_arity(n); i++) {
323 assert ( get_irn_mode(in[i]) == mode_M );
325 assert ( mymode == mode_M );
332 /*******************************************************************/
333 /* Verify the whole graph. */
334 /*******************************************************************/
337 vrfy_wrap (ir_node *node, void *env) {
342 irg_vrfy (ir_graph *irg)
345 rem = current_ir_graph;
346 current_ir_graph = irg;
348 irg_walk(irg->end, vrfy_wrap, NULL, NULL);
350 current_ir_graph = rem;