comparison gcc/omega.c @ 55:77e2b8dfacca gcc-4.4.5

update it from 4.4.3 to 4.5.0
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 23:39:51 +0900
parents a06113de4d67
children b7f97abdc517
comparison
equal deleted inserted replaced
52:c156f1bd5cd9 55:77e2b8dfacca
1 /* Source code for an implementation of the Omega test, an integer 1 /* Source code for an implementation of the Omega test, an integer
2 programming algorithm for dependence analysis, by William Pugh, 2 programming algorithm for dependence analysis, by William Pugh,
3 appeared in Supercomputing '91 and CACM Aug 92. 3 appeared in Supercomputing '91 and CACM Aug 92.
4 4
5 This code has no license restrictions, and is considered public 5 This code has no license restrictions, and is considered public
6 domain. 6 domain.
7 7
8 Changes copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, 8 Changes copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
9 Inc. 9 Inc.
10 Contributed by Sebastian Pop <sebastian.pop@inria.fr> 10 Contributed by Sebastian Pop <sebastian.pop@inria.fr>
11 11
12 This file is part of GCC. 12 This file is part of GCC.
13 13
33 33
34 #include "config.h" 34 #include "config.h"
35 #include "system.h" 35 #include "system.h"
36 #include "coretypes.h" 36 #include "coretypes.h"
37 #include "tm.h" 37 #include "tm.h"
38 #include "errors.h"
39 #include "ggc.h" 38 #include "ggc.h"
40 #include "tree.h" 39 #include "tree.h"
41 #include "diagnostic.h" 40 #include "diagnostic.h"
42 #include "varray.h" 41 #include "varray.h"
43 #include "tree-pass.h" 42 #include "tree-pass.h"
506 505
507 typedef enum { 506 typedef enum {
508 none, le, lt 507 none, le, lt
509 } partial_order_type; 508 } partial_order_type;
510 509
511 partial_order_type **po = XNEWVEC (partial_order_type *, 510 partial_order_type **po = XNEWVEC (partial_order_type *,
512 OMEGA_MAX_VARS * OMEGA_MAX_VARS); 511 OMEGA_MAX_VARS * OMEGA_MAX_VARS);
513 int **po_eq = XNEWVEC (int *, OMEGA_MAX_VARS * OMEGA_MAX_VARS); 512 int **po_eq = XNEWVEC (int *, OMEGA_MAX_VARS * OMEGA_MAX_VARS);
514 int *last_links = XNEWVEC (int, OMEGA_MAX_VARS); 513 int *last_links = XNEWVEC (int, OMEGA_MAX_VARS);
515 int *first_links = XNEWVEC (int, OMEGA_MAX_VARS); 514 int *first_links = XNEWVEC (int, OMEGA_MAX_VARS);
516 int *chain_length = XNEWVEC (int, OMEGA_MAX_VARS); 515 int *chain_length = XNEWVEC (int, OMEGA_MAX_VARS);
672 chain[m++] = v2; 671 chain[m++] = v2;
673 v = v2; 672 v = v2;
674 } 673 }
675 674
676 fprintf (file, "%s", omega_variable_to_str (pb, chain[0])); 675 fprintf (file, "%s", omega_variable_to_str (pb, chain[0]));
677 676
678 for (multiprint = false, i = 1; i < m; i++) 677 for (multiprint = false, i = 1; i < m; i++)
679 { 678 {
680 v = chain[i - 1]; 679 v = chain[i - 1];
681 v2 = chain[i]; 680 v2 = chain[i];
682 681
1304 verify_omega_pb (omega_pb pb) 1303 verify_omega_pb (omega_pb pb)
1305 { 1304 {
1306 enum omega_result result; 1305 enum omega_result result;
1307 int e; 1306 int e;
1308 bool any_color = false; 1307 bool any_color = false;
1309 omega_pb tmp_problem = XNEW (struct omega_pb); 1308 omega_pb tmp_problem = XNEW (struct omega_pb_d);
1310 1309
1311 omega_copy_problem (tmp_problem, pb); 1310 omega_copy_problem (tmp_problem, pb);
1312 tmp_problem->safe_vars = 0; 1311 tmp_problem->safe_vars = 0;
1313 tmp_problem->num_subs = 0; 1312 tmp_problem->num_subs = 0;
1314 1313
1315 for (e = pb->num_geqs - 1; e >= 0; e--) 1314 for (e = pb->num_geqs - 1; e >= 0; e--)
1316 if (pb->geqs[e].color == omega_red) 1315 if (pb->geqs[e].color == omega_red)
1317 { 1316 {
1318 any_color = true; 1317 any_color = true;
1319 break; 1318 break;
1357 /* Add a new equality to problem PB at last position E. */ 1356 /* Add a new equality to problem PB at last position E. */
1358 1357
1359 static void 1358 static void
1360 adding_equality_constraint (omega_pb pb, int e) 1359 adding_equality_constraint (omega_pb pb, int e)
1361 { 1360 {
1362 if (original_problem != no_problem 1361 if (original_problem != no_problem
1363 && original_problem != pb 1362 && original_problem != pb
1364 && !conservative) 1363 && !conservative)
1365 { 1364 {
1366 int i, j; 1365 int i, j;
1367 int e2 = original_problem->num_eqs++; 1366 int e2 = original_problem->num_eqs++;
1524 1523
1525 for (; i0 >= 0; i0--) 1524 for (; i0 >= 0; i0--)
1526 { 1525 {
1527 i = packing[i0]; 1526 i = packing[i0];
1528 pb->geqs[e].coef[i] = pb->geqs[e].coef[i] / g; 1527 pb->geqs[e].coef[i] = pb->geqs[e].coef[i] / g;
1529 hashCode = hashCode * hash_key_multiplier * (i + 3) 1528 hashCode = hashCode * hash_key_multiplier * (i + 3)
1530 + pb->geqs[e].coef[i]; 1529 + pb->geqs[e].coef[i];
1531 } 1530 }
1532 } 1531 }
1533 1532
1534 g2 = abs (hashCode); 1533 g2 = abs (hashCode);
1642 } 1641 }
1643 return normalize_false; 1642 return normalize_false;
1644 } 1643 }
1645 1644
1646 if (pb->geqs[e2].coef[0] == -cTerm 1645 if (pb->geqs[e2].coef[0] == -cTerm
1647 && (create_color 1646 && (create_color
1648 || pb->geqs[e].color == omega_black)) 1647 || pb->geqs[e].color == omega_black))
1649 { 1648 {
1650 omega_copy_eqn (&pb->eqs[pb->num_eqs], &pb->geqs[e], 1649 omega_copy_eqn (&pb->eqs[pb->num_eqs], &pb->geqs[e],
1651 pb->num_vars); 1650 pb->num_vars);
1652 if (pb->geqs[e].color == omega_black) 1651 if (pb->geqs[e].color == omega_black)
1684 } 1683 }
1685 } 1684 }
1686 1685
1687 e2 = fast_lookup[MAX_KEYS + eKey]; 1686 e2 = fast_lookup[MAX_KEYS + eKey];
1688 1687
1689 if (e2 < e && pb->geqs[e2].key == eKey 1688 if (e2 < e && pb->geqs[e2].key == eKey
1690 && pb->geqs[e2].color == omega_black) 1689 && pb->geqs[e2].color == omega_black)
1691 { 1690 {
1692 if (pb->geqs[e2].coef[0] > cTerm) 1691 if (pb->geqs[e2].coef[0] > cTerm)
1693 { 1692 {
1694 if (pb->geqs[e].color == omega_black) 1693 if (pb->geqs[e].color == omega_black)
1833 } 1832 }
1834 1833
1835 for (e2 = pb->num_eqs - 1; e2 >= 0; e2--) 1834 for (e2 = pb->num_eqs - 1; e2 >= 0; e2--)
1836 if (e != e2 && pb->eqs[e2].coef[i] 1835 if (e != e2 && pb->eqs[e2].coef[i]
1837 && (pb->eqs[e2].color == omega_red 1836 && (pb->eqs[e2].color == omega_red
1838 || (pb->eqs[e2].color == omega_black 1837 || (pb->eqs[e2].color == omega_black
1839 && pb->eqs[e].color == omega_black))) 1838 && pb->eqs[e].color == omega_black)))
1840 { 1839 {
1841 eqn eqn = &(pb->eqs[e2]); 1840 eqn eqn = &(pb->eqs[e2]);
1842 int var, k; 1841 int var, k;
1843 1842
1852 eqn->coef[i] = 0; 1851 eqn->coef[i] = 0;
1853 divide_eqn_by_gcd (eqn, n_vars); 1852 divide_eqn_by_gcd (eqn, n_vars);
1854 } 1853 }
1855 1854
1856 for (e2 = pb->num_geqs - 1; e2 >= 0; e2--) 1855 for (e2 = pb->num_geqs - 1; e2 >= 0; e2--)
1857 if (pb->geqs[e2].coef[i] 1856 if (pb->geqs[e2].coef[i]
1858 && (pb->geqs[e2].color == omega_red 1857 && (pb->geqs[e2].color == omega_red
1859 || (pb->eqs[e].color == omega_black 1858 || (pb->eqs[e].color == omega_black
1860 && pb->geqs[e2].color == omega_black))) 1859 && pb->geqs[e2].color == omega_black)))
1861 { 1860 {
1862 eqn eqn = &(pb->geqs[e2]); 1861 eqn eqn = &(pb->geqs[e2]);
1863 int var, k; 1862 int var, k;
1864 1863
1874 eqn->touched = 1; 1873 eqn->touched = 1;
1875 renormalize = true; 1874 renormalize = true;
1876 } 1875 }
1877 1876
1878 for (e2 = pb->num_subs - 1; e2 >= 0; e2--) 1877 for (e2 = pb->num_subs - 1; e2 >= 0; e2--)
1879 if (pb->subs[e2].coef[i] 1878 if (pb->subs[e2].coef[i]
1880 && (pb->subs[e2].color == omega_red 1879 && (pb->subs[e2].color == omega_red
1881 || (pb->subs[e2].color == omega_black 1880 || (pb->subs[e2].color == omega_black
1882 && pb->eqs[e].color == omega_black))) 1881 && pb->eqs[e].color == omega_black)))
1883 { 1882 {
1884 eqn eqn = &(pb->subs[e2]); 1883 eqn eqn = &(pb->subs[e2]);
1885 int var, k; 1884 int var, k;
1886 1885
1974 substituted variables in PB. */ 1973 substituted variables in PB. */
1975 1974
1976 static void 1975 static void
1977 resurrect_subs (omega_pb pb) 1976 resurrect_subs (omega_pb pb)
1978 { 1977 {
1979 if (pb->num_subs > 0 1978 if (pb->num_subs > 0
1980 && please_no_equalities_in_simplified_problems == 0) 1979 && please_no_equalities_in_simplified_problems == 0)
1981 { 1980 {
1982 int i, e, n, m; 1981 int i, e, m;
1983 1982
1984 if (dump_file && (dump_flags & TDF_DETAILS)) 1983 if (dump_file && (dump_flags & TDF_DETAILS))
1985 { 1984 {
1986 fprintf (dump_file, 1985 fprintf (dump_file,
1987 "problem reduced, bringing variables back to life\n"); 1986 "problem reduced, bringing variables back to life\n");
1991 for (i = 1; omega_safe_var_p (pb, i); i++) 1990 for (i = 1; omega_safe_var_p (pb, i); i++)
1992 if (omega_wildcard_p (pb, i)) 1991 if (omega_wildcard_p (pb, i))
1993 omega_unprotect_1 (pb, &i, NULL); 1992 omega_unprotect_1 (pb, &i, NULL);
1994 1993
1995 m = pb->num_subs; 1994 m = pb->num_subs;
1996 n = MAX (pb->num_vars, pb->safe_vars + m);
1997 1995
1998 for (e = pb->num_geqs - 1; e >= 0; e--) 1996 for (e = pb->num_geqs - 1; e >= 0; e--)
1999 if (single_var_geq (&pb->geqs[e], pb->num_vars)) 1997 if (single_var_geq (&pb->geqs[e], pb->num_vars))
2000 { 1998 {
2001 if (!omega_safe_var_p (pb, abs (pb->geqs[e].key))) 1999 if (!omega_safe_var_p (pb, abs (pb->geqs[e].key)))
2131 goto foundPQ; 2129 goto foundPQ;
2132 2130
2133 continue; 2131 continue;
2134 2132
2135 foundPQ: 2133 foundPQ:
2136 pz = ((zeqs[e1] & zeqs[e2]) | (peqs[e1] & neqs[e2]) 2134 pz = ((zeqs[e1] & zeqs[e2]) | (peqs[e1] & neqs[e2])
2137 | (neqs[e1] & peqs[e2])); 2135 | (neqs[e1] & peqs[e2]));
2138 pp = peqs[e1] | peqs[e2]; 2136 pp = peqs[e1] | peqs[e2];
2139 pn = neqs[e1] | neqs[e2]; 2137 pn = neqs[e1] | neqs[e2];
2140 2138
2141 for (e3 = pb->num_geqs - 1; e3 >= 0; e3--) 2139 for (e3 = pb->num_geqs - 1; e3 >= 0; e3--)
2161 } 2159 }
2162 2160
2163 if (alpha3 > 0) 2161 if (alpha3 > 0)
2164 { 2162 {
2165 /* Trying to prove e3 is redundant. */ 2163 /* Trying to prove e3 is redundant. */
2166 if (!implies (peqs[e3], pp) 2164 if (!implies (peqs[e3], pp)
2167 || !implies (neqs[e3], pn)) 2165 || !implies (neqs[e3], pn))
2168 goto nextE3; 2166 goto nextE3;
2169 2167
2170 if (pb->geqs[e3].color == omega_black 2168 if (pb->geqs[e3].color == omega_black
2171 && (pb->geqs[e1].color == omega_red 2169 && (pb->geqs[e1].color == omega_red
2205 else 2203 else
2206 { 2204 {
2207 /* Trying to prove e3 <= 0 and therefore e3 = 0, 2205 /* Trying to prove e3 <= 0 and therefore e3 = 0,
2208 or trying to prove e3 < 0, and therefore the 2206 or trying to prove e3 < 0, and therefore the
2209 problem has no solutions. */ 2207 problem has no solutions. */
2210 if (!implies (peqs[e3], pn) 2208 if (!implies (peqs[e3], pn)
2211 || !implies (neqs[e3], pp)) 2209 || !implies (neqs[e3], pp))
2212 goto nextE3; 2210 goto nextE3;
2213 2211
2214 if (pb->geqs[e1].color == omega_red 2212 if (pb->geqs[e1].color == omega_red
2215 || pb->geqs[e2].color == omega_red 2213 || pb->geqs[e2].color == omega_red
2266 fprintf (dump_file, "\n=> inverse "); 2264 fprintf (dump_file, "\n=> inverse ");
2267 omega_print_geq (dump_file, pb, &(pb->geqs[e3])); 2265 omega_print_geq (dump_file, pb, &(pb->geqs[e3]));
2268 fprintf (dump_file, "\n\n"); 2266 fprintf (dump_file, "\n\n");
2269 } 2267 }
2270 2268
2271 omega_copy_eqn (&pb->eqs[pb->num_eqs++], 2269 omega_copy_eqn (&pb->eqs[pb->num_eqs++],
2272 &pb->geqs[e3], pb->num_vars); 2270 &pb->geqs[e3], pb->num_vars);
2273 gcc_assert (pb->num_eqs <= OMEGA_MAX_EQS); 2271 gcc_assert (pb->num_eqs <= OMEGA_MAX_EQS);
2274 adding_equality_constraint (pb, pb->num_eqs - 1); 2272 adding_equality_constraint (pb, pb->num_eqs - 1);
2275 is_dead[e3] = true; 2273 is_dead[e3] = true;
2276 } 2274 }
2285 omega_delete_geq (pb, e, pb->num_vars); 2283 omega_delete_geq (pb, e, pb->num_vars);
2286 2284
2287 if (!expensive) 2285 if (!expensive)
2288 goto eliminate_redundant_done; 2286 goto eliminate_redundant_done;
2289 2287
2290 tmp_problem = XNEW (struct omega_pb); 2288 tmp_problem = XNEW (struct omega_pb_d);
2291 conservative++; 2289 conservative++;
2292 2290
2293 for (e = pb->num_geqs - 1; e >= 0; e--) 2291 for (e = pb->num_geqs - 1; e >= 0; e--)
2294 { 2292 {
2295 if (dump_file && (dump_flags & TDF_DETAILS)) 2293 if (dump_file && (dump_flags & TDF_DETAILS))
2468 2466
2469 for (e = 0; e < pb->num_geqs; e++) 2467 for (e = 0; e < pb->num_geqs; e++)
2470 is_dead[e] = false; 2468 is_dead[e] = false;
2471 2469
2472 for (e = 0; e < pb->num_geqs; e++) 2470 for (e = 0; e < pb->num_geqs; e++)
2473 if (pb->geqs[e].color == omega_red 2471 if (pb->geqs[e].color == omega_red
2474 && !pb->geqs[e].touched) 2472 && !pb->geqs[e].touched)
2475 for (e2 = e + 1; e2 < pb->num_geqs; e2++) 2473 for (e2 = e + 1; e2 < pb->num_geqs; e2++)
2476 if (!pb->geqs[e2].touched 2474 if (!pb->geqs[e2].touched
2477 && pb->geqs[e].key == -pb->geqs[e2].key 2475 && pb->geqs[e].key == -pb->geqs[e2].key
2478 && pb->geqs[e].coef[0] == -pb->geqs[e2].coef[0] 2476 && pb->geqs[e].coef[0] == -pb->geqs[e2].coef[0]
2479 && pb->geqs[e2].color == omega_red) 2477 && pb->geqs[e2].color == omega_red)
2480 { 2478 {
2481 omega_copy_eqn (&pb->eqs[pb->num_eqs++], &pb->geqs[e], 2479 omega_copy_eqn (&pb->eqs[pb->num_eqs++], &pb->geqs[e],
2482 pb->num_vars); 2480 pb->num_vars);
2483 gcc_assert (pb->num_eqs <= OMEGA_MAX_EQS); 2481 gcc_assert (pb->num_eqs <= OMEGA_MAX_EQS);
2526 is_dead[e] = false; 2524 is_dead[e] = false;
2527 2525
2528 for (e = pb->num_geqs - 1; e >= 0; e--) 2526 for (e = pb->num_geqs - 1; e >= 0; e--)
2529 if (pb->geqs[e].color == omega_black && !is_dead[e]) 2527 if (pb->geqs[e].color == omega_black && !is_dead[e])
2530 for (e2 = e - 1; e2 >= 0; e2--) 2528 for (e2 = e - 1; e2 >= 0; e2--)
2531 if (pb->geqs[e2].color == omega_black 2529 if (pb->geqs[e2].color == omega_black
2532 && !is_dead[e2]) 2530 && !is_dead[e2])
2533 { 2531 {
2534 a = 0; 2532 a = 0;
2535 2533
2536 for (i = pb->num_vars; i > 1; i--) 2534 for (i = pb->num_vars; i > 1; i--)
2556 } 2554 }
2557 2555
2558 for (e3 = pb->num_geqs - 1; e3 >= 0; e3--) 2556 for (e3 = pb->num_geqs - 1; e3 >= 0; e3--)
2559 if (pb->geqs[e3].color == omega_red) 2557 if (pb->geqs[e3].color == omega_red)
2560 { 2558 {
2561 alpha1 = (pb->geqs[e2].coef[j] * pb->geqs[e3].coef[i] 2559 alpha1 = (pb->geqs[e2].coef[j] * pb->geqs[e3].coef[i]
2562 - pb->geqs[e2].coef[i] * pb->geqs[e3].coef[j]); 2560 - pb->geqs[e2].coef[i] * pb->geqs[e3].coef[j]);
2563 alpha2 = -(pb->geqs[e].coef[j] * pb->geqs[e3].coef[i] 2561 alpha2 = -(pb->geqs[e].coef[j] * pb->geqs[e3].coef[i]
2564 - pb->geqs[e].coef[i] * pb->geqs[e3].coef[j]); 2562 - pb->geqs[e].coef[i] * pb->geqs[e3].coef[j]);
2565 2563
2566 if ((a > 0 && alpha1 > 0 && alpha2 > 0) 2564 if ((a > 0 && alpha1 > 0 && alpha2 > 0)
2576 fprintf (dump_file, "\n"); 2574 fprintf (dump_file, "\n");
2577 } 2575 }
2578 2576
2579 for (k = pb->num_vars; k >= 0; k--) 2577 for (k = pb->num_vars; k >= 0; k--)
2580 { 2578 {
2581 c = (alpha1 * pb->geqs[e].coef[k] 2579 c = (alpha1 * pb->geqs[e].coef[k]
2582 + alpha2 * pb->geqs[e2].coef[k]); 2580 + alpha2 * pb->geqs[e2].coef[k]);
2583 2581
2584 if (c != a * pb->geqs[e3].coef[k]) 2582 if (c != a * pb->geqs[e3].coef[k])
2585 break; 2583 break;
2586 2584
2647 if (!omega_verify_simplification 2645 if (!omega_verify_simplification
2648 && verify_omega_pb (pb) == omega_false) 2646 && verify_omega_pb (pb) == omega_false)
2649 return; 2647 return;
2650 2648
2651 conservative++; 2649 conservative++;
2652 tmp_problem = XNEW (struct omega_pb); 2650 tmp_problem = XNEW (struct omega_pb_d);
2653 2651
2654 for (e = pb->num_geqs - 1; e >= 0; e--) 2652 for (e = pb->num_geqs - 1; e >= 0; e--)
2655 if (pb->geqs[e].color == omega_red) 2653 if (pb->geqs[e].color == omega_red)
2656 { 2654 {
2657 if (dump_file && (dump_flags & TDF_DETAILS)) 2655 if (dump_file && (dump_flags & TDF_DETAILS))
2742 2740
2743 static void 2741 static void
2744 omega_problem_reduced (omega_pb pb) 2742 omega_problem_reduced (omega_pb pb)
2745 { 2743 {
2746 if (omega_verify_simplification 2744 if (omega_verify_simplification
2747 && !in_approximate_mode 2745 && !in_approximate_mode
2748 && verify_omega_pb (pb) == omega_false) 2746 && verify_omega_pb (pb) == omega_false)
2749 return; 2747 return;
2750 2748
2751 if (PARAM_VALUE (PARAM_OMEGA_ELIMINATE_REDUNDANT_CONSTRAINTS) 2749 if (PARAM_VALUE (PARAM_OMEGA_ELIMINATE_REDUNDANT_CONSTRAINTS)
2752 && !omega_eliminate_redundant (pb, true)) 2750 && !omega_eliminate_redundant (pb, true))
2755 omega_found_reduction = omega_true; 2753 omega_found_reduction = omega_true;
2756 2754
2757 if (!please_no_equalities_in_simplified_problems) 2755 if (!please_no_equalities_in_simplified_problems)
2758 coalesce (pb); 2756 coalesce (pb);
2759 2757
2760 if (omega_reduce_with_subs 2758 if (omega_reduce_with_subs
2761 || please_no_equalities_in_simplified_problems) 2759 || please_no_equalities_in_simplified_problems)
2762 chain_unprotect (pb); 2760 chain_unprotect (pb);
2763 else 2761 else
2764 resurrect_subs (pb); 2762 resurrect_subs (pb);
2765 2763
3047 int j, k; 3045 int j, k;
3048 for (j = n_vars; j >= 0; j--) 3046 for (j = n_vars; j >= 0; j--)
3049 eqn->coef[j] *= a; 3047 eqn->coef[j] *= a;
3050 k = eqn->coef[i]; 3048 k = eqn->coef[i];
3051 eqn->coef[i] = 0; 3049 eqn->coef[i] = 0;
3052 eqn->color |= sub->color; 3050 if (sub->color == omega_red)
3051 eqn->color = omega_red;
3053 for (j = n_vars; j >= 0; j--) 3052 for (j = n_vars; j >= 0; j--)
3054 eqn->coef[j] -= sub->coef[j] * k / c; 3053 eqn->coef[j] -= sub->coef[j] * k / c;
3055 } 3054 }
3056 3055
3057 for (e = pb->num_geqs - 1; e >= 0; e--) 3056 for (e = pb->num_geqs - 1; e >= 0; e--)
3446 continue; 3445 continue;
3447 } 3446 }
3448 3447
3449 j = 0; 3448 j = 0;
3450 for (i = pb->num_vars; i != sv; i--) 3449 for (i = pb->num_vars; i != sv; i--)
3451 if (pb->eqs[e].coef[i] != 0 3450 if (pb->eqs[e].coef[i] != 0
3452 && factor > abs (pb->eqs[e].coef[i]) + 1) 3451 && factor > abs (pb->eqs[e].coef[i]) + 1)
3453 { 3452 {
3454 factor = abs (pb->eqs[e].coef[i]) + 1; 3453 factor = abs (pb->eqs[e].coef[i]) + 1;
3455 j = i; 3454 j = i;
3456 } 3455 }
3489 { 3488 {
3490 fprintf (dump_file, "Using parallel splintering\n"); 3489 fprintf (dump_file, "Using parallel splintering\n");
3491 omega_print_problem (dump_file, pb); 3490 omega_print_problem (dump_file, pb);
3492 } 3491 }
3493 3492
3494 tmp_problem = XNEW (struct omega_pb); 3493 tmp_problem = XNEW (struct omega_pb_d);
3495 omega_copy_eqn (&pb->eqs[0], &pb->geqs[e], pb->num_vars); 3494 omega_copy_eqn (&pb->eqs[0], &pb->geqs[e], pb->num_vars);
3496 pb->num_eqs = 1; 3495 pb->num_eqs = 1;
3497 3496
3498 for (i = 0; i <= diff; i++) 3497 for (i = 0; i <= diff; i++)
3499 { 3498 {
3589 { 3588 {
3590 if (a != -1) 3589 if (a != -1)
3591 c = int_div (c, -a); 3590 c = int_div (c, -a);
3592 3591
3593 if (upper_bound > c 3592 if (upper_bound > c
3594 || (upper_bound == c 3593 || (upper_bound == c
3595 && !omega_eqn_is_red (&pb->geqs[e], desired_res))) 3594 && !omega_eqn_is_red (&pb->geqs[e], desired_res)))
3596 { 3595 {
3597 upper_bound = c; 3596 upper_bound = c;
3598 u_color = pb->geqs[e].color; 3597 u_color = pb->geqs[e].color;
3599 } 3598 }
3721 int e2, Le = 0, Ue; 3720 int e2, Le = 0, Ue;
3722 bool possible_easy_int_solution; 3721 bool possible_easy_int_solution;
3723 int max_splinters = 1; 3722 int max_splinters = 1;
3724 bool exact = false; 3723 bool exact = false;
3725 bool lucky_exact = false; 3724 bool lucky_exact = false;
3726 int neweqns = 0;
3727 int best = (INT_MAX); 3725 int best = (INT_MAX);
3728 int j = 0, jLe = 0, jLowerBoundCount = 0; 3726 int j = 0, jLe = 0, jLowerBoundCount = 0;
3729 3727
3730 3728
3731 eliminate_again = false; 3729 eliminate_again = false;
3855 int diff = 3853 int diff =
3856 Lc * pb->geqs[ub].coef[0] + Uc * pb->geqs[lb].coef[0]; 3854 Lc * pb->geqs[ub].coef[0] + Uc * pb->geqs[lb].coef[0];
3857 lucky = (diff >= (Uc - 1) * (Lc - 1)); 3855 lucky = (diff >= (Uc - 1) * (Lc - 1));
3858 } 3856 }
3859 3857
3860 if (maxC == 1 3858 if (maxC == 1
3861 || minC == -1 3859 || minC == -1
3862 || lucky 3860 || lucky
3863 || in_approximate_mode) 3861 || in_approximate_mode)
3864 { 3862 {
3865 neweqns = score = upper_bound_count * lower_bound_count; 3863 score = upper_bound_count * lower_bound_count;
3866 3864
3867 if (dump_file && (dump_flags & TDF_DETAILS)) 3865 if (dump_file && (dump_flags & TDF_DETAILS))
3868 fprintf (dump_file, 3866 fprintf (dump_file,
3869 "For %s, exact, score = %d*%d, range = %d ... %d," 3867 "For %s, exact, score = %d*%d, range = %d ... %d,"
3870 "\nlucky = %d, in_approximate_mode=%d \n", 3868 "\nlucky = %d, in_approximate_mode=%d \n",
3871 omega_variable_to_str (pb, i), 3869 omega_variable_to_str (pb, i),
3872 upper_bound_count, 3870 upper_bound_count,
3873 lower_bound_count, minC, maxC, lucky, 3871 lower_bound_count, minC, maxC, lucky,
3874 in_approximate_mode); 3872 in_approximate_mode);
3875 3873
3876 if (!exact 3874 if (!exact
3877 || score < best) 3875 || score < best)
3878 { 3876 {
3896 "range = %d ... %d \n", 3894 "range = %d ... %d \n",
3897 omega_variable_to_str (pb, i), 3895 omega_variable_to_str (pb, i),
3898 upper_bound_count, 3896 upper_bound_count,
3899 lower_bound_count, minC, maxC); 3897 lower_bound_count, minC, maxC);
3900 3898
3901 neweqns = upper_bound_count * lower_bound_count;
3902 score = maxC - minC; 3899 score = maxC - minC;
3903 3900
3904 if (best > score) 3901 if (best > score)
3905 { 3902 {
3906 best = score; 3903 best = score;
4161 4158
4162 if (coefficient > 0) 4159 if (coefficient > 0)
4163 { 4160 {
4164 constantTerm = -int_div (constantTerm, coefficient); 4161 constantTerm = -int_div (constantTerm, coefficient);
4165 4162
4166 if (constantTerm > lower_bound 4163 if (constantTerm > lower_bound
4167 || (constantTerm == lower_bound 4164 || (constantTerm == lower_bound
4168 && (desired_res != omega_simplify 4165 && (desired_res != omega_simplify
4169 || (pb->geqs[Ue].color == omega_black 4166 || (pb->geqs[Ue].color == omega_black
4170 && pb->geqs[Le].color == omega_black)))) 4167 && pb->geqs[Le].color == omega_black))))
4171 { 4168 {
4172 lower_bound = constantTerm; 4169 lower_bound = constantTerm;
4173 lb_color = (pb->geqs[Ue].color == omega_red 4170 lb_color = (pb->geqs[Ue].color == omega_red
4283 omega_problem_reduced (pb); 4280 omega_problem_reduced (pb);
4284 return omega_false; 4281 return omega_false;
4285 } 4282 }
4286 else 4283 else
4287 { 4284 {
4288 if (!conservative 4285 if (!conservative
4289 && (desired_res != omega_simplify 4286 && (desired_res != omega_simplify
4290 || (lb_color == omega_black 4287 || (lb_color == omega_black
4291 && ub_color == omega_black)) 4288 && ub_color == omega_black))
4292 && original_problem != no_problem 4289 && original_problem != no_problem
4293 && lower_bound == upper_bound) 4290 && lower_bound == upper_bound)
4413 check_mul (pb->geqs[Le].coef[k], Uc); 4410 check_mul (pb->geqs[Le].coef[k], Uc);
4414 4411
4415 pb->geqs[e2].coef[n_vars + 1] = 0; 4412 pb->geqs[e2].coef[n_vars + 1] = 0;
4416 pb->geqs[e2].touched = 1; 4413 pb->geqs[e2].touched = 1;
4417 4414
4418 if (pb->geqs[Ue].color == omega_red 4415 if (pb->geqs[Ue].color == omega_red
4419 || pb->geqs[Le].color == omega_red) 4416 || pb->geqs[Le].color == omega_red)
4420 pb->geqs[e2].color = omega_red; 4417 pb->geqs[e2].color = omega_red;
4421 else 4418 else
4422 pb->geqs[e2].color = omega_black; 4419 pb->geqs[e2].color = omega_black;
4423 4420
4801 4798
4802 if (omega_solve_depth > 50) 4799 if (omega_solve_depth > 50)
4803 { 4800 {
4804 if (dump_file && (dump_flags & TDF_DETAILS)) 4801 if (dump_file && (dump_flags & TDF_DETAILS))
4805 { 4802 {
4806 fprintf (dump_file, 4803 fprintf (dump_file,
4807 "Solve depth = %d, in_approximate_mode = %d, aborting\n", 4804 "Solve depth = %d, in_approximate_mode = %d, aborting\n",
4808 omega_solve_depth, in_approximate_mode); 4805 omega_solve_depth, in_approximate_mode);
4809 omega_print_problem (dump_file, pb); 4806 omega_print_problem (dump_file, pb);
4810 } 4807 }
4811 gcc_assert (0); 4808 gcc_assert (0);
4829 omega_solve_depth--; 4826 omega_solve_depth--;
4830 4827
4831 if (!omega_reduce_with_subs) 4828 if (!omega_reduce_with_subs)
4832 { 4829 {
4833 resurrect_subs (pb); 4830 resurrect_subs (pb);
4834 gcc_assert (please_no_equalities_in_simplified_problems 4831 gcc_assert (please_no_equalities_in_simplified_problems
4835 || !result || pb->num_subs == 0); 4832 || !result || pb->num_subs == 0);
4836 } 4833 }
4837 4834
4838 return result; 4835 return result;
4839 } 4836 }
5115 5112
5116 if (pb->safe_vars < pb->num_vars) 5113 if (pb->safe_vars < pb->num_vars)
5117 { 5114 {
5118 for (e = pb->num_geqs - 1; e >= 0; e--) 5115 for (e = pb->num_geqs - 1; e >= 0; e--)
5119 { 5116 {
5120 pb->geqs[e].coef[pb->num_vars] = 5117 pb->geqs[e].coef[pb->num_vars] =
5121 pb->geqs[e].coef[pb->safe_vars]; 5118 pb->geqs[e].coef[pb->safe_vars];
5122 5119
5123 pb->geqs[e].coef[pb->safe_vars] = 0; 5120 pb->geqs[e].coef[pb->safe_vars] = 0;
5124 } 5121 }
5125 5122
5308 5305
5309 if (!is_simple) 5306 if (!is_simple)
5310 continue; 5307 continue;
5311 else 5308 else
5312 { 5309 {
5313 *lower_bound = *upper_bound = 5310 *lower_bound = *upper_bound =
5314 -pb->eqs[e].coef[i] * pb->eqs[e].coef[0]; 5311 -pb->eqs[e].coef[i] * pb->eqs[e].coef[0];
5315 return false; 5312 return false;
5316 } 5313 }
5317 } 5314 }
5318 5315
5423 5420
5424 if (!omega_query_variable (pb, i, l, u) 5421 if (!omega_query_variable (pb, i, l, u)
5425 || (pb->num_vars == 1 && pb->forwarding_address[i] == 1)) 5422 || (pb->num_vars == 1 && pb->forwarding_address[i] == 1))
5426 return false; 5423 return false;
5427 5424
5428 if (abs (pb->forwarding_address[i]) == 1 5425 if (abs (pb->forwarding_address[i]) == 1
5429 && pb->num_vars + pb->num_subs == 2 5426 && pb->num_vars + pb->num_subs == 2
5430 && pb->num_eqs + pb->num_subs == 1) 5427 && pb->num_eqs + pb->num_subs == 1)
5431 { 5428 {
5432 bool could_be_zero; 5429 bool could_be_zero;
5433 query_coupled_variable (pb, i, l, u, &could_be_zero, neg_infinity, 5430 query_coupled_variable (pb, i, l, u, &could_be_zero, neg_infinity,
5497 5494
5498 gcc_assert (nvars <= OMEGA_MAX_VARS); 5495 gcc_assert (nvars <= OMEGA_MAX_VARS);
5499 omega_initialize (); 5496 omega_initialize ();
5500 5497
5501 /* Allocate and initialize PB. */ 5498 /* Allocate and initialize PB. */
5502 pb = XCNEW (struct omega_pb); 5499 pb = XCNEW (struct omega_pb_d);
5503 pb->var = XCNEWVEC (int, OMEGA_MAX_VARS + 2); 5500 pb->var = XCNEWVEC (int, OMEGA_MAX_VARS + 2);
5504 pb->forwarding_address = XCNEWVEC (int, OMEGA_MAX_VARS + 2); 5501 pb->forwarding_address = XCNEWVEC (int, OMEGA_MAX_VARS + 2);
5505 pb->geqs = omega_alloc_eqns (0, OMEGA_MAX_GEQS); 5502 pb->geqs = omega_alloc_eqns (0, OMEGA_MAX_GEQS);
5506 pb->eqs = omega_alloc_eqns (0, OMEGA_MAX_EQS); 5503 pb->eqs = omega_alloc_eqns (0, OMEGA_MAX_EQS);
5507 pb->subs = omega_alloc_eqns (0, OMEGA_MAX_VARS + 1); 5504 pb->subs = omega_alloc_eqns (0, OMEGA_MAX_VARS + 1);