aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-01-26 12:29:09 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-01-26 12:29:09 +0000
commit7f657dde6f3fff3ed52f89a110caaad27fc1f996 (patch)
tree2263c0e6cd79ee509ff9633ef13494172efecf8d
parentec80da28b6bb82771044cf4c1120d24d30902873 (diff)
downloadgcc-7f657dde6f3fff3ed52f89a110caaad27fc1f996.zip
gcc-7f657dde6f3fff3ed52f89a110caaad27fc1f996.tar.gz
gcc-7f657dde6f3fff3ed52f89a110caaad27fc1f996.tar.bz2
re PR tree-optimization/42250 (segfault in ipa-type-escape.c for several cpu2000 tests)
2010-01-26 Richard Guenther <rguenther@suse.de> PR tree-optimization/42250 * ipa-type-escape.c (type_escape_execute): Do not analyze clones. * gcc.dg/pr42250.c: New testcase. From-SVN: r156244
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-type-escape.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr42250.c68
4 files changed, 79 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b97384a..da237e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-26 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/42250
+ * ipa-type-escape.c (type_escape_execute): Do not analyze clones.
+
2010-01-26 Jakub Jelinek <jakub@redhat.com>
PR fortran/42866
diff --git a/gcc/ipa-type-escape.c b/gcc/ipa-type-escape.c
index 0c8d229..8d9f261 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 d0a4de2..3cdaee3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-26 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/42250
+ * gcc.dg/pr42250.c: New testcase.
+
2010-01-25 Arnaud Charlet <charlet@adacore.com>
* 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 0000000..d3d4bb7
--- /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);
+}