diff mbox series

[committed] Another H8 cleanup in preparation for the cc0->CC_REG transition.

Message ID 797260862077637ee511870133c9fff20d519eee.camel@redhat.com
State New
Headers show
Series [committed] Another H8 cleanup in preparation for the cc0->CC_REG transition. | expand

Commit Message

Li, Pan2 via Gcc-patches May 17, 2020, 5:22 p.m. UTC
This patch collapses a couple existing patterns (branch_true, branch_false) into
a single pattern and updates all the combiner/peephole branches to use the same
basic structure.  This makes the cc0->CC_REG transition easier in a variety of
ways, particularly with optimizing compare/branch sequences.

Specifically it introduces a new pc_or_label_operand instead of explicitly
referencing (pc) and (label_ref) expressions.  In patterns it verifies that one
of the two operands must be the pc in the pattern's condition.  This isn't
necessary for the peepholes.

In theory this could affect code generation allowing the peepholes to apply in
cases where they don't right now.  But in practice I haven't seen any
differences.

Installing on the trunk.

Jeff
diff mbox series

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 60ff1ffceef..5cb197958ba 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@ 
+2020-05-17 Jeff Law  <law@redhat.com>
+
+	* config/h8300/predicates.md (pc_or_label_operand): New predicate.
+	* config/h8300/jumpcall.md (branch_true, branch_false): Consolidate
+	into a single pattern using pc_or_label_operand.
+	* config/h8300/combiner.md (bit branch patterns): Likewise.
+	* config/h8300/peepholes.md (HImode and SImode branches): Likewise.
+
 2020-05-17  Aldy Hernandez  <aldyh@redhat.com>
 
 	Revert:
diff --git a/gcc/config/h8300/combiner.md b/gcc/config/h8300/combiner.md
index f59ff5f15bd..4f49c7fba34 100644
--- a/gcc/config/h8300/combiner.md
+++ b/gcc/config/h8300/combiner.md
@@ -740,9 +740,9 @@ 
 					   (const_int 1)
 					   (const_int 7))
 			  (const_int 0))
-		      (label_ref (match_operand 1 "" ""))
-		      (pc)))]
-  ""
+		      (match_operand 1 "pc_or_label_operand" "")
+		      (match_operand 2 "pc_or_label_operand" "")))]
+  "operands[1] == pc_rtx || operands[2] == pc_rtx"
   "#"
   ""
   [(set (cc0) (compare (match_dup 0)
@@ -750,9 +750,8 @@ 
    (set (pc)
 	(if_then_else (ge (cc0)
 			  (const_int 0))
-		      (label_ref (match_dup 1))
-		      (pc)))]
-  "")
+		      (match_dup 1)
+		      (match_dup 2)))])
 
 (define_insn_and_split ""
   [(set (pc)
@@ -760,9 +759,9 @@ 
 					   (const_int 1)
 					   (const_int 7))
 			  (const_int 0))
-		      (label_ref (match_operand 1 "" ""))
-		      (pc)))]
-  ""
+		      (match_operand 1 "pc_or_label_operand" "")
+		      (match_operand 2 "pc_or_label_operand" "")))]
+  "operands[1] == pc_rtx || operands[2] == pc_rtx"
   "#"
   ""
   [(set (cc0) (compare (match_dup 0)
@@ -770,6 +769,5 @@ 
    (set (pc)
 	(if_then_else (lt (cc0)
 			  (const_int 0))
-		      (label_ref (match_dup 1))
-		      (pc)))]
-  "")
+		      (match_dup 1)
+		      (match_dup 2)))])
diff --git a/gcc/config/h8300/jumpcall.md b/gcc/config/h8300/jumpcall.md
index 4c0a5ccf8af..7208fb6d86b 100644
--- a/gcc/config/h8300/jumpcall.md
+++ b/gcc/config/h8300/jumpcall.md
@@ -37,60 +37,44 @@ 
     DONE;
   })
 
