From c59b1cd18a0a346a75f6324e0bcf9623b96569e6 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Thu, 1 Feb 2024 21:27:19 +0100 Subject: [PATCH] i386: Improve *cmp_doubleword splitter [PR113701] The fix for PR70321 introduced a splitter that split a doubleword comparison into a pair of XORs followed by an IOR to set the (zero) flags register. To help the reload, splitter forced SUBREG pieces of double-word input values to a pseudo, but this regressed gcc.target/i386/pr82580.c int f0 (U x, U y) { return x == y; } from: xorq %rdx, %rdi xorq %rcx, %rsi xorl %eax, %eax orq %rsi, %rdi sete %al ret to: xchgq %rdi, %rsi movq %rdx, %r8 movq %rcx, %rax movq %rsi, %rdx movq %rdi, %rcx xorq %rax, %rcx xorq %r8, %rdx xorl %eax, %eax orq %rcx, %rdx sete %al ret To mitigate the regression, remove this legacy heuristic (workaround?). There have been many incremental changes and improvements to x86 TImode and register allocation, so this legacy workaround is not only no longer useful, but it actually hurts register allocation. The patched compiler now produces: xchgq %rdi, %rsi xorl %eax, %eax xorq %rsi, %rdx xorq %rdi, %rcx orq %rcx, %rdx sete %al ret PR target/113701 gcc/ChangeLog: * config/i386/i386.md (*cmp_doubleword): Do not force SUBREG pieces to pseudos. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Uros. --- gcc/config/i386/i386.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index e6ebc461e524..d6bd637e8105 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -1617,10 +1617,6 @@ (set (match_dup 4) (ior:DWIH (match_dup 4) (match_dup 5)))])] { split_double_mode (mode, &operands[0], 2, &operands[0], &operands[2]); - /* Placing the SUBREG pieces in pseudos helps reload. */ - for (int i = 0; i < 4; i++) - if (SUBREG_P (operands[i])) - operands[i] = force_reg (mode, operands[i]); operands[4] = gen_reg_rtx (mode);