X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firverify.c;h=4868f07483a15eea4658d0dd4c84ba4293d60192;hb=a08e6f04aa3669cff094f94a9484c7c2bb1314d0;hp=4c30c34418972414a6b336b8811bb8830b8799d7;hpb=b6a361cfb2284fb2f6ae11998b3213cecbe996ed;p=libfirm diff --git a/ir/ir/irverify.c b/ir/ir/irverify.c index 4c30c3441..4868f0748 100644 --- a/ir/ir/irverify.c +++ b/ir/ir/irverify.c @@ -733,6 +733,17 @@ static int verify_node_Proj_Bound(const ir_node *p) return 1; } +static int verify_node_Proj_fragile(const ir_node *node) +{ + ir_node *pred = get_Proj_pred(node); + int throws_exception = ir_throws_exception(pred); + ASSERT_AND_RET((!is_x_except_Proj(node) || throws_exception) + && (!is_x_regular_Proj(node) || throws_exception), + "X_except und X_regular Proj only allowed when throws_exception is set", + 0); + return 1; +} + /** * verify a Proj node */ @@ -746,6 +757,12 @@ static int verify_node_Proj(const ir_node *p) ASSERT_AND_RET(get_irn_mode(pred) == mode_T, "mode of a 'projed' node is not Tuple", 0); ASSERT_AND_RET(get_irg_pinned(irg) == op_pin_state_floats || get_nodes_block(pred) == get_nodes_block(p), "Proj must be in same block as its predecessor", 0); + if (is_fragile_op(pred)) { + int res = verify_node_Proj_fragile(p); + if (res != 1) + return res; + } + op = get_irn_op(pred); if (op->ops.verify_proj_node) return op->ops.verify_proj_node(p); @@ -1858,7 +1875,7 @@ static int check_block_cfg(const ir_node *block, check_cfg_env_t *env) if (pn == pn_Cond_false) ir_nodeset_insert(&env->false_projs, branch); } else { - int default_pn = get_Cond_default_proj(branch); + long default_pn = get_Cond_default_proj(branch); if (pn == default_pn) ir_nodeset_insert(&env->true_projs, branch); }