Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[QualityWeek] Check-Release diffs with x86 #58063

Closed
AndyAyersMS opened this issue Aug 24, 2021 · 28 comments · Fixed by #58630
Closed

[QualityWeek] Check-Release diffs with x86 #58063

AndyAyersMS opened this issue Aug 24, 2021 · 28 comments · Fixed by #58630
Assignees
Labels
area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
Milestone

Comments

@AndyAyersMS
Copy link
Member

Seven methods show Check-Release diffs with x86 (at b8a5a4a, jit guid c2e4a466-795d-4e64-a776-0ae7b2eed65b)

In windows.x86\libraries.pmi.windows.x86.checked.mch

  • 214500
  • 215551

In windows.x86\libraries_tests.pmi.windows.x86.checked.mch

  • 219233
  • 173104
  • 173261
  • 322112
  • 322110

Sample diff (322112)

;;; Check

8b bd 5c ff ff ff   	mov	edi, dword ptr [ebp - 164]
8b 8d 60 ff ff ff   	mov	ecx, dword ptr [ebp - 160]
8b 95 58 ff ff ff   	mov	edx, dword ptr [ebp - 168]
89 95 54 ff ff ff   	mov	dword ptr [ebp - 172], edx
8b 55 94            	mov	edx, dword ptr [ebp - 108]
53                  	push	ebx
57                  	push	edi
56                  	push	esi
51                  	push	ecx
50                  	push	eax
52                  	push	edx
ff b5 54 ff ff ff   	push	dword ptr [ebp - 172]

;;; Release

89 85 7c ff ff ff   	mov	dword ptr [ebp - 132], eax
8b bd 58 ff ff ff   	mov	edi, dword ptr [ebp - 168]
8b 8d 5c ff ff ff   	mov	ecx, dword ptr [ebp - 164]
8b 95 54 ff ff ff   	mov	edx, dword ptr [ebp - 172]
8b 45 94            	mov	eax, dword ptr [ebp - 108]
53                  	push	ebx
57                  	push	edi
56                  	push	esi
51                  	push	ecx
8b 8d 7c ff ff ff   	mov	ecx, dword ptr [ebp - 132]
51                  	push	ecx
50                  	push	eax
52                  	push	edx

Sample repro:

c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\superpmi.exe -a  -c 322112 c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\clrjit.dll  c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Release\Tests\Core_Root\clrjit.dll c:\repos\runtime2\artifacts\spmi\mch\c2e4a466-795d-4e64-a776-0ae7b2eed65b.windows.x86\libraries_tests.pmi.windows.x86.checked.mch

Using jit(c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\clrjit.dll) with input (c:\repos\runtime2\artifacts\spmi\mch\c2e4a466-795d-4e64-a776-0ae7b2eed65b.windows.x86\libraries_tests.pmi.windows.x86.checked.mch)
 indexCount=1 (322112)
Jit startup took 7.889400ms
Jit startup took 1.269200ms
Code Size mismatch: Left=927, (null)=1777940516
...
-----------------------------------------------
Block:   Left
Size:    927
...
-----------------------------------------------
Block:   Right
Size:    934
@dotnet-issue-labeler dotnet-issue-labeler bot added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI untriaged New issue has not been triaged by the area owner labels Aug 24, 2021
@ghost
Copy link

ghost commented Aug 24, 2021

Tagging subscribers to this area: @JulieLeeMSFT
See info in area-owners.md if you want to be subscribed.

Issue Details

Seven methods show Check-Release diffs with x86 (at b8a5a4a, jit guid c2e4a466-795d-4e64-a776-0ae7b2eed65b)

In windows.x86\libraries.pmi.windows.x86.checked.mch

  • 214500
  • 215551

In windows.x86\libraries_tests.pmi.windows.x86.checked.mch

  • 219233
  • 173104
  • 173261
  • 322112
  • 322110

Sample diff (322112)

;;; Check

