Mercurial > hg > CbC > CbC_gcc
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); |