fix PR13577, an issue introduced by r161687

- FCMOV only supports a subset of X86 conditions. Skip boolean
  simplification if X86 condition is not valid for FCMOV.
- add a minimal test case for PR13577.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161732 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael Liao 2012-08-11 23:47:06 +00:00
parent 235e2e6f0d
commit 9eac20ac88
2 changed files with 27 additions and 1 deletions

View File

@ -13843,6 +13843,22 @@ static SDValue BoolTestSetCCCombine(SDValue Cmp, X86::CondCode &CC) {
return SetCC.getOperand(1);
}
static bool IsValidFCMOVCondition(X86::CondCode CC) {
switch (CC) {
default:
return false;
case X86::COND_B:
case X86::COND_BE:
case X86::COND_E:
case X86::COND_P:
case X86::COND_AE:
case X86::COND_A:
case X86::COND_NE:
case X86::COND_NP:
return true;
}
}
/// Optimize X86ISD::CMOV [LHS, RHS, CONDCODE (e.g. X86::COND_NE), CONDVAL]
static SDValue PerformCMOVCombine(SDNode *N, SelectionDAG &DAG,
TargetLowering::DAGCombinerInfo &DCI) {
@ -13871,7 +13887,9 @@ static SDValue PerformCMOVCombine(SDNode *N, SelectionDAG &DAG,
SDValue Flags;
Flags = BoolTestSetCCCombine(Cond, CC);
if (Flags.getNode()) {
if (Flags.getNode() &&
// Extra check as FCMOV only supports a subset of X86 cond.
(FalseOp.getValueType() != MVT::f80 || IsValidFCMOVCondition(CC))) {
SDValue Ops[] = { FalseOp, TrueOp,
DAG.getConstant(CC, MVT::i8), Flags };
return DAG.getNode(X86ISD::CMOV, DL, N->getVTList(),

View File

@ -0,0 +1,8 @@
; RUN: llc < %s -march=x86-64
define x86_fp80 @foo(x86_fp80 %a) {
%1 = tail call x86_fp80 @copysignl(x86_fp80 0xK7FFF8000000000000000, x86_fp80 %a) nounwind readnone
ret x86_fp80 %1
}
declare x86_fp80 @copysignl(x86_fp80, x86_fp80) nounwind readnone