These splitters are only used when for some reason we generated a bdnz
loop but we cannot actually use one (CTR is already used for something
else, for example).  This shouldn't happen often, so making the split
sequence one insn longer isn't a big deal.


2014-12-08  Segher Boessenkool  <seg...@kernel.crashing.org>

gcc/
        PR target/64180
        * config/rs6000/rs6000.md (*ctr<mode>_internal1, *ctr<mode>_internal2,
        *ctr<mode>_internal5, *ctr<mode>_internal6): Change "r" alternatives
        to "b".  Increase length.
        (splitters for these): Split to cmp+addi instead of addic.

---
 gcc/config/rs6000/rs6000.md | 42 ++++++++++++++++++++----------------------
 1 file changed, 20 insertions(+), 22 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index abf20c3..6f4bafb 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -13496,7 +13496,7 @@ (define_expand "ctr<mode>"
 
 (define_insn "*ctr<mode>_internal1"
   [(set (pc)
-       (if_then_else (ne (match_operand:P 1 "register_operand" "c,*r,*r,*r")
+       (if_then_else (ne (match_operand:P 1 "register_operand" "c,*b,*b,*b")
                          (const_int 1))
                      (label_ref (match_operand 0 "" ""))
                      (pc)))
@@ -13516,11 +13516,11 @@ (define_insn "*ctr<mode>_internal1"
     return \"bdz $+8\;b %l0\";
 }"
   [(set_attr "type" "branch")
-   (set_attr "length" "*,12,16,16")])
+   (set_attr "length" "*,16,20,20")])
 
 (define_insn "*ctr<mode>_internal2"
   [(set (pc)
-       (if_then_else (ne (match_operand:P 1 "register_operand" "c,*r,*r,*r")
+       (if_then_else (ne (match_operand:P 1 "register_operand" "c,*b,*b,*b")
                          (const_int 1))
                      (pc)
                      (label_ref (match_operand 0 "" ""))))
@@ -13540,13 +13540,13 @@ (define_insn "*ctr<mode>_internal2"
     return \"bdnz $+8\;b %l0\";
 }"
   [(set_attr "type" "branch")
-   (set_attr "length" "*,12,16,16")])
+   (set_attr "length" "*,16,20,20")])
 
 ;; Similar but use EQ
 
 (define_insn "*ctr<mode>_internal5"
   [(set (pc)
-       (if_then_else (eq (match_operand:P 1 "register_operand" "c,*r,*r,*r")
+       (if_then_else (eq (match_operand:P 1 "register_operand" "c,*b,*b,*b")
                          (const_int 1))
                      (label_ref (match_operand 0 "" ""))
                      (pc)))
@@ -13566,11 +13566,11 @@ (define_insn "*ctr<mode>_internal5"
     return \"bdnz $+8\;b %l0\";
 }"
   [(set_attr "type" "branch")
-   (set_attr "length" "*,12,16,16")])
+   (set_attr "length" "*,16,20,20")])
 
 (define_insn "*ctr<mode>_internal6"
   [(set (pc)
-       (if_then_else (eq (match_operand:P 1 "register_operand" "c,*r,*r,*r")
+       (if_then_else (eq (match_operand:P 1 "register_operand" "c,*b,*b,*b")
                          (const_int 1))
                      (pc)
                      (label_ref (match_operand 0 "" ""))))
@@ -13590,7 +13590,7 @@ (define_insn "*ctr<mode>_internal6"
     return \"bdz $+8\;b %l0\";
 }"
   [(set_attr "type" "branch")
-   (set_attr "length" "*,12,16,16")])
+   (set_attr "length" "*,16,20,20")])
 
 ;; Now the splitters if we could not allocate the CTR register
 
@@ -13606,13 +13606,12 @@ (define_split
    (clobber (match_scratch:CC 3 ""))
    (clobber (match_scratch:P 4 ""))]
   "reload_completed"
-  [(parallel [(set (match_dup 3)
-                  (compare:CC (plus:P (match_dup 1)
-                                       (const_int -1))
-                              (const_int 0)))
-             (set (match_dup 0)
-                  (plus:P (match_dup 1)
-                           (const_int -1)))])
+  [(set (match_dup 3)
+       (compare:CC (match_dup 1)
+                   (const_int 1)))
+   (set (match_dup 0)
+       (plus:P (match_dup 1)
+               (const_int -1)))
    (set (pc) (if_then_else (match_dup 7)
                           (match_dup 5)
                           (match_dup 6)))]
@@ -13632,13 +13631,12 @@ (define_split
    (clobber (match_scratch:CC 3 ""))
    (clobber (match_scratch:P 4 ""))]
   "reload_completed && ! gpc_reg_operand (operands[0], SImode)"
-  [(parallel [(set (match_dup 3)
-                  (compare:CC (plus:P (match_dup 1)
-                                       (const_int -1))
-                              (const_int 0)))
-             (set (match_dup 4)
-                  (plus:P (match_dup 1)
-                           (const_int -1)))])
+  [(set (match_dup 3)
+       (compare:CC (match_dup 1)
+                   (const_int 1)))
+   (set (match_dup 4)
+       (plus:P (match_dup 1)
+               (const_int -1)))
    (set (match_dup 0)
        (match_dup 4))
    (set (pc) (if_then_else (match_dup 7)
-- 
1.8.1.4

Reply via email to