/// <summary> /// Adds general backend optimizations. /// </summary> /// <param name="builder">The transformation manager to populate.</param> /// <param name="acceleratorSpecializer"> /// An instance of an <see cref="AcceleratorSpecializer"/> class. /// </param> /// <param name="level">The desired optimization level.</param> public static void AddBackendOptimizations( this Transformer.Builder builder, AcceleratorSpecializer acceleratorSpecializer, OptimizationLevel level) { // Specialize accelerator properties and views builder.Add(new LowerArrays()); builder.Add(new LowerPointerViews()); builder.Add(acceleratorSpecializer); // Lower structures if (level > OptimizationLevel.O1) { builder.Add(new LowerStructures()); } // Apply final DCE phase in release mode if (level > OptimizationLevel.O0) { builder.Add(new DeadCodeElimination()); } // Append further backend specific transformations in release mode builder.Add(new Inliner()); if (level > OptimizationLevel.O0) { builder.Add(new SimplifyControlFlow()); } }
/// <summary> /// Constructs a new data instance. /// </summary> public SpecializerData( AcceleratorSpecializer specializer, IRContext context) { Specializer = specializer; Context = context; }
/// <summary> /// Adds general backend optimizations. /// </summary> /// <param name="builder">The transformation manager to populate.</param> /// <param name="acceleratorSpecializer"> /// An instance of an <see cref="AcceleratorSpecializer"/> class. /// </param> /// <param name="inliningMode">The inlining mode to use.</param> /// <param name="level">The desired optimization level.</param> public static void AddBackendOptimizations( this Transformer.Builder builder, AcceleratorSpecializer acceleratorSpecializer, InliningMode inliningMode, OptimizationLevel level) { // Specialize accelerator properties, arrays and views builder.Add(new LowerArrays(MemoryAddressSpace.Local)); builder.Add(new LowerPointerViews()); builder.Add(acceleratorSpecializer); // Perform an additional inlining pass to specialize small device-specific // functions that could have been introduced if (inliningMode != InliningMode.Disabled) { builder.Add(new Inliner()); } // Skip further optimizations in debug mode if (level < OptimizationLevel.O1) { return; } // Use experimental address-space specializer in O2 only if (level > OptimizationLevel.O1) { // Specialize all parameter address spaces builder.Add(new InferKernelAddressSpaces(MemoryAddressSpace.Global)); } // Lower all value structures that could have been created during the // following passes: // LowerArrays, LowerPointerViews, AcceleratorSpecializer and // AddressSpaceSpecializer builder.Add(new LowerStructures()); // Apply DCE phase in release mode to remove all dead values that // could be created in prior passes builder.Add(new DeadCodeElimination()); // Converts local memory arrays into compile-time known structures builder.Add(new SSAStructureConstruction()); // Infer all specialized address spaces if (level > OptimizationLevel.O1) { builder.Add(new InferLocalAddressSpaces()); } else { builder.Add(new InferAddressSpaces()); } // Final cleanup phases to improve performance builder.Add(new CleanupBlocks()); builder.Add(new SimplifyControlFlow()); }
/// <summary> /// Constructs a new data instance. /// </summary> public SpecializerData( AcceleratorSpecializer specializer, IRContext context, List <Value> toImplement) { ToImplement = toImplement; Specializer = specializer; Context = context; }
/// <summary> /// Specializes warp size values. /// </summary> private static void Specialize( RewriterContext context, AcceleratorSpecializer specializer, WarpSizeValue value) { if (!specializer.WarpSize.HasValue) { return; } Specialize(context, value, specializer.WarpSize.Value); }
/// <summary> /// Specializes native pointer casts. /// </summary> private static void Specialize( RewriterContext context, AcceleratorSpecializer specializer, IntAsPointerCast value) { var convert = context.Builder.CreateConvert( value.Location, value.Value, specializer.IntPointerType); context.ReplaceAndRemove(value, convert); }
/// <summary> /// Adds general backend optimizations. /// </summary> /// <param name="builder">The transformation manager to populate.</param> /// <param name="acceleratorSpecializer"> /// An instance of an <see cref="AcceleratorSpecializer"/> class. /// </param> /// <param name="level">The desired optimization level.</param> public static void AddBackendOptimizations( this Transformer.Builder builder, AcceleratorSpecializer acceleratorSpecializer, OptimizationLevel level) { // Specialize accelerator properties and views builder.Add(new LowerArrays()); builder.Add(new LowerPointerViews()); builder.Add(acceleratorSpecializer); // Specialize all parameter address spaces if (level > OptimizationLevel.O1) { builder.Add(new AddressSpaceSpecializer(MemoryAddressSpace.Global)); } // Lower structures if (level > OptimizationLevel.O1) { builder.Add(new LowerStructures()); } // Apply DCE phase in release mode if (level > OptimizationLevel.O0) { builder.Add(new DeadCodeElimination()); } // Infer all specialized address spaces if (level > OptimizationLevel.O1) { builder.Add(new InferAddressSpaces()); } // Append further backend specific transformations in O2 and O1 mode builder.Add(new Inliner()); if (level > OptimizationLevel.O1) { builder.Add(new CleanupBlocks()); builder.Add(new SimplifyControlFlow()); builder.Add(new DeadCodeElimination()); } else if (level > OptimizationLevel.O0) { builder.Add(new SimplifyControlFlow()); } }
/// <summary> /// Adds general backend optimizations. /// </summary> /// <param name="builder">The transformation manager to populate.</param> /// <param name="acceleratorSpecializer"> /// An instance of an <see cref="AcceleratorSpecializer"/> class. /// </param> /// <param name="contextFlags">The context flags.</param> /// <param name="level">The desired optimization level.</param> public static void AddBackendOptimizations( this Transformer.Builder builder, AcceleratorSpecializer acceleratorSpecializer, ContextFlags contextFlags, OptimizationLevel level) { // Specialize accelerator properties and views builder.Add(new LowerPointerViews()); builder.Add(acceleratorSpecializer); // Perform an additional inlining pass to specialize small device-specific // functions that could have been introduced if (!contextFlags.HasFlags(ContextFlags.NoInlining)) { builder.Add(new Inliner()); } // Skip further optimizations in debug mode if (level < OptimizationLevel.O1) { return; } // Use experimental address-space specializer in O2 only if (level > OptimizationLevel.O1) { // Specialize all parameter address spaces builder.Add(new AddressSpaceSpecializer(MemoryAddressSpace.Global)); } // Lower all value structures that could have been created during the // following passes: // LowerPointerViews, AcceleratorSpecializer and AddressSpaceSpecializer builder.Add(new LowerStructures()); // Apply DCE phase in release mode to remove all dead values that // could be created in prior passes builder.Add(new DeadCodeElimination()); // Infer all specialized address spaces builder.Add(new InferAddressSpaces()); // Final cleanup phases to improve performance builder.Add(new CleanupBlocks()); builder.Add(new SimplifyControlFlow()); }
/// <summary> /// Adds general backend optimizations. /// </summary> /// <param name="builder">The transformation manager to populate.</param> /// <param name="acceleratorSpecializer"> /// An instance of an <see cref="AcceleratorSpecializer"/> class. /// </param> /// <param name="level">The desired optimization level.</param> public static void AddBackendOptimizations( this Transformer.Builder builder, AcceleratorSpecializer acceleratorSpecializer, OptimizationLevel level) { // Specialize accelerator properties and views builder.Add(new LowerArrays()); builder.Add(new LowerPointerViews()); builder.Add(acceleratorSpecializer); // Lower structures if (level > OptimizationLevel.O1) { builder.Add(new LowerStructures()); builder.Add(new DeadCodeElimination()); } }
/// <summary> /// Specializes int to native pointer casts. /// </summary> private static void Specialize( RewriterContext context, AcceleratorSpecializer specializer, IntAsPointerCast value) { // Convert from int -> native int type -> pointer var builder = context.Builder; // int -> native int type var convertToNativeInt = builder.CreateConvert( value.Location, value.Value, specializer.IntPointerType); // native int type -> pointer var convert = builder.CreateIntAsPointerCast( value.Location, convertToNativeInt); context.ReplaceAndRemove(value, convert); }
/// <summary> /// Specializes native pointer to int casts. /// </summary> private static void Specialize( RewriterContext context, AcceleratorSpecializer specializer, PointerAsIntCast value) { // Convert from ptr -> native int type -> desired int type var builder = context.Builder; // ptr -> native int type var convertToNativeType = builder.CreatePointerAsIntCast( value.Location, value.Value, specializer.IntPointerType.BasicValueType); // native int type -> desired int type var convert = builder.CreateConvert( value.Location, convertToNativeType, value.TargetType); context.ReplaceAndRemove(value, convert); }
/// <summary> /// Specializes accelerator-type values. /// </summary> private static void Specialize( RewriterContext context, AcceleratorSpecializer specializer, AcceleratorTypeValue value) => Specialize(context, value, (int)specializer.AcceleratorType);
/// <summary> /// Returns true if we have to adjust the source cast operation. /// </summary> private static bool CanSpecialize( AcceleratorSpecializer specializer, IntAsPointerCast value) => value.SourceType != specializer.IntPointerType;
/// <summary> /// Specializes IO output operations via the instance method /// <see cref="Specialize(in RewriterContext, WriteToOutput)"/> of the parent /// <paramref name="specializer"/> instance. /// </summary> private static void Specialize( RewriterContext context, AcceleratorSpecializer specializer, WriteToOutput value) => specializer.Specialize(context, value);
/// <summary> /// Returns true if we have to adjust the source cast operation. /// </summary> private static bool CanSpecialize( AcceleratorSpecializer specializer, PointerAsIntCast value) => value.TargetType != specializer.IntPointerType;
/// <summary> /// Adds general backend optimizations. /// </summary> /// <param name="builder">The transformation manager to populate.</param> /// <param name="acceleratorSpecializer"> /// An instance of an <see cref="AcceleratorSpecializer"/> class. /// </param> /// <param name="inliningMode">The inlining mode to use.</param> /// <param name="level">The desired optimization level.</param> public static void AddBackendOptimizations <TPlacementStrategy>( this Transformer.Builder builder, AcceleratorSpecializer acceleratorSpecializer, InliningMode inliningMode, OptimizationLevel level) where TPlacementStrategy : struct, CodePlacement.IPlacementStrategy { // Specialize accelerator properties, arrays and views builder.Add(new LowerArrays(MemoryAddressSpace.Local)); builder.Add(new LowerPointerViews()); builder.Add(acceleratorSpecializer); // Perform an additional inlining pass to specialize small device-specific // functions that could have been introduced if (inliningMode != InliningMode.Disabled) { builder.Add(new Inliner()); } // Apply UCE and DCE passes to avoid dead branches and fold conditionals that // do not affect the actual code being executed builder.Add(new UnreachableCodeElimination()); builder.Add(new DeadCodeElimination()); // Skip further optimizations in debug mode if (level < OptimizationLevel.O1) { return; } // Use experimental address-space specializer in O2 only if (level > OptimizationLevel.O1) { // Specialize all parameter address spaces builder.Add(new InferKernelAddressSpaces(MemoryAddressSpace.Global)); } // Lower all value structures that could have been created during the // following passes: // LowerArrays, LowerPointerViews, AcceleratorSpecializer and // AddressSpaceSpecializer builder.Add(new LowerStructures()); // Apply UCE and DCE phases in release mode to remove all dead values and // branches that could be have been created in prior passes builder.Add(new UnreachableCodeElimination()); builder.Add(new DeadCodeElimination()); // Converts local memory arrays into compile-time known structures builder.Add(new SSAStructureConstruction()); // Infer all specialized address spaces if (level > OptimizationLevel.O1) { builder.Add(new InferLocalAddressSpaces()); } else { builder.Add(new InferAddressSpaces()); } // Final cleanup phases to improve performance builder.Add(new CleanupBlocks()); builder.Add(new SimplifyControlFlow()); if (level > OptimizationLevel.O1) { // Add additional code placement optimizations to reduce register // pressure and improve performance builder.Add(new DeadCodeElimination()); builder.Add(new CodePlacement <TPlacementStrategy>( CodePlacementMode.Aggressive)); builder.Add(new LoopInvariantCodeMotion()); } }