aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <jlaw@ventanamicro.com>2024-12-30 07:40:07 -0700
committerJeff Law <jlaw@ventanamicro.com>2024-12-30 07:42:54 -0700
commit64d31343d4676d8ceef9232dcd33824bc2eff330 (patch)
treeb2bbd4022cd695c54826a5449d4ce6e3546a9425
parentea66f57c9603312a8e4117b719d55becbc28ec43 (diff)
downloadgcc-64d31343d4676d8ceef9232dcd33824bc2eff330.zip
gcc-64d31343d4676d8ceef9232dcd33824bc2eff330.tar.gz
gcc-64d31343d4676d8ceef9232dcd33824bc2eff330.tar.bz2
[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.
-rw-r--r--gcc/config/riscv/riscv.md24
-rw-r--r--gcc/testsuite/gcc.target/riscv/pr118122.c12
2 files changed, 24 insertions, 12 deletions
diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 6c6155c..deb1560 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 0000000..0cdc3bf
--- /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;
+}
+
+