Propagate address spaces to builtins.
authorAndrew Stubbs <ams@codesourcery.com>
Fri, 21 Sep 2018 11:25:39 +0000 (11:25 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Fri, 21 Sep 2018 11:25:39 +0000 (11:25 +0000)
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  <ams@codesourcery.com>
    Julian Brown  <julian@codesourcery.com>

gcc/
* builtins.c (get_builtin_sync_mem): Handle address spaces.

Co-Authored-By: Julian Brown <julian@codesourcery.com>
From-SVN: r264467

gcc/ChangeLog
gcc/builtins.c

index d33af3eb89500cda7795c818af133af9ca583157..1df077df6027fcb7266a571fd73224d9f31ae82c 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-21  Andrew Stubbs  <ams@codesourcery.com>
+           Julian Brown  <julian@codesourcery.com>
+
+       * builtins.c (get_builtin_sync_mem): Handle address spaces.
+
 2018-09-21  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Return false
index 3f39d10977d7ea1d4262ea684b05c93bba7a980b..1d4de099726a52479586fe1b7f3240ac4c3119a4 100644 (file)
@@ -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),