C# Roslyn编译器优化带零的函数调用乘法

C# Roslyn编译器优化带零的函数调用乘法,c#,optimization,visual-studio-2015,roslyn,C#,Optimization,Visual Studio 2015,Roslyn,昨天我在我的C代码中发现了这种奇怪的行为: ILSpy反编译: Stack s=新堆栈(); s、 推(1L); s、 推(2L); s、 推(3L); s、 推动(0升);// 是的,这绝对是一个错误。 *0,如果有副作用,则不应优化为0 谢谢你报道这个问题 您可以在以下位置跟踪错误/修复的进度: 是的,我可以用VS2015更新2重新编程。Roslyn一直是一个主要的bug生成器。单击以报告它。通过使用一个变量来存储Pop返回值,抖动优化器将再次消除该值。如果没有指向非站点资源的链接,很可能无

昨天我在我的C代码中发现了这种奇怪的行为:

ILSpy反编译:

Stack s=新堆栈();
s、 推(1L);
s、 推(2L);
s、 推(3L);

s、 推动(0升);// 是的,这绝对是一个错误。 *0,如果有副作用,则不应优化为0

谢谢你报道这个问题

您可以在以下位置跟踪错误/修复的进度:

是的,我可以用VS2015更新2重新编程。Roslyn一直是一个主要的bug生成器。单击以报告它。通过使用一个变量来存储Pop返回值,抖动优化器将再次消除该值。如果没有指向非站点资源的链接,很可能无法回答该问题(这使得该问题脱离主题)。这是一个非常棒的bug报告,应该在这里提交。当然,团队中的某个人可以回答。。。也许是贾里德·帕森斯?@HansPassant:我有点认为这不是一个bug,而是一个特性:)。但如果是这样,我将打开一个问题,暂时更改我的代码生成器,在它自己的行中显式调用Stack.Pop()。@Mikescher:当然是一个错误,优化器试图消除冗余乘法,但应该运行所有副作用,所以您无法判断。@SledgeHammer:我同意这很愚蠢。但为我辩护,这并不是我写的真正的代码。这是从我的程序生成的代码。感谢你们对这样的问题反应如此迅速。哇,太棒了。我真的很高兴MS开发最近进展如何。你们能到电话组去把他们踢个正着吗?我担心WP平台。说真的,我很害怕。
Stack<long> s = new Stack<long>();

s.Push(1);           // stack contains [1]
s.Push(2);           // stack contains [1|2]
s.Push(3);           // stack contains [1|2|3]

s.Push(s.Pop() * 0); // stack should contain [1|2|0]

Console.WriteLine(string.Join("|", s.Reverse()));
// ...
IL_0022: ldloc.0
IL_0023: ldc.i4.0
IL_0024: conv.i8
IL_0025: callvirt instance void class   [System]System.Collections.Generic.Stack`1<int64>::Push(!0)
// ...
Stack<long> s = new Stack<long>();
s.Push(1L);
s.Push(2L);
s.Push(3L);
s.Push(0L); // <- the offending line
Console.WriteLine(string.Join<long>("|", s.Reverse<long>()));