IBM Z: Remove match_scratch workaround

Since commit dd1ef00c45 ("Fix bug in the define_subst handling that
made match_scratch unusable for multi-alternative patterns.") the
workaround for that bug in *ashrdi3_31<setcc><cconly> is not only no
longer necessary, but actually breaks the build.

Get rid of it by using only one alternative in (match_scratch).  It
will be replicated as many times as needed in order to match the
pattern with which (define_subst) is used.

gcc/ChangeLog:

	* config/s390/s390.md(*ashrdi3_31<setcc><cconly>): Use a single
	constraint.
	* config/s390/subst.md(cconly_subst): Use a single constraint
	in (match_scratch).

gcc/testsuite/ChangeLog:

	* gcc.target/s390/ashr.c: New test.
This commit is contained in:
Ilya Leoshkevich 2021-05-31 21:59:50 +02:00
parent 9ca24bd34b
commit 22d834e32b
3 changed files with 16 additions and 11 deletions

View file

@ -9328,19 +9328,13 @@
""
"")
; FIXME: The number of alternatives is doubled here to match the fix
; number of 2 in the subst pattern for the (clobber (match_scratch...
; The right fix should be to support match_scratch in the output
; pattern of a define_subst.
(define_insn "*ashrdi3_31<setcc><cconly>"
[(set (match_operand:DI 0 "register_operand" "=d, d")
(ashiftrt:DI (match_operand:DI 1 "register_operand" "0, 0")
(match_operand:QI 2 "shift_count_operand" "jsc,jsc")))
[(set (match_operand:DI 0 "register_operand" "=d")
(ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
(match_operand:QI 2 "shift_count_operand" "jsc")))
(clobber (reg:CC CC_REGNUM))]
"!TARGET_ZARCH"
"@
srda\t%0,%Y2
srda\t%0,%Y2"
"srda\t%0,%Y2"
[(set_attr "op_type" "RS")
(set_attr "atype" "reg")])

View file

@ -45,7 +45,7 @@
"s390_match_ccmode(insn, CCSmode)"
[(set (reg CC_REGNUM)
(compare (match_dup 1) (const_int 0)))
(clobber (match_scratch:DSI 0 "=d,d"))])
(clobber (match_scratch:DSI 0 "=d"))])
(define_subst_attr "cconly" "cconly_subst" "" "_cconly")

View file

@ -0,0 +1,11 @@
/* Test the arithmetic shift right pattern. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
int e(void);
int f (long c, int b)
{
return (c >> b) && e ();
}