[XamlC] Optimize Stloc/Ldloc (#614)
authorStephane Delcroix <stephane@delcroix.org>
Mon, 12 Dec 2016 20:49:05 +0000 (21:49 +0100)
committerGitHub <noreply@github.com>
Mon, 12 Dec 2016 20:49:05 +0000 (21:49 +0100)
Xamarin.Forms.Build.Tasks/MethodBodyExtensions.cs
Xamarin.Forms.Xaml.Xamlc/Xamarin.Forms.Xaml.Xamlc.csproj

index f5bdc85..380cb59 100644 (file)
@@ -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
index 4380fd3..4430103 100644 (file)
@@ -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>