diff options
| author | Michael Liao <michael.liao@intel.com> | 2012-08-11 23:47:06 +0000 |
|---|---|---|
| committer | Michael Liao <michael.liao@intel.com> | 2012-08-11 23:47:06 +0000 |
| commit | e7e828fd64beb911da9461dbbbeb332d907cdbe2 (patch) | |
| tree | c785971bd1a3999d38f795e5d6b3fb2a24f1cf0f /llvm/lib | |
| parent | b03a84c13e5a907f59568d4c0913e94faf6f3e31 (diff) | |
| download | bcm5719-llvm-e7e828fd64beb911da9461dbbbeb332d907cdbe2.tar.gz bcm5719-llvm-e7e828fd64beb911da9461dbbbeb332d907cdbe2.zip | |
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.
llvm-svn: 161732
Diffstat (limited to 'llvm/lib')
| -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(), |

