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
2010-08-25 Richard Guenther <rguenther@suse.de>
+ 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 <rguenther@suse.de>
+
PR tree-optimization/45316
* tree-ssa-pre.c (eliminate): Properly clean EH info.
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
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;
}
{
/* 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);
}
2010-08-25 Richard Guenther <rguenther@suse.de>
+ PR lto/44562
+ * gcc.dg/graphite/id-27.c: New testcase.
+ * gcc.dg/lto/20100825-1_0.c: Likewise.
+
+2010-08-25 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/45316
* g++.dg/opt/pr45316.C: New testcase.
--- /dev/null
+/* { 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; }
--- /dev/null
+/* { 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; }