OSDN Git Service

2010-02-19 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Feb 2010 10:40:17 +0000 (10:40 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Feb 2010 10:40:17 +0000 (10:40 +0000)
PR tree-optimization/42944
* tree-ssa-alias.c (call_may_clobber_ref_p_1): Massage
test for aliasing with errno.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156890 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-ssa-alias.c

index 17f72d9..607c318 100644 (file)
@@ -1,3 +1,9 @@
+2010-02-19  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/42944
+       * tree-ssa-alias.c (call_may_clobber_ref_p_1): Massage
+       test for aliasing with errno.
+
 2010-02-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/42233
index 7b60201..b235ecc 100644 (file)
@@ -1258,16 +1258,19 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
        case BUILT_IN_CALLOC:
          /* Unix98 specifies that errno is set on allocation failure.
             Until we properly can track the errno location assume it
-            is not a plain decl but anonymous storage in a different
-            translation unit.  */
-         if (flag_errno_math)
+            is not a local decl but external or anonymous storage in
+            a different translation unit.  Also assume it is of
+            type int as required by the standard.  */
+         if (flag_errno_math
+             && TREE_TYPE (base) == integer_type_node)
            {
              struct ptr_info_def *pi;
-             if (DECL_P (base))
-               return false;
-             if (INDIRECT_REF_P (base)
-                 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
-                 && (pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0))))
+             if (DECL_P (base)
+                 && !TREE_STATIC (base))
+               return true;
+             else if (INDIRECT_REF_P (base)
+                      && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
+                      && (pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0))))
                return pi->pt.anything || pi->pt.nonlocal;
            }
          return false;