summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorSteven Wu <stevenwu@apple.com>2018-02-19 19:22:28 +0000
committerSteven Wu <stevenwu@apple.com>2018-02-19 19:22:28 +0000
commit545d34a2724ef158d79c5e37dc817ceea9fbd1d8 (patch)
tree4c9b275b7730412e6dc9f3fd60517647552a6d3f /llvm
parent65207923f66d2813e5170f4f90002ece718f133f (diff)
downloadbcm5719-llvm-545d34a2724ef158d79c5e37dc817ceea9fbd1d8.tar.gz
bcm5719-llvm-545d34a2724ef158d79c5e37dc817ceea9fbd1d8.zip
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
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Bitcode/LLVMBitCodes.h14
-rw-r--r--llvm/lib/Bitcode/Reader/BitcodeReader.cpp16
-rw-r--r--llvm/lib/Bitcode/Writer/BitcodeWriter.cpp16
-rw-r--r--llvm/test/Bitcode/compatibility-3.6.ll4
-rw-r--r--llvm/test/Bitcode/compatibility-3.7.ll4
-rw-r--r--llvm/test/Bitcode/compatibility-3.8.ll8
-rw-r--r--llvm/test/Bitcode/compatibility-3.9.ll8
-rw-r--r--llvm/test/Bitcode/compatibility-4.0.ll8
-rw-r--r--llvm/test/Bitcode/compatibility-5.0.ll8
9 files changed, 41 insertions, 45 deletions
diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
index 11689975938..c030e9c4d41 100644
--- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h
+++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
@@ -407,6 +407,20 @@ enum OverflowingBinaryOperatorOptionalFlags {
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
/// PossiblyExactOperator's SubclassOptionalData contents.
enum PossiblyExactOperatorOptionalFlags { PEO_EXACT = 0 };
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index f38f7df0803..582298136ae 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -1047,19 +1047,21 @@ static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) {
static FastMathFlags getDecodedFastMathFlags(unsigned Val) {
FastMathFlags FMF;
- if (0 != (Val & FastMathFlags::AllowReassoc))
+ if (0 != (Val & bitc::UnsafeAlgebra))
+ FMF.setFast();
+ if (0 != (Val & bitc::AllowReassoc))
FMF.setAllowReassoc();
- if (0 != (Val & FastMathFlags::NoNaNs))
+ if (0 != (Val & bitc::NoNaNs))
FMF.setNoNaNs();
- if (0 != (Val & FastMathFlags::NoInfs))
+ if (0 != (Val & bitc::NoInfs))
FMF.setNoInfs();
- if (0 != (Val & FastMathFlags::NoSignedZeros))
+ if (0 != (Val & bitc::NoSignedZeros))
FMF.setNoSignedZeros();
- if (0 != (Val & FastMathFlags::AllowReciprocal))
+ if (0 != (Val & bitc::AllowReciprocal))
FMF.setAllowReciprocal();
- if (0 != (Val & FastMathFlags::AllowContract))
+ if (0 != (Val & bitc::AllowContract))
FMF.setAllowContract(true);
- if (0 != (Val & FastMathFlags::ApproxFunc))
+ if (0 != (Val & bitc::ApproxFunc))
FMF.setApproxFunc();
return FMF;
}
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index 15c06f5506a..832f494bc77 100644
--- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -1334,19 +1334,19 @@ static uint64_t getOptimizationFlags(const Value *V) {
Flags |= 1 << bitc::PEO_EXACT;
} else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
if (FPMO->hasAllowReassoc())
- Flags |= FastMathFlags::AllowReassoc;
+ Flags |= bitc::AllowReassoc;
if (FPMO->hasNoNaNs())
- Flags |= FastMathFlags::NoNaNs;
+ Flags |= bitc::NoNaNs;
if (FPMO->hasNoInfs())
- Flags |= FastMathFlags::NoInfs;
+ Flags |= bitc::NoInfs;
if (FPMO->hasNoSignedZeros())
- Flags |= FastMathFlags::NoSignedZeros;
+ Flags |= bitc::NoSignedZeros;
if (FPMO->hasAllowReciprocal())
- Flags |= FastMathFlags::AllowReciprocal;
+ Flags |= bitc::AllowReciprocal;
if (FPMO->hasAllowContract())
- Flags |= FastMathFlags::AllowContract;
+ Flags |= bitc::AllowContract;
if (FPMO->hasApproxFunc())
- Flags |= FastMathFlags::ApproxFunc;
+ Flags |= bitc::ApproxFunc;
}
return Flags;
@@ -3196,7 +3196,7 @@ void ModuleBitcodeWriter::writeBlockInfo() {
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS
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) !=
FUNCTION_INST_BINOP_FLAGS_ABBREV)
llvm_unreachable("Unexpected abbrev ordering!");
diff --git a/llvm/test/Bitcode/compatibility-3.6.ll b/llvm/test/Bitcode/compatibility-3.6.ll
index 6c47a853e24..e9313dfba87 100644
--- a/llvm/test/Bitcode/compatibility-3.6.ll
+++ b/llvm/test/Bitcode/compatibility-3.6.ll
@@ -612,9 +612,7 @@ define void @fastmathflags(float %op1, float %op2) {
%f.arcp = fadd arcp float %op1, %op2
; CHECK: %f.arcp = fadd arcp float %op1, %op2
%f.fast = fadd fast 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'.
- ; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
+ ; CHECK: %f.fast = fadd fast float %op1, %op2
ret void
}
diff --git a/llvm/test/Bitcode/compatibility-3.7.ll b/llvm/test/Bitcode/compatibility-3.7.ll
index 55844e5c498..82fc9905535 100644
--- a/llvm/test/Bitcode/compatibility-3.7.ll
+++ b/llvm/test/Bitcode/compatibility-3.7.ll
@@ -656,9 +656,7 @@ define void @fastmathflags(float %op1, float %op2) {
%f.arcp = fadd arcp float %op1, %op2
; CHECK: %f.arcp = fadd arcp float %op1, %op2
%f.fast = fadd fast 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'.
- ; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
+ ; CHECK: %f.fast = fadd fast float %op1, %op2
ret void
}
diff --git a/llvm/test/Bitcode/compatibility-3.8.ll b/llvm/test/Bitcode/compatibility-3.8.ll
index a7fa20f2bc0..2e70a380d10 100644
--- a/llvm/test/Bitcode/compatibility-3.8.ll
+++ b/llvm/test/Bitcode/compatibility-3.8.ll
@@ -687,9 +687,7 @@ define void @fastmathflags(float %op1, float %op2) {
%f.arcp = fadd arcp float %op1, %op2
; CHECK: %f.arcp = fadd arcp float %op1, %op2
%f.fast = fadd fast 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'.
- ; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
+ ; CHECK: %f.fast = fadd fast float %op1, %op2
ret void
}
@@ -702,9 +700,7 @@ declare <4 x double> @fmf3()
; CHECK-LABEL: fastMathFlagsForCalls(
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
%call.fast = call fast float @fmf1()
- ; 'fast' used to be its own bit, but this changed in Oct 2017.
- ; 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()
+ ; CHECK: %call.fast = call fast float @fmf1()
; Throw in some other attributes to make sure those stay in the right places.
diff --git a/llvm/test/Bitcode/compatibility-3.9.ll b/llvm/test/Bitcode/compatibility-3.9.ll
index c456fefe9d4..7c84daa7d3c 100644
--- a/llvm/test/Bitcode/compatibility-3.9.ll
+++ b/llvm/test/Bitcode/compatibility-3.9.ll
@@ -758,9 +758,7 @@ define void @fastmathflags(float %op1, float %op2) {
%f.arcp = fadd arcp float %op1, %op2
; CHECK: %f.arcp = fadd arcp float %op1, %op2
%f.fast = fadd fast 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'.
- ; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
+ ; CHECK: %f.fast = fadd fast float %op1, %op2
ret void
}
@@ -773,9 +771,7 @@ declare <4 x double> @fmf3()
; CHECK-LABEL: fastMathFlagsForCalls(
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
%call.fast = call fast float @fmf1()
- ; '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'.
- ; CHECK: %call.fast = call reassoc nnan ninf nsz arcp float @fmf1()
+ ; CHECK: %call.fast = call fast float @fmf1()
; Throw in some other attributes to make sure those stay in the right places.
diff --git a/llvm/test/Bitcode/compatibility-4.0.ll b/llvm/test/Bitcode/compatibility-4.0.ll
index 68446a7d5b0..9e34d48c95f 100644
--- a/llvm/test/Bitcode/compatibility-4.0.ll
+++ b/llvm/test/Bitcode/compatibility-4.0.ll
@@ -757,10 +757,8 @@ define void @fastmathflags(float %op1, float %op2) {
; CHECK: %f.nsz = fadd nsz float %op1, %op2
%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
- ; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp float %op1, %op2
+ ; CHECK: %f.fast = fadd fast float %op1, %op2
ret void
}
@@ -773,9 +771,7 @@ declare <4 x double> @fmf3()
; CHECK-LABEL: fastMathFlagsForCalls(
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
%call.fast = call fast float @fmf1()
- ; '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'.
- ; CHECK: %call.fast = call reassoc nnan ninf nsz arcp float @fmf1()
+ ; CHECK: %call.fast = call fast float @fmf1()
; Throw in some other attributes to make sure those stay in the right places.
diff --git a/llvm/test/Bitcode/compatibility-5.0.ll b/llvm/test/Bitcode/compatibility-5.0.ll
index cdadc032d87..a4b3fca82b7 100644
--- a/llvm/test/Bitcode/compatibility-5.0.ll
+++ b/llvm/test/Bitcode/compatibility-5.0.ll
@@ -765,9 +765,7 @@ define void @fastmathflags(float %op1, float %op2) {
%f.contract = fadd contract float %op1, %op2
; CHECK: %f.contract = fadd contract float %op1, %op2
%f.fast = fadd fast 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 'afn' bit set, so this is not fully 'fast'.
- ; CHECK: %f.fast = fadd reassoc nnan ninf nsz arcp contract float %op1, %op2
+ ; CHECK: %f.fast = fadd fast float %op1, %op2
ret void
}
@@ -780,9 +778,7 @@ declare <4 x double> @fmf3()
; CHECK-LABEL: fastMathFlagsForCalls(
define void @fastMathFlagsForCalls(float %f, double %d1, <4 x double> %d2) {
%call.fast = call fast float @fmf1()
- ; 'fast' used to be its own bit, but this changed in Oct 2017.
- ; 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()
+ ; CHECK: %call.fast = call fast float @fmf1()
; Throw in some other attributes to make sure those stay in the right places.
OpenPOWER on IntegriCloud