/// <summary> /// Applies an accelerator-specialization transformation. /// </summary> protected override bool PerformTransformation( IRContext context, Method.Builder builder) { var toImplement = new List <Value>(16); var data = new SpecializerData(this, context, toImplement); if (!Rewriter.Rewrite(builder.SourceBlocks, builder, data)) { return(false); } foreach (var value in toImplement) { switch (value) { case DebugAssertOperation assert: Implement(context, builder, builder[assert.BasicBlock], assert); break; case WriteToOutput write: Implement(context, builder, builder[write.BasicBlock], write); break; case AsAligned aligned: Implement(context, builder, builder[aligned.BasicBlock], aligned); break; default: throw builder.GetInvalidOperationException(); } } return(true); }
/// <summary> /// Specializes warp size values. /// </summary> private static void Specialize( RewriterContext context, SpecializerData data, WarpSizeValue value) { var warpSizeValue = data.WarpSize; if (!warpSizeValue.HasValue) { return; } Specialize(context, value, warpSizeValue.Value); }
/// <summary> /// Specializes debug operations via the instance method /// <see cref="Specialize(in RewriterContext, IRContext, DebugAssertOperation)"/> /// of the parent <paramref name="data"/> instance. /// </summary> private static void Specialize( RewriterContext context, SpecializerData data, DebugAssertOperation value) { if (data.EnableAssertions) { data.Specializer.Specialize(context, data.Context, value); } else { context.Remove(value); } }
/// <summary> /// Removes or collects IO operations. /// </summary> private static void Specialize( RewriterContext context, SpecializerData data, WriteToOutput value) { if (data.EnableIOOperations) { data.ToImplement.Add(value); } else { context.Remove(value); } }
/// <summary> /// Specializes int to native pointer casts. /// </summary> private static void Specialize( RewriterContext context, SpecializerData data, 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, data.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, SpecializerData data, 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, data.IntPointerType.BasicValueType); // native int type -> desired int type var convert = builder.CreateConvert( value.Location, convertToNativeType, value.TargetType); context.ReplaceAndRemove(value, convert); }
/// <summary> /// Specializes IO output operations via the instance method /// <see cref="Specialize(in RewriterContext, IRContext, WriteToOutput)"/> of /// the parent <paramref name="data"/> instance. /// </summary> private static void Specialize( RewriterContext context, SpecializerData data, WriteToOutput value) => data.Specializer.Specialize(context, data.Context, value);
/// <summary> /// Returns true if we have to adjust the source cast operation. /// </summary> private static bool CanSpecialize( SpecializerData data, PointerAsIntCast value) => value.TargetType != data.IntPointerType;
/// <summary> /// Returns true if we have to adjust the source cast operation. /// </summary> private static bool CanSpecialize( SpecializerData data, IntAsPointerCast value) => value.SourceType != data.IntPointerType;
/// <summary> /// Specializes accelerator-type values. /// </summary> private static void Specialize( RewriterContext context, SpecializerData data, AcceleratorTypeValue value) => Specialize(context, value, (int)data.AcceleratorType);
/// <summary> /// Collects alignment operations (for debugging purposes). /// </summary> private static void Specialize( RewriterContext context, SpecializerData data, AsAligned value) => data.ToImplement.Add(value);