Some of Andrew's recent match.pd changes triggered a regression in my tester for the rx processor for c-torture/execute/pr66940.c which would be exposed only during an LTO compilation.

Specifically the subdi3_internal pattern had the wrong idiom to detect a carry from the high word into the low word. It had the wrong opcode and the operands were reversed.

This resulted in combine doing a simplification that was valid according to the presented RTL, but which ultimately got the wrong result.

I would often say this was a latent bug. But the testsuite shows builtin-arith-overflow-14 and builtin-arith-overflow-p18 failures are fixed as well. So it's been visible indefinitely, but nobody's ever looked into those failures.

Committed to the trunk.

Jeff
commit db08a096e4b19b91a7ec64f31a45549bb1f077ff
Author: Jeff Law <j...@ventanamicro.com>
Date:   Fri Aug 11 15:52:57 2023 -0600

    [committed] Fix subdi3 synthesis on rx port
    
    Some of Andrew's recent match.pd changes triggered a regression in my tester
    for the rx processor for c-torture/execute/pr66940.c which would be exposed
    only during an LTO compilation.
    
    Specifically the subdi3_internal pattern had the wrong idiom to detect a 
carry
    from the high word into the low word.  It had the wrong opcode and the 
operands
    were reversed.
    
    This resulted in combine doing a simplification that was valid according to 
the
    presented RTL, but which ultimately got the wrong result.
    
    I would often say this was a latent bug.  But the testsuite shows
    builtin-arith-overflow-14 and builtin-arith-overflow-p18 failures are fixed 
as
    well.  So it's been visible indefinitely, but nobody's ever looked into 
those
    failures.
    
    Committed to the trunk.
    
    gcc/
            * config/rx/rx.md (subdi3): Fix test for borrow.

diff --git a/gcc/config/rx/rx.md b/gcc/config/rx/rx.md
index 6959c6095c6..f6b13b92aa5 100644
--- a/gcc/config/rx/rx.md
+++ b/gcc/config/rx/rx.md
@@ -1722,7 +1722,7 @@ (define_insn_and_split "subdi3_internal"
          (minus:SI
            (match_operand:SI      4 "register_operand"   "  1, 1")
            (match_operand:SI      5 "rx_compare_operand" " rQ,rQ"))
-         (geu:SI (match_dup 2) (match_dup 3))))
+         (gtu:SI (match_dup 3) (match_dup 2))))
    (clobber (reg:CC CC_REG))]
   ""
   "#"

Reply via email to