re PR target/65768 (sub-optimimal code for constant Uses in loop)
authorKugan Vivekanandarajah <kuganv@linaro.org>
Sat, 16 May 2015 09:35:52 +0000 (09:35 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Sat, 16 May 2015 09:35:52 +0000 (09:35 +0000)
gcc/ChangeLog:

2015-05-16  Kugan Vivekanandarajah  <kuganv@linaro.org>
    Zhenqiang Chen  <zhenqiang.chen@linaro.org>

PR target/65768
* config/arm/arm.h (DONT_EARLY_SPLIT_CONSTANT): New macro.
* config/arm/arm.md (subsi3, andsi3, iorsi3, xorsi3, movsi): Keep some
 large constants in register instead of splitting them.

gcc/testsuite/ChangeLog:

2015-05-16  Kugan Vivekanandarajah  <kuganv@linaro.org>
    Zhenqiang Chen  <zhenqiang.chen@linaro.org>

PR target/65768
* gcc.target/arm/maskdata.c: New test.

Co-Authored-By: Zhenqiang Chen <zhenqiang.chen@linaro.org>
From-SVN: r223235

gcc/ChangeLog
gcc/config/arm/arm.h
gcc/config/arm/arm.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/maskdata.c [new file with mode: 0644]

index da14ae887609d3addfe272b57ac52c105e536145..84e282a0e8486d3257064dd9c6224e2bad2820dc 100644 (file)
@@ -1,3 +1,11 @@
+2015-05-16  Kugan Vivekanandarajah  <kuganv@linaro.org>
+           Zhenqiang Chen  <zhenqiang.chen@linaro.org>
+
+       PR target/65768
+       * config/arm/arm.h (DONT_EARLY_SPLIT_CONSTANT): New macro.
+       * config/arm/arm.md (subsi3, andsi3, iorsi3, xorsi3, movsi): Keep some
+        large constants in register instead of splitting them.
+
 2015-05-16  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/66140
index a58a7b14deeff4b040c2e8b1526fbe315a86542b..6480123985c0af98f70e42d969ffbea6aba3b983 100644 (file)
@@ -396,6 +396,12 @@ extern void (*arm_lang_output_object_attributes_hook)(void);
 /* Should NEON be used for 64-bits bitops.  */
 #define TARGET_PREFER_NEON_64BITS (prefer_neon_for_64bits)
 
+/* Should constant I be slplit for OP.  */
+#define DONT_EARLY_SPLIT_CONSTANT(i, op) \
+                               ((optimize >= 2) \
+                                && can_create_pseudo_p () \
+                                && !const_ok_for_op (i, op))
+
 /* True iff the full BPABI is being used.  If TARGET_BPABI is true,
    then TARGET_AAPCS_BASED must be true -- but the converse does not
    hold.  TARGET_BPABI implies the use of the BPABI runtime library,
index adbb83fd8890649c62f1b79e069f2656088adf9e..9a71b79fc5dcfa9ffb5f69f2cace51da71cea492 100644 (file)
     {
       if (TARGET_32BIT)
         {
-          arm_split_constant (MINUS, SImode, NULL_RTX,
-                             INTVAL (operands[1]), operands[0],
-                             operands[2], optimize && can_create_pseudo_p ());
-          DONE;
+         if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[1]), MINUS))
+           operands[1] = force_reg (SImode, operands[1]);
+         else
+           {
+             arm_split_constant (MINUS, SImode, NULL_RTX,
+                                 INTVAL (operands[1]), operands[0],
+                                 operands[2],
+                                 optimize && can_create_pseudo_p ());
+             DONE;
+           }
        }
       else /* TARGET_THUMB1 */
         operands[1] = force_reg (SImode, operands[1]);
              operands[1] = convert_to_mode (QImode, operands[1], 1);
              emit_insn (gen_thumb2_zero_extendqisi2_v6 (operands[0],
                                                         operands[1]));
+             DONE;
            }