8b bd 5c ff ff ff   	mov	edi, dword ptr [ebp - 164]
8b 8d 60 ff ff ff   	mov	ecx, dword ptr [ebp - 160]
8b 95 58 ff ff ff   	mov	edx, dword ptr [ebp - 168]
89 95 54 ff ff ff   	mov	dword ptr [ebp - 172], edx
8b 55 94            	mov	edx, dword ptr [ebp - 108]
53                  	push	ebx
57                  	push	edi
56                  	push	esi
51                  	push	ecx
50                  	push	eax
52                  	push	edx
ff b5 54 ff ff ff   	push	dword ptr [ebp - 172]

;;; Release

89 85 7c ff ff ff   	mov	dword ptr [ebp - 132], eax
8b bd 58 ff ff ff   	mov	edi, dword ptr [ebp - 168]
8b 8d 5c ff ff ff   	mov	ecx, dword ptr [ebp - 164]
8b 95 54 ff ff ff   	mov	edx, dword ptr [ebp - 172]
8b 45 94            	mov	eax, dword ptr [ebp - 108]
53                  	push	ebx
57                  	push	edi
56                  	push	esi
51                  	push	ecx
8b 8d 7c ff ff ff   	mov	ecx, dword ptr [ebp - 132]
51                  	push	ecx
50                  	push	eax
52                  	push	edx

Sample repro:

c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\superpmi.exe -a  -c 322112 c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\clrjit.dll  c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Release\Tests\Core_Root\clrjit.dll c:\repos\runtime2\artifacts\spmi\mch\c2e4a466-795d-4e64-a776-0ae7b2eed65b.windows.x86\libraries_tests.pmi.windows.x86.checked.mch

Using jit(c:\repos\runtime2\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\clrjit.dll) with input (c:\repos\runtime2\artifacts\spmi\mch\c2e4a466-795d-4e64-a776-0ae7b2eed65b.windows.x86\libraries_tests.pmi.windows.x86.checked.mch)
 indexCount=1 (322112)
Jit startup took 7.889400ms
Jit startup took 1.269200ms
Code Size mismatch: Left=927, (null)=1777940516
...
-----------------------------------------------
Block:   Left
Size:    927
...
-----------------------------------------------
Block:   Right
Size:    934
Author: AndyAyersMS
Assignees: -
Labels:

area-CodeGen-coreclr, untriaged

Milestone: -

@AndyAyersMS AndyAyersMS removed the untriaged New issue has not been triaged by the area owner label Aug 24, 2021
@AndyAyersMS AndyAyersMS added this to the 6.0.0 milestone Aug 24, 2021
@JulieLeeMSFT
Copy link
Member

CC @dotnet/jit-contrib

@AndyAyersMS
Copy link
Member Author

There was also one method with diffs on arm64 both with windows and linux, but I suspect it's the spurious SPMI static alignment thing (#53773).

@AndyAyersMS
Copy link
Member Author

@dotnet/jit-contrib These can be tricky to track down. Anyone up for a challenge?

@jakobbotsch
Copy link
Member

I can give it a go (I have no 6.0 issues as well).

@jakobbotsch jakobbotsch self-assigned this Aug 24, 2021
@jakobbotsch
Copy link
Member

I'm not able to reproduce this. On b8a5a4a, even replaying all of libraries_tests.pmi.windows.x86.checked.mch with -a and checked/release compiler I saw no diffs. The command I invoked was:

.\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\superpmi.exe -a .\artifacts\tests\coreclr\windows.x86.Checked\Tests\Core_Root\clrjit.dll .\artifacts\tests\coreclr\windows.x86.Release\Tests\Core_Root\clrjit.dll "D:\dev\dotnet\spmi\mch\c2e4a466-795d-4e64-a776-0ae7b2eed65b.windows.x86\libraries_tests.pmi.windows.x86.checked.mch"

giving me

Loaded 342956  Jitted 342956  FailedCompile 0 Excluded 0 Missing 0 Diffs 0
Total time: 1423800.749200ms

Weirdly, the code size I get for 322112 is also significantly different from either of the code sizes you get: Total bytes of code 653. Any idea what could be wrong?

@jakobbotsch
Copy link
Member

For libraries.pmi.windows.x86.checked.mch I found a GC info diff for -c 127268 that I am looking at now.

@AndyAyersMS
Copy link
Member Author

