]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[committed][RISC-V][PR target/123274] Add missing condition in usmul<mode>3 pattern
authorJeff Law <jeffrey.law@oss.qualcomm.com>
Tue, 23 Dec 2025 20:25:47 +0000 (13:25 -0700)
committerJeff Law <jeffrey.law@oss.qualcomm.com>
Tue, 23 Dec 2025 20:27:30 +0000 (13:27 -0700)
As Andrew P. noted in the BZ, the expander is missing elements in its condition
leading to generation of an insn that can't be matched.

This adds the necessary condition to the usmul<mode>3 expander which in turn
fixes the ICE.  I just checked and that expander wansn't in gcc-15, so this is
just a gcc-16 issue.

Tested on riscv32-elf and riscv64-elf.  I have a bootstrap in flight on the
Pioneer, but I'm not expecting any surprises.  Much like the patch earlier
today, I'm going to push this now rather than wait for pre-commit CI.

PR target/123274
gcc/
* config/riscv/riscv.md (usmul<mode>3): Add proper condition.

gcc/testsuite/
* gcc.target/riscv/pr123274.c: New test.

gcc/config/riscv/riscv.md
gcc/testsuite/gcc.target/riscv/pr123274.c [new file with mode: 0644]

index 6f8cd26e5c95878b3440166ef7c542587ae25c61..a24ec95b2e48112fa3678333011c723ace981931 100644 (file)
   [(match_operand:ANYI 0 "register_operand")
    (match_operand:ANYI 1 "register_operand")
    (match_operand:ANYI 2 "register_operand")]
-  ""
+  "TARGET_ZMMUL || TARGET_MUL"
   {
     riscv_expand_usmul (operands[0], operands[1], operands[2]);
     DONE;
diff --git a/gcc/testsuite/gcc.target/riscv/pr123274.c b/gcc/testsuite/gcc.target/riscv/pr123274.c
new file mode 100644 (file)
index 0000000..5f13e7c
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=rv64id" { target rv64 } } */
+/* { dg-options "-O2 -march=rv32id" { target rv32 } } */
+unsigned a, b;
+
+void
+foo()
+{
+  if (__builtin_mul_overflow(a, b, &b))
+    b = 0xffffffff;
+}