https://gcc.gnu.org/g:64d31343d4676d8ceef9232dcd33824bc2eff330

commit r15-6470-g64d31343d4676d8ceef9232dcd33824bc2eff330
Author: Jeff Law <j...@ventanamicro.com>
Date:   Mon Dec 30 07:40:07 2024 -0700

    [RISC-V][PR target/118122] Fix modes in recently added risc-v pattern
    
    The new pattern to optimize certain code sequences on RISC-V played things a
    bit fast and loose with modes -- some operands were using the ALLI iterator
    while the scratch used X and the split codegen used X.
    
    Naturally under the "right" circumstances this would trigger an ICE due to
    mismatched modes.  This patch uses X consistently in that pattern. It also
    fixes some formatting nits.
    
    Tested in my tester, but waiting on the pre-commit verdict before moving
    forward.
    
            PR target/118122
    gcc/
            * config/riscv/riscv.md (lui_constraint<X:mode>_and_to_or): Use
            X iterator rather than ANYI consistently.  Fix formatting.
    
    gcc/testsuite
    
            * gcc.target/riscv/pr118122.c: New test.

Diff:
---
 gcc/config/riscv/riscv.md                 | 24 ++++++++++++------------
 gcc/testsuite/gcc.target/riscv/pr118122.c | 12 ++++++++++++
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 6c6155ceeb83..deb156075497 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -861,19 +861,19 @@
 ;; Transform (X & C1) + C2 into (X | ~C1) - (-C2 | ~C1)
 ;; Where C1 is not a LUI operand, but ~C1 is a LUI operand
 
-(define_insn_and_split "*lui_constraint<ANYI:mode>_and_to_or"
-       [(set (match_operand:ANYI 0 "register_operand" "=r")
-       (plus:ANYI (and:ANYI (match_operand:ANYI 1 "register_operand" "r")
-                        (match_operand 2 "const_int_operand"))
-                (match_operand 3 "const_int_operand")))
+(define_insn_and_split "*lui_constraint<X:mode>_and_to_or"
+       [(set (match_operand:X 0 "register_operand" "=r")
+       (plus:X (and:X (match_operand:X 1 "register_operand" "r")
+                      (match_operand 2 "const_int_operand"))
+               (match_operand 3 "const_int_operand")))
    (clobber (match_scratch:X 4 "=&r"))]
-  "LUI_OPERAND (~INTVAL (operands[2]))
-   && ((INTVAL (operands[2]) & (-INTVAL (operands[3])))
-   == (-INTVAL (operands[3])))
-   && riscv_const_insns (operands[3], false)
-   && (riscv_const_insns
-   (GEN_INT (~INTVAL (operands[2]) | -INTVAL (operands[3])), false)
-   <= riscv_const_insns (operands[3], false))"
+  "(LUI_OPERAND (~INTVAL (operands[2]))
+    && ((INTVAL (operands[2]) & (-INTVAL (operands[3])))
+       == (-INTVAL (operands[3])))
+    && riscv_const_insns (operands[3], false)
+    && (riscv_const_insns (GEN_INT (~INTVAL (operands[2])
+                                   | -INTVAL (operands[3])), false)
+       <= riscv_const_insns (operands[3], false)))"
   "#"
   "&& reload_completed"
   [(set (match_dup 4) (match_dup 5))
diff --git a/gcc/testsuite/gcc.target/riscv/pr118122.c 
b/gcc/testsuite/gcc.target/riscv/pr118122.c
new file mode 100644
index 000000000000..0cdc3bf83b12
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/pr118122.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fno-tree-ter -fno-forward-propagate" } */
+char c;
+
+void
+foo(short s)
+{
+  s += 34231u;
+  c = s;
+}
+
+

Reply via email to