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))]
""
"#"