/// <summary> /// Performs the internal SSA construction transformation. /// </summary> /// <param name="builder">The parent meethod builder.</param> /// <param name="rewriter">The SSA rewriter to use.</param> /// <returns>True, if the transformation could be applied.</returns> protected bool PerformTransformation( Method.Builder builder, SSARewriter <Value, ConstructionData> rewriter) { // Search for convertible allocas var allocas = new HashSet <Alloca>(); builder.SourceBlocks.ForEachValue <Alloca>(alloca => { if (!CanConvert(builder, alloca)) { return; } allocas.Add(alloca); }); if (allocas.Count < 1) { return(false); } // Perform SSA construction var ssaBuilder = SSABuilder <Value> .Create(builder); return(rewriter.Rewrite(ssaBuilder, new ConstructionData(allocas))); }
/// <summary> /// Applies the SSA construction transformation. /// </summary> protected override bool PerformTransformation(Method.Builder builder) { // Create scope and try to find SSA-convertible alloca nodes var scope = builder.CreateScope(ScopeFlags.AddAlreadyVisitedNodes); // Search for convertible allocas var allocas = new HashSet <Alloca>(); scope.ForEachValue <Alloca>(alloca => { if (!alloca.IsSimpleAllocation || alloca.AddressSpace != MemoryAddressSpace.Local || RequiresAddress(alloca)) { return; } allocas.Add(alloca); }); if (allocas.Count < 1) { return(false); } // Perform SSA construction var ssaBuilder = SSABuilder <Value> .Create(builder, scope); return(Rewriter.Rewrite(ssaBuilder, new ConstructionData(allocas))); }
/// <summary> /// Applies the SSA construction transformation. /// </summary> protected override bool PerformTransformation(Method.Builder builder) { // Search for convertible allocas var allocas = new HashSet <Alloca>(); builder.SourceBlocks.ForEachValue <Alloca>(alloca => { if (!alloca.IsSimpleAllocation || alloca.AddressSpace != MemoryAddressSpace.Local || RequiresAddress(alloca)) { return; } allocas.Add(alloca); }); if (allocas.Count < 1) { return(false); } // Perform SSA construction var ssaBuilder = SSABuilder <Value> .Create(builder); return(Rewriter.Rewrite(ssaBuilder, new ConstructionData(allocas))); }
/// <summary> /// Applies the structure lowering transformation. /// </summary> protected override bool PerformTransformation(Method.Builder builder) { var ssaBuilder = SSABuilder <FieldRef> .Create(builder); var loweredPhis = new List <LoweredPhi>(); var loweringData = new LoweringData(loweredPhis); bool applied = LowerLoadStores ? LoadStoreRewriter.Rewrite(ssaBuilder, loweringData) : Rewriter.Rewrite(ssaBuilder, loweringData); // Seal all lowered phis foreach (var phi in loweredPhis) { var phiValue = phi.Seal(ssaBuilder); phiValue.TryRemoveTrivialPhi(builder); } return(applied); }