Ejemplo n.º 1
0
        /// <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)));
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
 /// <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);
 }
Ejemplo n.º 4
0
        /// <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);
        }