+         else if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[2]), AND))
+           operands[2] = force_reg (SImode, operands[2]);
          else
-           arm_split_constant (AND, SImode, NULL_RTX,
-                               INTVAL (operands[2]), operands[0],
-                               operands[1],
-                               optimize && can_create_pseudo_p ());
+           {
+             arm_split_constant (AND, SImode, NULL_RTX,
+                                 INTVAL (operands[2]), operands[0],
+                                 operands[1],
+                                 optimize && can_create_pseudo_p ());
 
-          DONE;
+             DONE;
+           }
         }
     }
   else /* TARGET_THUMB1 */
     {
       if (TARGET_32BIT)
         {
-          arm_split_constant (IOR, SImode, NULL_RTX,
-                             INTVAL (operands[2]), operands[0], operands[1],
-                             optimize && can_create_pseudo_p ());
-          DONE;
+         if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[2]), IOR))
+           operands[2] = force_reg (SImode, operands[2]);
+         else
+           {
+             arm_split_constant (IOR, SImode, NULL_RTX,
+                                 INTVAL (operands[2]), operands[0],
+                                 operands[1],
+                                 optimize && can_create_pseudo_p ());
+             DONE;
+           }
        }
       else /* TARGET_THUMB1 */
         {
     {
       if (TARGET_32BIT)
         {
-          arm_split_constant (XOR, SImode, NULL_RTX,
-                             INTVAL (operands[2]), operands[0], operands[1],
-                             optimize && can_create_pseudo_p ());
-          DONE;
+         if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[2]), XOR))
+           operands[2] = force_reg (SImode, operands[2]);
+         else
+           {
+             arm_split_constant (XOR, SImode, NULL_RTX,
+                                 INTVAL (operands[2]), operands[0],
+                                 operands[1],
+                                 optimize && can_create_pseudo_p ());
+             DONE;
+           }
        }
       else /* TARGET_THUMB1 */
         {
           && !(const_ok_for_arm (INTVAL (operands[1]))
                || const_ok_for_arm (~INTVAL (operands[1]))))
         {
-           arm_split_constant (SET, SImode, NULL_RTX,
-                              INTVAL (operands[1]), operands[0], NULL_RTX,
-                              optimize && can_create_pseudo_p ());
-          DONE;
+          if (DONT_EARLY_SPLIT_CONSTANT (INTVAL (operands[1]), SET))
+            {
+               emit_insn (gen_rtx_SET (operands[0], operands[1]));
+               DONE;
+            }
+         else
+            {
+               arm_split_constant (SET, SImode, NULL_RTX,
+                                   INTVAL (operands[1]), operands[0], NULL_RTX,
+                                   optimize && can_create_pseudo_p ());
+               DONE;
+            }
         }
     }
   else /* TARGET_THUMB1...  */
index 7d58a1883a15df3e15a49bcde96b68ba3ae7eb52..430e6bd72878cd918bb4a1e1f51eca65406efc5d 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-16  Kugan Vivekanandarajah  <kuganv@linaro.org>
+           Zhenqiang Chen  <zhenqiang.chen@linaro.org>
+
+       PR target/65768
+       * gcc.target/arm/maskdata.c: New test.
+
 2015-05-16  Mikael Morin  <mikael@gcc.gnu.org>
 
        PR fortran/65792
diff --git a/gcc/testsuite/gcc.target/arm/maskdata.c b/gcc/testsuite/gcc.target/arm/maskdata.c
new file mode 100644 (file)
index 0000000..6d6bb39
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options " -O2 -fno-gcse " }  */
+/* { dg-require-effective-target arm_thumb2_ok } */
+
+#define MASK 0xff00ff
+void maskdata (int * data, int len)
+{
+   int i = len;
+   for (; i > 0; i -= 2)
+    {
+      data[i] &= MASK;
+      data[i + 1] &= MASK;
+    }
+}
+/* { dg-final { scan-assembler-not "65280" } } */