On Thu, Apr 17, 2025 at 05:08:10AM +0200, Jakub Jelinek wrote: > On Wed, Apr 16, 2025 at 08:52:17PM +0200, Jakub Jelinek wrote: > > The following testcase ICEs since r15-1579 (addition of late combiner), > > because *clrmem_short can't be split. > > The problem is that the define_insn uses > > (use (match_operand 1 "nonmemory_operand" "n,a,a,a")) > > (use (match_operand 2 "immediate_operand" "X,R,X,X")) > > (clobber (match_scratch:P 3 "=X,X,X,&a")) > > and define_split assumed that if operands[1] is const_int_operand, > > match_scratch will be always scratch, and it will be reg only if > > it was the last alternative where operands[1] is a reg. > > The pattern doesn't guarantee it though, of course RA will not try to > > uselessly assign a reg there if it is not needed, but during RA > > on the testcase below we match the last alternative, but then comes > > late combiner and propagates const_int 3 into operands[1]. And that > > matches fine, match_scratch matches either scratch or reg and the constraint > > in that case is X for the first variant, so still just fine. But we won't > > split that because the splitters only expect scratch. > > > > The following patch fixes it by using match_scratch instead of scratch, > > so that it accepts either. > > > > Bootstrapped on s390x-linux, ok for trunk if regtesting passes as well? > > Regtested successfully as well.
Ok, thank you very much for fixing this! Cheers, Stefan > > > 2025-04-16 Jakub Jelinek <ja...@redhat.com> > > > > PR target/119834 > > * config/s390/s390.md (define_split after *cpymem_short): Use > > (clobber (match_scratch N)) instead of (clobber (scratch)). Use > > (match_dup 4) and operands[4] instead of (match_dup 3) and operands[3] > > in the last of those. > > (define_split after *clrmem_short): Use (clobber (match_scratch N)) > > instead of (clobber (scratch)). > > (define_split after *cmpmem_short): Likewise. > > > > * g++.target/s390/pr119834.C: New test. > > Jakub >