diff options
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 20 | 
1 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index af1675b4d94..5dbe633d6e8 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -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(),  | 

