re PR tree-optimization/53703 (verify_ssa: definition in block 105 does not dominate use in block 103)

gcc:

2012-06-18  Bill Schmidt  <wschmidt@linux.ibm.com>

	PR tree-optimization/53703
	* tree-ssa-phiopt.c (hoist_adjacent_loads): Skip virtual phis;
	correctly set bb_for_def[12].

gcc/testsuite:

2012-06-18  Bill Schmidt  <wschmidt@linux.ibm.com>

	PR tree-optimization/53703
	* gcc.dg/torture/pr53703.c: New test.

From-SVN: r188731
This commit is contained in:
Bill Schmidt 2012-06-18 12:22:37 +00:00 committed by William Schmidt
parent d421b10cd1
commit 9b10be32fd
4 changed files with 166 additions and 10 deletions

View File

@ -1,3 +1,9 @@
2012-06-18 Bill Schmidt <wschmidt@linux.ibm.com>
PR tree-optimization/53703
* tree-ssa-phiopt.c (hoist_adjacent_loads): Skip virtual phis;
correctly set bb_for_def[12].
2012-06-18 Steven Bosscher <steven@gcc.gnu.org>
* config/vax/vax.h (VMS_TARGET): Remove.

View File

@ -1,3 +1,8 @@
2012-06-18 Bill Schmidt <wschmidt@linux.ibm.com>
PR tree-optimization/53703
* gcc.dg/torture/pr53703.c: New test.
2012-06-18 Richard Sandiford <rdsandiford@googlemail.com>
PR middle-end/53698

View File

@ -0,0 +1,149 @@
/* Reduced test case from PR53703. Used to ICE. */
/* { dg-do compile } */
/* { dg-options "-w" } */
typedef long unsigned int size_t;
typedef unsigned short int sa_family_t;
struct sockaddr {};
typedef unsigned char __u8;
typedef unsigned short __u16;
typedef unsigned int __u32;
struct nlmsghdr {
__u32 nlmsg_len;
__u16 nlmsg_type;
};
struct ifaddrmsg {
__u8 ifa_family;
};
enum {
IFA_ADDRESS,
IFA_LOCAL,
};
enum {
RTM_NEWLINK = 16,
RTM_NEWADDR = 20,
};
struct rtattr {
unsigned short rta_len;
unsigned short rta_type;
};
struct ifaddrs {
struct ifaddrs *ifa_next;
unsigned short ifa_flags;
};
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
struct nlmsg_list {
struct nlmsg_list *nlm_next;
int size;
};
struct rtmaddr_ifamap {
void *address;
void *local;
int address_len;
int local_len;
};
int usagi_getifaddrs (struct ifaddrs **ifap)
{
struct nlmsg_list *nlmsg_list, *nlmsg_end, *nlm;
size_t dlen, xlen, nlen;
int build;
for (build = 0; build <= 1; build++)
{
struct ifaddrs *ifl = ((void *)0), *ifa = ((void *)0);
struct nlmsghdr *nlh, *nlh0;
uint16_t *ifflist = ((void *)0);
struct rtmaddr_ifamap ifamap;
for (nlm = nlmsg_list; nlm; nlm = nlm->nlm_next)
{
int nlmlen = nlm->size;
for (nlh = nlh0;
((nlmlen) >= (int)sizeof(struct nlmsghdr)
&& (nlh)->nlmsg_len >= sizeof(struct nlmsghdr)
&& (nlh)->nlmsg_len <= (nlmlen));
nlh = ((nlmlen) -= ( (((nlh)->nlmsg_len)+4U -1) & ~(4U -1) ),
(struct nlmsghdr*)(((char*)(nlh))
+ ( (((nlh)->nlmsg_len)+4U -1)
& ~(4U -1) ))))
{
struct ifinfomsg *ifim = ((void *)0);
struct ifaddrmsg *ifam = ((void *)0);
struct rtattr *rta;
sa_family_t nlm_family = 0;
uint32_t nlm_scope = 0, nlm_index = 0;
memset (&ifamap, 0, sizeof (ifamap));
switch (nlh->nlmsg_type)
{
case RTM_NEWLINK:
ifim = (struct ifinfomsg *)
((void*)(((char*)nlh)
+ ((0)+( ((((int)
( ((sizeof(struct nlmsghdr))+4U -1)
& ~(4U -1) )))+4U -1)
& ~(4U -1) ))));
case RTM_NEWADDR:
ifam = (struct ifaddrmsg *)
((void*)(((char*)nlh)
+ ((0)+( ((((int)
( ((sizeof(struct nlmsghdr))+4U -1)
& ~(4U -1) )))+4U -1)
& ~(4U -1) ))));
nlm_family = ifam->ifa_family;
if (build)
ifa->ifa_flags = ifflist[nlm_index];
break;
default:
continue;
}
if (!build)
{
void *rtadata = ((void*)(((char*)(rta))
+ (( ((sizeof(struct rtattr))+4 -1)
& ~(4 -1) ) + (0))));
size_t rtapayload = ((int)((rta)->rta_len)
- (( ((sizeof(struct rtattr))+4 -1)
& ~(4 -1) ) + (0)));
switch (nlh->nlmsg_type)
{
case RTM_NEWLINK:
break;
case RTM_NEWADDR:
if (nlm_family == 17)
break;
switch (rta->rta_type)
{
case IFA_ADDRESS:
ifamap.address = rtadata;
ifamap.address_len = rtapayload;
case IFA_LOCAL:
ifamap.local = rtadata;
}
}
}
if (nlh->nlmsg_type == RTM_NEWADDR && nlm_family != 17)
{
if (!ifamap.local)
{
ifamap.local = ifamap.address;
ifamap.local_len = ifamap.address_len;
}
if (!ifamap.address)
{
ifamap.address = ifamap.local;
}
if (ifamap.address_len != ifamap.local_len
|| (ifamap.address != ((void *)0)
&& memcmp (ifamap.address, ifamap.local,
ifamap.address_len)))
{
if (!build)
dlen += (((ifa_sa_len (nlm_family,
ifamap.address_len))+4U -1)
& ~(4U -1) );
}
}
}
}
}
}

View File

@ -1853,7 +1853,9 @@ hoist_adjacent_loads (basic_block bb0, basic_block bb1,
if (TREE_CODE (arg1) != SSA_NAME
|| TREE_CODE (arg2) != SSA_NAME
|| SSA_NAME_IS_DEFAULT_DEF (arg1)
|| SSA_NAME_IS_DEFAULT_DEF (arg2))
|| SSA_NAME_IS_DEFAULT_DEF (arg2)
|| !is_gimple_reg (arg1)
|| !is_gimple_reg (arg2))
continue;
def1 = SSA_NAME_DEF_STMT (arg1);
@ -1914,17 +1916,11 @@ hoist_adjacent_loads (basic_block bb0, basic_block bb1,
defswap = def1;
def1 = def2;
def2 = defswap;
/* Don't swap bb1 and bb2 as we may have more than one
phi to process successfully. */
bb_for_def1 = bb2;
bb_for_def2 = bb1;
}
else
{
bb_for_def1 = bb1;
bb_for_def2 = bb2;
}
bb_for_def1 = gimple_bb (def1);
bb_for_def2 = gimple_bb (def2);
/* Check for proper alignment of the first field. */
tree_offset1 = bit_position (field1);
tree_offset2 = bit_position (field2);