diff mbox

[03/10] rs6000: Do not use addic in the ctr* splitters

Message ID a258c1ecbf3a441240021dfc5fe67b5b6cc73a5c.1418024189.git.segher@kernel.crashing.org
State New
Headers show

Commit Message

Segher Boessenkool Dec. 8, 2014, 2:18 p.m. UTC
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  <segher@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(-)

Comments

David Edelsohn Dec. 8, 2014, 2:28 p.m. UTC | #1
On Mon, Dec 8, 2014 at 9:18 AM, Segher Boessenkool
<segher@kernel.crashing.org> wrote:
> 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  <segher@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.

Okay.

Thanks, David
diff mbox

Patch

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)