I can still repro these...maybe we have slightly different collections? Here are the method names so you can cross-check.

Release jit will show zero method size which is why these look like improvements.

libraries.pmi.windows.x86.checked.mch:


Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 832
Total bytes of diff: 0
Total bytes of delta: -832 (-100.00% of base)
    diff is an improvement.
Detail diffs


Total byte diff includes -832 bytes from reconciling methods
	Base had    2 unique methods,      832 unique bytes
	Diff had    0 unique methods,        0 unique bytes

Top file improvements (bytes):
        -416 : 214500.dasm (-100.00% of base)
        -416 : 215551.dasm (-100.00% of base)

2 total files with Code Size differences (2 improved, 0 regressed), 0 unchanged.

Top method improvements (bytes):
        -416 (-100.00% of base) : 214500.dasm - System.Security.Cryptography.EccKeyFormatHelper:WriteUncompressedBasePoint(byref,System.Formats.Asn1.AsnWriter)
        -416 (-100.00% of base) : 215551.dasm - System.Security.Cryptography.EccKeyFormatHelper:WriteUncompressedBasePoint(byref,System.Formats.Asn1.AsnWriter)

Top method improvements (percentages):
        -416 (-100.00% of base) : 214500.dasm - System.Security.Cryptography.EccKeyFormatHelper:WriteUncompressedBasePoint(byref,System.Formats.Asn1.AsnWriter)
        -416 (-100.00% of base) : 215551.dasm - System.Security.Cryptography.EccKeyFormatHelper:WriteUncompressedBasePoint(byref,System.Formats.Asn1.AsnWriter)

2 total methods with Code Size differences (2 improved, 0 regressed), -2 unchanged.


libraries_tests.pmi.windows.x86.checked.mch:


Summary of Code Size diffs:
(Lower is better)

Total bytes of base: 6512
Total bytes of diff: 0
Total bytes of delta: -6512 (-100.00% of base)
    diff is an improvement.
Detail diffs


Total byte diff includes -6512 bytes from reconciling methods
	Base had    5 unique methods,     6512 unique bytes
	Diff had    0 unique methods,        0 unique bytes

Top file improvements (bytes):
       -1890 : 219233.dasm (-100.00% of base)
       -1542 : 173104.dasm (-100.00% of base)
       -1368 : 173261.dasm (-100.00% of base)
        -924 : 322112.dasm (-100.00% of base)
        -788 : 322110.dasm (-100.00% of base)

5 total files with Code Size differences (5 improved, 0 regressed), 0 unchanged.

Top method improvements (bytes):
       -1890 (-100.00% of base) : 219233.dasm - System.Security.Cryptography.X509Certificates.Tests.LoadFromFileTests:TestThumbprint_ByHashAlgorithm(System.String,bool)
       -1542 (-100.00% of base) : 173104.dasm - System.Formats.Asn1.Tests.Reader.ReadBitString:TryCopyBitStringBytes_Success_CER_MaxPrimitiveLength()
       -1368 (-100.00% of base) : 173261.dasm - System.Formats.Asn1.Tests.Reader.ReadOctetString:TryCopyOctetStringBytes_Success_CER_MaxPrimitiveLength()
        -924 (-100.00% of base) : 322112.dasm - System.Numerics.Tests.ToStringTest:VerifyTryFormat(System.String,System.String,System.IFormatProvider,bool,System.String)
        -788 (-100.00% of base) : 322110.dasm - System.Numerics.Tests.ToStringTest:VerifyToString(System.String,System.String,System.IFormatProvider,bool,System.String)

Top method improvements (percentages):
       -1542 (-100.00% of base) : 173104.dasm - System.Formats.Asn1.Tests.Reader.ReadBitString:TryCopyBitStringBytes_Success_CER_MaxPrimitiveLength()
       -1368 (-100.00% of base) : 173261.dasm - System.Formats.Asn1.Tests.Reader.ReadOctetString:TryCopyOctetStringBytes_Success_CER_MaxPrimitiveLength()
        -788 (-100.00% of base) : 322110.dasm - System.Numerics.Tests.ToStringTest:VerifyToString(System.String,System.String,System.IFormatProvider,bool,System.String)
        -924 (-100.00% of base) : 322112.dasm - System.Numerics.Tests.ToStringTest:VerifyTryFormat(System.String,System.String,System.IFormatProvider,bool,System.String)
       -1890 (-100.00% of base) : 219233.dasm - System.Security.Cryptography.X509Certificates.Tests.LoadFromFileTests:TestThumbprint_ByHashAlgorithm(System.String,bool)

