-/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
- * All rights reserved.
- *
- * Authors: Christian Schaefer
- *
- *
+/*
+ * Project: libFIRM
+ * File name: ir/ir/irvrfy.c
+ * Purpose: Check irnodes for correctness.
+ * Author: Christian Schaefer
+ * Modified by: Goetz Lindenmaier. Till Riedel
+ * Created:
+ * CVS-ID: $Id$
+ * Copyright: (c) 1998-2003 Universität Karlsruhe
+ * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
*/
-/* $Id$ */
-
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
break;
case iro_Load:
- ASSERT_AND_RET(
- ((proj == 0 && mode == mode_M) ||
- (proj == 1 && mode == mode_X) ||
- (proj == 2 && mode_is_data(mode))),
- "wrong Proj from Load", 0);
+ if (proj == pn_Load_res) {
+ ir_node *ptr = get_Load_ptr(pred);
+ entity *ent = NULL;
+ if (get_irn_op(ptr) == op_Sel) {
+ ent = get_Sel_entity(ptr);
+ } else if ((get_irn_op(ptr) == op_Const) &&
+ tarval_is_entity(get_Const_tarval(ptr))) {
+ ent = get_tarval_entity(get_Const_tarval(ptr));
+ }
+ if (ent)
+ ASSERT_AND_RET((mode == get_type_mode(get_entity_type(ent))),
+ "wrong data Proj from Load", 0);
+ else
+ ASSERT_AND_RET(mode_is_data(mode),
+ "wrong data Proj from Load", 0);
+ } else {
+ ASSERT_AND_RET(((proj == pn_Load_M && mode == mode_M) ||
+ (proj == pn_Load_X_except && mode == mode_X)),
+ "wrong Proj from Load", 0);
+ }
break;
case iro_Store:
int opcode, opcode1;
ir_mode *mymode, *op1mode = NULL, *op2mode, *op3mode;
int op_is_symmetric = 1; /* 0: asymmetric
-1: operands have identical modes
-2: modes of operands == mode of this node */
+ 1: operands have identical modes
+ 2: modes of operands == mode of this node */
type *mt; /* A method type */
ir_node **in;
switch (opcode)
{
+
+ case iro_Block:
+ for (i = 0; i < get_Block_n_cfgpreds(n); ++i) {
+ ir_node *pred = get_Block_cfgpred(n, i);
+ ASSERT_AND_RET((is_Bad(pred) || get_irn_op(pred) == op_Unknown || (get_irn_mode(pred) == mode_X)), "Block node", 0);
+ }
+ // End block may only have Return, Raise or fragile ops as preds.
+ if (n == get_irg_end_block(irg))
+ for (i = 0; i < get_Block_n_cfgpreds(n); ++i) {
+ ir_node *pred = skip_Proj(get_Block_cfgpred(n, i));
+ if (is_Proj(pred) || get_irn_op(pred) == op_Tuple)
+ break; // We can not test properly. How many tuples are there?
+ ASSERT_AND_RET(((get_irn_op(pred) == op_Return) ||
+ is_Bad(pred) ||
+ (get_irn_op(pred) == op_Raise) ||
+ is_fragile_op(pred) ),
+ "End Block node", 0);
+ }
+ break;
+
case iro_Start:
ASSERT_AND_RET(
/* Start: BB --> X x M x ref x data1 x ... x datan x ref */
/* Compare arguments of node with those of type */
mt = get_Call_type(n);
- if (get_method_variadicity(mt) == variadic) {
+ if (get_method_variadicity(mt) == variadicity_variadic) {
ASSERT_AND_RET(
get_Call_n_params(n) >= get_method_n_params(mt),
"Number of args for Call doesn't match number of args in variadic type.",
);
if (mode_is_reference(op1mode) != mode_is_reference(op2mode)) {
/* BB x ref x int --> ref or BB x int x ref --> ref */
- op_is_symmetric = 0; /* ArmRoq */
+ op_is_symmetric = 0;
} else {
/* BB x num x num --> num or BB x ref x ref */
op_is_symmetric = 2;
"Sub node", 0
);
if (mode_is_reference(op1mode) != mode_is_reference(op2mode)) {
- op_is_symmetric = 0; /* ArmRoq */
+ op_is_symmetric = 0;
} else {
op_is_symmetric = 2;
}
/* Free: BB x M x ref --> M */
op1mode == mode_M && mode_is_reference(op2mode) &&
mymode == mode_M,
- "Free node",0
+ "Free node", 0
);
break;
return vrfy_Proj_proj(n, irg);
break;
+ case iro_Confirm:
+ op1mode = get_irn_mode(in[1]);
+ op2mode = get_irn_mode(in[2]);
+ ASSERT_AND_RET(
+ /* Confirm: BB x T x T --> T */
+ op1mode == mymode &&
+ op2mode == mymode,
+ "Confirm node", 0
+ );
+
+ break;
+
default:
break;
}