From 7f657dde6f3fff3ed52f89a110caaad27fc1f996 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 26 Jan 2010 12:29:09 +0000 Subject: [PATCH] re PR tree-optimization/42250 (segfault in ipa-type-escape.c for several cpu2000 tests) 2010-01-26 Richard Guenther PR tree-optimization/42250 * ipa-type-escape.c (type_escape_execute): Do not analyze clones. * gcc.dg/pr42250.c: New testcase. From-SVN: r156244 --- gcc/ChangeLog | 5 +++ gcc/ipa-type-escape.c | 2 +- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/pr42250.c | 68 ++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr42250.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b97384aa2ac..da237e7e57d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-01-26 Richard Guenther + + PR tree-optimization/42250 + * ipa-type-escape.c (type_escape_execute): Do not analyze clones. + 2010-01-26 Jakub Jelinek PR fortran/42866 diff --git a/gcc/ipa-type-escape.c b/gcc/ipa-type-escape.c index 0c8d229f3cf..8d9f26114d3 100644 --- a/gcc/ipa-type-escape.c +++ b/gcc/ipa-type-escape.c @@ -1984,7 +1984,7 @@ type_escape_execute (void) they may cause a type variable to escape. */ for (node = cgraph_nodes; node; node = node->next) - if (node->analyzed) + if (node->analyzed && !node->clone_of) analyze_function (node); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d0a4de2315b..3cdaee3ea39 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-26 Richard Guenther + + PR tree-optimization/42250 + * gcc.dg/pr42250.c: New testcase. + 2010-01-25 Arnaud Charlet * gnat.dg/array_bounds_test.adb: New test. diff --git a/gcc/testsuite/gcc.dg/pr42250.c b/gcc/testsuite/gcc.dg/pr42250.c new file mode 100644 index 00000000000..d3d4bb7be2f --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr42250.c @@ -0,0 +1,68 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fipa-type-escape" } */ + +extern double log10 (double __x); +extern double ceil (double __x); +extern double floor (double __x); +extern void free (void *__ptr); +extern void *my_malloc (unsigned int); +extern int num_rr_nodes; +static float get_cblock_trans (int *num_inputs_to_cblock, + int max_inputs_to_cblock, + float trans_cblock_to_lblock_buf, + float trans_sram_bit); +static float trans_per_mux (int num_inputs, float trans_sram_bit); +void +count_routing_transistors (int num_switch, float R_minW_nmos, + float R_minW_pmos) +{ + int *num_inputs_to_cblock; + int iswitch, i, j, iseg, max_inputs_to_cblock; + float input_cblock_trans; + const float trans_sram_bit = 6.; + float trans_cblock_to_lblock_buf; + input_cblock_trans = + get_cblock_trans (num_inputs_to_cblock, max_inputs_to_cblock, + trans_cblock_to_lblock_buf, trans_sram_bit); +} + +static float +get_cblock_trans (int *num_inputs_to_cblock, int max_inputs_to_cblock, + float trans_cblock_to_lblock_buf, float trans_sram_bit) +{ + float *trans_per_cblock; + float trans_count; + int i, num_inputs; + + trans_per_cblock = + (float *) my_malloc ((max_inputs_to_cblock + 1) * sizeof (float)); + for (i = 1; i <= max_inputs_to_cblock; i++) + trans_per_cblock[i] = + trans_per_mux (i, trans_sram_bit) + trans_cblock_to_lblock_buf; + for (i = 0; i < num_rr_nodes; i++) + { + num_inputs = num_inputs_to_cblock[i]; + trans_count += trans_per_cblock[num_inputs]; + } + free (trans_per_cblock); + return (trans_count); +} + +static float +trans_per_mux (int num_inputs, float trans_sram_bit) +{ + int nlevels, ilevel, current_inps; + float ntrans = 0; + + if (num_inputs <= 1) + return (0); + nlevels = ceil (log10 (num_inputs) / log10 (2.) - 0.00001); + current_inps = num_inputs; + for (ilevel = 1; ilevel <= nlevels; ilevel++) + { + ntrans += 2 * floor (current_inps / 2.); + current_inps = ceil (current_inps / 2.); + } + ntrans += trans_sram_bit * nlevels; + return (ntrans); +} -- 2.30.2