===================================================================
@@ -0,0 +1,18 @@
+/* Check that the delay slot of an rts insn is filled, if it follows a cbranch
+ with an unfilled delay slot, as in:
+ bt .L3
+ mov r7,r0 <<< this insn
+ rts
+ nop <<< should go into this delay slot
+*/
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "nop" } } */
+
+int
+test_0 (const char* x, int a, int b, int c)
+{
+ if (x[a] == 92)
+ return b;
+ return c;
+}
===================================================================
@@ -8,7 +8,7 @@
/* { dg-final { scan-assembler-times "nott" 2 } } */
/* { dg-final { scan-assembler-times "cmp/eq" 2 } } */
/* { dg-final { scan-assembler-times "cmp/hi" 4 } } */
-/* { dg-final { scan-assembler-times "cmp/gt" 3 } } */
+/* { dg-final { scan-assembler-times "cmp/gt" 2 } } */
/* { dg-final { scan-assembler-not "not\t" } } */
#include "pr51244-20.c"
===================================================================
@@ -593,20 +593,10 @@
[(and (eq_attr "in_delay_slot" "yes")
(eq_attr "type" "!pstore,prget")) (nil) (nil)])
-;; Say that we have annulled true branches, since this gives smaller and
-;; faster code when branches are predicted as not taken.
-
-;; ??? The non-annulled condition should really be "in_delay_slot",
-;; but insns that can be filled in non-annulled get priority over insns
-;; that can only be filled in anulled.
-
+;; Conditional branches with delay slots are available starting with SH2.
(define_delay
- (and (eq_attr "type" "cbranch")
- (match_test "TARGET_SH2"))
- ;; SH2e has a hardware bug that pretty much prohibits the use of
- ;; annulled delay slots.
- [(eq_attr "cond_delay_slot" "yes") (and (eq_attr "cond_delay_slot" "yes")
- (not (eq_attr "cpu" "sh2e"))) (nil)])
+ (and (eq_attr "type" "cbranch") (match_test "TARGET_SH2"))
+ [(eq_attr "cond_delay_slot" "yes") (nil) (nil)])
;; -------------------------------------------------------------------------
;; SImode signed integer comparisons