[llvm] r325525 - bitcode support change for fast flags compatibility
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 20 08:24:23 PST 2018
Merged to 6.0 in r325592.
On Mon, Feb 19, 2018 at 8:22 PM, Steven Wu via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: steven_wu
> Date: Mon Feb 19 11:22:28 2018
> New Revision: 325525
>
> URL: http://llvm.org/viewvc/llvm-project?rev=325525&view=rev
> Log:
> 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
>
> Modified:
> llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h
> llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
> llvm/trunk/test/Bitcode/compatibility-3.6.ll
> llvm/trunk/test/Bitcode/compatibility-3.7.ll
> llvm/trunk/test/Bitcode/compatibility-3.8.ll
> llvm/trunk/test/Bitcode/compatibility-3.9.ll
> llvm/trunk/test/Bitcode/compatibility-4.0.ll
> llvm/trunk/test/Bitcode/compatibility-5.0.ll
>
> Modified: llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h (original)
> +++ llvm/trunk/include/llvm/Bitcode/LLVMBitCodes.h Mon Feb 19 11:22:28 2018
> @@ -407,6 +407,20 @@ enum OverflowingBinaryOperatorOptionalFl
> 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 };
>
> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Mon Feb 19 11:22:28 2018
> @@ -1047,19 +1047,21 @@ static Comdat::SelectionKind getDecodedC
>
> 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;
> }
>
> Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Mon Feb 19 11:22:28 2018
> @@ -1334,19 +1334,19 @@ static uint64_t getOptimizationFlags(con
> 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!");
>
> Modified: llvm/trunk/test/Bitcode/compatibility-3.6.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility-3.6.ll?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility-3.6.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility-3.6.ll Mon Feb 19 11:22:28 2018
> @@ -612,9 +612,7 @@ define void @fastmathflags(float %op1, f
> %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
> }
>
>
> Modified: llvm/trunk/test/Bitcode/compatibility-3.7.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility-3.7.ll?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility-3.7.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility-3.7.ll Mon Feb 19 11:22:28 2018
> @@ -656,9 +656,7 @@ define void @fastmathflags(float %op1, f
> %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
> }
>
>
> Modified: llvm/trunk/test/Bitcode/compatibility-3.8.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility-3.8.ll?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility-3.8.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility-3.8.ll Mon Feb 19 11:22:28 2018
> @@ -687,9 +687,7 @@ define void @fastmathflags(float %op1, f
> %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.
>
>
> Modified: llvm/trunk/test/Bitcode/compatibility-3.9.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility-3.9.ll?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility-3.9.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility-3.9.ll Mon Feb 19 11:22:28 2018
> @@ -758,9 +758,7 @@ define void @fastmathflags(float %op1, f
> %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.
>
>
> Modified: llvm/trunk/test/Bitcode/compatibility-4.0.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility-4.0.ll?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility-4.0.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility-4.0.ll Mon Feb 19 11:22:28 2018
> @@ -757,10 +757,8 @@ define void @fastmathflags(float %op1, f
> ; 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.
>
>
> Modified: llvm/trunk/test/Bitcode/compatibility-5.0.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/compatibility-5.0.ll?rev=325525&r1=325524&r2=325525&view=diff
> ==============================================================================
> --- llvm/trunk/test/Bitcode/compatibility-5.0.ll (original)
> +++ llvm/trunk/test/Bitcode/compatibility-5.0.ll Mon Feb 19 11:22:28 2018
> @@ -765,9 +765,7 @@ define void @fastmathflags(float %op1, f
> %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.
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list