From 4bb07c5d3708bbab76c88458eb885a66c7ecf265 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 9 Feb 2009 11:09:25 +0000 Subject: [PATCH] re PR middle-end/38981 (internal compiler error) PR middle-end/38981 * tree-ssa-coalesce.c (add_coalesce): Cap the costs of coalesce pairs at MUST_COALESCE_COST-1 instead of MUST_COALESCE_COST. From-SVN: r144032 --- gcc/ChangeLog | 6 ++ gcc/testsuite/ChangeLog | 4 ++ .../gcc.c-torture/compile/20090209-1.c | 61 +++++++++++++++++++ gcc/tree-ssa-coalesce.c | 13 ++-- 4 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20090209-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a6deff996a4..b1e2ae8b875 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-02-09 Eric Botcazou + + PR middle-end/38981 + * tree-ssa-coalesce.c (add_coalesce): Cap the costs of coalesce pairs + at MUST_COALESCE_COST-1 instead of MUST_COALESCE_COST. + 2009-02-09 Richard Guenther PR middle-end/35202 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7cde83d6c5e..cd90ac8d78a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-02-09 Eric Botcazou + + * gcc.c-torture/compile/20090209-1.c: New test. + 2009-02-06 Paolo Carlini PR c++/35147 diff --git a/gcc/testsuite/gcc.c-torture/compile/20090209-1.c b/gcc/testsuite/gcc.c-torture/compile/20090209-1.c new file mode 100644 index 00000000000..781a5e8fd0d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20090209-1.c @@ -0,0 +1,61 @@ +/* PR middle-end/38981 */ +/* Reporter: Kamaraju Kusumanchi */ + +struct d_info +{ + int **subs; +}; + +static int * +d_substitution (struct d_info *di, int prefix) +{ + char c; + + c='_'; + + if (c == '_') + { + unsigned int id; + + if (c != '_') + { + do + { + unsigned int new_id; + + if (new_id < id) + return 0; + id = new_id; + } + while (c != '_'); + } + + + + return di->subs[id]; + } + else + { + int verbose; + int code; + int simple_len; + + code=0; + simple_len=0; + verbose=0; + if (! code && prefix) + { + char peek; + peek='A'; + + if (peek == 'C' || peek == 'D') + verbose = 1; + } + + if (verbose) + { + code = simple_len; + } + + } +} diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c index 3af0c3285d8..8ac74f0c290 100644 --- a/gcc/tree-ssa-coalesce.c +++ b/gcc/tree-ssa-coalesce.c @@ -284,8 +284,7 @@ add_cost_one_coalesce (coalesce_list_p cl, int p1, int p2) /* Add a coalesce between P1 and P2 in list CL with a cost of VALUE. */ static inline void -add_coalesce (coalesce_list_p cl, int p1, int p2, - int value) +add_coalesce (coalesce_list_p cl, int p1, int p2, int value) { coalesce_pair_p node; @@ -295,13 +294,13 @@ add_coalesce (coalesce_list_p cl, int p1, int p2, node = find_coalesce_pair (cl, p1, p2, true); - /* Once the value is MUST_COALESCE_COST, leave it that way. */ - if (node->cost != MUST_COALESCE_COST) + /* Once the value is at least MUST_COALESCE_COST - 1, leave it that way. */ + if (node->cost < MUST_COALESCE_COST - 1) { - if (value == MUST_COALESCE_COST) - node->cost = value; - else + if (value < MUST_COALESCE_COST - 1) node->cost += value; + else + node->cost = value; } } -- 2.30.2