gcc/ 2018-05-09 Claudiu Zissulescu <claz...@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 <claz...@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 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 } } */ -- 2.17.1