5 total methods with Code Size differences (5 improved, 0 regressed), -5 unchanged.


My file sizes are:

08/24/2021  12:28 PM     2,989,844,961 libraries.pmi.windows.x86.checked.mch
08/24/2021  12:31 PM     6,091,472,060 libraries_tests.pmi.windows.x86.checked.mch

@jakobbotsch
Copy link
Member

Indeed, looks like our collections are different. Strange that I didn't find the diffs with a full diff, though.

The GC info problem might be the cause for the other diffs as well -- two tracked locals get 400 as the weighted ref count, except in the release build the two 400's are bitwise different and that ends up changing how they are sorted. I'm not sure if we enable non-compliant float opts in checked/release, but I'm trying to track down where the difference shows up exactly.

@jakobbotsch
Copy link
Member

incRefCnts is called with two different weights in checked (left) vs release (right):
image

I believe the weight is the block weight, so trying to track down why those are different now.

In the end, we might need to add an epsilon to this check:

if (weight1 != weight2)
{
return weight1 > weight2;
}

@AndyAyersMS
Copy link
Member Author

Did you just pull down the SPMI collections?

I can try sharing out my versions and filter them down to just the implicated MCs so they're not so massive.

@jakobbotsch
Copy link
Member

No, last time I pulled it was after #57306 so they are a bit old. I'll try updating the collection after I'm done with that other issue.

@BruceForstall
Copy link
Member

fwiw, #51317 is a proposal to avoid this problem of "when did you pull down the collections?" and the fact we currently overwrite collections in storage every weekend.

@AndyAyersMS
Copy link
Member Author

MCHs with just those 7 failing methods here: https://gist.github.com/AndyAyersMS/6055fa9ec2062385ec3d60a9e2ebe78d

@jakobbotsch
Copy link
Member

The issue seems to be that we are using x87 in checked builds while we are using SSE in release builds. The code generated for getBBWeight end up with two different results for the same calculation:
image

In checked, the code generated by MSVC is

// getBBWeight -- get the normalized weight of this block
BasicBlock::weight_t BasicBlock::getBBWeight(Compiler* comp)
{
6A8E6B65  push        ebp  
6A8E6B66  mov         ebp,esp  
6A8E6B68  push        ecx  
6A8E6B69  push        esi  
6A8E6B6A  mov         esi,ecx  
    if (this->bbWeight == BB_ZERO_WEIGHT)
6A8E6B6C  movss       xmm0,dword ptr [esi+20h]  
6A8E6B71  ucomiss     xmm0,dword ptr [__real@00000000 (6AA18AB4h)]  
6A8E6B78  lahf  
6A8E6B79  test        ah,44h  
6A8E6B7C  jp          BasicBlock::getBBWeight+1Dh (6A8E6B82h)  
    {
        return BB_ZERO_WEIGHT;
6A8E6B7E  fldz  
6A8E6B80  jmp         BasicBlock::getBBWeight+34h (6A8E6B99h)  
    }
    else
    {
        weight_t calledCount = getCalledCount(comp);
6A8E6B82  push        dword ptr [comp]  
6A8E6B85  call        BasicBlock::getCalledCount (6A8E6B9Eh)  
6A8E6B8A  fstp        dword ptr [ebp-4]  

        // Normalize the bbWeights by multiplying by BB_UNITY_WEIGHT and dividing by the calledCount.
        //
        weight_t fullResult = this->bbWeight * BB_UNITY_WEIGHT / calledCount;
6A8E6B8D  fld         dword ptr [esi+20h]  
6A8E6B90  fmul        dword ptr [__real@42c80000 (6AA1600Ch)]  
6A8E6B96  fdiv        dword ptr [calledCount]  
6A8E6B99  pop         esi  

        return fullResult;
    }
}
6A8E6B9A  leave  
6A8E6B9B  ret         4  

