-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Closed
Labels
JitUntriagedCLR JIT issues needing additional triageCLR JIT issues needing additional triagearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMICLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIbughelp wanted[up-for-grabs] Good issue for external contributors[up-for-grabs] Good issue for external contributorsmemory modelissues associated with memory modelissues associated with memory model
Milestone
Description
If the following program is compiled with optimizations enabled (e.g. the /o+ flag is provided on the csc command line), RyuJIT will drop the volatile read of a:
using System.Runtime.CompilerServices;
static class C
{
static volatile int a;
static int b;
[MethodImpl(MethodImplOptions.NoInlining)]
static void LightweightStoreFence()
{
a = 1;
var dummy = a;
b = 2;
}
static void Main()
{
LightweightStoreFence();
}
}�
The IL as reported by a JIT dump is:
IL_0000 17 ldc.i4.1
IL_0001 fe 13 volatile.
IL_0003 80 01 00 00 04 stsfld 0x4000001
IL_0008 fe 13 volatile.
IL_000a 7e 01 00 00 04 ldsfld 0x4000001
IL_000f 26 pop
IL_0010 18 ldc.i4.2
IL_0011 80 02 00 00 04 stsfld 0x4000002
IL_0016 2a ret �
The generated assembly is:
G_M23768_IG01: ; func=00, offs=000000H, size=0000H, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, byref, nogc <-- Prolog IG
G_M23768_IG02: ; offs=000000H, size=0014H, gcrefRegs=00000000 {}, byrefRegs=00000000 {}, byref
IN0001: 000000 mov dword ptr [reloc classVar[0xd2155a38]], 1
IN0002: 00000A mov dword ptr [reloc classVar[0xd2155a58]], 2
G_M23768_IG03: ; offs=000014H, size=0001H, epilog, nogc, emitadd
IN0003: 000014 ret �
From the dump, it appears that the importer drops the volatile ldsfld on the floor when it imports the pop instruction. This is not correct per the ECMA spec, which states that volatile operations may not be removed or coalesced.
Thanks to @omariom for reporting the original issue in #6257.
category:correctness
theme:volatile
skill-level:expert
cost:medium
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
JitUntriagedCLR JIT issues needing additional triageCLR JIT issues needing additional triagearea-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMICLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIbughelp wanted[up-for-grabs] Good issue for external contributors[up-for-grabs] Good issue for external contributorsmemory modelissues associated with memory modelissues associated with memory model