/// <summary> /// Lowers structure store operations into distinct stores for each field. /// </summary> private static void Lower( SSARewriterContext <FieldRef> context, LoweringData _, Store store) { var builder = context.Builder; foreach (var(_, fieldAccess) in store.Value.Type as StructureType) { // Update target address var address = builder.CreateLoadFieldAddress( store.Location, store.Target, new FieldSpan(fieldAccess)); // Load the currently registered SSA value and store it var value = context.GetValue( context.Block, new FieldRef(store.Value, fieldAccess)); var loweredStore = builder.CreateStore( store.Location, address, value); context.MarkConverted(loweredStore); } context.Remove(store); }
/// <summary> /// Lowers structure load operations into distinct loads for each field. /// </summary> private static void Lower( SSARewriterContext <FieldRef> context, LoweringData _, Load load) { var builder = context.Builder; foreach (var(_, fieldAccess) in load.Type as StructureType) { // Update source address var address = builder.CreateLoadFieldAddress( load.Location, load.Source, new FieldSpan(fieldAccess)); // Load value and store its reference in the current block var loweredLoad = builder.CreateLoad(load.Location, address); context.SetValue( context.Block, new FieldRef(load, fieldAccess), loweredLoad); context.MarkConverted(loweredLoad); } context.Remove(load); }
/// <summary> /// Lowers null values into separate SSA values. /// </summary> private static void Lower( SSARewriterContext <FieldRef> context, LoweringData _, NullValue nullValue) { foreach (var(fieldType, fieldAccess) in nullValue.Type as StructureType) { // Build the new target value var value = context.Builder.CreateNull( nullValue.Location, fieldType); context.MarkConverted(value); // Bind the new SSA value context.SetValue( context.Block, new FieldRef(nullValue, fieldAccess), value); } }