while the generated code in release is

// getBBWeight -- get the normalized weight of this block
BasicBlock::weight_t BasicBlock::getBBWeight(Compiler* comp)
{
6A777140  push        ebp  
6A777141  mov         ebp,esp  
    if (this->bbWeight == BB_ZERO_WEIGHT)
6A777143  movss       xmm0,dword ptr [ecx+20h]  
6A777148  xorps       xmm2,xmm2  
6A77714B  ucomiss     xmm0,xmm2  
6A77714E  lahf  
6A77714F  test        ah,44h  
6A777152  jp          BasicBlock::getBBWeight+1Bh (6A77715Bh)  
6A777154  xorps       xmm0,xmm0  

        return fullResult;
    }
}
6A777157  pop         ebp  
6A777158  ret         4  
    {
        return BB_ZERO_WEIGHT;
    }
    else
    {
        weight_t calledCount = getCalledCount(comp);
6A77715B  mov         ecx,dword ptr [comp]  
6A77715E  movss       xmm3,dword ptr [__real@42c80000 (6A8257DCh)]  
6A777166  movss       xmm1,dword ptr [ecx+164h]  
6A77716E  ucomiss     xmm1,xmm2  
6A777171  lahf  
6A777172  test        ah,44h  
6A777175  jp          BasicBlock::getBBWeight+7Ch (6A7771BCh)  
6A777177  mov         eax,dword ptr [ecx+3F8h]  
6A77717D  mov         eax,dword ptr [eax]  
6A77717F  and         eax,4000000h  
6A777184  or          eax,0  
6A777187  jne         BasicBlock::getBBWeight+65h (6A7771A5h)  
6A777189  cmp         dword ptr [ecx+1B4h],eax  
6A77718F  je          BasicBlock::getBBWeight+65h (6A7771A5h)  
6A777191  movss       xmm1,dword ptr [__real@3f800000 (6A8255FCh)]  

        // Normalize the bbWeights by multiplying by BB_UNITY_WEIGHT and dividing by the calledCount.
        //
        weight_t fullResult = this->bbWeight * BB_UNITY_WEIGHT / calledCount;
6A777199  mulss       xmm0,xmm3  
6A77719D  divss       xmm0,xmm1  

        return fullResult;
    }
}
6A7771A1  pop         ebp  
6A7771A2  ret         4  
    {
        return BB_ZERO_WEIGHT;
    }
    else
    {
        weight_t calledCount = getCalledCount(comp);
6A7771A5  mov         eax,dword ptr [ecx+100h]  
6A7771AB  movss       xmm1,dword ptr [eax+20h]  
6A7771B0  ucomiss     xmm1,xmm2  
6A7771B3  lahf  
6A7771B4  test        ah,44h  
6A7771B7  jp          BasicBlock::getBBWeight+7Ch (6A7771BCh)  
6A7771B9  movaps      xmm1,xmm3  

        // Normalize the bbWeights by multiplying by BB_UNITY_WEIGHT and dividing by the calledCount.
        //
        weight_t fullResult = this->bbWeight * BB_UNITY_WEIGHT / calledCount;
6A7771BC  mulss       xmm0,xmm3  
6A7771C0  divss       xmm0,xmm1  

        return fullResult;
    }
}
6A7771C4  pop         ebp  
6A7771C5  ret         4

@jakobbotsch
Copy link
Member

jakobbotsch commented Aug 26, 2021

The difference seems to be when whole program optimization is enabled, in which case MSVC gives BasicBlock:getBBWeight a custom calling convention that returns the float in xmm0. This seems to bias MSVC into performing the computation using XMM registers, meaning lower intermediate precision in release. In checked the result is returned in st(0) and the computation is done with 8064-bit intermediate precision.

Not sure if we can enable whole program optimization in checked builds. Might be that we need to introduce the epsilon above, though I worry that we can see other differences.

@BruceForstall
Copy link
Member

The use of floating-point in the compiler was always going to be a risk due to issues like this, but we do need some kind of solution. What FP switch is used for VC++? Presumably /fp:fast? Would /fp:precise fix it?

