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:
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_mode(pred) == mode_X)), "Block node", 0);
+ 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))