Skip to content

Commit 8a8520f

Browse files
committed
Fixed InProcessEmitTests
1 parent 36ba1bb commit 8a8520f

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

src/BenchmarkDotNet/Helpers/Reflection.Emit/IlGeneratorStatementExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ public static void EmitLoopEndFromFldTo0(
194194
ilBuilder.EmitLdloc(counterLocal);
195195
ilBuilder.Emit(OpCodes.Ldc_I4_0);
196196
ilBuilder.Emit(OpCodes.Conv_I8);
197-
ilBuilder.Emit(OpCodes.Bge_S, loopStartLabel);
197+
ilBuilder.Emit(OpCodes.Bge, loopStartLabel);
198198
}
199199
}
200200
}

src/BenchmarkDotNet/Toolchains/InProcess.Emit.Implementation/Emitters/TaskConsumeEmitter.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ class Perfolizer.Horology.IClock clock
164164
var ilBuilder = actionMethodBuilder.GetILGenerator();
165165

166166
// init locals
167-
var argLocals = runnableEmitter.EmitDeclareArgLocals(ilBuilder);
168167
var valueLocal = ilBuilder.DeclareLocal(ConsumableInfo.OverheadMethodReturnType);
168+
var argLocals = runnableEmitter.EmitDeclareArgLocals(ilBuilder);
169169
var indexLocal = ilBuilder.DeclareLocal(typeof(long));
170170

