+2018-06-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/86314
+ * config/i386/i386.md (setcc + movzbl to xor + setcc peephole2s):
+ Check reg_overlap_mentioned_p in addition to reg_set_p with the same
+ operands.
+
2018-06-25 Michael Meissner <meissner@linux.vnet.ibm.com>
Back port from trunk
"(peep2_reg_dead_p (3, operands[1])
|| operands_match_p (operands[1], operands[3]))
&& ! reg_overlap_mentioned_p (operands[3], operands[0])
+ && ! reg_overlap_mentioned_p (operands[3], operands[4])
&& ! reg_set_p (operands[3], operands[4])
&& peep2_regno_dead_p (0, FLAGS_REG)"
[(parallel [(set (match_dup 5) (match_dup 0))
"(peep2_reg_dead_p (3, operands[1])
|| operands_match_p (operands[1], operands[3]))
&& ! reg_overlap_mentioned_p (operands[3], operands[0])
+ && ! reg_overlap_mentioned_p (operands[3], operands[4])
&& ! reg_set_p (operands[3], operands[4])
&& peep2_regno_dead_p (0, FLAGS_REG)"
[(parallel [(set (match_dup 5) (match_dup 0))
--- /dev/null
+// PR target/86314
+// { dg-do run { target sync_int_long } }
+// { dg-options "-O2" }
+
+__attribute__((noinline, noclone)) unsigned long
+foo (unsigned long *p)
+{
+ unsigned long m = 1UL << ((*p & 1) ? 1 : 0);
+ unsigned long n = __atomic_fetch_or (p, m, __ATOMIC_SEQ_CST);
+ return (n & m) == 0;
+}
+
+int
+main ()
+{
+ unsigned long v = 1;
+ if (foo (&v) != 1)
+ __builtin_abort ();
+ return 0;
+}