Skip to content

Commit

Permalink
JIT: Cast UInt64 to Single directly during const folding (dotnet#106419)
Browse files Browse the repository at this point in the history
  • Loading branch information
amanasifkhalid authored Aug 20, 2024
1 parent 7cd266e commit 7a50b43
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/coreclr/jit/gentree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15607,7 +15607,7 @@ GenTree* Compiler::gtFoldExprConst(GenTree* tree)

case TYP_FLOAT:
{
#if defined(TARGET_64BIT)
#ifdef TARGET_64BIT
if (tree->IsUnsigned() && (lval1 < 0))
{
f1 = FloatingPointUtils::convertUInt64ToFloat((uint64_t)lval1);
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/jit/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2272,8 +2272,7 @@ double FloatingPointUtils::convertUInt64ToDouble(uint64_t uIntVal)

float FloatingPointUtils::convertUInt64ToFloat(uint64_t u64)
{
double d = convertUInt64ToDouble(u64);
return (float)d;
return (float)u64;
}

uint64_t FloatingPointUtils::convertDoubleToUInt64(double d)
Expand Down
36 changes: 36 additions & 0 deletions src/tests/JIT/Regression/JitBlue/Runtime_106338/Runtime_106338.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

// Generated by Fuzzlyn v2.2 on 2024-08-13 00:04:04
// Run on Arm64 MacOS
// Seed: 13207615092246842583-vectort,vector64,vector128,armadvsimd,armadvsimdarm64,armaes,armarmbase,armarmbasearm64,armcrc32,armcrc32arm64,armdp,armrdm,armrdmarm64,armsha1,armsha256
// Reduced from 226.8 KiB to 0.4 KiB in 00:02:12
// Debug: Outputs 1600094603
// Release: Outputs 1600094604
using System;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics.X86;
using Xunit;

public class Runtime_106338
{
[Fact]
[SkipOnMono("https://github.com/dotnet/runtime/issues/100368", TestPlatforms.Any)]
public static void TestEntryPoint()
{
ulong vr10 = 16105307123914158031UL;
float vr11 = 4294967295U | vr10;
uint result = BitConverter.SingleToUInt32Bits(vr11);

if ((RuntimeInformation.ProcessArchitecture == Architecture.Arm64) || ((RuntimeInformation.ProcessArchitecture == Architecture.X64) && Avx512F.IsSupported))
{
// Expected to cast ulong -> float directly
Assert.Equal(1600094603U, result);
}
else
{
// Expected to cast ulong -> double -> float
Assert.Equal(1600094604U, result);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Optimize>True</Optimize>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildProjectName).cs" />
</ItemGroup>
</Project>

0 comments on commit 7a50b43

Please sign in to comment.