-(define_insn "branch_true"
+(define_insn "branch"
   [(set (pc)
-	(if_then_else (match_operator 1 "comparison_operator"
+	(if_then_else (match_operator 2 "comparison_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 0 "" ""))
-		      (pc)))]
-  ""
+		      (match_operand 0 "pc_or_label_operand" "")
+		      (match_operand 1 "pc_or_label_operand" "")))]
+  "operands[0] == pc_rtx || operands[1] == pc_rtx"
 {
   if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0
-      && (GET_CODE (operands[1]) == GT
-	  || GET_CODE (operands[1]) == GE
-	  || GET_CODE (operands[1]) == LE
-	  || GET_CODE (operands[1]) == LT))
+      && (GET_CODE (operands[2]) == GT
+	  || GET_CODE (operands[2]) == GE
+	  || GET_CODE (operands[2]) == LE
+	  || GET_CODE (operands[2]) == LT))
     {
       cc_status.flags &= ~CC_OVERFLOW_UNUSABLE;
       return 0;
     }
 
-  if (get_attr_length (insn) == 2)
-    return "b%j1	%l0";
-  else if (get_attr_length (insn) == 4)
-    return "b%j1	%l0:16";
-  else
-    return "b%k1	.Lh8BR%=\;jmp	@%l0\\n.Lh8BR%=:";
-}
- [(set_attr "type" "branch")
-   (set_attr "cc" "none")])
-
-(define_insn "branch_false"
-  [(set (pc)
-	(if_then_else (match_operator 1 "comparison_operator"
-		       [(cc0) (const_int 0)])
-		      (pc)
-		      (label_ref (match_operand 0 "" ""))))]
-  ""
-{
-  if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0
-      && (GET_CODE (operands[1]) == GT
-	  || GET_CODE (operands[1]) == GE
-	  || GET_CODE (operands[1]) == LE
-	  || GET_CODE (operands[1]) == LT))
+  if (operands[0] != pc_rtx)
     {
-      cc_status.flags &= ~CC_OVERFLOW_UNUSABLE;
-      return 0;
+      if (get_attr_length (insn) == 2)
+	return "b%j2	%l0";
+      else if (get_attr_length (insn) == 4)
+	return "b%j2	%l0:16";
+      else
+	return "b%k2	.Lh8BR%=\;jmp	@%l0\\n.Lh8BR%=:";
     }
-
-  if (get_attr_length (insn) == 2)
-    return "b%k1	%l0";
-  else if (get_attr_length (insn) == 4)
-    return "b%k1	%l0:16";
   else
-    return "b%j1	.Lh8BR%=\;jmp	@%l0\\n.Lh8BR%=:";
+    {
+      if (get_attr_length (insn) == 2)
+	return "b%k2	%l1";
+      else if (get_attr_length (insn) == 4)
+	return "b%k2	%l1:16";
+      else
+	return "b%j2	.Lh8BR%=\;jmp	@%l1\\n.Lh8BR%=:";
+    }
 }
-  [(set_attr "type" "branch")
+ [(set_attr "type" "branch")
    (set_attr "cc" "none")])
 
 (define_insn "*brabc"
diff --git a/gcc/config/h8300/peepholes.md b/gcc/config/h8300/peepholes.md
index a0f5af28a53..8442cd80a5e 100644
--- a/gcc/config/h8300/peepholes.md
+++ b/gcc/config/h8300/peepholes.md
@@ -367,10 +367,10 @@ 
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   ""
   [(set (match_operand:HI 0 "register_operand" "")
 	(unspec:HI [(match_dup 0)
@@ -379,10 +379,9 @@ 
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
-  "")
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))])
 
 ;; The SImode version of the previous pattern.
 
