OSDN Git Service

* builtins.c (get_memory_rtx): Set mem attributes for non-ADDR_EXPR
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 26 Sep 2004 19:13:38 +0000 (19:13 +0000)
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 26 Sep 2004 19:13:38 +0000 (19:13 +0000)
expressions.  Always clear MEM_SIZE and alias set.

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

gcc/ChangeLog
gcc/builtins.c

index 75ba5a7..718e131 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-26  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * builtins.c (get_memory_rtx): Set mem attributes for non-ADDR_EXPR
+       expressions.  Always clear MEM_SIZE and alias set.
+
 2004-09-26  Roger Sayle  <roger@eyesopen.com>
            Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
index f3ee9e9..9127f45 100644 (file)
@@ -990,15 +990,20 @@ get_memory_rtx (tree exp)
     exp = TREE_OPERAND (exp, 0);
 
   if (TREE_CODE (exp) == ADDR_EXPR)
-    {
-      exp = TREE_OPERAND (exp, 0);
-      set_mem_attributes (mem, exp, 0);
-    }
+    exp = TREE_OPERAND (exp, 0);
   else if (POINTER_TYPE_P (TREE_TYPE (exp)))
+    exp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (exp)), exp);
+  else
+    exp = NULL;
+
+  /* Honor attributes derived from exp, except for the alias set
+     (as builtin stringops may alias with anything) and the size
+     (as stringops may access multiple array elements).  */
+  if (exp)
     {
-      exp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (exp)), exp);
-      /* memcpy, memset and other builtin stringops can alias with anything.  */
+      set_mem_attributes (mem, exp, 0);
       set_mem_alias_set (mem, 0);
+      set_mem_size (mem, NULL_RTX);
     }
 
   return mem;