/// <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> /// Adds the common rewriters to the given rewriter instance. /// </summary> /// <param name="rewriter">The rewriter to extend.</param> private static void AddRewriters(SSARewriter <FieldRef, LoweringData> rewriter) { // Keep particular values that cannot be rewritten by this pass rewriter.Add <Parameter>((_, value) => value.Type.IsStructureType, Keep); rewriter.Add <ArrayValue>((_, value) => value.Type.IsStructureType, Keep); rewriter.Add <GetArrayElement>( (_, value) => value.Type.IsStructureType, Keep); rewriter.Add <SetArrayElement>( (_, value) => value.Type.IsStructureType, Keep); // Rewrite known values rewriter.Add <NullValue>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <StructureValue>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <PhiValue>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <Broadcast>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <WarpShuffle>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <SubWarpShuffle>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <ReturnTerminator>( (_, value) => value.Method.ReturnType.IsStructureType, Lower); rewriter.Add <GetField>(Lower); rewriter.Add <SetField>(Lower); rewriter.Add <MethodCall>(Lower); }
/// <summary> /// Registers all base rewriting patterns. /// </summary> protected static void RegisterRewriters <TConstructionData>( SSARewriter <Value, TConstructionData> rewriter) where TConstructionData : IConstructionData { rewriter.Add <Load>(Convert); rewriter.Add <Store>(Convert); rewriter.Add <LoadFieldAddress>(Convert); rewriter.Add <AddressSpaceCast>(Convert); }
/// <summary> /// Adds the common rewriters to the given rewriter instance. /// </summary> /// <param name="rewriter">The rewriter to extend.</param> private static void AddRewriters(SSARewriter <FieldRef, LoweringData> rewriter) { rewriter.Add <Parameter>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <NullValue>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <StructureValue>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <PhiValue>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <Broadcast>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <WarpShuffle>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <SubWarpShuffle>((_, value) => value.Type.IsStructureType, Lower); rewriter.Add <ReturnTerminator>( (_, value) => value.Method.ReturnType.IsStructureType, Lower); rewriter.Add <GetField>(Lower); rewriter.Add <SetField>(Lower); rewriter.Add <MethodCall>(Lower); }