RyuJit产生不正确的结果

在最近升级到.net 4.6之后,我们发现了一个错误,RyuJit产生了不正确的结果,现在我们可以通过在app.config中添加useLegacyJit enabled =“true”来解决这个问题。

我怎样才能debugging由以下产生的机器码?

我在VS 2015 RTM中创build了一个新的控制台项目,设置为释放,任何CPU,未选中首选32位,运行有和没有debugging器连接产生相同的结果。

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

它应该产生:假的假

而是产生:True False

这个例子的关键部分是

 result = true ? false : result; 

哪个应该总是返回false,但是从输出中可以看到,第一次运行该方法时返回True,第二次运行该方法时返回不同的答案。 从Calculate()方法中删除更多的行会导致它总是返回True,但是给出的例子是最接近我可以复制到我们的实际生产场景。

感谢您的孤立的repro程序,我可以证实这确实是优化器中的RyuJIT错误,由于内联而暴露出来。 我已经对编译器进行了修复,并确定了细节。 不要把它变成一个bug跟踪器,而且要更快一些:ryujit@microsoft.com。