rs6000: Workaround for new ifcvt behavior [PR104335].

Since r12-6747-gaa8cfe785953a0 ifcvt passes a "cc comparison"
i.e. the representation of the result of a comparison to the
backend.  rs6000_emit_int_cmove () is not prepared to handle this.
Therefore, this patch makes it return false in such a case.

	PR target/104335

gcc/ChangeLog:

	* config/rs6000/rs6000.cc (rs6000_emit_int_cmove): Return false
	if the expected comparison's first operand is of mode MODE_CC.
This commit is contained in:
Robin Dapp 2022-02-17 19:59:51 +01:00
parent 73a118c209
commit fac15bf848

View file

@ -16215,6 +16215,12 @@ rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
return false;
/* PR104335: We now need to expect CC-mode "comparisons"
coming from ifcvt. The following code expects proper
comparisons so better abort here. */
if (GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_CC)
return false;
/* We still have to do the compare, because isel doesn't do a
compare, it just looks at the CRx bits set by a previous compare
instruction. */