@@ -393,10 +392,10 @@ 
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   ""
   [(set (match_operand:SI 0 "register_operand" "")
 	(unspec:SI [(match_dup 0)
@@ -405,10 +404,9 @@ 
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
-  "")
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))])
 
 (define_peephole2
   [(parallel [(set (cc0)
@@ -418,19 +416,19 @@ 
 			    (const_int 0)))
 	      (clobber (scratch:QI))])
    (set (pc)
-	(if_then_else (match_operator 1 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   ""
   [(set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[3] = ((GET_CODE (operands[1]) == EQ)
+    operands[4] = ((GET_CODE (operands[4]) == EQ)
 		   ? gen_rtx_GE (VOIDmode, cc0_rtx, const0_rtx)
 		   : gen_rtx_LT (VOIDmode, cc0_rtx, const0_rtx));
   })
@@ -598,23 +596,23 @@ 
 	(compare (match_operand:HI 0 "register_operand" "")
 		 (match_operand:HI 1 "incdec_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "INTVAL (operands[1]) != 0 && peep2_reg_dead_p (1, operands[0])"
   [(set (match_dup 0)
 	(unspec:HI [(match_dup 0)
-		    (match_dup 4)]
+		    (match_dup 5)]
 		   UNSPEC_INCDEC))
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (- INTVAL (operands[1]));
+    operands[5] = GEN_INT (- INTVAL (operands[1]));
   })
 
 ;; Transform
@@ -632,25 +630,25 @@ 
 	(compare (match_operand:HI 0 "register_operand" "")
 		 (match_operand:HI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtle_operator"
+	(if_then_else (match_operator 4 "gtle_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == 1
        || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
   [(parallel [(set (match_dup 0)
 		   (ashiftrt:HI (match_dup 0)
-				(match_dup 4)))
+				(match_dup 5)))
 	      (clobber (scratch:QI))])
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 2)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 4)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
+    operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
   })
 
 ;; Transform
@@ -668,26 +666,26 @@ 
 	(compare (match_operand:HI 0 "register_operand" "")
 		 (match_operand:HI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtuleu_operator"
+	(if_then_else (match_operator 4 "gtuleu_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == 1
        || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
   [(parallel [(set (match_dup 0)
 		   (ashiftrt:HI (match_dup 0)
-				(match_dup 4)))
+				(match_dup 5)))
 	      (clobber (scratch:QI))])
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 5)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 6)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
-    operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
+    operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
+    operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
 				  VOIDmode, cc0_rtx, const0_rtx);
   })
 
@@ -708,17 +706,16 @@ 
    (set (pc)
 	(if_then_else (match_operator 1 "gtle_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   ""
   [(set (cc0) (compare (and:HI (match_dup 0)
 			       (const_int -256))
 		       (const_int 0)))
    (set (pc)
 	(if_then_else (match_dup 1)
-		      (label_ref (match_dup 2))
-		      (pc)))]
-  "")
+		      (match_dup 2)
+		      (match_dup 3)))])
 
 ;; Transform
 ;;
@@ -737,18 +734,18 @@ 
    (set (pc)
 	(if_then_else (match_operator 1 "gtuleu_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   ""
   [(set (cc0) (compare (and:HI (match_dup 0)
 			       (const_int -256))
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 3)
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_dup 4)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[3] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
+    operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
 				  VOIDmode, cc0_rtx, const0_rtx);
   })
 
@@ -829,23 +826,23 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "incdec_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "INTVAL (operands[1]) != 0 && peep2_reg_dead_p (1, operands[0])"
   [(set (match_dup 0)
 	(unspec:SI [(match_dup 0)
-		    (match_dup 4)]
+		    (match_dup 5)]
 		   UNSPEC_INCDEC))
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (- INTVAL (operands[1]));
+    operands[5] = GEN_INT (- INTVAL (operands[1]));
   })
 
 ;; Transform
@@ -863,10 +860,10 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == -131072
        || INTVAL (operands[1]) == -65536
@@ -874,15 +871,15 @@ 
        || INTVAL (operands[1]) == 131072)"
   [(set (match_dup 0)
 	(plus:SI (match_dup 0)
-		 (match_dup 4)))
+		 (match_dup 5)))
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (- INTVAL (operands[1]));
+    operands[5] = GEN_INT (- INTVAL (operands[1]));
   })
 
 ;; Transform
@@ -901,10 +898,10 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && ((INTVAL (operands[1]) & 0x00ff) == INTVAL (operands[1])
        || (INTVAL (operands[1]) & 0xff00) == INTVAL (operands[1])
@@ -918,10 +915,9 @@ 
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
-  "")
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))])
 
 ;; Transform
 ;;
@@ -939,10 +935,10 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && ((INTVAL (operands[1]) | 0x00ff) == -1
        || (INTVAL (operands[1]) | 0xff00) == -1)
@@ -950,17 +946,17 @@ 
    && INTVAL (operands[1]) != -2"
   [(set (match_dup 0)
 	(xor:SI (match_dup 0)
-		(match_dup 4)))
+		(match_dup 5)))
    (set (match_dup 0)
 	(not:SI (match_dup 0)))
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (INTVAL (operands[1]) ^ -1);
+    operands[5] = GEN_INT (INTVAL (operands[1]) ^ -1);
   })
 
 ;; Transform
@@ -979,16 +975,16 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == -2147483647 - 1
        || (TARGET_H8300S && INTVAL (operands[1]) == 1073741824))"
   [(set (match_dup 0)
 	(rotate:SI (match_dup 0)
-		   (match_dup 4)))
+		   (match_dup 5)))
    (set (match_dup 0)
 	(unspec:SI [(match_dup 0)
 		    (const_int -1)]
@@ -996,11 +992,11 @@ 
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (INTVAL (operands[1]) == -2147483647 - 1 ? 1 : 2);
+    operands[5] = GEN_INT (INTVAL (operands[1]) == -2147483647 - 1 ? 1 : 2);
   })
 
 ;; Transform
