This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PTX] address space patch
- From: Nathan Sidwell <nathan at acm dot org>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 27 Nov 2015 09:24:15 -0500
- Subject: [PTX] address space patch
- Authentication-results: sourceware.org; auth=none
I've committed this cleanup of some of the address space machinery. As with the
fn recording helpers, the address space helper was accepting many things that
were not symbols. Changed the two callers to only pass a symbol -- one of them
had already done the symbol extraction anyway. Also, the prototype is not
needed externally.
nathan
2015-11-27 Nathan Sidwell <nathan@acm.org>
* config/nvptx/nvptx-protos.h (nvptx_addr_space_from_address):
Don't declare.
* config/nvptx/nvptx.c (nvptx_addr_space_from_sym): New.
(nvptx_maybe_convert_symbolic_operand): Simplify.
(nvptx_addr_space_from_address): Delete.
(nvptx_print_operand): Adjust 'A' case.
Index: config/nvptx/nvptx-protos.h
===================================================================
--- config/nvptx/nvptx-protos.h (revision 231015)
+++ config/nvptx/nvptx-protos.h (working copy)
@@ -41,7 +41,6 @@ extern const char *nvptx_output_return (
extern machine_mode nvptx_underlying_object_mode (rtx);
extern const char *nvptx_section_from_addr_space (addr_space_t);
extern bool nvptx_hard_regno_mode_ok (int, machine_mode);
-extern addr_space_t nvptx_addr_space_from_address (rtx);
extern rtx nvptx_maybe_convert_symbolic_operand (rtx);
#endif
#endif
Index: config/nvptx/nvptx.c
===================================================================
--- config/nvptx/nvptx.c (revision 231015)
+++ config/nvptx/nvptx.c (working copy)
@@ -206,6 +206,24 @@ nvptx_ptx_type_from_mode (machine_mode m
}
}
+/* Determine the address space to use for SYMBOL_REF SYM. */
+
+static addr_space_t
+nvptx_addr_space_from_sym (rtx sym)
+{
+ tree decl = SYMBOL_REF_DECL (sym);
+ if (decl == NULL_TREE || TREE_CODE (decl) == FUNCTION_DECL)
+ return ADDR_SPACE_GENERIC;
+
+ bool is_const = (CONSTANT_CLASS_P (decl)
+ || TREE_CODE (decl) == CONST_DECL
+ || TREE_READONLY (decl));
+ if (is_const)
+ return ADDR_SPACE_CONST;
+
+ return ADDR_SPACE_GLOBAL;
+}
+
/* If MODE should be treated as two registers of an inner mode, return
that inner mode. Otherwise return VOIDmode. */
@@ -1359,22 +1377,25 @@ nvptx_gen_wcast (rtx reg, propagate_mask
original operand, or the converted one. */
rtx
-nvptx_maybe_convert_symbolic_operand (rtx orig_op)
+nvptx_maybe_convert_symbolic_operand (rtx op)
{
- if (GET_MODE (orig_op) != Pmode)
- return orig_op;
+ if (GET_MODE (op) != Pmode)
+ return op;
+
+ rtx sym = op;
+ if (GET_CODE (sym) == CONST)
+ sym = XEXP (sym, 0);
+ if (GET_CODE (sym) == PLUS)
+ sym = XEXP (sym, 0);
- rtx op = orig_op;
- while (GET_CODE (op) == PLUS || GET_CODE (op) == CONST)
- op = XEXP (op, 0);
- if (GET_CODE (op) != SYMBOL_REF)
- return orig_op;
+ if (GET_CODE (sym) != SYMBOL_REF)
+ return op;
- nvptx_maybe_record_fnsym (op);
+ nvptx_maybe_record_fnsym (sym);
- addr_space_t as = nvptx_addr_space_from_address (op);
+ addr_space_t as = nvptx_addr_space_from_sym (sym);
if (as == ADDR_SPACE_GENERIC)
- return orig_op;
+ return op;
enum unspec code;
code = (as == ADDR_SPACE_GLOBAL ? UNSPEC_FROM_GLOBAL
@@ -1382,9 +1403,10 @@ nvptx_maybe_convert_symbolic_operand (rt
: as == ADDR_SPACE_SHARED ? UNSPEC_FROM_SHARED
: as == ADDR_SPACE_CONST ? UNSPEC_FROM_CONST
: UNSPEC_FROM_PARAM);
+
rtx dest = gen_reg_rtx (Pmode);
- emit_insn (gen_rtx_SET (dest, gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig_op),
- code)));
+ emit_insn (gen_rtx_SET (dest,
+ gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op), code)));
return dest;
}
@@ -1465,29 +1487,6 @@ nvptx_section_for_decl (const_tree decl)
return ".global";
}
-/* Look for a SYMBOL_REF in ADDR and return the address space to be used
- for the insn referencing this address. */
-
-addr_space_t
-nvptx_addr_space_from_address (rtx addr)
-{
- while (GET_CODE (addr) == PLUS || GET_CODE (addr) == CONST)
- addr = XEXP (addr, 0);
- if (GET_CODE (addr) != SYMBOL_REF)
- return ADDR_SPACE_GENERIC;
-
- tree decl = SYMBOL_REF_DECL (addr);
- if (decl == NULL_TREE || TREE_CODE (decl) == FUNCTION_DECL)
- return ADDR_SPACE_GENERIC;
-
- bool is_const = (CONSTANT_CLASS_P (decl)
- || TREE_CODE (decl) == CONST_DECL
- || TREE_READONLY (decl));
- if (is_const)
- return ADDR_SPACE_CONST;
-
- return ADDR_SPACE_GLOBAL;
-}
/* Machinery to output constant initializers. When beginning an initializer,
we decide on a chunk size (which is visible in ptx in the type used), and
@@ -1945,7 +1944,17 @@ nvptx_print_operand (FILE *file, rtx x,
{
case 'A':
{
- addr_space_t as = nvptx_addr_space_from_address (XEXP (x, 0));
+ addr_space_t as = ADDR_SPACE_GENERIC;
+ rtx sym = XEXP (x, 0);
+
+ if (GET_CODE (sym) == CONST)
+ sym = XEXP (sym, 0);
+ if (GET_CODE (sym) == PLUS)
+ sym = XEXP (sym, 0);
+
+ if (GET_CODE (sym) == SYMBOL_REF)
+ as = nvptx_addr_space_from_sym (sym);
+
fputs (nvptx_section_from_addr_space (as), file);
}
break;