[ARC] Fix uncache attribute.
authorClaudiu Zissulescu <claziss@synopsys.com>
Wed, 25 Jul 2018 14:31:04 +0000 (16:31 +0200)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Wed, 25 Jul 2018 14:31:04 +0000 (16:31 +0200)
gcc/
2018-05-09  Claudiu Zissulescu  <claziss@synopsys.com>

* config/arc/arc.c (compact_memory_operand_p): Check for uncached
accesses as well.
(arc_is_uncached_mem_p): uncached applies to both the variable and
the pointer.

testsuite/
2018-05-09  Claudiu Zissulescu  <claziss@synopsys.com>

* gcc.target/arc/uncached-1.c: New test.
* gcc.target/arc/uncached-2.c: Likewise.

From-SVN: r262970

gcc/ChangeLog
gcc/config/arc/arc.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/uncached-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arc/uncached-2.c [new file with mode: 0644]

index 0c0c644bf942cf262adb80e0ff821e39a3443b1d..db3d91bf22c6426a8ce5588cb385419629458b66 100644 (file)
@@ -1,3 +1,10 @@
+2018-07-25  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * config/arc/arc.c (compact_memory_operand_p): Check for uncached
+       accesses as well.
+       (arc_is_uncached_mem_p): uncached applies to both the variable and
+       the pointer.
+
 2018-07-25  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/arc/arc.h (ADDITIONAL_REGISTER_NAMES): Add additional
index 4cbf7ab2b334d15a3b8d7a58f9f53f699bcdc972..c186e02e0f183e8c1d8a6a4939ee5ce148702604 100644 (file)
@@ -10420,6 +10420,10 @@ compact_memory_operand_p (rtx op, machine_mode mode,
   if (MEM_VOLATILE_P (op) && !TARGET_VOLATILE_CACHE_SET)
     return false;
 
+  /* likewise for uncached types.  */
+  if (arc_is_uncached_mem_p (op))
+    return false;
+
   if (mode == VOIDmode)
     mode = GET_MODE (op);
 
@@ -10703,28 +10707,36 @@ arc_handle_uncached_attribute (tree *node,
 bool
 arc_is_uncached_mem_p (rtx pat)
 {
-  tree attrs;
-  tree ttype;
-  struct mem_attrs *refattrs;
+  tree attrs = NULL_TREE;
+  tree addr;
 
   if (!MEM_P (pat))
     return false;
 
   /* Get the memory attributes.  */
-  refattrs = MEM_ATTRS (pat);
-  if (!refattrs
-      || !refattrs->expr)
+  addr = MEM_EXPR (pat);
+  if (!addr)
     return false;
 
-  /* Get the type declaration.  */
-  ttype = TREE_TYPE (refattrs->expr);
-  if (!ttype)
-    return false;
+  /* Get the attributes.  */
+  if (TREE_CODE (addr) == MEM_REF)
+    {
+      attrs = TYPE_ATTRIBUTES (TREE_TYPE (addr));
+      if (lookup_attribute ("uncached", attrs))
+       return true;
 
-  /* Get the type attributes.  */
-  attrs = TYPE_ATTRIBUTES (ttype);
-  if (lookup_attribute ("uncached", attrs))
-    return true;
+      attrs = TYPE_ATTRIBUTES (TREE_TYPE (TREE_OPERAND (addr, 0)));
+      if (lookup_attribute ("uncached", attrs))
+       return true;
+    }
+
+  /* For COMPONENT_REF, use the FIELD_DECL from tree operand 1.  */
+  if (TREE_CODE (addr) == COMPONENT_REF)
+    {
+      attrs = TYPE_ATTRIBUTES (TREE_TYPE (TREE_OPERAND (addr, 1)));
+      if (lookup_attribute ("uncached", attrs))
+       return true;
+    }
   return false;
 }
 
index af40567347d3dd52e7c62c5484634fb3d6955995..76f935a48adbcbab2ec765372f48a4599ad85966 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-25  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * gcc.target/arc/uncached-1.c: New test.
+       * gcc.target/arc/uncached-2.c: Likewise.
+
 2018-07-24  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/86622
diff --git a/gcc/testsuite/gcc.target/arc/uncached-1.c b/gcc/testsuite/gcc.target/arc/uncached-1.c
new file mode 100644 (file)
index 0000000..7a6bade
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+volatile __attribute__((uncached))  int * status =
+  (volatile __attribute__((uncached)) int *) 0x04 ;
+
+int get_stat (void)
+{
+  return *status;
+}
+
+/* { dg-final { scan-assembler-times "ld\.di" 1 } } */
diff --git a/gcc/testsuite/gcc.target/arc/uncached-2.c b/gcc/testsuite/gcc.target/arc/uncached-2.c
new file mode 100644 (file)
index 0000000..89eed32
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+void clkgen_switch(unsigned int base, unsigned int offset, int val)
+{
+  volatile  unsigned int __attribute__ ((uncached)) *dest =
+    (volatile unsigned int __attribute__ ((uncached)) *) (base + offset);
+  *dest = val;
+}
+/* { dg-final { scan-assembler-times "st\.di" 1 } } */