* config/nvptx/nvptx-protos.h
authorNathan Sidwell <nathan@acm.org>
Wed, 23 Dec 2015 16:55:31 +0000 (16:55 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 23 Dec 2015 16:55:31 +0000 (16:55 +0000)
(nvptx_maybe_convert_symbolic_operand): Delete prototype.
* config/nvptx/nvptx.c (nvptx_maybe_convert_symbolic_operand): Delete.
(nvptx_output_mov_insn): Record fnsym here.
(nvptx_wpropagate): Don't create UNSPEC_TO_GENERIC unspec.
* config/nvptx/nvptx.md (UNSPEC_TO_GENERIC): Delete.
(symbolic_operand): Delete predicate.
(nvptx_nonimmediate_operand): Delete predicate.
(mov<mode>): Hard regs are perfectly ok here.
(convaddr_<mode>): Delete.

From-SVN: r231930

gcc/ChangeLog
gcc/config/nvptx/nvptx-protos.h
gcc/config/nvptx/nvptx.c
gcc/config/nvptx/nvptx.md

index e789c11..9992840 100644 (file)
@@ -1,5 +1,18 @@
 2015-12-23  Nathan Sidwell  <nathan@acm.org>
 
+       * config/nvptx/nvptx-protos.h
+       (nvptx_maybe_convert_symbolic_operand): Delete prototype.
+       * config/nvptx/nvptx.c (nvptx_maybe_convert_symbolic_operand): Delete.
+       (nvptx_output_mov_insn): Record fnsym here.
+       (nvptx_wpropagate): Don't create UNSPEC_TO_GENERIC unspec.
+       * config/nvptx/nvptx.md (UNSPEC_TO_GENERIC): Delete.
+       (symbolic_operand): Delete predicate.
+       (nvptx_nonimmediate_operand): Delete predicate.
+       (mov<mode>): Hard regs are perfectly ok here.
+       (convaddr_<mode>): Delete.
+
+2015-12-23  Nathan Sidwell  <nathan@acm.org>
+
        * alias.c (compare_base_decls): Simplify in-symtab check.
        * cgraph.h (decl_in_symtab_p): Check DECL_IN_CONSTANT_POOL.
 
index 084ff8e..d399877 100644 (file)
@@ -41,6 +41,5 @@ extern const char *nvptx_ptx_type_from_mode (machine_mode, bool);
 extern const char *nvptx_output_mov_insn (rtx, rtx);
 extern const char *nvptx_output_call_insn (rtx_insn *, rtx, rtx);
 extern const char *nvptx_output_return (void);
-extern rtx nvptx_maybe_convert_symbolic_operand (rtx);
 #endif
 #endif
index 7405d7c..432e246 100644 (file)
@@ -1413,31 +1413,6 @@ nvptx_gen_wcast (rtx reg, propagate_mask pm, unsigned rep, wcast_data_t *data)
     }
   return res;
 }
-
-/* When loading an operand ORIG_OP, verify whether an address space
-   conversion to generic is required, and if so, perform it.  Check
-   for SYMBOL_REFs and record them if needed.  Return either the
-   original operand, or the converted one.  */
-
-rtx
-nvptx_maybe_convert_symbolic_operand (rtx 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);
-
-  if (GET_CODE (sym) != SYMBOL_REF)
-    return op;
-
-  nvptx_maybe_record_fnsym (sym);
-
-  return op;
-}
 \f
 /* Returns true if X is a valid address for use in a memory reference.  */
 
@@ -1767,9 +1742,12 @@ nvptx_output_mov_insn (rtx dst, rtx src)
   rtx sym = src;
   if (GET_CODE (sym) == CONST)
     sym = XEXP (XEXP (sym, 0), 0);
-  if (SYMBOL_REF_P (sym)
-      && SYMBOL_DATA_AREA (sym) != DATA_AREA_GENERIC)
-    return "%.\tcvta%D1%t0\t%0, %1;";
+  if (SYMBOL_REF_P (sym))
+    {
+      if (SYMBOL_DATA_AREA (sym) != DATA_AREA_GENERIC)
+       return "%.\tcvta%D1%t0\t%0, %1;";
+      nvptx_maybe_record_fnsym (sym);
+    }
 
   if (src_inner == dst_inner)
     return "%.\tmov%t0\t%0, %1;";
@@ -3359,9 +3337,7 @@ nvptx_wpropagate (bool pre_p, basic_block block, rtx_insn *insn)
   if (data.offset)
     {
       /* Stuff was emitted, initialize the base pointer now.  */
-      rtx init = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, worker_bcast_sym),
-                                UNSPEC_TO_GENERIC);
-      init = gen_rtx_SET (data.base, init);
+      rtx init = gen_rtx_SET (data.base, worker_bcast_sym);
       emit_insn_after (init, insn);
 
       if (worker_bcast_size < data.offset)
index 93083a8..182371c 100644 (file)
@@ -20,7 +20,6 @@
 
 (define_c_enum "unspec" [
    UNSPEC_ARG_REG
-   UNSPEC_TO_GENERIC
 
    UNSPEC_COPYSIGN
    UNSPEC_LOG2
@@ -61,6 +60,9 @@
 (define_attr "subregs_ok" "false,true"
   (const_string "false"))
 
+;; The nvptx operand predicates, in general, don't permit subregs and
+;; only literal constants, which differ from the generic ones, which
+;; permit subregs and symbolc constants (as appropriate)
 (define_predicate "nvptx_register_operand"
   (match_code "reg")
 {
           : memory_operand (op, mode));
 })
 
-;; Allow symbolic constants.
-(define_predicate "symbolic_operand"
-  (match_code "symbol_ref,const"))
-
-;; Registers or constants for normal instructions.  Does not allow symbolic
-;; constants.
 (define_predicate "nvptx_nonmemory_operand"
   (match_code "reg,const_int,const_double")
 {
           : immediate_operand (op, mode));
 })
 
-(define_predicate "nvptx_nonimmediate_operand"
-  (match_code "reg,subreg,mem")
-{
-  if (REG_P (op))
-    return (op != frame_pointer_rtx
-           && op != arg_pointer_rtx
-           && op != stack_pointer_rtx);
-  return nonimmediate_operand (op, mode);
-})
-
 (define_predicate "const0_operand"
   (and (match_code "const_int")
        (match_test "op == const0_rtx")))
        (match_operand:QHSDISDFM 1 "general_operand" ""))]
   ""
 {
-  operands[1] = nvptx_maybe_convert_symbolic_operand (operands[1]);
-
-  /* Hard registers are often actually symbolic operands on this target.
-     Don't allow them when storing to memory.  */
-  if (MEM_P (operands[0])
-      && (!REG_P (operands[1])
-         || REGNO (operands[1]) <= LAST_VIRTUAL_REGISTER))
+  if (MEM_P (operands[0]) && !REG_P (operands[1]))
     {
       rtx tmp = gen_reg_rtx (<MODE>mode);
       emit_move_insn (tmp, operands[1]);
    %.\\tst%A0.u%T0\\t%0, %1;"
   [(set_attr "subregs_ok" "true")])
 
-;; Pointer address space conversion
-(define_insn "convaddr_<mode>"
-  [(set (match_operand:P 0 "nvptx_register_operand" "=R")
-       (unspec:P [(match_operand:P 1 "symbolic_operand" "s")]
-                  UNSPEC_TO_GENERIC))]
-  ""
-  "%.\\tcvta%D1%t0\\t%0, %1;")
-
 ;; Integer arithmetic
 
 (define_insn "add<mode>3"