[2/4,ARX,FIX] Fix uncache attribute.

Message ID 20180716122945.9375-2-claziss@gmail.com
State New
Headers show
Series
  • [1/4,ARC] Add more additional register names
Related show

Commit Message

Claudiu Zissulescu July 16, 2018, 12:29 p.m.
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.
---
 gcc/config/arc/arc.c                      | 40 +++++++++++++++--------
 gcc/testsuite/gcc.target/arc/uncached-1.c | 11 +++++++
 gcc/testsuite/gcc.target/arc/uncached-2.c |  9 +++++
 3 files changed, 46 insertions(+), 14 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/arc/uncached-1.c
 create mode 100644 gcc/testsuite/gcc.target/arc/uncached-2.c

-- 
2.17.1

Patch

diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index f36f88f920b..bf719eab115 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -10450,6 +10450,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);
 
@@ -10733,28 +10737,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;
 }
 
diff --git a/gcc/testsuite/gcc.target/arc/uncached-1.c b/gcc/testsuite/gcc.target/arc/uncached-1.c
new file mode 100644
index 00000000000..7a6bade81c4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/uncached-1.c
@@ -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
index 00000000000..89eed326e01
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/uncached-2.c
@@ -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 } } */