Skip to content

Commit 307f9a1

Browse files
authored
Merge pull request #529 from dadhi/copilot/optimize-branches-to-small-branches
Optimize branch instructions to short form at known-small-distance sites
2 parents cba4229 + f4fc8ab commit 307f9a1

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

src/FastExpressionCompiler/FastExpressionCompiler.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2568,7 +2568,7 @@ private static bool TryEmitCoalesceOperator(BinaryExpression expr, ILGenerator i
25682568
il.DmarkLabel(labelFalse);
25692569
else
25702570
{
2571-
il.Demit(OpCodes.Br, labelDone);
2571+
il.Demit(OpCodes.Br_S, labelDone); // safe: jumps over Castclass (5 bytes) = 5 bytes
25722572
il.DmarkLabel(labelFalse); // todo: @bug? should we insert the boxing for the Nullable value type before the Castclass
25732573
il.Demit(OpCodes.Castclass, exprType);
25742574
il.DmarkLabel(labelDone);
@@ -2947,9 +2947,9 @@ private static bool TryEmitSimpleUnaryExpression(UnaryExpression expr, Expressio
29472947
{
29482948
var falseLabel = il.DefineLabel();
29492949
var continueLabel = il.DefineLabel();
2950-
il.Demit(OpCodes.Brfalse, falseLabel);
2950+
il.Demit(OpCodes.Brfalse_S, falseLabel); // safe: jumps over Ldc_I4_0 (1 byte) + Br_S (2 bytes) = 3 bytes
29512951
il.Demit(OpCodes.Ldc_I4_0);
2952-
il.Demit(OpCodes.Br, continueLabel);
2952+
il.Demit(OpCodes.Br_S, continueLabel); // safe: jumps over Ldc_I4_1 (1 byte) = 1 byte
29532953
il.DmarkLabel(falseLabel);
29542954
il.Demit(OpCodes.Ldc_I4_1);
29552955
il.DmarkLabel(continueLabel);
@@ -5770,9 +5770,9 @@ var methodName
57705770
var resultLabel = il.DefineLabel();
57715771
var isNullLabel = il.DefineLabel();
57725772
EmitLoadLocalVariable(il, leftHasValueVar);
5773-
il.Demit(OpCodes.Brfalse, isNullLabel);
5773+
il.Demit(OpCodes.Brfalse_S, isNullLabel); // safe: jumps over EmitLoadLocalVariable (1-4 bytes) + Brtrue_S (2 bytes) = 3-6 bytes
57745774
EmitLoadLocalVariable(il, rightHasValueVar);
5775-
il.Demit(OpCodes.Brtrue, resultLabel);
5775+
il.Demit(OpCodes.Brtrue_S, resultLabel); // safe: jumps over Pop (1 byte) + Ldnull (1 byte) = 2 bytes
57765776
il.DmarkLabel(isNullLabel);
57775777
il.Demit(OpCodes.Pop);
57785778
il.Demit(OpCodes.Ldnull);
@@ -5977,7 +5977,7 @@ private static bool TryEmitLogicalOperator(BinaryExpression expr, ExpressionType
59775977
return false;
59785978

59795979
var labelDone = il.DefineLabel();
5980-
il.Demit(OpCodes.Br, labelDone);
5980+
il.Demit(OpCodes.Br_S, labelDone); // safe: jumps over Ldc_I4_0 or Ldc_I4_1 (1 byte) = 1 byte
59815981

59825982
il.DmarkLabel(labelSkipRight); // label the second branch
59835983
il.Demit(nodeType == ExpressionType.AndAlso ? OpCodes.Ldc_I4_0 : OpCodes.Ldc_I4_1);

test/FastExpressionCompiler.IssueTests/Issue159_NumericConversions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ public void ComparisonsWithConversionsShouldWork4()
365365
OpCodes.Cgt_Un,
366366
OpCodes.Ldc_I4_0,
367367
OpCodes.Ceq,
368-
OpCodes.Br,
368+
OpCodes.Br_S, // short form: jumps over Ldc_I4_0 (1 byte) = 1 byte
369369
OpCodes.Ldc_I4_0,
370370
OpCodes.Ret);
371371

0 commit comments

Comments
 (0)