From 9da5500b12acba71c0a807e1ed2de92b18f16c29 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 6 Mar 2012 13:13:14 +0000 Subject: [PATCH] re PR middle-end/52493 (tree check fail in ptr_derefs_may_alias_p) 2012-03-06 Richard Guenther PR middle-end/52493 * tree-ssa-alias.c (ptr_derefs_may_alias_p): Robustify. * gcc.dg/torture/pr52493.c: New testcase. From-SVN: r184987 --- gcc/ChangeLog | 5 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/torture/pr52493.c | 38 ++++++++++++++++++++++++++ gcc/tree-ssa-alias.c | 22 ++++++--------- 4 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr52493.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f629fa7df0..3b88179294b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-03-06 Richard Guenther + + PR middle-end/52493 + * tree-ssa-alias.c (ptr_derefs_may_alias_p): Robustify. + 2012-03-06 Tristan Gingold * config/vms/vms-c.c (vms_pragma_nomember_alignment): Handle diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 45b04e975bd..25b446bd47c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-03-06 Richard Guenther + + PR middle-end/52493 + * gcc.dg/torture/pr52493.c: New testcase. + 2012-03-06 Richard Guenther PR lto/52097 diff --git a/gcc/testsuite/gcc.dg/torture/pr52493.c b/gcc/testsuite/gcc.dg/torture/pr52493.c new file mode 100644 index 00000000000..b04ac5c17db --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr52493.c @@ -0,0 +1,38 @@ +/* { dg-do compile } */ + +struct Time { + long int sec; + long usec; +}; +struct Flow { + unsigned short iif; + struct Time mtime; +}; +struct NetFlow { + unsigned MaxFlows; + unsigned HeaderFields; + unsigned short *HeaderFormat; +}; +static struct NetFlow *netflow; +static struct Time start_time; +static unsigned char emit_packet[1500]; +inline long int cmpmtime(struct Time *t1, struct Time *t2) +{ + return (t1->sec - t2->sec) * 1000 + (t1->usec - t2->usec) / 1000; +} +static void fill(int fields, unsigned short *format, + struct Flow *flow, void *p) +{ + int i; + for (i = 0; i < fields; i++) + if (format[i] == 21) + { + unsigned int __v; + __v = cmpmtime(&flow->mtime, &start_time); + *((unsigned int *) p) = __v; + } +} +void emit_thread() +{ + fill(netflow->HeaderFields, netflow->HeaderFormat, 0, &emit_packet); +} diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 54badda1772..dd90432b920 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -236,17 +236,6 @@ ptr_derefs_may_alias_p (tree ptr1, tree ptr2) STRIP_NOPS (ptr1); STRIP_NOPS (ptr2); - /* Anything we do not explicilty handle aliases. */ - if ((TREE_CODE (ptr1) != SSA_NAME - && TREE_CODE (ptr1) != ADDR_EXPR - && TREE_CODE (ptr1) != POINTER_PLUS_EXPR) - || (TREE_CODE (ptr2) != SSA_NAME - && TREE_CODE (ptr2) != ADDR_EXPR - && TREE_CODE (ptr2) != POINTER_PLUS_EXPR) - || !POINTER_TYPE_P (TREE_TYPE (ptr1)) - || !POINTER_TYPE_P (TREE_TYPE (ptr2))) - return true; - /* Disregard pointer offsetting. */ if (TREE_CODE (ptr1) == POINTER_PLUS_EXPR) { @@ -275,7 +264,7 @@ ptr_derefs_may_alias_p (tree ptr1, tree ptr2) if (base && (TREE_CODE (base) == MEM_REF || TREE_CODE (base) == TARGET_MEM_REF)) - ptr1 = TREE_OPERAND (base, 0); + return ptr_derefs_may_alias_p (TREE_OPERAND (base, 0), ptr2); else if (base && DECL_P (base)) return ptr_deref_may_alias_decl_p (ptr2, base); @@ -288,7 +277,7 @@ ptr_derefs_may_alias_p (tree ptr1, tree ptr2) if (base && (TREE_CODE (base) == MEM_REF || TREE_CODE (base) == TARGET_MEM_REF)) - ptr2 = TREE_OPERAND (base, 0); + return ptr_derefs_may_alias_p (ptr1, TREE_OPERAND (base, 0)); else if (base && DECL_P (base)) return ptr_deref_may_alias_decl_p (ptr1, base); @@ -296,6 +285,13 @@ ptr_derefs_may_alias_p (tree ptr1, tree ptr2) return true; } + /* From here we require SSA name pointers. Anything else aliases. */ + if (TREE_CODE (ptr1) != SSA_NAME + || TREE_CODE (ptr2) != SSA_NAME + || !POINTER_TYPE_P (TREE_TYPE (ptr1)) + || !POINTER_TYPE_P (TREE_TYPE (ptr2))) + return true; + /* We may end up with two empty points-to solutions for two same pointers. In this case we still want to say both pointers alias, so shortcut that here. */ -- 2.30.2