171171
/*
@@ -215,7 +215,7 @@ class Perfolizer.Horology.IClock clock
215215
*/
216216
ilBuilder.Emit(OpCodes.Ldarg_0);
217217
ilBuilder.Emit(OpCodes.Ldfld, actionDelegateField);
218-
ilBuilder.Emit(OpCodes.Callvirt, actionInvokeMethod);
218+
ilBuilder.EmitInstanceCallThisValueOnStack(null, actionInvokeMethod, argLocals);
219219
ilBuilder.EmitStloc(valueLocal);
220220
}
221221
ilBuilder.EmitLoopEndFromFldTo0(loopStartLabel, loopHeadLabel, repeatsRemainingField, indexLocal);
@@ -367,8 +367,8 @@ instance void __RunTask () cil managed
367367
// [1] int64,
368368
// [2] class [System.Private.CoreLib]System.Exception e
369369
//)
370-
var argLocals = runnableEmitter.EmitDeclareArgLocals(ilBuilder);
371370
var clockspanLocal = ilBuilder.DeclareLocal(typeof(ClockSpan));
371+
var argLocals = runnableEmitter.EmitDeclareArgLocals(ilBuilder);
372372
LocalBuilder maybeValueTaskLocal = actionInvokeMethod.ReturnType.IsValueType
373373
? ilBuilder.DeclareLocal(actionInvokeMethod.ReturnType)
374374
: null;
@@ -417,7 +417,7 @@ instance void __RunTask () cil managed
417417
ilBuilder.Emit(OpCodes.Ldarg_0);
418418
ilBuilder.Emit(OpCodes.Ldflda, currentAwaiterField);
419419
ilBuilder.Emit(OpCodes.Call, currentAwaiterField.FieldType.GetProperty(nameof(TaskAwaiter.IsCompleted), BindingFlagsAllInstance).GetGetMethod(true));
420-
ilBuilder.Emit(OpCodes.Brtrue_S, isCompletedLabel);
420+
ilBuilder.Emit(OpCodes.Brtrue, isCompletedLabel);
421421
{
422422
/*
423423
// currentAwaiter.UnsafeOnCompleted(continuation);
@@ -433,7 +433,7 @@ instance void __RunTask () cil managed
433433
ilBuilder.Emit(OpCodes.Ldfld, continuationField);
434434
ilBuilder.Emit(OpCodes.Call, currentAwaiterField.FieldType.GetMethod(nameof(TaskAwaiter.UnsafeOnCompleted), BindingFlagsAllInstance));
435435
// return;
436-
ilBuilder.Emit(OpCodes.Leave_S, returnLabel);
436+
ilBuilder.Emit(OpCodes.Leave, returnLabel);
437437
}
438438
ilBuilder.MarkLabel(isCompletedLabel);
439439
/*
@@ -468,7 +468,7 @@ instance void __RunTask () cil managed
468468
ilBuilder.EmitLdloc(exceptionLocal);
469469
ilBuilder.Emit(OpCodes.Call, setExceptionMethod);
470470
// return;
471-
ilBuilder.Emit(OpCodes.Leave_S, returnLabel);
471+
ilBuilder.Emit(OpCodes.Leave, returnLabel);
472472
}
473473
ilBuilder.EndExceptionBlock();
474474

@@ -570,7 +570,7 @@ instance void __Continuation () cil managed
570570
ilBuilder.EmitLdloc(exceptionLocal);
571571
ilBuilder.Emit(OpCodes.Call, setExceptionMethod);
572572
// return;
573-
ilBuilder.Emit(OpCodes.Leave_S, returnLabel);
573+
ilBuilder.Emit(OpCodes.Leave, returnLabel);
574574
}
575575
ilBuilder.EndExceptionBlock();
576576

tests/BenchmarkDotNet.IntegrationTests/InProcess.EmitTests/NaiveRunnableEmitDiff.cs

+21-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using BenchmarkDotNet.Loggers;
5+
using BenchmarkDotNet.Toolchains.InProcess.Emit.Implementation;
56
using Mono.Cecil;
67
using Mono.Cecil.Cil;
78
using Mono.Collections.Generic;
@@ -31,7 +32,9 @@ public class NaiveRunnableEmitDiff
3132
{
3233
{ OpCodes.Br_S, OpCodes.Br },
3334
{ OpCodes.Blt_S, OpCodes.Blt },
34-
{ OpCodes.Bne_Un_S, OpCodes.Bne_Un }
35+
{ OpCodes.Bne_Un_S, OpCodes.Bne_Un },
36+
{ OpCodes.Bge_S, OpCodes.Bge },
37+
{ OpCodes.Brtrue_S, OpCodes.Brtrue },
3538
};
3639

3740
public static void RunDiff(string roslynAssemblyPath, string emittedAssemblyPath, ILogger logger)
@@ -63,7 +66,15 @@ private static bool AreSameTypeIgnoreNested(TypeReference left, TypeReference ri
6366

6467
private static bool AreSameSignature(MethodReference left, MethodReference right)
6568
{
66-
return (left.Name == right.Name || (left.Name.StartsWith("<.ctor>") && right.Name == "__Workload"))
69+
var lookup = new HashSet<string>()
70+
{
71+
RunnableConstants.WorkloadImplementationMethodName,
72+
RunnableConstants.GlobalSetupMethodName,
73+
RunnableConstants.GlobalCleanupMethodName,
74+
RunnableConstants.IterationSetupMethodName,
75+
RunnableConstants.IterationCleanupMethodName
76+
};
77+
return (left.Name == right.Name || (left.Name.StartsWith("<.ctor>") && lookup.Contains(right.Name)))
6778
&& AreSameTypeIgnoreNested(left.ReturnType, right.ReturnType)
6879
&& left.Parameters.Count == right.Parameters.Count
6980
&& left.Parameters
@@ -80,7 +91,9 @@ private static List<Instruction> GetOpInstructions(MethodDefinition method)
8091
var result = new List<Instruction>(bodyInstructions.Count);
8192
foreach (var instruction in bodyInstructions)
8293
{
83-
if (compareNops || instruction.OpCode != OpCodes.Nop)
94+
// Skip leave instructions since the IlBuilder forces them differently than Roslyn.
95+
if (instruction.OpCode != OpCodes.Leave && instruction.OpCode != OpCodes.Leave_S
96+
&& (compareNops || instruction.OpCode != OpCodes.Nop))
8497
result.Add(instruction);
8598
}
8699

@@ -289,14 +302,17 @@ private static void DiffMembers(TypeDefinition type1, TypeDefinition type2, ILog
289302
}
290303

291304
var methods2ByName = type2.Methods.ToLookup(f => f.Name);
305+
var methods2ByComparison = new HashSet<MethodDefinition>(type2.Methods);
292306
foreach (var method1 in type1.Methods)
293307
{
294308
logger.Write($" method {method1.FullName}");
295309

296310
var method2 = methods2ByName[method1.Name].SingleOrDefault(m => AreSameSignature(method1, m));
297311
if (method2 == null)
298-
method2 = type2.Methods.SingleOrDefault(m => AreSameSignature(method1, m));
299-
if (method2 == null)
312+
method2 = methods2ByComparison.FirstOrDefault(m => AreSameSignature(method1, m));
313+
if (method2 != null)
314+
methods2ByComparison.Remove(method2);
315+
else
300316
method2 = methods2ByName[method1.Name].SingleOrDefault();
301317

302318
if (Diff(method1, method2))

0 commit comments

Comments
 (0)