re PR target/77308 (surprisingly large stack usage for sha512 on arm)
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Thu, 17 Nov 2016 13:47:24 +0000 (13:47 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Thu, 17 Nov 2016 13:47:24 +0000 (13:47 +0000)
2016-11-17  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR target/77308
        * config/arm/arm.md (*thumb2_ldrd, *thumb2_ldrd_base,
        *thumb2_ldrd_base_neg, *thumb2_strd, *thumb2_strd_base,
        *thumb2_strd_base_neg): Recognize insn regardless of
        current_tune->prefer_ldrd_strd.
        * config/arm/ldrdstrd.md: Enable all ldrd/strd peephole rules
        whenever possible.

testsuite:
2016-11-17  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR target/77308
        * gcc.target/arm/pr53447-5.c: New test.
        * lib/target-supports.exp
        (check_effective_target_arm_prefer_ldrd_strd): Adjust.

From-SVN: r242549

gcc/ChangeLog
gcc/config/arm/arm.md
gcc/config/arm/ldrdstrd.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr53447-5.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp

index c37fc9cd9a5bb705abbc9662627491c1cde82790..8797a218b363be8b529f778ed5d65352bf637d69 100644 (file)
@@ -1,3 +1,13 @@
+2016-11-17  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR target/77308
+       * config/arm/arm.md (*thumb2_ldrd, *thumb2_ldrd_base,
+       *thumb2_ldrd_base_neg, *thumb2_strd, *thumb2_strd_base,
+       *thumb2_strd_base_neg): Recognize insn regardless of
+       current_tune->prefer_ldrd_strd.
+       * config/arm/ldrdstrd.md: Enable all ldrd/strd peephole rules
+       whenever possible.
+
 2016-11-17  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/arc/arc.c (arc_ccfsm_post_advance): Handle return
index a4f83d6737776a087237a9784c0afbb7af11dbf7..ccae728bd16e403cbcada323463b473ad0397b67 100644 (file)
         (mem:SI (plus:SI (match_dup 1)
                          (match_operand:SI 4 "const_int_operand" ""))))]
   "TARGET_LDRD && TARGET_THUMB2 && reload_completed
-     && current_tune->prefer_ldrd_strd
      && ((INTVAL (operands[2]) + 4) == INTVAL (operands[4]))
      && (operands_ok_ldrd_strd (operands[0], operands[3],
                                   operands[1], INTVAL (operands[2]),
         (mem:SI (plus:SI (match_dup 1)
                          (const_int 4))))]
   "TARGET_LDRD && TARGET_THUMB2 && reload_completed
-     && current_tune->prefer_ldrd_strd
      && (operands_ok_ldrd_strd (operands[0], operands[2],
                                   operands[1], 0, false, true))"
   "ldrd%?\t%0, %2, [%1]"
    (set (match_operand:SI 2 "s_register_operand" "=r")
         (mem:SI (match_dup 1)))]
   "TARGET_LDRD && TARGET_THUMB2 && reload_completed
-     && current_tune->prefer_ldrd_strd
      && (operands_ok_ldrd_strd (operands[0], operands[2],
                                   operands[1], -4, false, true))"
   "ldrd%?\t%0, %2, [%1, #-4]"
                          (match_operand:SI 3 "const_int_operand" "")))
         (match_operand:SI 4 "s_register_operand" "r"))]
   "TARGET_LDRD && TARGET_THUMB2 && reload_completed
-     && current_tune->prefer_ldrd_strd
      && ((INTVAL (operands[1]) + 4) == INTVAL (operands[3]))
      && (operands_ok_ldrd_strd (operands[2], operands[4],
                                   operands[0], INTVAL (operands[1]),
                          (const_int 4)))
         (match_operand:SI 2 "s_register_operand" "r"))]
   "TARGET_LDRD && TARGET_THUMB2 && reload_completed
-     && current_tune->prefer_ldrd_strd
      && (operands_ok_ldrd_strd (operands[1], operands[2],
                                   operands[0], 0, false, false))"
   "strd%?\t%1, %2, [%0]"
    (set (mem:SI (match_dup 0))
         (match_operand:SI 2 "s_register_operand" "r"))]
   "TARGET_LDRD && TARGET_THUMB2 && reload_completed
-     && current_tune->prefer_ldrd_strd
      && (operands_ok_ldrd_strd (operands[1], operands[2],
                                   operands[0], -4, false, false))"
   "strd%?\t%1, %2, [%0, #-4]"
index e7ef542e379291a481a34711b55e26088cd620fc..7e6b7dce520f3c7cc9ae95373e82a4856faa14d3 100644 (file)
@@ -29,9 +29,7 @@
         (match_operand:SI 2 "memory_operand" ""))
    (set (match_operand:SI 1 "arm_general_register_operand" "")
         (match_operand:SI 3 "memory_operand" ""))]
