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>
        /// Applies the SSA construction transformation.
        /// </summary>
        protected override bool PerformTransformation(Method.Builder builder)
        {
            // Create scope and try to find SSA-convertible alloca nodes
            var scope = builder.CreateScope(ScopeFlags.AddAlreadyVisitedNodes);

            // Search for convertible allocas
            var allocas = new HashSet <Alloca>();

            scope.ForEachValue <Alloca>(alloca =>
            {
                if (!alloca.IsSimpleAllocation ||
                    alloca.AddressSpace != MemoryAddressSpace.Local ||
                    RequiresAddress(alloca))
                {
                    return;
                }

                allocas.Add(alloca);
            });
            if (allocas.Count < 1)
            {
                return(false);
            }

            // Perform SSA construction
            var ssaBuilder = SSABuilder <Value> .Create(builder, scope);

            return(Rewriter.Rewrite(ssaBuilder, new ConstructionData(allocas)));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Applies the SSA construction transformation.
        /// </summary>
        protected override bool PerformTransformation(Method.Builder builder)
        {
            // Search for convertible allocas
            var allocas = new HashSet <Alloca>();

            builder.SourceBlocks.ForEachValue <Alloca>(alloca =>
            {
                if (!alloca.IsSimpleAllocation ||
                    alloca.AddressSpace != MemoryAddressSpace.Local ||
                    RequiresAddress(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.º 4
0
        /// <summary>
        /// Applies the structure lowering transformation.
        /// </summary>
        protected override bool PerformTransformation(Method.Builder builder)
        {
            var ssaBuilder = SSABuilder <FieldRef> .Create(builder);

            var loweredPhis  = new List <LoweredPhi>();
            var loweringData = new LoweringData(loweredPhis);

            bool applied = LowerLoadStores
                ? LoadStoreRewriter.Rewrite(ssaBuilder, loweringData)
                : Rewriter.Rewrite(ssaBuilder, loweringData);

            // Seal all lowered phis
            foreach (var phi in loweredPhis)
            {
                var phiValue = phi.Seal(ssaBuilder);
                phiValue.TryRemoveTrivialPhi(builder);
            }

            return(applied);
        }