Skip to content

Commit 1612193

Browse files
committed
More work on deserializers
1 parent 2c69b2a commit 1612193

File tree

8 files changed

+709
-31
lines changed

8 files changed

+709
-31
lines changed

Src/ILGPU/IR/Serialization/IIRWriter.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public partial interface IIRWriter
5252
void Write(string tag, string value);
5353

5454
/// <summary>
55-
/// Serializes a string value to the stream.
55+
/// Serializes an enum value to the stream.
5656
/// </summary>
5757
/// <param name="tag">
5858
/// A tag that describes the purpose of this value.

Src/ILGPU/IR/Values/ArrayValues.cs

+55-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,37 @@ namespace ILGPU.IR.Values
2222
/// Represents an allocation operation of a new array in a particular address space.
2323
/// </summary>
2424
[ValueKind(ValueKind.Array)]
25-
public sealed class NewArray : ControlFlowValue
25+
public sealed class NewArray : ControlFlowValue, IValueReader
2626
{
27+
#region Static
28+
29+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
30+
public static Value? Read(ValueHeader header, IIRReader reader)
31+
{
32+
var methodBuilder = header.Method?.MethodBuilder;
33+
if (methodBuilder is not null &&
34+
header.Block is not null &&
35+
header.Block.GetOrCreateBuilder(methodBuilder,
36+
out BasicBlock.Builder? blockBuilder) &&
37+
reader.Read(out long typeId))
38+
{
39+
var newArrayBuilder = blockBuilder.CreateNewArray(
40+
Location.Unknown, reader.Context.Types[typeId]
41+
.AsNotNullCast<ArrayType>());
42+
43+
foreach (var node in header.Nodes)
44+
newArrayBuilder.Add(node);
45+
46+
return newArrayBuilder.Seal();
47+
}
48+
else
49+
{
50+
return null;
51+
}
52+
}
53+
54+
#endregion
55+
2756
#region Nested Types
2857

2958
/// <summary>
@@ -186,8 +215,32 @@ public interface IArrayValueOperation
186215
/// Gets the length of an array value or a particular array dimension.
187216
/// </summary>
188217
[ValueKind(ValueKind.GetArrayLength)]
189-
public sealed class GetArrayLength : Value, IArrayValueOperation
218+
public sealed class GetArrayLength : Value, IArrayValueOperation, IValueReader
190219
{
220+
#region Static
221+
222+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
223+
public static Value? Read(ValueHeader header, IIRReader reader)
224+
{
225+
var methodBuilder = header.Method?.MethodBuilder;
226+
if (methodBuilder is not null &&
227+
header.Block is not null &&
228+
header.Block.GetOrCreateBuilder(methodBuilder,
229+
out BasicBlock.Builder? blockBuilder))
230+
{
231+
return blockBuilder.CreateGetArrayLength(
232+
Location.Unknown,
233+
header.Nodes[0],
234+
header.Nodes[1]);
235+
}
236+
else
237+
{
238+
return null;
239+
}
240+
}
241+
242+
#endregion
243+
191244
#region Instance
192245

193246
/// <summary>

Src/ILGPU/IR/Values/Atomic.cs

+58-2
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,36 @@ public enum AtomicKind
147147
/// Represents a generic atomic operation.
148148
/// </summary>
149149
[ValueKind(ValueKind.GenericAtomic)]
150-
public sealed class GenericAtomic : AtomicValue
150+
public sealed class GenericAtomic : AtomicValue, IValueReader
151151
{
152+
#region Static
153+
154+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
155+
public static Value? Read(ValueHeader header, IIRReader reader)
156+
{
157+
var methodBuilder = header.Method?.MethodBuilder;
158+
if (methodBuilder is not null &&
159+
header.Block is not null &&
160+
header.Block.GetOrCreateBuilder(methodBuilder,
161+
out BasicBlock.Builder? blockBuilder) &&
162+
reader.Read(out AtomicKind kind) &&
163+
reader.Read(out AtomicFlags flags))
164+
{
165+
return blockBuilder.CreateAtomic(
166+
Location.Unknown,
167+
header.Nodes[0],
168+
header.Nodes[1],
169+
kind, flags
170+
);
171+
}
172+
else
173+
{
174+
return null;
175+
}
176+
}
177+
178+
#endregion
179+
152180
#region Instance
153181

154182
/// <summary>
@@ -228,8 +256,36 @@ protected internal override void Write<T>(T writer)
228256
/// Represents an atomic compare-and-swap operation.
229257
/// </summary>
230258
[ValueKind(ValueKind.AtomicCAS)]
231-
public sealed class AtomicCAS : AtomicValue
259+
public sealed class AtomicCAS : AtomicValue, IValueReader
232260
{
261+
#region Static
262+
263+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
264+
public static Value? Read(ValueHeader header, IIRReader reader)
265+
{
266+
var methodBuilder = header.Method?.MethodBuilder;
267+
if (methodBuilder is not null &&
268+
header.Block is not null &&
269+
header.Block.GetOrCreateBuilder(methodBuilder,
270+
out BasicBlock.Builder? blockBuilder) &&
271+
reader.Read(out AtomicFlags flags))
272+
{
273+
return blockBuilder.CreateAtomicCAS(
274+
Location.Unknown,
275+
header.Nodes[0],
276+
header.Nodes[1],
277+
header.Nodes[2],
278+
flags
279+
);
280+
}
281+
else
282+
{
283+
return null;
284+
}
285+
}
286+
287+
#endregion
288+
233289
#region Instance
234290

235291
/// <summary>

Src/ILGPU/IR/Values/Cast.cs

+170-8
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,30 @@ protected PointerIntCast(
9191
/// Casts from an integer to a raw pointer value.
9292
/// </summary>
9393
[ValueKind(ValueKind.IntAsPointerCast)]
94-
public sealed class IntAsPointerCast : PointerIntCast
94+
public sealed class IntAsPointerCast : PointerIntCast, IValueReader
9595
{
96+
#region Static
97+
98+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
99+
public static Value? Read(ValueHeader header, IIRReader reader)
100+
{
101+
var methodBuilder = header.Method?.MethodBuilder;
102+
if (methodBuilder is not null &&
103+
header.Block is not null &&
104+
header.Block.GetOrCreateBuilder(methodBuilder,
105+
out BasicBlock.Builder? blockBuilder))
106+
{
107+
return blockBuilder.CreateIntAsPointerCast(
108+
Location.Unknown, header.Nodes[0]);
109+
}
110+
else
111+
{
112+
return null;
113+
}
114+
}
115+
116+
#endregion
117+
96118
#region Instance
97119

98120
/// <summary>
@@ -157,8 +179,32 @@ protected internal override void Write<T>(T writer) { }
157179
/// Casts from a pointer value to an integer.
158180
/// </summary>
159181
[ValueKind(ValueKind.PointerAsIntCast)]
160-
public sealed class PointerAsIntCast : PointerIntCast
182+
public sealed class PointerAsIntCast : PointerIntCast, IValueReader
161183
{
184+
#region Static
185+
186+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
187+
public static Value? Read(ValueHeader header, IIRReader reader)
188+
{
189+
var methodBuilder = header.Method?.MethodBuilder;
190+
if (methodBuilder is not null &&
191+
header.Block is not null &&
192+
header.Block.GetOrCreateBuilder(methodBuilder,
193+
out BasicBlock.Builder? blockBuilder) &&
194+
reader.Read(out BasicValueType targetBasicValueType))
195+
{
196+
return blockBuilder.CreatePointerAsIntCast(
197+
Location.Unknown, header.Nodes[0],
198+
targetBasicValueType);
199+
}
200+
else
201+
{
202+
return null;
203+
}
204+
}
205+
206+
#endregion
207+
162208
#region Instance
163209

164210
/// <summary>
@@ -215,7 +261,8 @@ protected internal override Value Rebuild(
215261
TargetBasicValueType);
216262

217263
/// <summary cref="Value.Write{T}(T)"/>
218-
protected internal override void Write<T>(T writer) { }
264+
protected internal override void Write<T>(T writer) =>
265+
writer.Write(nameof(TargetBasicValueType), TargetBasicValueType);
219266

220267
/// <summary cref="Value.Accept"/>
221268
public override void Accept<T>(T visitor) => visitor.Visit(this);
@@ -270,8 +317,32 @@ internal BaseAddressSpaceCast(
270317
/// Casts the type of a pointer to a different type.
271318
/// </summary>
272319
[ValueKind(ValueKind.PointerCast)]
273-
public sealed class PointerCast : BaseAddressSpaceCast
320+
public sealed class PointerCast : BaseAddressSpaceCast, IValueReader
274321
{
322+
#region Static
323+
324+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
325+
public static Value? Read(ValueHeader header, IIRReader reader)
326+
{
327+
var methodBuilder = header.Method?.MethodBuilder;
328+
if (methodBuilder is not null &&
329+
header.Block is not null &&
330+
header.Block.GetOrCreateBuilder(methodBuilder,
331+
out BasicBlock.Builder? blockBuilder) &&
332+
reader.Read(out long targetTypeId))
333+
{
334+
return blockBuilder.CreatePointerCast(
335+
Location.Unknown, header.Nodes[0],
336+
reader.Context.Types[targetTypeId]);
337+
}
338+
else
339+
{
340+
return null;
341+
}
342+
}
343+
344+
#endregion
345+
275346
#region Instance
276347

277348
/// <summary>
@@ -479,8 +550,33 @@ protected internal override void Write<T>(T writer) =>
479550
/// Casts a view from one element type to another.
480551
/// </summary>
481552
[ValueKind(ValueKind.ViewCast)]
482-
public sealed class ViewCast : BaseAddressSpaceCast
553+
public sealed class ViewCast : BaseAddressSpaceCast, IValueReader
483554
{
555+
#region Static
556+
557+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
558+
public static Value? Read(ValueHeader header, IIRReader reader)
559+
{
560+
var methodBuilder = header.Method?.MethodBuilder;
561+
if (methodBuilder is not null &&
562+
header.Block is not null &&
563+
header.Block.GetOrCreateBuilder(methodBuilder,
564+
out BasicBlock.Builder? blockBuilder) &&
565+
reader.Read(out long targetElementTypeId))
566+
{
567+
return blockBuilder.CreateViewCast(
568+
Location.Unknown, header.Nodes[0],
569+
reader.Context.Types[targetElementTypeId]
570+
);
571+
}
572+
else
573+
{
574+
return null;
575+
}
576+
}
577+
578+
#endregion
579+
484580
#region Instance
485581

486582
/// <summary>
@@ -562,8 +658,30 @@ protected internal override void Write<T>(T writer) =>
562658
/// Casts an array to a linear array view.
563659
/// </summary>
564660
[ValueKind(ValueKind.ArrayToViewCast)]
565-
public sealed class ArrayToViewCast : CastValue
661+
public sealed class ArrayToViewCast : CastValue, IValueReader
566662
{
663+
#region Static
664+
665+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
666+
public static Value? Read(ValueHeader header, IIRReader reader)
667+
{
668+
var methodBuilder = header.Method?.MethodBuilder;
669+
if (methodBuilder is not null &&
670+
header.Block is not null &&
671+
header.Block.GetOrCreateBuilder(methodBuilder,
672+
out BasicBlock.Builder? blockBuilder))
673+
{
674+
return blockBuilder.CreateArrayToViewCast(
675+
Location.Unknown, header.Nodes[0]);
676+
}
677+
else
678+
{
679+
return null;
680+
}
681+
}
682+
683+
#endregion
684+
567685
#region Instance
568686

569687
/// <summary>
@@ -698,8 +816,30 @@ protected sealed override TypeNode ComputeType(
698816
/// Casts from a float to an int while preserving bits.
699817
/// </summary>
700818
[ValueKind(ValueKind.FloatAsIntCast)]
701-
public sealed class FloatAsIntCast : BitCast
819+
public sealed class FloatAsIntCast : BitCast, IValueReader
702820
{
821+
#region Static
822+
823+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
824+
public static Value? Read(ValueHeader header, IIRReader reader)
825+
{
826+
var methodBuilder = header.Method?.MethodBuilder;
827+
if (methodBuilder is not null &&
828+
header.Block is not null &&
829+
header.Block.GetOrCreateBuilder(methodBuilder,
830+
out BasicBlock.Builder? blockBuilder))
831+
{
832+
return blockBuilder.CreateFloatAsIntCast(
833+
Location.Unknown, header.Nodes[0]);
834+
}
835+
else
836+
{
837+
return null;
838+
}
839+
}
840+
841+
#endregion
842+
703843
#region Instance
704844

705845
/// <summary>
@@ -767,8 +907,30 @@ protected internal override void Write<T>(T writer) { }
767907
/// Casts from an int to a float while preserving bits.
768908
/// </summary>
769909
[ValueKind(ValueKind.IntAsFloatCast)]
770-
public sealed class IntAsFloatCast : BitCast
910+
public sealed class IntAsFloatCast : BitCast, IValueReader
771911
{
912+
#region Static
913+
914+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
915+
public static Value? Read(ValueHeader header, IIRReader reader)
916+
{
917+
var methodBuilder = header.Method?.MethodBuilder;
918+
if (methodBuilder is not null &&
919+
header.Block is not null &&
920+
header.Block.GetOrCreateBuilder(methodBuilder,
921+
out BasicBlock.Builder? blockBuilder))
922+
{
923+
return blockBuilder.CreateIntAsFloatCast(
924+
Location.Unknown, header.Nodes[0]);
925+
}
926+
else
927+
{
928+
return null;
929+
}
930+
}
931+
932+
#endregion
933+
772934
#region Instance
773935

774936
/// <summary>

0 commit comments

Comments
 (0)