The problem is that expansion can use const0_rtx as an indicator that we are not interested in the value. This is an invalid as a target of a move, so, we must always have a valid target. This dummies up a target, just like in the NULL_RTX case.
Ok? diff --git a/gcc/optabs.c b/gcc/optabs.c index 353727f..a091deb 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -7174,6 +7174,8 @@ expand_atomic_test_and_set (rtx target, rtx mem, enum memmodel model) { trueval = const1_rtx; subtarget = target ? target : gen_reg_rtx (mode); + if (subtarget == const0_rtx) + subtarget = gen_reg_rtx (mode); } else {