X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fomega.c;h=35b20431346b3b133d7ac68964daa9438982c915;hb=db2761c823a5d3d268a55bd869d7877d3c2a124d;hp=ed6f536f39f6c8aad64adb37a0c60d7f26a661b2;hpb=5a30047cc1166eb6ec0def314673f9535c5d44b7;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/omega.c b/gcc/omega.c index ed6f536f39f..35b20431346 100644 --- a/gcc/omega.c +++ b/gcc/omega.c @@ -1,18 +1,19 @@ -/* Source code for an implementation of the Omega test, an integer - programming algorithm for dependence analysis, by William Pugh, +/* Source code for an implementation of the Omega test, an integer + programming algorithm for dependence analysis, by William Pugh, appeared in Supercomputing '91 and CACM Aug 92. This code has no license restrictions, and is considered public domain. - Changes copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. + Changes copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, + Inc. Contributed by Sebastian Pop This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later +Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY @@ -21,9 +22,8 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +along with GCC; see the file COPYING3. If not see +. */ /* For a detailed description, see "Constraint-Based Array Dependence Analysis" William Pugh, David Wonnacott, TOPLAS'98 and David @@ -35,11 +35,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "system.h" #include "coretypes.h" #include "tm.h" -#include "errors.h" #include "ggc.h" #include "tree.h" #include "diagnostic.h" -#include "varray.h" #include "tree-pass.h" #include "omega.h" @@ -508,7 +506,7 @@ omega_pretty_print_problem (FILE *file, omega_pb pb) none, le, lt } partial_order_type; - partial_order_type **po = XNEWVEC (partial_order_type *, + partial_order_type **po = XNEWVEC (partial_order_type *, OMEGA_MAX_VARS * OMEGA_MAX_VARS); int **po_eq = XNEWVEC (int *, OMEGA_MAX_VARS * OMEGA_MAX_VARS); int *last_links = XNEWVEC (int, OMEGA_MAX_VARS); @@ -674,7 +672,7 @@ omega_pretty_print_problem (FILE *file, omega_pb pb) } fprintf (file, "%s", omega_variable_to_str (pb, chain[0])); - + for (multiprint = false, i = 1; i < m; i++) { v = chain[i - 1]; @@ -1306,12 +1304,12 @@ verify_omega_pb (omega_pb pb) enum omega_result result; int e; bool any_color = false; - omega_pb tmp_problem = XNEW (struct omega_pb); + omega_pb tmp_problem = XNEW (struct omega_pb_d); omega_copy_problem (tmp_problem, pb); tmp_problem->safe_vars = 0; tmp_problem->num_subs = 0; - + for (e = pb->num_geqs - 1; e >= 0; e--) if (pb->geqs[e].color == omega_red) { @@ -1359,7 +1357,7 @@ verify_omega_pb (omega_pb pb) static void adding_equality_constraint (omega_pb pb, int e) { - if (original_problem != no_problem + if (original_problem != no_problem && original_problem != pb && !conservative) { @@ -1526,7 +1524,7 @@ normalize_omega_problem (omega_pb pb) { i = packing[i0]; pb->geqs[e].coef[i] = pb->geqs[e].coef[i] / g; - hashCode = hashCode * hash_key_multiplier * (i + 3) + hashCode = hashCode * hash_key_multiplier * (i + 3) + pb->geqs[e].coef[i]; } } @@ -1644,7 +1642,7 @@ normalize_omega_problem (omega_pb pb) } if (pb->geqs[e2].coef[0] == -cTerm - && (create_color + && (create_color || pb->geqs[e].color == omega_black)) { omega_copy_eqn (&pb->eqs[pb->num_eqs], &pb->geqs[e], @@ -1686,7 +1684,7 @@ normalize_omega_problem (omega_pb pb) e2 = fast_lookup[MAX_KEYS + eKey]; - if (e2 < e && pb->geqs[e2].key == eKey + if (e2 < e && pb->geqs[e2].key == eKey && pb->geqs[e2].color == omega_black) { if (pb->geqs[e2].coef[0] > cTerm) @@ -1835,7 +1833,7 @@ cleanout_wildcards (omega_pb pb) for (e2 = pb->num_eqs - 1; e2 >= 0; e2--) if (e != e2 && pb->eqs[e2].coef[i] && (pb->eqs[e2].color == omega_red - || (pb->eqs[e2].color == omega_black + || (pb->eqs[e2].color == omega_black && pb->eqs[e].color == omega_black))) { eqn eqn = &(pb->eqs[e2]); @@ -1854,9 +1852,9 @@ cleanout_wildcards (omega_pb pb) } for (e2 = pb->num_geqs - 1; e2 >= 0; e2--) - if (pb->geqs[e2].coef[i] + if (pb->geqs[e2].coef[i] && (pb->geqs[e2].color == omega_red - || (pb->eqs[e].color == omega_black + || (pb->eqs[e].color == omega_black && pb->geqs[e2].color == omega_black))) { eqn eqn = &(pb->geqs[e2]); @@ -1876,9 +1874,9 @@ cleanout_wildcards (omega_pb pb) } for (e2 = pb->num_subs - 1; e2 >= 0; e2--) - if (pb->subs[e2].coef[i] + if (pb->subs[e2].coef[i] && (pb->subs[e2].color == omega_red - || (pb->subs[e2].color == omega_black + || (pb->subs[e2].color == omega_black && pb->eqs[e].color == omega_black))) { eqn eqn = &(pb->subs[e2]); @@ -1976,10 +1974,10 @@ omega_unprotect_1 (omega_pb pb, int *idx, bool *unprotect) static void resurrect_subs (omega_pb pb) { - if (pb->num_subs > 0 + if (pb->num_subs > 0 && please_no_equalities_in_simplified_problems == 0) { - int i, e, n, m; + int i, e, m; if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -1993,7 +1991,6 @@ resurrect_subs (omega_pb pb) omega_unprotect_1 (pb, &i, NULL); m = pb->num_subs; - n = MAX (pb->num_vars, pb->safe_vars + m); for (e = pb->num_geqs - 1; e >= 0; e--) if (single_var_geq (&pb->geqs[e], pb->num_vars)) @@ -2133,7 +2130,7 @@ omega_eliminate_redundant (omega_pb pb, bool expensive) continue; foundPQ: - pz = ((zeqs[e1] & zeqs[e2]) | (peqs[e1] & neqs[e2]) + pz = ((zeqs[e1] & zeqs[e2]) | (peqs[e1] & neqs[e2]) | (neqs[e1] & peqs[e2])); pp = peqs[e1] | peqs[e2]; pn = neqs[e1] | neqs[e2]; @@ -2163,7 +2160,7 @@ omega_eliminate_redundant (omega_pb pb, bool expensive) if (alpha3 > 0) { /* Trying to prove e3 is redundant. */ - if (!implies (peqs[e3], pp) + if (!implies (peqs[e3], pp) || !implies (neqs[e3], pn)) goto nextE3; @@ -2207,7 +2204,7 @@ omega_eliminate_redundant (omega_pb pb, bool expensive) /* Trying to prove e3 <= 0 and therefore e3 = 0, or trying to prove e3 < 0, and therefore the problem has no solutions. */ - if (!implies (peqs[e3], pn) + if (!implies (peqs[e3], pn) || !implies (neqs[e3], pp)) goto nextE3; @@ -2268,7 +2265,7 @@ omega_eliminate_redundant (omega_pb pb, bool expensive) fprintf (dump_file, "\n\n"); } - omega_copy_eqn (&pb->eqs[pb->num_eqs++], + omega_copy_eqn (&pb->eqs[pb->num_eqs++], &pb->geqs[e3], pb->num_vars); gcc_assert (pb->num_eqs <= OMEGA_MAX_EQS); adding_equality_constraint (pb, pb->num_eqs - 1); @@ -2287,7 +2284,7 @@ omega_eliminate_redundant (omega_pb pb, bool expensive) if (!expensive) goto eliminate_redundant_done; - tmp_problem = XNEW (struct omega_pb); + tmp_problem = XNEW (struct omega_pb_d); conservative++; for (e = pb->num_geqs - 1; e >= 0; e--) @@ -2434,7 +2431,7 @@ smooth_weird_equations (omega_pb pb) if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, - "Smoothing wierd equations; adding:\n"); + "Smoothing weird equations; adding:\n"); omega_print_geq (dump_file, pb, &pb->geqs[e3]); fprintf (dump_file, "\nto:\n"); omega_print_problem (dump_file, pb); @@ -2470,12 +2467,12 @@ coalesce (omega_pb pb) is_dead[e] = false; for (e = 0; e < pb->num_geqs; e++) - if (pb->geqs[e].color == omega_red + if (pb->geqs[e].color == omega_red && !pb->geqs[e].touched) for (e2 = e + 1; e2 < pb->num_geqs; e2++) - if (!pb->geqs[e2].touched + if (!pb->geqs[e2].touched && pb->geqs[e].key == -pb->geqs[e2].key - && pb->geqs[e].coef[0] == -pb->geqs[e2].coef[0] + && pb->geqs[e].coef[0] == -pb->geqs[e2].coef[0] && pb->geqs[e2].color == omega_red) { omega_copy_eqn (&pb->eqs[pb->num_eqs++], &pb->geqs[e], @@ -2528,7 +2525,7 @@ omega_eliminate_red (omega_pb pb, bool eliminate_all) for (e = pb->num_geqs - 1; e >= 0; e--) if (pb->geqs[e].color == omega_black && !is_dead[e]) for (e2 = e - 1; e2 >= 0; e2--) - if (pb->geqs[e2].color == omega_black + if (pb->geqs[e2].color == omega_black && !is_dead[e2]) { a = 0; @@ -2558,7 +2555,7 @@ omega_eliminate_red (omega_pb pb, bool eliminate_all) for (e3 = pb->num_geqs - 1; e3 >= 0; e3--) if (pb->geqs[e3].color == omega_red) { - alpha1 = (pb->geqs[e2].coef[j] * pb->geqs[e3].coef[i] + alpha1 = (pb->geqs[e2].coef[j] * pb->geqs[e3].coef[i] - pb->geqs[e2].coef[i] * pb->geqs[e3].coef[j]); alpha2 = -(pb->geqs[e].coef[j] * pb->geqs[e3].coef[i] - pb->geqs[e].coef[i] * pb->geqs[e3].coef[j]); @@ -2578,7 +2575,7 @@ omega_eliminate_red (omega_pb pb, bool eliminate_all) for (k = pb->num_vars; k >= 0; k--) { - c = (alpha1 * pb->geqs[e].coef[k] + c = (alpha1 * pb->geqs[e].coef[k] + alpha2 * pb->geqs[e2].coef[k]); if (c != a * pb->geqs[e3].coef[k]) @@ -2649,7 +2646,7 @@ omega_eliminate_red (omega_pb pb, bool eliminate_all) return; conservative++; - tmp_problem = XNEW (struct omega_pb); + tmp_problem = XNEW (struct omega_pb_d); for (e = pb->num_geqs - 1; e >= 0; e--) if (pb->geqs[e].color == omega_red) @@ -2744,7 +2741,7 @@ static void omega_problem_reduced (omega_pb pb) { if (omega_verify_simplification - && !in_approximate_mode + && !in_approximate_mode && verify_omega_pb (pb) == omega_false) return; @@ -2757,7 +2754,7 @@ omega_problem_reduced (omega_pb pb) if (!please_no_equalities_in_simplified_problems) coalesce (pb); - if (omega_reduce_with_subs + if (omega_reduce_with_subs || please_no_equalities_in_simplified_problems) chain_unprotect (pb); else @@ -3049,7 +3046,8 @@ omega_do_elimination (omega_pb pb, int e, int i) eqn->coef[j] *= a; k = eqn->coef[i]; eqn->coef[i] = 0; - eqn->color |= sub->color; + if (sub->color == omega_red) + eqn->color = omega_red; for (j = n_vars; j >= 0; j--) eqn->coef[j] -= sub->coef[j] * k / c; } @@ -3448,7 +3446,7 @@ omega_solve_eq (omega_pb pb, enum omega_result desired_res) j = 0; for (i = pb->num_vars; i != sv; i--) - if (pb->eqs[e].coef[i] != 0 + if (pb->eqs[e].coef[i] != 0 && factor > abs (pb->eqs[e].coef[i]) + 1) { factor = abs (pb->eqs[e].coef[i]) + 1; @@ -3491,7 +3489,7 @@ parallel_splinter (omega_pb pb, int e, int diff, omega_print_problem (dump_file, pb); } - tmp_problem = XNEW (struct omega_pb); + tmp_problem = XNEW (struct omega_pb_d); omega_copy_eqn (&pb->eqs[0], &pb->geqs[e], pb->num_vars); pb->num_eqs = 1; @@ -3591,7 +3589,7 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) c = int_div (c, -a); if (upper_bound > c - || (upper_bound == c + || (upper_bound == c && !omega_eqn_is_red (&pb->geqs[e], desired_res))) { upper_bound = c; @@ -3723,7 +3721,6 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) int max_splinters = 1; bool exact = false; bool lucky_exact = false; - int neweqns = 0; int best = (INT_MAX); int j = 0, jLe = 0, jLowerBoundCount = 0; @@ -3857,12 +3854,12 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) lucky = (diff >= (Uc - 1) * (Lc - 1)); } - if (maxC == 1 - || minC == -1 - || lucky + if (maxC == 1 + || minC == -1 + || lucky || in_approximate_mode) { - neweqns = score = upper_bound_count * lower_bound_count; + score = upper_bound_count * lower_bound_count; if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, @@ -3870,7 +3867,7 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) "\nlucky = %d, in_approximate_mode=%d \n", omega_variable_to_str (pb, i), upper_bound_count, - lower_bound_count, minC, maxC, lucky, + lower_bound_count, minC, maxC, lucky, in_approximate_mode); if (!exact @@ -3898,7 +3895,6 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) upper_bound_count, lower_bound_count, minC, maxC); - neweqns = upper_bound_count * lower_bound_count; score = maxC - minC; if (best > score) @@ -4163,9 +4159,9 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) { constantTerm = -int_div (constantTerm, coefficient); - if (constantTerm > lower_bound - || (constantTerm == lower_bound - && (desired_res != omega_simplify + if (constantTerm > lower_bound + || (constantTerm == lower_bound + && (desired_res != omega_simplify || (pb->geqs[Ue].color == omega_black && pb->geqs[Le].color == omega_black)))) { @@ -4285,7 +4281,7 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) } else { - if (!conservative + if (!conservative && (desired_res != omega_simplify || (lb_color == omega_black && ub_color == omega_black)) @@ -4415,7 +4411,7 @@ omega_solve_geq (omega_pb pb, enum omega_result desired_res) pb->geqs[e2].coef[n_vars + 1] = 0; pb->geqs[e2].touched = 1; - if (pb->geqs[Ue].color == omega_red + if (pb->geqs[Ue].color == omega_red || pb->geqs[Le].color == omega_red) pb->geqs[e2].color = omega_red; else @@ -4803,7 +4799,7 @@ omega_solve_problem (omega_pb pb, enum omega_result desired_res) { if (dump_file && (dump_flags & TDF_DETAILS)) { - fprintf (dump_file, + fprintf (dump_file, "Solve depth = %d, in_approximate_mode = %d, aborting\n", omega_solve_depth, in_approximate_mode); omega_print_problem (dump_file, pb); @@ -4831,7 +4827,7 @@ omega_solve_problem (omega_pb pb, enum omega_result desired_res) if (!omega_reduce_with_subs) { resurrect_subs (pb); - gcc_assert (please_no_equalities_in_simplified_problems + gcc_assert (please_no_equalities_in_simplified_problems || !result || pb->num_subs == 0); } @@ -5117,7 +5113,7 @@ omega_unprotect_variable (omega_pb pb, int var) { for (e = pb->num_geqs - 1; e >= 0; e--) { - pb->geqs[e].coef[pb->num_vars] = + pb->geqs[e].coef[pb->num_vars] = pb->geqs[e].coef[pb->safe_vars]; pb->geqs[e].coef[pb->safe_vars] = 0; @@ -5310,7 +5306,7 @@ omega_query_variable (omega_pb pb, int i, int *lower_bound, int *upper_bound) continue; else { - *lower_bound = *upper_bound = + *lower_bound = *upper_bound = -pb->eqs[e].coef[i] * pb->eqs[e].coef[0]; return false; } @@ -5425,7 +5421,7 @@ omega_query_variable_bounds (omega_pb pb, int i, int *l, int *u) || (pb->num_vars == 1 && pb->forwarding_address[i] == 1)) return false; - if (abs (pb->forwarding_address[i]) == 1 + if (abs (pb->forwarding_address[i]) == 1 && pb->num_vars + pb->num_subs == 2 && pb->num_eqs + pb->num_subs == 1) { @@ -5499,7 +5495,7 @@ omega_alloc_problem (int nvars, int nprot) omega_initialize (); /* Allocate and initialize PB. */ - pb = XCNEW (struct omega_pb); + pb = XCNEW (struct omega_pb_d); pb->var = XCNEWVEC (int, OMEGA_MAX_VARS + 2); pb->forwarding_address = XCNEWVEC (int, OMEGA_MAX_VARS + 2); pb->geqs = omega_alloc_eqns (0, OMEGA_MAX_GEQS);