@@ -1018,33 +1014,33 @@ 
 ;; same compare insn immediately before this one.
 
 (define_peephole2
-  [(match_scratch:SI 4 "r")
+  [(match_scratch:SI 5 "r")
    (set (cc0)
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtle_operator"
+	(if_then_else (match_operator 4 "gtle_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "!peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == 1
        || (TARGET_H8300S && INTVAL (operands[1]) == 3))
    && !same_cmp_preceding_p (insn)"
-  [(set (match_dup 4)
+  [(set (match_dup 5)
 	(match_dup 0))
-   (parallel [(set (match_dup 4)
-		   (ashiftrt:SI (match_dup 4)
-				(match_dup 5)))
+   (parallel [(set (match_dup 5)
+		   (ashiftrt:SI (match_dup 5)
+				(match_dup 6)))
 	      (clobber (scratch:QI))])
-   (set (cc0) (compare (match_dup 4)
+   (set (cc0) (compare (match_dup 5)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 2)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 4)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
+    operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
   })
 
 ;; Transform
@@ -1062,34 +1058,34 @@ 
 ;; same compare insn immediately before this one.
 
 (define_peephole2
-  [(match_scratch:SI 4 "r")
+  [(match_scratch:SI 5 "r")
    (set (cc0)
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtuleu_operator"
+	(if_then_else (match_operator 4 "gtuleu_operator"
 		         [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "!peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == 1
        || (TARGET_H8300S && INTVAL (operands[1]) == 3))
    && !same_cmp_preceding_p (insn)"
-  [(set (match_dup 4)
+  [(set (match_dup 5)
 	(match_dup 0))
-   (parallel [(set (match_dup 4)
-		   (ashiftrt:SI (match_dup 4)
-				(match_dup 5)))
+   (parallel [(set (match_dup 5)
+		   (ashiftrt:SI (match_dup 5)
+				(match_dup 6)))
 	      (clobber (scratch:QI))])
-   (set (cc0) (compare (match_dup 4)
+   (set (cc0) (compare (match_dup 5)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 6)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 7)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
-    operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
+    operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
+    operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
 				  VOIDmode, cc0_rtx, const0_rtx);
   })
 
@@ -1108,25 +1104,25 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtle_operator"
+	(if_then_else (match_operator 4 "gtle_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == 1
        || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
   [(parallel [(set (match_dup 0)
 		   (ashiftrt:SI (match_dup 0)
-				(match_dup 4)))
+				(match_dup 5)))
 	      (clobber (scratch:QI))])
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 2)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 4)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
+    operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
   })
 
 ;; Transform
@@ -1144,26 +1140,26 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtuleu_operator"
+	(if_then_else (match_operator 4 "gtuleu_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == 1
        || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
   [(parallel [(set (match_dup 0)
 		   (ashiftrt:SI (match_dup 0)
-				(match_dup 4)))
+				(match_dup 5)))
 	      (clobber (scratch:QI))])
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 5)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 6)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
-    operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
+    operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
+    operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
 				  VOIDmode, cc0_rtx, const0_rtx);
   })
 
@@ -1183,10 +1179,10 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtle_operator"
+	(if_then_else (match_operator 4 "gtle_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && (INTVAL (operands[1]) == 3
        || INTVAL (operands[1]) == 7
@@ -1197,15 +1193,15 @@ 
        || INTVAL (operands[1]) == 255)"
   [(set (match_dup 0)
 	(and:SI (match_dup 0)
-		(match_dup 4)))
+		(match_dup 5)))
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 2)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 4)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (~INTVAL (operands[1]));
+    operands[5] = GEN_INT (~INTVAL (operands[1]));
   })
 
 ;; Transform
@@ -1224,10 +1220,10 @@ 
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "const_int_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 2 "gtuleu_operator"
+	(if_then_else (match_operator 4 "gtuleu_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 3 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "peep2_reg_dead_p (1, operands[0])
    && ((TARGET_H8300H && INTVAL (operands[1]) == 3)
 	|| INTVAL (operands[1]) == 7
@@ -1238,16 +1234,16 @@ 
 	|| INTVAL (operands[1]) == 255)"
   [(set (match_dup 0)
 	(and:SI (match_dup 0)
-		(match_dup 4)))
+		(match_dup 5)))
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 5)
-		      (label_ref (match_dup 3))
-		      (pc)))]
+	(if_then_else (match_dup 6)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[4] = GEN_INT (~INTVAL (operands[1]));
-    operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
+    operands[5] = GEN_INT (~INTVAL (operands[1]));
+    operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
 				  VOIDmode, cc0_rtx, const0_rtx);
   })
 
@@ -1268,17 +1264,16 @@ 
    (set (pc)
 	(if_then_else (match_operator 1 "gtle_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   ""
   [(set (cc0) (compare (and:SI (match_dup 0)
 			       (const_int -65536))
 		       (const_int 0)))
    (set (pc)
 	(if_then_else (match_dup 1)
-		      (label_ref (match_dup 2))
-		      (pc)))]
-  "")
+		      (match_dup 2)
+		      (match_dup 3)))])
 
 ;; Transform
 ;;
@@ -1297,18 +1292,18 @@ 
    (set (pc)
 	(if_then_else (match_operator 1 "gtuleu_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   ""
   [(set (cc0) (compare (and:SI (match_dup 0)
 			       (const_int -65536))
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_dup 3)
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_dup 4)
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[3] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
+    operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
 				  VOIDmode, cc0_rtx, const0_rtx);
   })
 
@@ -1327,32 +1322,32 @@ 
 ;; same compare insn.
 
 (define_peephole2
-  [(match_scratch:SI 4 "r")
+  [(match_scratch:SI 5 "r")
    (set (cc0)
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (match_operand:SI 1 "incdec_operand" "")))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "INTVAL (operands[1]) != 0
    && !peep2_reg_dead_p (1, operands[0])
    && !same_cmp_following_p (insn)"
-  [(set (match_dup 4)
+  [(set (match_dup 5)
 	(match_dup 0))
-   (set (match_dup 4)
-	(unspec:SI [(match_dup 4)
-		    (match_dup 5)]
+   (set (match_dup 5)
+	(unspec:SI [(match_dup 5)
+		    (match_dup 6)]
 		   UNSPEC_INCDEC))
-   (set (cc0) (compare (match_dup 4)
+   (set (cc0) (compare (match_dup 5)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
-    operands[5] = GEN_INT (- INTVAL (operands[1]));
+    operands[6] = GEN_INT (- INTVAL (operands[1]));
   })
 
 ;; Narrow the mode of testing if possible.
@@ -1364,28 +1359,28 @@ 
    (set (cc0) (compare (match_dup 0)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_operator 3 "eqne_operator"
+	(if_then_else (match_operator 4 "eqne_operator"
 		       [(cc0) (const_int 0)])
-		      (label_ref (match_operand 2 "" ""))
-		      (pc)))]
+		      (match_operand 2 "pc_or_label_operand" "")
+		      (match_operand 3 "pc_or_label_operand" "")))]
   "((const_int_qi_operand (operands[1], QImode)
      || (GET_MODE (operands[0]) == SImode
 	 && const_int_hi_operand (operands[1], HImode)))
     && peep2_reg_dead_p (2, operands[0]))"
-  [(set (match_dup 4) (match_dup 6))
-   (set (cc0) (compare (match_dup 4)
+  [(set (match_dup 5) (match_dup 7))
+   (set (cc0) (compare (match_dup 5)
 		       (const_int 0)))
    (set (pc)
-	(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
-		      (label_ref (match_dup 2))
-		      (pc)))]
+	(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
+		      (match_dup 2)
+		      (match_dup 3)))]
   {
     enum machine_mode mode;
 
     mode = const_int_qi_operand (operands[1], QImode) ? QImode : HImode;
-    operands[4] = gen_rtx_REG (mode, REGNO (operands[0]));
-    operands[5] = gen_int_mode (INTVAL (operands[1]), mode);
-    operands[6] = gen_rtx_AND (mode, operands[4], operands[5]);
+    operands[5] = gen_rtx_REG (mode, REGNO (operands[0]));
+    operands[6] = gen_int_mode (INTVAL (operands[1]), mode);
+    operands[7] = gen_rtx_AND (mode, operands[5], operands[6]);
   })
 
 ;; These triggers right at the end of allocation of locals in the
diff --git a/gcc/config/h8300/predicates.md b/gcc/config/h8300/predicates.md
index 6496992dbe8..b530c2cb23e 100644
--- a/gcc/config/h8300/predicates.md
+++ b/gcc/config/h8300/predicates.md
@@ -495,3 +495,9 @@ 
 
   return (code == IOR || code == XOR);
 })
+
+;; Used to detect valid targets for conditional branches
+;; Used to detect (pc) or (label_ref) in some jumping patterns
+(define_predicate "pc_or_label_operand"
+  (match_code "pc,label_ref"))
+