private void RemoveRedundantMemoryBarriers()
{
int lastMemoryBarrier = -1;
for (int i = 0; i < code.Count; i++)
{
switch (code[i].pseudo)
{
case CodeType.MemoryBarrier:
if (lastMemoryBarrier != -1)
{
code.RemoveAt(lastMemoryBarrier);
i--;
}
lastMemoryBarrier = i;
break;
case CodeType.OpCode:
if (code[i].opcode == OpCodes.Volatile)
{
if (code[i + 1].opcode != OpCodes.Stfld && code[i + 1].opcode != OpCodes.Stsfld)
{
lastMemoryBarrier = -1;
}
}
else if (code[i].opcode.FlowControl != FlowControl.Next)
{
lastMemoryBarrier = -1;
}
break;
}
}
}