This also implies we should verify no checked/release diffs on Linux/Mac, which will have different native compiler behavior.

Tangentially related: #53849

@AndyAyersMS
Copy link
Member Author

We are using /fp:precise already in all builds. MSVC docs seem to leave some wiggle room for intermediate results rounding.

@BruceForstall
Copy link
Member

The docs say, "The compiler rounds to source code precision at four specific points during expression evaluation: ... when a function call returns a floating-point value." Is that happening in the checked case? The calculation occurs and result is left on the stack; does it need an explicit rounding? Would that even matter to the issue?

@AndyAyersMS
Copy link
Member Author

Could be if we revised everything to use double instead of float we'd hit this less often, as the issue is seemingly that intermediate results in float trees may be kept as doubles.

@jakobbotsch
Copy link
Member

The issue boils down to the fact that

99.429672f * 100 / 100

gives different results depending on whether it is evaluated with 64-bit or 32-bit intermediate precision. In debug and release MSVC is evaluating it with 32-bit intermediate precision, while checked builds without LTO evaluate it with 64-bit (or 80-bit) intermediate precision.

I read various sources that suggest that MSVC will set the intermediate precision of x87 instructions to 64-bit, so indeed switching to double might fix that. Although since the JIT is a library, I guess there is no guarantee that the intermediate precision is not 80 bits in which case we might just hit it less often, as @AndyAyersMS mentioned.

@BruceForstall
Copy link
Member

Would adding explicit casts to this particular code help? (e.g., (float)(99.429672f * 100.0f) / 100.0f)

That's not a great solution compiler-wide given pervasive computations using weight_t types.

@AndyAyersMS
Copy link
Member Author

Would adding explicit casts to this particular code help?

It should, but as you note it may be hard to do this everywhere it's needed.

Another trick is to struct-wrap BasicBlock::weight_t and define all the needed operators on the structs so that we can isolate use of native FP operations to the struct methods and in doing so get proper rounding boundaries. Not sure how expensive this ends up being overall.

But I think going to double will likely be the simplest fix and probably doesn't cost much at runtime.

@jakobbotsch
Copy link
Member

Adding the cast does not seem to affect the code gen -- the problem remains.

@jakobbotsch
Copy link
Member

I verified that switching to double fixes the problem and also the diffs in the .mch files @AndyAyersMS sent above. I'll submit a PR shortly.

@jakobbotsch
Copy link
Member

Since there is no codegen bug here I'll move it to 7.0.

@jakobbotsch jakobbotsch modified the milestones: 6.0.0, 7.0.0 Aug 27, 2021
@jakobbotsch
Copy link
Member

jakobbotsch commented Aug 27, 2021

Unfortunately with using doubles everywhere (including RA) I see a ~1.2% regression on x64 in instructions retired with PIN of SPMI over libraries. That's with the following changeset (only last commit is important):
https://github.com/dotnet/runtime/compare/main...jakobbotsch:fix-58063?expand=1
I'll try if I can see where the regression is coming from.

@jakobbotsch
Copy link
Member

Andy suggested that the regression might be because of native PGO and after rebuilding a release build with PGO off I see almost no difference (0.03% more retired instructions), so gonna mitigate by making the weights doubles and also by introducing epsilon in the above.

jakobbotsch added a commit to jakobbotsch/runtime that referenced this issue Sep 3, 2021
Mitigate issues where the compiler might evaluate intermediate
computations with higher precisions due to optimizations, causing
different results between x86 windows checked/release.

Fix dotnet#58063
@ghost ghost added the in-pr There is an active PR which will close this issue when it is merged label Sep 3, 2021
jakobbotsch added a commit that referenced this issue Sep 7, 2021
…psilon when sorting locals (#58630)

Mitigate issues where the compiler might evaluate intermediate
computations with higher precisions due to optimizations, causing
different results between x86 windows checked/release.

Fix #58063
@ghost ghost removed the in-pr There is an active PR which will close this issue when it is merged label Sep 7, 2021
@ghost ghost locked as resolved and limited conversation to collaborators Oct 7, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI
Projects
Archived in project
4 participants