diff options
author | Richard Guenther <rguenther@suse.de> | 2012-03-06 13:13:14 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-03-06 13:13:14 +0000 |
commit | 9da5500b12acba71c0a807e1ed2de92b18f16c29 (patch) | |
tree | 5b61b7f72f5092239fe2009364b461df160a3bf9 /gcc/tree-ssa-alias.c | |
parent | 66df6e9ef326961129b741b129927a4f85b607f1 (diff) | |
download | gcc-9da5500b12acba71c0a807e1ed2de92b18f16c29.zip gcc-9da5500b12acba71c0a807e1ed2de92b18f16c29.tar.gz gcc-9da5500b12acba71c0a807e1ed2de92b18f16c29.tar.bz2 |
re PR middle-end/52493 (tree check fail in ptr_derefs_may_alias_p)
2012-03-06 Richard Guenther <rguenther@suse.de>
PR middle-end/52493
* tree-ssa-alias.c (ptr_derefs_may_alias_p): Robustify.
* gcc.dg/torture/pr52493.c: New testcase.
From-SVN: r184987
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 54badda..dd90432 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. */ |