1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Christian Schaefer
15 # include "irgraph_t.h"
24 ir_mode *mymode, *op1mode, *op2mode, *op3mode;
25 int op_is_symmetric = 1; /* 0: asymmetric
26 1: operands have identical modes
27 2: modes of operands == mode of this node */
31 opcode = get_irn_opcode (n);
33 if (opcode != iro_Phi && opcode != iro_Block)
34 for (i = 0; i < get_irn_arity(n); i++)
35 if (get_irn_opcode(get_irn_n(n, i)) == iro_Bad)
38 mymode = get_irn_mode (n);
45 /* Start: BB --> X x M x P x data1 x ... x datan */
56 op1mode = get_irn_mode(in[1]);
58 /* Cond: BB x b --> X x X */
60 /* Cond: BB x Iu --> X^n */
63 assert (mymode == mode_T);
66 op1mode = get_irn_mode(in[1]);
67 /* Return: BB x M x data1 x ... x datan --> X */
68 /* printf("mode: %s, code %s\n", ID_TO_STR(n->mode->name), ID_TO_STR(n->op->name));*/
69 assert ( op1mode == mode_M ); /* operand M */
70 for (i=2; i < get_irn_arity(n); i++) {
71 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
73 assert ( mymode == mode_X ); /* result X */
76 op1mode = get_irn_mode(in[1]);
77 op2mode = get_irn_mode(in[2]);
79 /* Sel: BB x M x P --> X x M */
80 op1mode == mode_M && op2mode == mode_p
86 /* Const: BB --> data */
87 mode_is_data (mymode) ||
88 mymode == mode_b /* we want boolean constants for static evaluation
94 /* SymConst: BB --> Iu or
96 (mymode == mode_I) || (mymode == mode_p)
100 op1mode = get_irn_mode(in[1]);
101 op2mode = get_irn_mode(in[2]);
103 /* Sel: BB x M x P x Iu^n --> P */
104 op1mode == mode_M && op2mode == mode_p
107 for (i=3; i < get_irn_arity(n); i++) {
108 assert (get_irn_mode(in[i]) == mode_I); }
111 op1mode = get_irn_mode(in[1]);
112 op2mode = get_irn_mode(in[2]);
113 /* Call: BB x M x P x data1 x ... x datan
114 --> M x datan+1 x ... x data n+m */
115 assert ( op1mode == mode_M && op2mode == mode_p ); /* operand M x P */
116 for (i=3; i < get_irn_arity(n); i++) {
117 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
119 assert ( mymode == mode_T ); /* result T */
122 op1mode = get_irn_mode(in[1]);
123 op2mode = get_irn_mode(in[2]);
125 /* common Add: BB x num x num --> num */
126 (mymode == op1mode && mymode == op2mode
127 && mode_is_num(mymode))
128 || /* Pointer Add: BB x P x Is --> P */
129 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
130 || /* Pointer Add: BB x Is x P --> P */
131 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
133 if (op1mode == mode_p || op2mode == mode_p) {
134 /* BB x P x Is --> P or BB x Is x P --> P */
135 op_is_symmetric = 0; /* ArmRoq */
137 /* BB x num x num --> num */
142 op1mode = get_irn_mode(in[1]);
143 op2mode = get_irn_mode(in[2]);
145 /* common Sub: BB x num x num --> num */
146 (mymode ==op1mode && mymode == op2mode
147 && mode_is_num(op1mode))
148 || /* Pointer Sub: BB x P x Is --> P */
149 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
150 || /* Pointer Sub: BB x Is x P --> P */
151 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
152 || /* Pointer Sub: BB x P x P --> Is */
153 (op1mode == mode_p && op2mode == mode_p && mymode == mode_i)
155 if (op1mode == mode_p && op2mode == mode_p) {
156 op_is_symmetric = 1; /* ArmRoq */
157 } else if (op1mode == mode_p || op2mode == mode_p) {
158 op_is_symmetric = 0; /* ArmRoq */
164 op1mode = get_irn_mode(in[1]);
166 /* Minus: BB x float --> float */
167 op1mode == mymode && mode_is_float (op1mode)
172 op1mode = get_irn_mode(in[1]);
173 op2mode = get_irn_mode(in[2]);
175 /* Mul: BB x num x num --> num */
176 mymode == op1mode && mymode == op2mode
177 && mode_is_num (op1mode)
182 op1mode = get_irn_mode(in[1]);
183 op2mode = get_irn_mode(in[2]);
184 op3mode = get_irn_mode(in[3]);
186 /* Quot: BB x M x float x float --> M x X x float */
187 op1mode == mode_M && op2mode == op3mode
188 && mode_is_float(op2mode) && mymode == mode_T
193 op1mode = get_irn_mode(in[1]);
194 op2mode = get_irn_mode(in[2]);
195 op3mode = get_irn_mode(in[3]);
197 /* DivMod: BB x M x num x num --> M x X x Is x Is */
198 op1mode == mode_M && op2mode == op3mode
199 && mode_is_num (op2mode) && mymode == mode_T
205 op1mode = get_irn_mode(in[1]);
206 op2mode = get_irn_mode(in[2]);
207 op3mode = get_irn_mode(in[3]);
209 /* Div or Mod: BB x M x num x num --> M x X x Is */
210 op1mode == mode_M && op2mode == op3mode &&
211 mode_is_num (op2mode) && mymode == mode_T
216 op1mode = get_irn_mode(in[1]);
218 /* Abs: BB x num --> num */
219 op1mode == mymode && mode_is_num (op1mode)
226 op1mode = get_irn_mode(in[1]);
227 op2mode = get_irn_mode(in[2]);
229 /* And or Or or Eor: BB x int x int --> int */
230 mymode == op1mode && mymode == op2mode
231 && mode_is_int (mymode)
236 op1mode = get_irn_mode(in[1]);
238 /* Not: BB x int --> int */
240 && mode_is_int (mymode)
246 op1mode = get_irn_mode(in[1]);
247 op2mode = get_irn_mode(in[2]);
249 /* Cmp: BB x datab x datab --> b16 */
250 op1mode == op2mode && mode_is_data (op1mode)
258 op1mode = get_irn_mode(in[1]);
259 op2mode = get_irn_mode(in[2]);
261 /* Shl, Shr, Shrs or Rot: BB x int x Iu --> int */
262 mode_is_int (op1mode) && op2mode == mode_I
267 op1mode = get_irn_mode(in[1]);
269 /* Conv: BB x datab1 --> datab2 */
270 mode_is_datab (op1mode)
271 && mode_is_data (mymode)
275 /* Phi: BB x dataM^n --> dataM */
276 /* for some reason "<=" aborts. Is there a problem with get_store? */
277 for (i=1; i < get_irn_arity(n); i++) {
279 assert ( get_irn_mode(in[i]) == mymode );
281 assert ( mode_is_dataM(mymode) );
284 op1mode = get_irn_mode(in[1]);
285 op2mode = get_irn_mode(in[2]);
287 /* Load: BB x M x P --> M x X x data */
288 op1mode == mode_M && op2mode == mode_p
290 assert ( mymode == mode_T );
293 op1mode = get_irn_mode(in[1]);
294 op2mode = get_irn_mode(in[2]);
295 op3mode = get_irn_mode(in[3]);
297 /* Load: BB x M x P x data --> M x X */
298 op1mode == mode_M && op2mode == mode_p
299 && mode_is_data (op3mode)
301 assert(mymode == mode_T);
304 op1mode = get_irn_mode(in[1]);
305 op2mode = get_irn_mode(in[2]);
307 /* Alloc: BB x M x Iu --> M x X x P */
308 op1mode == mode_M && op2mode == mode_I
313 op1mode = get_irn_mode(in[1]);
314 op2mode = get_irn_mode(in[2]);
315 op3mode = get_irn_mode(in[3]);
317 /* Free: BB x M x P x Iu --> M */
318 op1mode == mode_M && op2mode == mode_p && op3mode == mode_I
323 /* Sync: BB x M^n --> M */
324 for (i=1; i < get_irn_arity(n); i++) {
325 assert ( get_irn_mode(in[i]) == mode_M );
327 assert ( mymode == mode_M );
334 /*******************************************************************/
335 /* Verify the whole graph. */
336 /*******************************************************************/
339 vrfy_wrap (ir_node *node, void *env) {
344 irg_vrfy (ir_graph *irg)
347 rem = current_ir_graph;
348 current_ir_graph = irg;
350 irg_walk(irg->end, vrfy_wrap, NULL, NULL);
352 current_ir_graph = rem;