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.
(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)))]
{
--- /dev/null
+/* 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;
+}