File nvl665849.patch of Package gcc43
2011-01-21 Richard Guenther <rguenther@suse.de>
* tree-ssa-sccvn.c (visit_copy): Make abnormal SSA names varying.
* gcc.dg/torture/bnc665849.c: New testcase.
--- gcc/tree-ssa-sccvn.c.orig 2011-01-21 12:51:31.000000000 +0100
+++ gcc/tree-ssa-sccvn.c 2011-01-21 12:52:01.000000000 +0100
@@ -1134,6 +1134,8 @@
static bool
visit_copy (tree lhs, tree rhs)
{
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
+ return set_ssa_val_to (lhs, lhs);
/* Follow chains of copies to their destination. */
while (SSA_VAL (rhs) != rhs && TREE_CODE (SSA_VAL (rhs)) == SSA_NAME)
--- /dev/null 2009-04-14 12:16:40.000000000 +0200
+++ gcc/testsuite/gcc.dg/torture/bnc665849.c 2011-01-21 12:53:15.000000000 +0100
@@ -0,0 +1,63 @@
+/* { dg-do compile } */
+/* { dg-options "-fpreserve-function-arguments" } */
+
+typedef unsigned int __u32;
+typedef unsigned long u_long;
+typedef unsigned int uint;
+typedef unsigned char __uint8_t;
+typedef unsigned short int __uint16_t;
+typedef unsigned int __uint32_t;
+typedef unsigned long long int __uint64_t;
+typedef __u32 xfs_dev_t;
+typedef __uint32_t xfs_agblock_t;
+typedef __uint32_t xfs_extlen_t;
+typedef struct bhv_desc {
+} bhv_desc_t;
+typedef struct bhv_vfs {
+} cred_t;
+typedef struct bhv_vattr {
+ u_long va_blocksize;
+ xfs_dev_t va_rdev;
+} bhv_vattr_t;
+typedef struct xfs_bufhash {
+ xfs_agblock_t sb_rextsize;
+ __uint8_t sb_blocklog;
+} xfs_sb_t;
+typedef struct xfs_mount {
+ xfs_sb_t m_sb;
+ uint m_writeio_log;
+ __uint64_t m_flags;
+ int m_swidth;
+} xfs_mount_t;
+unsigned long xfs_preferred_iosize(xfs_mount_t *mp)
+{
+ return mp->m_swidth << mp->m_sb.sb_blocklog;
+}
+typedef struct xfs_bmbt_rec_64 {
+ __uint16_t di_mode;
+ xfs_extlen_t di_extsize;
+ __uint16_t di_flags;
+} xfs_dinode_core_t;
+typedef struct dm_attrs_s {
+ struct xfs_mount *i_mount;
+ struct bhv_desc i_bhv_desc;
+ xfs_dinode_core_t i_d;
+} xfs_inode_t;
+xfs_extlen_t xfs_get_extsz_hint (xfs_inode_t *ip)
+{
+ xfs_extlen_t extsz = 0;
+ if (__builtin_expect(!!(ip->i_d.di_flags & (1 << 0)), 0))
+ extsz = ip->i_mount->m_sb.sb_rextsize;
+ return extsz;
+}
+void xfs_getattr( bhv_desc_t *bdp, bhv_vattr_t *vap)
+{
+ xfs_inode_t *ip;
+ xfs_mount_t *mp;
+ ip = (xfs_inode_t *)((char *)(bdp)-(char *)&(((xfs_inode_t *)0)->i_bhv_desc));
+ mp = ip->i_mount;
+ if (!(ip->i_d.di_flags & (1 << 0)))
+ vap->va_blocksize = xfs_preferred_iosize(mp);
+ else
+ vap->va_blocksize = xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
+}