[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