RyuJIT produciendo resultados incorrectos


Después de actualizar recientemente a.net 4.6 descubrimos un error donde RyuJIT produce resultados incorrectos, pudimos solucionar el problema por ahora agregando useLegacyJit enabled="true" a la aplicación.config.

¿Cómo puedo depurar el código de máquina generado por lo siguiente?

He creado un nuevo proyecto de consola en VS 2015 RTM, establecido para Liberar, Cualquier CPU, sin marcar Prefieren 32 bits, que se ejecuta con y sin depurador conectado produce el mismo resultado.

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();
            }
        }
    }
}

Debería producir: Falso False

Pero en su lugar produce: Verdadero False

La parte clave del ejemplo es

result = true ? false : result;

Que siempre debe devolver false, pero como puede ver en la salida, devuelve True la primera vez que se ejecuta el método, y una respuesta diferente la segunda vez que se ejecuta el método. Eliminar algunas líneas más del método Calculate () hará que devuelva True siempre, pero el ejemplo dado es el más cercano que podría reproducir a nuestro escenario de producción real.

Author: BrandonAGr, 2015-07-22

1 answers

Gracias por el programa repro aislado y puedo confirmar que este es de hecho un error de RyuJIT en el optimizador que quedó expuesto debido a la inserción. He hecho una solución al compilador y averiguar los detalles de despliegue. Para no convertirlo en un rastreador de errores, y para un cambio más rápido: [email protected].

 27
Author: schellap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-05 06:50:27