Commit 7b8edc29 by Nathan Sidwell Committed by Nathan Sidwell

nvptx-protos.h (nvptx_addr_space_from_address): Don't declare.

	* 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.

From-SVN: r231016
parent 72c0f643
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.
2015-11-27 Richard Biener <rguenther@suse.de> 2015-11-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/68559 PR tree-optimization/68559
...@@ -41,7 +41,6 @@ extern const char *nvptx_output_return (void); ...@@ -41,7 +41,6 @@ extern const char *nvptx_output_return (void);
extern machine_mode nvptx_underlying_object_mode (rtx); extern machine_mode nvptx_underlying_object_mode (rtx);
extern const char *nvptx_section_from_addr_space (addr_space_t); extern const char *nvptx_section_from_addr_space (addr_space_t);
extern bool nvptx_hard_regno_mode_ok (int, machine_mode); 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); extern rtx nvptx_maybe_convert_symbolic_operand (rtx);
#endif #endif
#endif #endif
...@@ -206,6 +206,24 @@ nvptx_ptx_type_from_mode (machine_mode mode, bool promote) ...@@ -206,6 +206,24 @@ nvptx_ptx_type_from_mode (machine_mode mode, bool promote)
} }
} }
/* 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 /* If MODE should be treated as two registers of an inner mode, return
that inner mode. Otherwise return VOIDmode. */ that inner mode. Otherwise return VOIDmode. */
...@@ -1359,22 +1377,25 @@ nvptx_gen_wcast (rtx reg, propagate_mask pm, unsigned rep, wcast_data_t *data) ...@@ -1359,22 +1377,25 @@ nvptx_gen_wcast (rtx reg, propagate_mask pm, unsigned rep, wcast_data_t *data)
original operand, or the converted one. */ original operand, or the converted one. */
rtx rtx
nvptx_maybe_convert_symbolic_operand (rtx orig_op) nvptx_maybe_convert_symbolic_operand (rtx op)
{ {
if (GET_MODE (orig_op) != Pmode) if (GET_MODE (op) != Pmode)
return orig_op; 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; if (GET_CODE (sym) != SYMBOL_REF)
while (GET_CODE (op) == PLUS || GET_CODE (op) == CONST) return op;
op = XEXP (op, 0);
if (GET_CODE (op) != SYMBOL_REF)
return orig_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) if (as == ADDR_SPACE_GENERIC)
return orig_op; return op;
enum unspec code; enum unspec code;
code = (as == ADDR_SPACE_GLOBAL ? UNSPEC_FROM_GLOBAL code = (as == ADDR_SPACE_GLOBAL ? UNSPEC_FROM_GLOBAL
...@@ -1382,9 +1403,10 @@ nvptx_maybe_convert_symbolic_operand (rtx orig_op) ...@@ -1382,9 +1403,10 @@ nvptx_maybe_convert_symbolic_operand (rtx orig_op)
: as == ADDR_SPACE_SHARED ? UNSPEC_FROM_SHARED : as == ADDR_SPACE_SHARED ? UNSPEC_FROM_SHARED
: as == ADDR_SPACE_CONST ? UNSPEC_FROM_CONST : as == ADDR_SPACE_CONST ? UNSPEC_FROM_CONST
: UNSPEC_FROM_PARAM); : UNSPEC_FROM_PARAM);
rtx dest = gen_reg_rtx (Pmode); rtx dest = gen_reg_rtx (Pmode);
emit_insn (gen_rtx_SET (dest, gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig_op), emit_insn (gen_rtx_SET (dest,
code))); gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op), code)));
return dest; return dest;
} }
...@@ -1465,29 +1487,6 @@ nvptx_section_for_decl (const_tree decl) ...@@ -1465,29 +1487,6 @@ nvptx_section_for_decl (const_tree decl)
return ".global"; 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, /* 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 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, int code) ...@@ -1945,7 +1944,17 @@ nvptx_print_operand (FILE *file, rtx x, int code)
{ {
case 'A': 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); fputs (nvptx_section_from_addr_space (as), file);
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment