]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Require in peephole2 that memory is offsettable [PR119450]
authorJakub Jelinek <jakub@redhat.com>
Wed, 26 Mar 2025 07:47:20 +0000 (08:47 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 26 Mar 2025 07:49:46 +0000 (08:49 +0100)
The following testcase ICEs because a peephole2 attempts to offset
memory which is not offsettable (in particular address is a ZERO_EXTEND
in this case).

Because peephole2s don't support constraints, I've added a check for this
in the peephole2's condition.

2025-03-26  Jakub Jelinek  <jakub@redhat.com>

PR target/119450
* config/i386/i386.md (narrow test peephole2): Test for
offsettable_memref_p in condition.

* gcc.target/i386/pr119450.c: New test.

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

index 9d1b34e559598b19e8e5d737fd610662fe2ccaf6..f7f790d2aeb48b2b592efcb2fb94b42b1f08240d 100644 (file)
          (and:SWI248 (match_operand:SWI248 0 "memory_operand")
                      (match_operand 1 "const_int_operand"))
          (const_int 0)))]
-  "!TARGET_PARTIAL_MEMORY_READ_STALL && !MEM_VOLATILE_P (operands[0])"
+  "!TARGET_PARTIAL_MEMORY_READ_STALL
+   && !MEM_VOLATILE_P (operands[0])
+   && offsettable_memref_p (operands[0])"
   [(set (reg:CCZ FLAGS_REG)
        (compare:CCZ (match_dup 2) (const_int 0)))]
 {
diff --git a/gcc/testsuite/gcc.target/i386/pr119450.c b/gcc/testsuite/gcc.target/i386/pr119450.c
new file mode 100644 (file)
index 0000000..fa4bbda
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/119450 */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+long *a;
+int b;
+
+void
+foo (void)
+{
+  unsigned d = b >> 30;
+  a = (long *) (__UINTPTR_TYPE__) d;
+  if (*a & 1 << 30)
+    *a = 0;
+}