-  "TARGET_LDRD
-     && current_tune->prefer_ldrd_strd
-     && !optimize_function_for_size_p (cfun)"
+  "TARGET_LDRD"
   [(const_int 0)]
 {
   if (!gen_operands_ldrd_strd (operands, true, false, false))
@@ -63,9 +61,7 @@
        (match_operand:SI 0 "arm_general_register_operand" ""))
    (set (match_operand:SI 3 "memory_operand" "")
        (match_operand:SI 1 "arm_general_register_operand" ""))]
-  "TARGET_LDRD
-     && current_tune->prefer_ldrd_strd
-     && !optimize_function_for_size_p (cfun)"
+  "TARGET_LDRD"
   [(const_int 0)]
 {
   if (!gen_operands_ldrd_strd (operands, false, false, false))
         (match_operand:SI 5 "const_int_operand" ""))
    (set (match_operand:SI 3 "memory_operand" "")
         (match_dup 1))]
- "TARGET_LDRD
-  && current_tune->prefer_ldrd_strd
-  && !optimize_function_for_size_p (cfun)"
+  "TARGET_LDRD"
   [(const_int 0)]
 {
   if (!gen_operands_ldrd_strd (operands, false, true, false))
         (match_dup 0))
    (set (match_operand:SI 3 "memory_operand" "")
         (match_dup 1))]
- "TARGET_LDRD
-  && current_tune->prefer_ldrd_strd
-  && !optimize_function_for_size_p (cfun)"
-   [(const_int 0)]
+  "TARGET_LDRD"
+  [(const_int 0)]
 {
   if (!gen_operands_ldrd_strd (operands, false, true, false))
      FAIL;
                           [(match_operand 6 "arm_general_register_operand" "")
                            (match_operand 7 "arm_general_register_operand" "") ]))]
   "TARGET_LDRD && TARGET_ARM
-   && current_tune->prefer_ldrd_strd
-   && !optimize_function_for_size_p (cfun)
    && (  ((rtx_equal_p(operands[0], operands[6])) && (rtx_equal_p(operands[1], operands[7])))
         ||((rtx_equal_p(operands[0], operands[7])) && (rtx_equal_p(operands[1], operands[6]))))
    && (peep2_reg_dead_p (3, operands[0]) || rtx_equal_p (operands[0], operands[4]))
                                (match_operand 7 "arm_general_register_operand" "") ]))
        (clobber (reg:CC CC_REGNUM))])]
   "TARGET_LDRD && TARGET_ARM
-   && current_tune->prefer_ldrd_strd
-   && !optimize_function_for_size_p (cfun)
    && (  ((rtx_equal_p(operands[0], operands[6])) && (rtx_equal_p(operands[1], operands[7])))
        ||((rtx_equal_p(operands[0], operands[7])) && (rtx_equal_p(operands[1], operands[6]))))
    && (peep2_reg_dead_p (3, operands[0]) || rtx_equal_p (operands[0], operands[4]))
index 5063e51ebd6bf844c69219b6a77cf384349c9b0f..e16f2d0966ca61245ec98662f993ca6b699ac625 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-17  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR target/77308
+       * gcc.target/arm/pr53447-5.c: New test.
+       * lib/target-supports.exp
+       (check_effective_target_arm_prefer_ldrd_strd): Adjust.
+
 2016-11-17  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * gcc.target/arc/abitest.S: New file.
diff --git a/gcc/testsuite/gcc.target/arm/pr53447-5.c b/gcc/testsuite/gcc.target/arm/pr53447-5.c
new file mode 100644 (file)
index 0000000..35988f4
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -mthumb" } */
+/* { dg-require-effective-target arm_thumb2_ok } */
+
+void foo(long long* p)
+{
+  p[1] |= 0x100000001;
+  p[2] &= 0x100000001;
+  p[3] ^= 0x100000001;
+  p[4] += 0x100000001;
+  p[5] -= 0x100000001;
+  p[6] = ~p[6];
+  p[7] <<= 5;
+  p[8] >>= 5;
+  p[9] -= p[10];
+}
+
+/* { dg-final { scan-assembler-times "ldrd" 10 } } */
+/* { dg-final { scan-assembler-times "strd" 9 } } */
index ec99708f633b02d743cb229127a3d7f3c6cadbcd..8a2abd2c4cc441b4fc5d469f74b8535aaf864b3a 100644 (file)
@@ -4356,7 +4356,7 @@ proc check_effective_target_arm_prefer_ldrd_strd { } {
     }
 
     return [check_no_messages_and_pattern arm_prefer_ldrd_strd "strd\tr" assembly {
-        void foo (int *p) { p[0] = 1; p[1] = 0;}
+        void foo (void) { __asm__ ("" ::: "r4", "r5"); }
     }  "-O2 -mthumb" ]
 }