summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2016-12-12 21:49:05 +0100
committerGitHub <noreply@github.com>2016-12-12 21:49:05 +0100
commit354e27c09603143cef43d666be5beaed8928c040 (patch)
tree7d85ff00a7c44c60e4797be332f4e24073eebeef
parente45bce1a64bd30c462abf51ab3b4eec69d5346aa (diff)
downloadxamarin-forms-354e27c09603143cef43d666be5beaed8928c040.tar.gz
xamarin-forms-354e27c09603143cef43d666be5beaed8928c040.tar.bz2
xamarin-forms-354e27c09603143cef43d666be5beaed8928c040.zip
[XamlC] Optimize Stloc/Ldloc (#614)
-rw-r--r--Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs20
-rw-r--r--Xamarin.Forms.Xaml.Xamlc/Xamarin.Forms.Xaml.Xamlc.csproj2
2 files changed, 21 insertions, 1 deletions
diff --git a/Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs b/Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs
index f5bdc859..380cb59c 100644
--- a/Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs
+++ b/Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs
@@ -12,6 +12,7 @@ namespace Xamarin.Forms.Build.Tasks
throw new ArgumentNullException(nameof(self));
self.OptimizeLongs();
+ self.OptimizeStLdLoc();
self.OptimizeMacros();
}
@@ -36,5 +37,24 @@ namespace Xamarin.Forms.Build.Tasks
self.Instructions.Insert(++i, Instruction.Create(OpCodes.Conv_I8));
}
}
+
+ static void OptimizeStLdLoc(this MethodBody self)
+ {
+ var method = self.Method;
+ for (var i = 0; i < self.Instructions.Count; i++) {
+ var instruction = self.Instructions[i];
+ if (instruction.OpCode.Code != Code.Stloc)
+ continue;
+ if (i + 1 >= self.Instructions.Count)
+ continue;
+ var next = self.Instructions[i + 1];
+ int num = ((VariableDefinition)instruction.Operand).Index;
+ var vardef = instruction.Operand;
+ if (next.OpCode.Code != Code.Ldloc || num != ((VariableDefinition)next.Operand).Index)
+ continue;
+ ExpandMacro(instruction, OpCodes.Dup, null);
+ ExpandMacro(next, OpCodes.Stloc, vardef);
+ }
+ }
}
} \ No newline at end of file
diff --git a/Xamarin.Forms.Xaml.Xamlc/Xamarin.Forms.Xaml.Xamlc.csproj b/Xamarin.Forms.Xaml.Xamlc/Xamarin.Forms.Xaml.Xamlc.csproj
index 4380fd30..4430103b 100644
--- a/Xamarin.Forms.Xaml.Xamlc/Xamarin.Forms.Xaml.Xamlc.csproj
+++ b/Xamarin.Forms.Xaml.Xamlc/Xamarin.Forms.Xaml.Xamlc.csproj
@@ -17,7 +17,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Externalconsole>true</Externalconsole>
- <Commandlineparameters>-r "../../../Xamarin.Forms.Controls/bin/Debug/" -p "../../../Xamarin.Forms.Xaml.UnitTest/bin/Debug/;/Library/Frameworks/Mono.framework/Versions/3.12.1/lib/mono/4.5;/Library/Frameworks/Mono.framework/Versions/3.12.1/lib/mono/4.5/Facades/" --keep -v 4 ../../../Xamarin.Forms.Xaml.UnitTests/bin/Debug/Xamarin.Forms.Xaml.UnitTests.dll</Commandlineparameters>
+ <Commandlineparameters>-r "../../../Xamarin.Forms.Controls/bin/Debug/" -p "../../../Xamarin.Forms.Xaml.UnitTest/bin/Debug/;/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5;/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5/Facades/" --keep -v 4 ../../../Xamarin.Forms.Xaml.UnitTests/bin/Debug/Xamarin.Forms.Xaml.UnitTests.dll</Commandlineparameters>
<AssemblyName>xamlc</AssemblyName>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>