diff options
author | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2021-02-12 02:57:26 +0100 |
---|---|---|
committer | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2021-02-18 12:36:46 -0600 |
commit | e57bd1ff4fb65208cb3060b62e1c48aa0aac623f (patch) | |
tree | 4b2aac52d3c09b5aa0a8c702d0ea88128ca710ac /clang/lib/CodeGen/TargetInfo.cpp | |
parent | bb260b1ca7d51869e140212aa543f53dfcf01a1b (diff) | |
download | llvm-e57bd1ff4fb65208cb3060b62e1c48aa0aac623f.zip llvm-e57bd1ff4fb65208cb3060b62e1c48aa0aac623f.tar.gz llvm-e57bd1ff4fb65208cb3060b62e1c48aa0aac623f.tar.bz2 |
[CFE, SystemZ] New target hook testFPKind() for checks of FP values.
The recent commit 00a6254 "Stop traping on sNaN in builtin_isnan" changed the
lowering in constrained FP mode of builtin_isnan from an FP comparison to
integer operations to avoid trapping.
SystemZ has a special instruction "Test Data Class" which is the preferred
way to do this check. This patch adds a new target hook "testFPKind()" that
lets SystemZ emit the s390_tdc intrinsic instead.
testFPKind() takes the BuiltinID as an argument and is expected to soon
handle more opcodes than just 'builtin_isnan'.
Review: Thomas Preud'homme, Ulrich Weigand
Differential Revision: https://reviews.llvm.org/D96568
Diffstat (limited to 'clang/lib/CodeGen/TargetInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index d425412..a11768d 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -21,6 +21,7 @@ #include "clang/AST/RecordLayout.h" #include "clang/Basic/CodeGenOptions.h" #include "clang/Basic/DiagnosticFrontend.h" +#include "clang/Basic/Builtins.h" #include "clang/CodeGen/CGFunctionInfo.h" #include "clang/CodeGen/SwiftCallingConv.h" #include "llvm/ADT/SmallBitVector.h" @@ -30,6 +31,7 @@ #include "llvm/ADT/Twine.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/IntrinsicsNVPTX.h" +#include "llvm/IR/IntrinsicsS390.h" #include "llvm/IR/Type.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> // std::sort @@ -7200,8 +7202,37 @@ public: SystemZTargetCodeGenInfo(CodeGenTypes &CGT, bool HasVector, bool SoftFloatABI) : TargetCodeGenInfo( std::make_unique<SystemZABIInfo>(CGT, HasVector, SoftFloatABI)) {} -}; + llvm::Value *testFPKind(llvm::Value *V, unsigned BuiltinID, + CGBuilderTy &Builder, + CodeGenModule &CGM) const override { + assert(V->getType()->isFloatingPointTy() && "V should have an FP type."); + // Only use TDC in constrained FP mode. + if (!Builder.getIsFPConstrained()) + return nullptr; + + llvm::Type *Ty = V->getType(); + if (Ty->isFloatTy() || Ty->isDoubleTy() || Ty->isFP128Ty()) { + llvm::Module &M = CGM.getModule(); + auto &Ctx = M.getContext(); + llvm::Function *TDCFunc = + llvm::Intrinsic::getDeclaration(&M, llvm::Intrinsic::s390_tdc, Ty); + unsigned TDCBits = 0; + switch (BuiltinID) { + case Builtin::BI__builtin_isnan: + TDCBits = 0xf; + break; + default: + break; + } + if (TDCBits) + return Builder.CreateCall( + TDCFunc, + {V, llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), TDCBits)}); + } + return nullptr; + } +}; } bool SystemZABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const { |