mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
bitcode support change for fast flags compatibility
Summary: The discussion and as per need, each vendor needs a way to keep the old fast flags and the new fast flags in the auto upgrade path of the IR upgrader. This revision addresses that issue. Patched by Michael Berg Reviewers: qcolombet, hans, steven_wu Reviewed By: qcolombet, steven_wu Subscribers: dexonsmith, vsk, mehdi_amini, andrewrk, MatzeB, wristow, spatel Differential Revision: https://reviews.llvm.org/D43253 llvm-svn: 325525
This commit is contained in:
parent
70cba954aa
commit
a49fcd3ebf
@ -407,6 +407,20 @@ enum OverflowingBinaryOperatorOptionalFlags {
|
|||||||
OBO_NO_SIGNED_WRAP = 1
|
OBO_NO_SIGNED_WRAP = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// FastMath Flags
|
||||||
|
/// This is a fixed layout derived from the bitcode emitted by LLVM 5.0
|
||||||
|
/// intended to decouple the in-memory representation from the serialization.
|
||||||
|
enum FastMathMap {
|
||||||
|
UnsafeAlgebra = (1 << 0), // Legacy
|
||||||
|
NoNaNs = (1 << 1),
|
||||||
|
NoInfs = (1 << 2),
|
||||||
|
NoSignedZeros = (1 << 3),
|
||||||
|
AllowReciprocal = (1 << 4),
|
||||||
|
AllowContract = (1 << 5),
|
||||||
|
ApproxFunc = (1 << 6),
|
||||||
|
AllowReassoc = (1 << 7)
|
||||||
|
};
|
||||||
|
|
||||||
/// PossiblyExactOperatorOptionalFlags - Flags for serializing
|
/// PossiblyExactOperatorOptionalFlags - Flags for serializing
|
||||||
/// PossiblyExactOperator's SubclassOptionalData contents.
|
/// PossiblyExactOperator's SubclassOptionalData contents.
|
||||||
enum PossiblyExactOperatorOptionalFlags { PEO_EXACT = 0 };
|
enum PossiblyExactOperatorOptionalFlags { PEO_EXACT = 0 };
|
||||||
|
@ -1047,19 +1047,21 @@ static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) {
|
|||||||
|
|
||||||
static FastMathFlags getDecodedFastMathFlags(unsigned Val) {
|
static FastMathFlags getDecodedFastMathFlags(unsigned Val) {
|
||||||
FastMathFlags FMF;
|
FastMathFlags FMF;
|
||||||
if (0 != (Val & FastMathFlags::AllowReassoc))
|
if (0 != (Val & bitc::UnsafeAlgebra))
|
||||||
|
FMF.setFast();
|
||||||
|
if (0 != (Val & bitc::AllowReassoc))
|
||||||
FMF.setAllowReassoc();
|
FMF.setAllowReassoc();
|
||||||
if (0 != (Val & FastMathFlags::NoNaNs))
|
if (0 != (Val & bitc::NoNaNs))
|
||||||
FMF.setNoNaNs();
|
FMF.setNoNaNs();
|
||||||
if (0 != (Val & FastMathFlags::NoInfs))
|
if (0 != (Val & bitc::NoInfs))
|
||||||
FMF.setNoInfs();
|
FMF.setNoInfs();
|
||||||
if (0 != (Val & FastMathFlags::NoSignedZeros))
|
if (0 != (Val & bitc::NoSignedZeros))
|
||||||
FMF.setNoSignedZeros();
|
FMF.setNoSignedZeros();
|
||||||
if (0 != (Val & FastMathFlags::AllowReciprocal))
|
if (0 != (Val & bitc::AllowReciprocal))
|
||||||
FMF.setAllowReciprocal();
|
FMF.setAllowReciprocal();
|
||||||
if (0 != (Val & FastMathFlags::AllowContract))
|
if (0 != (Val & bitc::AllowContract))
|
||||||
FMF.setAllowContract(true);
|
FMF.setAllowContract(true);
|
||||||
if (0 != (Val & FastMathFlags::ApproxFunc))
|
if (0 != (Val & bitc::ApproxFunc))
|
||||||
FMF.setApproxFunc();
|
FMF.setApproxFunc();
|
||||||
return FMF;
|
return FMF;
|
||||||
}
|
}
|
||||||
|
@ -1334,19 +1334,19 @@ static uint64_t getOptimizationFlags(const Value *V) {
|
|||||||
Flags |= 1 << bitc::PEO_EXACT;
|
Flags |= 1 << bitc::PEO_EXACT;
|
||||||
} else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
|
} else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
|
||||||
if (FPMO->hasAllowReassoc())
|
if (FPMO->hasAllowReassoc())
|
||||||
Flags |= FastMathFlags::AllowReassoc;
|
Flags |= bitc::AllowReassoc;
|
||||||
if (FPMO->hasNoNaNs())
|
if (FPMO->hasNoNaNs())
|
||||||
Flags |= FastMathFlags::NoNaNs;
|
Flags |= bitc::NoNaNs;
|
||||||
if (FPMO->hasNoInfs())
|
if (FPMO->hasNoInfs())
|
||||||
Flags |= FastMathFlags::NoInfs;
|
Flags |= bitc::NoInfs;
|
||||||
if (FPMO->hasNoSignedZeros())
|
if (FPMO->hasNoSignedZeros())
|
||||||
Flags |= FastMathFlags::NoSignedZeros;
|
Flags |= bitc::NoSignedZeros;
|
||||||
if (FPMO->hasAllowReciprocal())
|
if (FPMO->hasAllowReciprocal())
|
||||||
Flags |= FastMathFlags::AllowReciprocal;
|
Flags |= bitc::AllowReciprocal;
|
||||||
if (FPMO->hasAllowContract())
|
if (FPMO->hasAllowContract())
|
||||||
Flags |= FastMathFlags::AllowContract;
|
Flags |= bitc::AllowContract;
|
||||||
if (FPMO->hasApproxFunc())
|
if (FPMO->hasApproxFunc())
|
||||||
Flags |= FastMathFlags::ApproxFunc;
|
Flags |= bitc::ApproxFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Flags;
|
return Flags;
|
||||||
@ -3196,7 +3196,7 @@ void ModuleBitcodeWriter::writeBlockInfo() {
|
|||||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS
|
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS
|
||||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS
|
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS
|
||||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
|
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
|
||||||
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // flags
|
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags
|
||||||
if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
|
if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
|
||||||
FUNCTION_INST_BINOP_FLAGS_ABBREV)
|
FUNCTION_INST_BINOP_FLAGS_ABBREV)
|
||||||
llvm_unreachable("Unexpected abbrev ordering!");
|
llvm_unreachable("Unexpected abbrev ordering!");
|
||||||
|
@ -612,9 +612,7 @@ define void @fastmathflags(float %op1, float %op2) {
|
|||||||
%f.arcp = fadd arcp float %op1, %op2
|
%f.arcp = fadd arcp float %op1, %op2
|
||||||
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
||||||
%f.fast = fadd fast float %op1, %op2
|
%f.fast = fadd fast float %op1, %op2
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %f.fast = fadd fast float %op1, %op2
|
||||||
; The binary test file does not have the newer 'contract' and 'afn' bits set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
|
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -656,9 +656,7 @@ define void @fastmathflags(float %op1, float %op2) {
|
|||||||
%f.arcp = fadd arcp float %op1, %op2
|
%f.arcp = fadd arcp float %op1, %op2
|
||||||
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
||||||
%f.fast = fadd fast float %op1, %op2
|
%f.fast = fadd fast float %op1, %op2
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %f.fast = fadd fast float %op1, %op2
|
||||||
; The binary test file does not have the newer 'contract' and 'afn' bits set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
|
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -687,9 +687,7 @@ define void @fastmathflags(float %op1, float %op2) {
|
|||||||
%f.arcp = fadd arcp float %op1, %op2
|
%f.arcp = fadd arcp float %op1, %op2
|
||||||
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
||||||
%f.fast = fadd fast float %op1, %op2
|
%f.fast = fadd fast float %op1, %op2
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %f.fast = fadd fast float %op1, %op2
|
||||||
; The binary test file does not have the newer 'contract' and 'afn' bits set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
|
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -702,9 +700,7 @@ declare <4 x double> @fmf3()
|
|||||||
; CHECK-LABEL: fastMathFlagsForCalls(
|
; CHECK-LABEL: fastMathFlagsForCalls(
|
||||||
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
||||||
%call.fast = call fast float @fmf1()
|
%call.fast = call fast float @fmf1()
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %call.fast = call fast float @fmf1()
|
||||||
; The binary test file does not have the newer 'contract' and 'aml' bits set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %call.fast = call reassoc nnan ninf nsz arcp float @fmf1()
|
|
||||||
|
|
||||||
; Throw in some other attributes to make sure those stay in the right places.
|
; Throw in some other attributes to make sure those stay in the right places.
|
||||||
|
|
||||||
|
@ -758,9 +758,7 @@ define void @fastmathflags(float %op1, float %op2) {
|
|||||||
%f.arcp = fadd arcp float %op1, %op2
|
%f.arcp = fadd arcp float %op1, %op2
|
||||||
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
||||||
%f.fast = fadd fast float %op1, %op2
|
%f.fast = fadd fast float %op1, %op2
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %f.fast = fadd fast float %op1, %op2
|
||||||
; The binary test file does not have the newer 'contract' and 'afn' bits set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
|
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -773,9 +771,7 @@ declare <4 x double> @fmf3()
|
|||||||
; CHECK-LABEL: fastMathFlagsForCalls(
|
; CHECK-LABEL: fastMathFlagsForCalls(
|
||||||
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
||||||
%call.fast = call fast float @fmf1()
|
%call.fast = call fast float @fmf1()
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %call.fast = call fast float @fmf1()
|
||||||
; The binary test file does not have the newer 'contract' and 'afn' bits set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %call.fast = call reassoc nnan ninf nsz arcp float @fmf1()
|
|
||||||
|
|
||||||
; Throw in some other attributes to make sure those stay in the right places.
|
; Throw in some other attributes to make sure those stay in the right places.
|
||||||
|
|
||||||
|
@ -757,10 +757,8 @@ define void @fastmathflags(float %op1, float %op2) {
|
|||||||
; CHECK: %f.nsz = fadd nsz float %op1, %op2
|
; CHECK: %f.nsz = fadd nsz float %op1, %op2
|
||||||
%f.arcp = fadd arcp float %op1, %op2
|
%f.arcp = fadd arcp float %op1, %op2
|
||||||
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
; CHECK: %f.arcp = fadd arcp float %op1, %op2
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
|
||||||
; The binary test file does not have the newer 'contract' and 'afn' bits set, so this is not fully 'fast'.
|
|
||||||
%f.fast = fadd fast float %op1, %op2
|
%f.fast = fadd fast float %op1, %op2
|
||||||
; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
|
; CHECK: %f.fast = fadd fast float %op1, %op2
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -773,9 +771,7 @@ declare <4 x double> @fmf3()
|
|||||||
; CHECK-LABEL: fastMathFlagsForCalls(
|
; CHECK-LABEL: fastMathFlagsForCalls(
|
||||||
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
||||||
%call.fast = call fast float @fmf1()
|
%call.fast = call fast float @fmf1()
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %call.fast = call fast float @fmf1()
|
||||||
; The binary test file does not have the newer 'contract' and 'afn' bits set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %call.fast = call reassoc nnan ninf nsz arcp float @fmf1()
|
|
||||||
|
|
||||||
; Throw in some other attributes to make sure those stay in the right places.
|
; Throw in some other attributes to make sure those stay in the right places.
|
||||||
|
|
||||||
|
@ -765,9 +765,7 @@ define void @fastmathflags(float %op1, float %op2) {
|
|||||||
%f.contract = fadd contract float %op1, %op2
|
%f.contract = fadd contract float %op1, %op2
|
||||||
; CHECK: %f.contract = fadd contract float %op1, %op2
|
; CHECK: %f.contract = fadd contract float %op1, %op2
|
||||||
%f.fast = fadd fast float %op1, %op2
|
%f.fast = fadd fast float %op1, %op2
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %f.fast = fadd fast float %op1, %op2
|
||||||
; The binary test file does not have the newer 'afn' bit set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp contract float %op1, %op2
|
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -780,9 +778,7 @@ declare <4 x double> @fmf3()
|
|||||||
; CHECK-LABEL: fastMathFlagsForCalls(
|
; CHECK-LABEL: fastMathFlagsForCalls(
|
||||||
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
|
||||||
%call.fast = call fast float @fmf1()
|
%call.fast = call fast float @fmf1()
|
||||||
; 'fast' used to be its own bit, but this changed in Oct 2017.
|
; CHECK: %call.fast = call fast float @fmf1()
|
||||||
; The binary test file does not have the newer 'afn' bit set, so this is not fully 'fast'.
|
|
||||||
; CHECK: %call.fast = call reassoc nnan ninf nsz arcp contract float @fmf1()
|
|
||||||
|
|
||||||
; Throw in some other attributes to make sure those stay in the right places.
|
; Throw in some other attributes to make sure those stay in the right places.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user