From ea74f76f37533dce30120bd711f7ae38036f3a49 Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 25 Aug 2010 14:05:28 +0000 Subject: [PATCH] 2010-08-25 Richard Guenther PR lto/44562 * lto-streamer.c (lto_record_common_node): Do not mess with TYPE_CANONICAL when not in lto. * gimple.c (gimple_register_type): Likewise. * gcc.dg/graphite/id-27.c: New testcase. * gcc.dg/lto/20100825-1_0.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163545 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 ++++ gcc/gimple.c | 11 ++++--- gcc/lto-streamer.c | 3 +- gcc/testsuite/ChangeLog | 6 ++++ gcc/testsuite/gcc.dg/graphite/id-27.c | 17 ++++++++++ gcc/testsuite/gcc.dg/lto/20100825-1_0.c | 57 +++++++++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/graphite/id-27.c create mode 100644 gcc/testsuite/gcc.dg/lto/20100825-1_0.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b3ff516..a0bef4e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2010-08-25 Richard Guenther + PR lto/44562 + * lto-streamer.c (lto_record_common_node): Do not mess with + TYPE_CANONICAL when not in lto. + * gimple.c (gimple_register_type): Likewise. + +2010-08-25 Richard Guenther + PR tree-optimization/45316 * tree-ssa-pre.c (eliminate): Properly clean EH info. diff --git a/gcc/gimple.c b/gcc/gimple.c index 9d5c61b..50b2eab 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -4215,8 +4215,9 @@ gimple_register_type (tree t) gcc_assert (TYPE_P (t)); /* In TYPE_CANONICAL we cache the result of gimple_register_type. - It is initially set to NULL during LTO streaming. */ - if (TYPE_CANONICAL (t)) + It is initially set to NULL during LTO streaming. + But do not mess with TYPE_CANONICAL when not in WPA or link phase. */ + if (in_lto_p && TYPE_CANONICAL (t)) return TYPE_CANONICAL (t); /* Always register the main variant first. This is important so we @@ -4282,12 +4283,14 @@ gimple_register_type (tree t) TYPE_NEXT_REF_TO (t) = NULL_TREE; } - TYPE_CANONICAL (t) = new_type; + if (in_lto_p) + TYPE_CANONICAL (t) = new_type; t = new_type; } else { - TYPE_CANONICAL (t) = t; + if (in_lto_p) + TYPE_CANONICAL (t) = t; *slot = (void *) t; } diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c index 2b3d172..27b7e56 100644 --- a/gcc/lto-streamer.c +++ b/gcc/lto-streamer.c @@ -524,7 +524,8 @@ lto_record_common_node (tree *nodep, VEC(tree, heap) **common_nodes, { /* Type merging will get confused by the canonical types as they are set by the middle-end. */ - TYPE_CANONICAL (node) = NULL_TREE; + if (in_lto_p) + TYPE_CANONICAL (node) = NULL_TREE; *nodep = node = gimple_register_type (node); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ba13e9e..6e8b140 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2010-08-25 Richard Guenther + PR lto/44562 + * gcc.dg/graphite/id-27.c: New testcase. + * gcc.dg/lto/20100825-1_0.c: Likewise. + +2010-08-25 Richard Guenther + PR tree-optimization/45316 * g++.dg/opt/pr45316.C: New testcase. diff --git a/gcc/testsuite/gcc.dg/graphite/id-27.c b/gcc/testsuite/gcc.dg/graphite/id-27.c new file mode 100644 index 0000000..d2d4cd3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/id-27.c @@ -0,0 +1,17 @@ +/* { dg-options "-O2 -fgraphite-identity -flto" { target lto } } */ + +typedef long ll; +void foo (int n, ll *p) +{ + while (n--) + *p += *p; +} + +typedef long long lll; +void bar (int n, lll *p) +{ + while (n--) + *p += *p; +} + +int main() { return 0; } diff --git a/gcc/testsuite/gcc.dg/lto/20100825-1_0.c b/gcc/testsuite/gcc.dg/lto/20100825-1_0.c new file mode 100644 index 0000000..67b5ce0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100825-1_0.c @@ -0,0 +1,57 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options { { -O3 -flto } } } */ + +typedef unsigned int UINT32; +typedef unsigned long long UINT64; +typedef struct { UINT64 w[2]; } UINT128; +void _bid_to_dpd128 (UINT128 *, UINT128 *); +static const int short_recip_scale[] = { + 1, + 65 - 64, + 69 - 64, + 71 - 64, + 75 - 64, + 78 - 64, + 81 - 64, + 85 - 64, + 88 - 64, + 91 - 64, + 95 - 64, + 98 - 64, + 101 - 64, + 105 - 64, + 108 - 64, + 111 - 64, + 115 - 64, + 118 - 64 +}; + +void _bid_to_dpd128 (UINT128 *, UINT128 *); + +void +_bid_to_dpd128 (UINT128 *pres, UINT128 *px) { + UINT128 res; + unsigned int comb; + UINT128 bcoeff; + UINT128 BH; + UINT64 BL, d109; + unsigned int amount; + UINT128 x = *px; + + comb = (x.w[1] ) >> 46; + if ((comb & 0x1e000) == 0x1e000) { + res = x; + } else { + bcoeff.w[1] = (x.w[1] & 0x0001ffffffffffffull); + bcoeff.w[0] = x.w[0]; + amount = 9; + BH.w[0] = (BH.w[0] >> amount) | (BH.w[1] << (64 - amount)); + BL = bcoeff.w[0] - BH.w[0] * 1000000000000000000ull; + d109 = 0x3333333333333334ull; + { UINT64 CXH, CXL, CYH,CYL,PL,PH,PM,PM2; CXH = (BH.w[0]) >> 32; CXL = (UINT32)(BH.w[0]); CYH = (d109) >> 32; CYL = (UINT32)(d109); PM = CXH*CYL; PH = CXH*CYH; PL = CXL*CYL; PM2 = CXL*CYH; PH += (PM>>32); PM = (UINT64)((UINT32)PM)+PM2+(PL>>32); }; + { UINT64 CXH, CXL, CYH,CYL,PL,PH,PM,PM2; CXH = (BL) >> 32; CXL = (UINT32)(BL); CYH = (d109) >> 32; CYL = (UINT32)(d109); PM = CXH*CYL; PH = CXH*CYH; PL = CXL*CYL; PM2 = CXL*CYH; PH += (PM>>32); PM = (UINT64)((UINT32)PM)+PM2+(PL>>32); }; + } + *pres = res; +} + +int main() { return 0; } -- 2.7.4