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
If the following program is compiled with optimizations enabled (e.g. the
/o+flag is provided on thecsccommand line), RyuJIT will drop the volatile read ofa:The IL as reported by a JIT dump is:
The generated assembly is:
From the dump, it appears that the importer drops the volatile
ldsfldon the floor when it imports thepopinstruction. 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