Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
 /// <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);
     }
 }
Exemplo n.º 4
0
 /// <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);
     }
 }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
 /// <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);
Exemplo n.º 8
0
 /// <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;
Exemplo n.º 9
0
 /// <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;
Exemplo n.º 10
0
 /// <summary>
 /// Specializes accelerator-type values.
 /// </summary>
 private static void Specialize(
     RewriterContext context,
     SpecializerData data,
     AcceleratorTypeValue value) =>
 Specialize(context, value, (int)data.AcceleratorType);
Exemplo n.º 11
0
 /// <summary>
 /// Collects alignment operations (for debugging purposes).
 /// </summary>
 private static void Specialize(
     RewriterContext context,
     SpecializerData data,
     AsAligned value) =>
 data.ToImplement.Add(value);