This patch inlines some tests while searching for the best way to
synthesize a constant, to avoid the need to generate an rtx.  This
became expensive for code that generates a lot of constants.
Backported to 4.7 and 4.8.

        * config/tilegx/tilegx.c (expand_set_cint64_one_inst): Inline
        tests for constraint J, K, N, P.

Index: gcc/config/tilegx/tilegx.c
===================================================================
--- gcc/config/tilegx/tilegx.c  (revision 197073)
+++ gcc/config/tilegx/tilegx.c  (working copy)
@@ -1429,14 +1429,16 @@ expand_set_cint64_one_inst (rtx dest_reg
     }
   else if (!three_wide_only)
     {
-      rtx imm_op = GEN_INT (val);
-
-      if (satisfies_constraint_J (imm_op)
-         || satisfies_constraint_K (imm_op)
-         || satisfies_constraint_N (imm_op)
-         || satisfies_constraint_P (imm_op))
+      /* Test for the following constraints: J, K, N, P.  We avoid
+        generating an rtx and using existing predicates because we
+        can be testing and rejecting a lot of constants, and GEN_INT
+        is O(N).  */
+      if ((val >= -32768 && val <= 65535)
+         || ((val == (val & 0xFF) * 0x0101010101010101LL))
+         || (val == ((trunc_int_for_mode (val, QImode) & 0xFFFF)
+                     * 0x0001000100010001LL)))
        {
-         emit_move_insn (dest_reg, imm_op);
+         emit_move_insn (dest_reg, GEN_INT (val));
          return true;
        }
     }

Reply via email to