mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-09 22:24:37 +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:
@ -697,6 +697,21 @@ static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) {
|
||||
}
|
||||
}
|
||||
|
||||
static FastMathFlags getDecodedFastMathFlags(unsigned Val) {
|
||||
FastMathFlags FMF;
|
||||
if (0 != (Val & FastMathFlags::UnsafeAlgebra))
|
||||
FMF.setUnsafeAlgebra();
|
||||
if (0 != (Val & FastMathFlags::NoNaNs))
|
||||
FMF.setNoNaNs();
|
||||
if (0 != (Val & FastMathFlags::NoInfs))
|
||||
FMF.setNoInfs();
|
||||
if (0 != (Val & FastMathFlags::NoSignedZeros))
|
||||
FMF.setNoSignedZeros();
|
||||
if (0 != (Val & FastMathFlags::AllowReciprocal))
|
||||
FMF.setAllowReciprocal();
|
||||
return FMF;
|
||||
}
|
||||
|
||||
static void upgradeDLLImportExportLinkage(llvm::GlobalValue *GV, unsigned Val) {
|
||||
switch (Val) {
|
||||
case 5: GV->setDLLStorageClass(GlobalValue::DLLImportStorageClass); break;
|
||||
@ -3472,17 +3487,7 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
if (Record[OpNum] & (1 << bitc::PEO_EXACT))
|
||||
cast<BinaryOperator>(I)->setIsExact(true);
|
||||
} else if (isa<FPMathOperator>(I)) {
|
||||
FastMathFlags FMF;
|
||||
if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra))
|
||||
FMF.setUnsafeAlgebra();
|
||||
if (0 != (Record[OpNum] & FastMathFlags::NoNaNs))
|
||||
FMF.setNoNaNs();
|
||||
if (0 != (Record[OpNum] & FastMathFlags::NoInfs))
|
||||
FMF.setNoInfs();
|
||||
if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros))
|
||||
FMF.setNoSignedZeros();
|
||||
if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal))
|
||||
FMF.setAllowReciprocal();
|
||||
FastMathFlags FMF = getDecodedFastMathFlags(Record[OpNum]);
|
||||
if (FMF.any())
|
||||
I->setFastMathFlags(FMF);
|
||||
}
|
||||
@ -3739,14 +3744,25 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *LHS, *RHS;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, LHS) ||
|
||||
popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) ||
|
||||
OpNum+1 != Record.size())
|
||||
popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS))
|
||||
return error("Invalid record");
|
||||
|
||||
unsigned PredVal = Record[OpNum];
|
||||
bool IsFP = LHS->getType()->isFPOrFPVectorTy();
|
||||
FastMathFlags FMF;
|
||||
if (IsFP && Record.size() > OpNum+1)
|
||||
FMF = getDecodedFastMathFlags(Record[++OpNum]);
|
||||
|
||||
if (OpNum+1 != Record.size())
|
||||
return error("Invalid record");
|
||||
|
||||
if (LHS->getType()->isFPOrFPVectorTy())
|
||||
I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS);
|
||||
I = new FCmpInst((FCmpInst::Predicate)PredVal, LHS, RHS);
|
||||
else
|
||||
I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS);
|
||||
I = new ICmpInst((ICmpInst::Predicate)PredVal, LHS, RHS);
|
||||
|
||||
if (FMF.any())
|
||||
I->setFastMathFlags(FMF);
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
|
@ -1759,13 +1759,17 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
|
||||
pushValue(I.getOperand(2), InstID, Vals, VE);
|
||||
break;
|
||||
case Instruction::ICmp:
|
||||
case Instruction::FCmp:
|
||||
case Instruction::FCmp: {
|
||||
// compare returning Int1Ty or vector of Int1Ty
|
||||
Code = bitc::FUNC_CODE_INST_CMP2;
|
||||
PushValueAndType(I.getOperand(0), InstID, Vals, VE);
|
||||
pushValue(I.getOperand(1), InstID, Vals, VE);
|
||||
Vals.push_back(cast<CmpInst>(I).getPredicate());
|
||||
uint64_t Flags = GetOptimizationFlags(&I);
|
||||
if (Flags != 0)
|
||||
Vals.push_back(Flags);
|
||||
break;
|
||||
}
|
||||
|
||||
case Instruction::Ret:
|
||||
{
|
||||
|
Reference in New Issue
Block a user