| Index: gcc/gcc/omega.c
|
| diff --git a/gcc/gcc/omega.c b/gcc/gcc/omega.c
|
| index 8f0470f6dfd64d65c722a82e827ddd9eef4f2688..666d4bd616d70752f084d0d2d15de7a050b56ec5 100644
|
| --- a/gcc/gcc/omega.c
|
| +++ b/gcc/gcc/omega.c
|
| @@ -1,11 +1,11 @@
|
| -/* 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, 2008 Free Software Foundation,
|
| + Changes copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
| Inc.
|
| Contributed by Sebastian Pop <sebastian.pop@inria.fr>
|
|
|
| @@ -35,7 +35,6 @@ along with GCC; see the file COPYING3. If not see
|
| #include "system.h"
|
| #include "coretypes.h"
|
| #include "tm.h"
|
| -#include "errors.h"
|
| #include "ggc.h"
|
| #include "tree.h"
|
| #include "diagnostic.h"
|
| @@ -508,7 +507,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 +673,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 +1305,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 +1358,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 +1525,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 +1643,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 +1685,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 +1834,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 +1853,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 +1875,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 +1975,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 +1992,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 +2131,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 +2161,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 +2205,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 +2266,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 +2285,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--)
|
| @@ -2470,12 +2468,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 +2526,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 +2556,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 +2576,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 +2647,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 +2742,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 +2755,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 +3047,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 +3447,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 +3490,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 +3590,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 +3722,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 +3855,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 +3868,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 +3896,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 +4160,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 +4282,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 +4412,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 +4800,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 +4828,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 +5114,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 +5307,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 +5422,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 +5496,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);
|
|
|