~ubuntu-branches/ubuntu/trusty/monodevelop/trusty-proposed

« back to all changes in this revision

Viewing changes to contrib/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs

  • Committer: Package Import Robot
  • Author(s): Jo Shields
  • Date: 2013-05-12 09:46:03 UTC
  • mto: This revision was merged to the branch mainline in revision 29.
  • Revision ID: package-import@ubuntu.com-20130512094603-mad323bzcxvmcam0
Tags: upstream-4.0.5+dfsg
ImportĀ upstreamĀ versionĀ 4.0.5+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
                InlineVariables,
36
36
                CopyPropagation,
37
37
                YieldReturn,
 
38
                AsyncAwait,
38
39
                PropertyAccessInstructions,
39
40
                SplitToMovableBlocks,
40
41
                TypeInference,
44
45
                JoinBasicBlocks,
45
46
                SimplifyLogicNot,
46
47
                SimplifyShiftOperators,
47
 
                TransformDecimalCtorToConstant,
 
48
                TypeConversionSimplifications,
48
49
                SimplifyLdObjAndStObj,
49
50
                SimplifyCustomShortCircuit,
50
51
                SimplifyLiftedOperators,
107
108
                        
108
109
                        if (abortBeforeStep == ILAstOptimizationStep.YieldReturn) return;
109
110
                        YieldReturnDecompiler.Run(context, method);
 
111
                        AsyncDecompiler.RunStep1(context, method);
 
112
                        
 
113
                        if (abortBeforeStep == ILAstOptimizationStep.AsyncAwait) return;
 
114
                        AsyncDecompiler.RunStep2(context, method);
110
115
                        
111
116
                        if (abortBeforeStep == ILAstOptimizationStep.PropertyAccessInstructions) return;
112
117
                        IntroducePropertyAccessInstructions(method);
143
148
                                        if (abortBeforeStep == ILAstOptimizationStep.SimplifyShiftOperators) return;
144
149
                                        modified |= block.RunOptimization(SimplifyShiftOperators);
145
150
 
146
 
                                        if (abortBeforeStep == ILAstOptimizationStep.TransformDecimalCtorToConstant) return;
147
 
                                        modified |= block.RunOptimization(TransformDecimalCtorToConstant);
148
 
                                        modified |= block.RunOptimization(SimplifyLdcI4ConvI8);
 
151
                                        if (abortBeforeStep == ILAstOptimizationStep.TypeConversionSimplifications) return;
 
152
                                        modified |= block.RunOptimization(TypeConversionSimplifications);
149
153
                                        
150
154
                                        if (abortBeforeStep == ILAstOptimizationStep.SimplifyLdObjAndStObj) return;
151
155
                                        modified |= block.RunOptimization(SimplifyLdObjAndStObj);
154
158
                                        modified |= block.RunOptimization(new SimpleControlFlow(context, method).SimplifyCustomShortCircuit);
155
159
 
156
160
                                        if (abortBeforeStep == ILAstOptimizationStep.SimplifyLiftedOperators) return;
157
 
//                                      modified |= block.RunOptimization(SimplifyLiftedOperators);
 
161
                                        modified |= block.RunOptimization(SimplifyLiftedOperators);
158
162
                                        
159
163
                                        if (abortBeforeStep == ILAstOptimizationStep.TransformArrayInitializers) return;
160
164
                                        modified |= block.RunOptimization(TransformArrayInitializers);
257
261
                /// Ignore arguments of 'leave'
258
262
                /// </summary>
259
263
                /// <param name="method"></param>
260
 
                void RemoveRedundantCode(ILBlock method)
 
264
                internal static void RemoveRedundantCode(ILBlock method)
261
265
                {
262
266
                        Dictionary<ILLabel, int> labelRefCount = new Dictionary<ILLabel, int>();
263
267
                        foreach (ILLabel target in method.GetSelfAndChildrenRecursive<ILExpression>(e => e.IsBranch()).SelectMany(e => e.GetBranchTargets())) {
287
291
                                                        prevExpr.ILRanges.AddRange(((ILExpression)body[i]).ILRanges);
288
292
                                                // Ignore pop
289
293
                                        } else {
290
 
                                                newBody.Add(body[i]);
 
294
                                                ILLabel label = body[i] as ILLabel;
 
295
                                                if (label != null) {
 
296
                                                        if (labelRefCount.GetOrDefault(label) > 0)
 
297
                                                                newBody.Add(label);
 
298
                                                } else {
 
299
                                                        newBody.Add(body[i]);
 
300
                                                }
291
301
                                        }
292
302
                                }
293
303
                                block.Body = newBody;
852
862
                        if (!collection.Remove(key))
853
863
                                throw new Exception("The key was not found in the dictionary");
854
864
                }
 
865
                
 
866
                public static bool ContainsReferenceTo(this ILExpression expr, ILVariable v)
 
867
                {
 
868
                        if (expr.Operand == v)
 
869
                                return true;
 
870
                        foreach (var arg in expr.Arguments) {
 
871
                                if (ContainsReferenceTo(arg, v))
 
872
                                        return true;
 
873
                        }
 
874
                        return false;
 
875
                }
855
876
        }
856
877
}