mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-28 05:19:42 +00:00
Add support for fast-math flags to the FCmp instruction.
FCmp behaves a lot like a floating-point binary operator in many ways, and can benefit from fast-math information. Flags such as nsz and nnan can affect if this fcmp (in combination with a select) can be treated as a fminnum/fmaxnum operation. This adds backwards-compatible bitcode support, IR parsing and writing, LangRef changes and IRBuilder changes. I'll need to audit InstSimplify and InstCombine in a followup to find places where flags should be copied. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241901 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1382,47 +1382,61 @@ public:
|
||||
return CreateICmp(ICmpInst::ICMP_SLE, LHS, RHS, Name);
|
||||
}
|
||||
|
||||
Value *CreateFCmpOEQ(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_OEQ, LHS, RHS, Name);
|
||||
Value *CreateFCmpOEQ(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_OEQ, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpOGT(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_OGT, LHS, RHS, Name);
|
||||
Value *CreateFCmpOGT(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_OGT, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpOGE(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_OGE, LHS, RHS, Name);
|
||||
Value *CreateFCmpOGE(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_OGE, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpOLT(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_OLT, LHS, RHS, Name);
|
||||
Value *CreateFCmpOLT(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_OLT, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpOLE(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_OLE, LHS, RHS, Name);
|
||||
Value *CreateFCmpOLE(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_OLE, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpONE(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_ONE, LHS, RHS, Name);
|
||||
Value *CreateFCmpONE(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_ONE, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpORD(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_ORD, LHS, RHS, Name);
|
||||
Value *CreateFCmpORD(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_ORD, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpUNO(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_UNO, LHS, RHS, Name);
|
||||
Value *CreateFCmpUNO(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_UNO, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpUEQ(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_UEQ, LHS, RHS, Name);
|
||||
Value *CreateFCmpUEQ(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_UEQ, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpUGT(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_UGT, LHS, RHS, Name);
|
||||
Value *CreateFCmpUGT(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_UGT, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpUGE(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_UGE, LHS, RHS, Name);
|
||||
Value *CreateFCmpUGE(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_UGE, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpULT(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_ULT, LHS, RHS, Name);
|
||||
Value *CreateFCmpULT(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_ULT, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpULE(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_ULE, LHS, RHS, Name);
|
||||
Value *CreateFCmpULE(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_ULE, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
Value *CreateFCmpUNE(Value *LHS, Value *RHS, const Twine &Name = "") {
|
||||
return CreateFCmp(FCmpInst::FCMP_UNE, LHS, RHS, Name);
|
||||
Value *CreateFCmpUNE(Value *LHS, Value *RHS, const Twine &Name = "",
|
||||
MDNode *FPMathTag = nullptr) {
|
||||
return CreateFCmp(FCmpInst::FCMP_UNE, LHS, RHS, Name, FPMathTag);
|
||||
}
|
||||
|
||||
Value *CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS,
|
||||
@@ -1433,11 +1447,12 @@ public:
|
||||
return Insert(new ICmpInst(P, LHS, RHS), Name);
|
||||
}
|
||||
Value *CreateFCmp(CmpInst::Predicate P, Value *LHS, Value *RHS,
|
||||
const Twine &Name = "") {
|
||||
const Twine &Name = "", MDNode *FPMathTag = nullptr) {
|
||||
if (Constant *LC = dyn_cast<Constant>(LHS))
|
||||
if (Constant *RC = dyn_cast<Constant>(RHS))
|
||||
return Insert(Folder.CreateFCmp(P, LC, RC), Name);
|
||||
return Insert(new FCmpInst(P, LHS, RHS), Name);
|
||||
return Insert(AddFPMathAttributes(new FCmpInst(P, LHS, RHS),
|
||||
FPMathTag, FMF), Name);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
||||
@@ -305,7 +305,8 @@ public:
|
||||
float getFPAccuracy() const;
|
||||
|
||||
static inline bool classof(const Instruction *I) {
|
||||
return I->getType()->isFPOrFPVectorTy();
|
||||
return I->getType()->isFPOrFPVectorTy() ||
|
||||
I->getOpcode() == Instruction::FCmp;
|
||||
}
|
||||
static inline bool classof(const Value *V) {
|
||||
return isa<Instruction>(V) && classof(cast<Instruction>(V));
|
||||
|
||||
Reference in New Issue
Block a user