diff options
author | Claudiu Zissulescu <claziss@synopsys.com> | 2018-07-25 16:31:04 +0200 |
---|---|---|
committer | Claudiu Zissulescu <claziss@gcc.gnu.org> | 2018-07-25 16:31:04 +0200 |
commit | 3e4a5f5485c15381c67a940d5da449242ace9029 (patch) | |
tree | de686ee247f43917dfce99fc46c5f2c266beff04 /gcc/config/arc/arc.c | |
parent | 8f176ba232f6c0a452c059cceb1ce5fcdd8177e1 (diff) | |
download | gcc-3e4a5f5485c15381c67a940d5da449242ace9029.zip gcc-3e4a5f5485c15381c67a940d5da449242ace9029.tar.gz gcc-3e4a5f5485c15381c67a940d5da449242ace9029.tar.bz2 |
[ARC] Fix uncache attribute.
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
Diffstat (limited to 'gcc/config/arc/arc.c')
-rw-r--r-- | gcc/config/arc/arc.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index 4cbf7ab..c186e02 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -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; } |