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.

Другие вопросы по тегам