X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Flower%2Flower_switch.c;h=28badb3c22130089c708dfd5017dcd16bf8bbabe;hb=58145b34ccd4c05fc1975cf8ba712e4b05cffa12;hp=2d4e2140c8994f33dc1b3b6df10e81d7f6bacf6f;hpb=6e5fd745c70d70f56fbe65df64983675897eb304;p=libfirm diff --git a/ir/lower/lower_switch.c b/ir/lower/lower_switch.c index 2d4e2140c..28badb3c2 100644 --- a/ir/lower/lower_switch.c +++ b/ir/lower/lower_switch.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -98,8 +98,8 @@ static void analyse_switch(cond_env_t *env, ir_node *cond) static int casecmp(const void *a, const void *b) { - const case_data_t *cda = a; - const case_data_t *cdb = b; + const case_data_t *cda = (const case_data_t*)a; + const case_data_t *cdb = (const case_data_t*)b; /* * Enforce unsigned sorting. Signed comparison will behave differently for @@ -139,13 +139,13 @@ static void create_if_cascade(cond_env_t *env, dbg_info *dbgi, ir_node *block, if (numcases == 0) { /* zero cases: "goto default;" */ - ARR_APP1(ir_node*, env->defusers, new_Jmp()); + ARR_APP1(ir_node*, env->defusers, new_r_Jmp(block)); } else if (numcases == 1) { /* only one case: "if (sel == val) goto target else goto default;" */ ir_node *val = new_r_Const_long(irg, cmp_mode, curcases[0].value); - ir_node *cmp = new_rd_Cmp(dbgi, block, cmp_sel, val); - ir_node *proj = new_r_Proj(cmp, mode_b, pn_Cmp_Eq); - ir_node *cond = new_rd_Cond(dbgi, block, proj); + ir_node *cmp = new_rd_Cmp(dbgi, block, cmp_sel, val, + ir_relation_equal); + ir_node *cond = new_rd_Cond(dbgi, block, cmp); ir_node *trueproj = new_r_Proj(cond, mode_X, pn_Cond_true); ir_node *falseproj = new_r_Proj(cond, mode_X, pn_Cond_false); @@ -154,9 +154,9 @@ static void create_if_cascade(cond_env_t *env, dbg_info *dbgi, ir_node *block, } else if (numcases == 2) { /* only two cases: "if (sel == val[0]) goto target[0];" */ ir_node *val = new_r_Const_long(irg, cmp_mode, curcases[0].value); - ir_node *cmp = new_rd_Cmp(dbgi, block, cmp_sel, val); - ir_node *proj = new_r_Proj(cmp, mode_b, pn_Cmp_Eq); - ir_node *cond = new_rd_Cond(dbgi, block, proj); + ir_node *cmp = new_rd_Cmp(dbgi, block, cmp_sel, val, + ir_relation_equal); + ir_node *cond = new_rd_Cond(dbgi, block, cmp); ir_node *trueproj = new_r_Proj(cond, mode_X, pn_Cond_true); ir_node *falseproj = new_r_Proj(cond, mode_X, pn_Cond_false); ir_node *in[1]; @@ -169,9 +169,8 @@ static void create_if_cascade(cond_env_t *env, dbg_info *dbgi, ir_node *block, /* second part: "else if (sel == val[1]) goto target[1] else goto default;" */ val = new_r_Const_long(irg, cmp_mode, curcases[1].value); - cmp = new_rd_Cmp(dbgi, neblock, cmp_sel, val); - proj = new_r_Proj(cmp, mode_b, pn_Cmp_Eq); - cond = new_rd_Cond(dbgi, neblock, proj); + cmp = new_rd_Cmp(dbgi, neblock, cmp_sel, val, ir_relation_equal); + cond = new_rd_Cond(dbgi, neblock, cmp); trueproj = new_r_Proj(cond, mode_X, pn_Cond_true); falseproj = new_r_Proj(cond, mode_X, pn_Cond_false); set_Block_cfgpred(curcases[1].target, 0, trueproj); @@ -181,9 +180,8 @@ static void create_if_cascade(cond_env_t *env, dbg_info *dbgi, ir_node *block, int midcase = numcases / 2; ir_node *val = new_r_Const_long(irg, cmp_mode, curcases[midcase].value); - ir_node *cmp = new_rd_Cmp(dbgi, block, cmp_sel, val); - ir_node *proj = new_r_Proj(cmp, mode_b, pn_Cmp_Lt); - ir_node *cond = new_rd_Cond(dbgi, block, proj); + ir_node *cmp = new_rd_Cmp(dbgi, block, cmp_sel, val, ir_relation_less); + ir_node *cond = new_rd_Cond(dbgi, block, cmp); ir_node *in[1]; ir_node *ltblock; ir_node *geblock; @@ -214,11 +212,10 @@ static void create_out_of_bounds_check(cond_env_t *env, ir_node *cond) ir_node *proj_true; ir_node *proj_false; ir_node *cmp; - ir_node *proj_cmp; ir_node *oob_cond; ir_node *in[1]; ir_node *new_block; - int n_default_preds; + size_t n_default_preds; int i; ir_node *proj; @@ -235,13 +232,13 @@ static void create_out_of_bounds_check(cond_env_t *env, ir_node *cond) delta = env->switch_min; env->switch_min = 0; env->switch_max -= delta; + set_Cond_selector(cond, sel); } /* check for out-of-bounds */ max_const = new_r_Const_long(irg, cmp_mode, env->switch_max); - cmp = new_rd_Cmp(dbgi, block, sel, max_const); - proj_cmp = new_r_Proj(cmp, mode_b, pn_Cmp_Le); - oob_cond = new_rd_Cond(dbgi, block, proj_cmp); + cmp = new_rd_Cmp(dbgi, block, sel, max_const, ir_relation_less_equal); + oob_cond = new_rd_Cond(dbgi, block, cmp); proj_true = new_r_Proj(oob_cond, mode_X, pn_Cond_true); proj_false = new_r_Proj(oob_cond, mode_X, pn_Cond_false); @@ -274,7 +271,7 @@ static void create_out_of_bounds_check(cond_env_t *env, ir_node *cond) /* adapt default block */ n_default_preds = ARR_LEN(default_preds); if (n_default_preds > 1) { - int i; + size_t i; /* create new intermediate blocks so we don't have critical edges */ for (i = 0; i < n_default_preds; ++i) { @@ -298,7 +295,7 @@ static void create_out_of_bounds_check(cond_env_t *env, ir_node *cond) */ static void find_cond_nodes(ir_node *block, void *ctx) { - walk_env_t *env = ctx; + walk_env_t *env = (walk_env_t *)ctx; ir_node *projx; ir_node *cond; ir_node *sel;