diff options
| author | Tim Northover <tnorthover@apple.com> | 2014-05-10 07:37:50 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2014-05-10 07:37:50 +0000 |
| commit | 55b3e22927a7e3e811b3c7f0304146f598f72987 (patch) | |
| tree | 5373d73ea51e82054a959f038d323760590321e7 /llvm/lib/Target/ARM64 | |
| parent | 9c8821bbef7f26d80e34c3ed2f771af7aa365d4b (diff) | |
| download | bcm5719-llvm-55b3e22927a7e3e811b3c7f0304146f598f72987.tar.gz bcm5719-llvm-55b3e22927a7e3e811b3c7f0304146f598f72987.zip | |
ARM64: fix SELECT_CC lowering in absence of NaNs.
We were swapping the true & false results while testing for FMAX/FMIN,
but not putting them back to the original state if the later checks
failed.
Should fix PR19700.
llvm-svn: 208469
Diffstat (limited to 'llvm/lib/Target/ARM64')
| -rw-r--r-- | llvm/lib/Target/ARM64/ARM64ISelLowering.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp b/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp index bff6ba060fb..b422ddcb43d 100644 --- a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp +++ b/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp @@ -3121,17 +3121,18 @@ SDValue ARM64TargetLowering::LowerSELECT_CC(SDValue Op, // Try to match this select into a max/min operation, which have dedicated // opcode in the instruction set. - // NOTE: This is not correct in the presence of NaNs, so we only enable this + // FIXME: This is not correct in the presence of NaNs, so we only enable this // in no-NaNs mode. if (getTargetMachine().Options.NoNaNsFPMath) { - if (selectCCOpsAreFMaxCompatible(LHS, FVal) && - selectCCOpsAreFMaxCompatible(RHS, TVal)) { + SDValue MinMaxLHS = TVal, MinMaxRHS = FVal; + if (selectCCOpsAreFMaxCompatible(LHS, MinMaxRHS) && + selectCCOpsAreFMaxCompatible(RHS, MinMaxLHS)) { CC = ISD::getSetCCSwappedOperands(CC); - std::swap(TVal, FVal); + std::swap(MinMaxLHS, MinMaxRHS); } - if (selectCCOpsAreFMaxCompatible(LHS, TVal) && - selectCCOpsAreFMaxCompatible(RHS, FVal)) { + if (selectCCOpsAreFMaxCompatible(LHS, MinMaxLHS) && + selectCCOpsAreFMaxCompatible(RHS, MinMaxRHS)) { switch (CC) { default: break; @@ -3141,7 +3142,7 @@ SDValue ARM64TargetLowering::LowerSELECT_CC(SDValue Op, case ISD::SETUGE: case ISD::SETOGT: case ISD::SETOGE: - return DAG.getNode(ARM64ISD::FMAX, dl, VT, TVal, FVal); + return DAG.getNode(ARM64ISD::FMAX, dl, VT, MinMaxLHS, MinMaxRHS); break; case ISD::SETLT: case ISD::SETLE: @@ -3149,7 +3150,7 @@ SDValue ARM64TargetLowering::LowerSELECT_CC(SDValue Op, case ISD::SETULE: case ISD::SETOLT: case ISD::SETOLE: - return DAG.getNode(ARM64ISD::FMIN, dl, VT, TVal, FVal); + return DAG.getNode(ARM64ISD::FMIN, dl, VT, MinMaxLHS, MinMaxRHS); break; } } |

