RyuJit дает неверные результаты
После недавнего обновления до.net 4.6 мы обнаружили ошибку, из-за которой RyuJit дает неверные результаты, и теперь мы смогли обойти эту проблему, добавив useLegacyJit enabled="true" в app.config.
Как я могу отладить машинный код, сгенерированный следующим?
Я создал новый консольный проект в VS 2015 RTM, для которого выбрано Release, Any CPU, unchecked Prefer 32 bit, работа с подключенным отладчиком и без него дает тот же результат.
using System;
using System.Runtime.CompilerServices;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Calculate());
Console.WriteLine(Calculate());
Console.ReadLine();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Value Calculate()
{
bool? _0 = (bool?)null;
bool? _1 = (bool?)true;
if (!Value.IsPresent<bool>(_1))
{
return default(Value);
}
bool? result = null;
result = (_1.Value ? new bool?(false) : result);
if (_0.HasValue && _0.Value)
{
}
return new Value(result);
}
public struct Value
{
bool? _value;
public Value(bool? value)
{
_value = value;
}
public static bool IsPresent<T>(bool? _)
{
return _.HasValue;
}
public override string ToString()
{
return _value.ToString();
}
}
}
}
Это должно привести к: False False
но вместо этого он производит: True False
Ключевая часть примера
result = true ? false : result;
Который должен всегда возвращать false, но, как вы можете видеть из выходных данных, он возвращает True при первом запуске метода и другой ответ при втором запуске метода. Удаление еще нескольких строк из метода Calculate() заставит его всегда возвращать True, но приведенный пример является наиболее близким, который я мог бы воспроизвести к нашему реальному сценарию производства.
1 ответ
Спасибо за изолированную программу repro, и я могу подтвердить, что это действительно ошибка RyuJIT в оптимизаторе, которая была обнаружена из-за встраивания. Я сделал исправление для компилятора и выяснил детали развертывания. Не для того, чтобы превратить SO в средство отслеживания ошибок, а для более быстрого решения проблемы: ryujit@microsoft.com.