From b6895597cd59f77077ccdecdacfdd34bf77b5a07 Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Fri, 21 Sep 2018 11:25:39 +0000 Subject: [PATCH] Propagate address spaces to builtins. At present, pointers passed to builtin functions, including atomic operators, are stripped of their address space properties. This doesn't seem to be deliberate, it just omits to copy them. Not only that, but it forces pointer sizes to Pmode, which isn't appropriate for all address spaces. This patch attempts to correct both issues. It works for GCN atomics and GCN OpenACC gang-private variables. 2018-09-21 Andrew Stubbs Julian Brown gcc/ * builtins.c (get_builtin_sync_mem): Handle address spaces. Co-Authored-By: Julian Brown From-SVN: r264467 --- gcc/ChangeLog | 5 +++++ gcc/builtins.c | 13 ++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d33af3eb895..1df077df602 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-09-21 Andrew Stubbs + Julian Brown + + * builtins.c (get_builtin_sync_mem): Handle address spaces. + 2018-09-21 Eric Botcazou * config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Return false diff --git a/gcc/builtins.c b/gcc/builtins.c index 3f39d10977d..1d4de099726 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -5863,14 +5863,21 @@ static rtx get_builtin_sync_mem (tree loc, machine_mode mode) { rtx addr, mem; + int addr_space = TYPE_ADDR_SPACE (POINTER_TYPE_P (TREE_TYPE (loc)) + ? TREE_TYPE (TREE_TYPE (loc)) + : TREE_TYPE (loc)); + scalar_int_mode addr_mode = targetm.addr_space.address_mode (addr_space); - addr = expand_expr (loc, NULL_RTX, ptr_mode, EXPAND_SUM); - addr = convert_memory_address (Pmode, addr); + addr = expand_expr (loc, NULL_RTX, addr_mode, EXPAND_SUM); /* Note that we explicitly do not want any alias information for this memory, so that we kill all other live memories. Otherwise we don't satisfy the full barrier semantics of the intrinsic. */ - mem = validize_mem (gen_rtx_MEM (mode, addr)); + mem = gen_rtx_MEM (mode, addr); + + set_mem_addr_space (mem, addr_space); + + mem = validize_mem (mem); /* The alignment needs to be at least according to that of the mode. */ set_mem_align (mem, MAX (GET_MODE_ALIGNMENT (mode), -- 2.30.2