X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_tab_pip.c;h=9663979a4ba4e7b570ce52b4b478a33800c062d6;hb=b35a6a202fe8bd218af5152420e1dabeb79f10d4;hp=f131ccf4754fa71ccf0289aae4ca78368c4a0427;hpb=5ee2cb71bd59bf8f86be6cbfbccced1aa6ae47a0;p=platform%2Fupstream%2Fisl.git diff --git a/isl_tab_pip.c b/isl_tab_pip.c index f131ccf..9663979 100644 --- a/isl_tab_pip.c +++ b/isl_tab_pip.c @@ -102,6 +102,8 @@ struct isl_context_op { void *(*save)(struct isl_context *context); /* restore saved context */ void (*restore)(struct isl_context *context, void *); + /* discard saved context */ + void (*discard)(void *); /* invalidate context */ void (*invalidate)(struct isl_context *context); /* free context */ @@ -307,6 +309,8 @@ static void sol_pop(struct isl_sol *sol) struct isl_basic_set *bset; bset = sol_domain(sol); + if (!bset) + goto error; isl_basic_set_free(partial->next->dom); partial->next->dom = bset; @@ -319,6 +323,9 @@ static void sol_pop(struct isl_sol *sol) } } else sol_pop_one(sol); + + if (0) +error: sol->error = 1; } static void sol_dec_level(struct isl_sol *sol) @@ -2418,6 +2425,10 @@ static void context_lex_restore(struct isl_context *context, void *save) } } +static void context_lex_discard(void *save) +{ +} + static int context_lex_is_ok(struct isl_context *context) { struct isl_context_lex *clex = (struct isl_context_lex *)context; @@ -2537,6 +2548,7 @@ struct isl_context_op isl_context_lex_op = { context_lex_is_ok, context_lex_save, context_lex_restore, + context_lex_discard, context_lex_invalidate, context_lex_free, }; @@ -3225,6 +3237,12 @@ error: cgbr->tab = NULL; } +static void context_gbr_discard(void *save) +{ + struct isl_gbr_tab_undo *snap = (struct isl_gbr_tab_undo *)save; + free(snap); +} + static int context_gbr_is_ok(struct isl_context *context) { struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context; @@ -3263,6 +3281,7 @@ struct isl_context_op isl_context_gbr_op = { context_gbr_is_ok, context_gbr_save, context_gbr_restore, + context_gbr_discard, context_gbr_invalidate, context_gbr_free, }; @@ -3561,6 +3580,8 @@ static void find_in_pos(struct isl_sol *sol, struct isl_tab *tab, isl_int *ineq) if (!sol->error) sol->context->op->restore(sol->context, saved); + else + sol->context->op->discard(saved); return; error: sol->error = 1; @@ -4763,11 +4784,13 @@ int isl_basic_map_foreach_lexopt(__isl_keep isl_basic_map *bmap, int max, struct isl_sol_for *sol_for = NULL; bmap = isl_basic_map_copy(bmap); + bmap = isl_basic_map_detect_equalities(bmap); if (!bmap) return -1; - bmap = isl_basic_map_detect_equalities(bmap); sol_for = sol_for_init(bmap, max, fn, user); + if (!sol_for) + goto error; if (isl_basic_map_plain_is_empty(bmap)) /* nothing */;