Skip to content

Commit 7e5ec07

Browse files
committed
More .Read implementations
1 parent 72e8eda commit 7e5ec07

File tree

7 files changed

+159
-9
lines changed

7 files changed

+159
-9
lines changed

Src/ILGPU.Analyzers/ReaderDelegatesGenerator.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public void OnVisitSyntaxNode(SyntaxNode node)
3737
{
3838
AttributeSyntax? attribute;
3939
if (node is ClassDeclarationSyntax cl &&
40+
cl.Parent is NamespaceDeclarationSyntax ns &&
41+
ns.Name.ToString().StartsWith("ILGPU.IR.Values") &&
4042
(attribute = cl.AttributeLists.SelectMany(x => x.Attributes)
4143
.SingleOrDefault(attr => attr.Name.ToString() == "ValueKind"))
4244
is not null)
@@ -72,7 +74,7 @@ public void Execute(GeneratorExecutionContext context)
7274
builder.AppendLine(" {");
7375
foreach (var kv in valueKindReciever.ValueKinds)
7476
{
75-
builder.AppendLine($" _readerDelegates.Add({kv.Key}, {kv.Value}.Read);");
77+
builder.AppendLine($" _readerDelegates.TryAdd({kv.Key}, {kv.Value}.Read);");
7678
}
7779
builder.AppendLine(" }");
7880
builder.AppendLine(" }");

Src/ILGPU/IR/Values/AlignValues.cs

+50-2
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,32 @@ protected override string ToArgString() =>
105105
/// Aligns a pointer or a view to a specified alignment in bytes.
106106
/// </summary>
107107
[ValueKind(ValueKind.AlignTo)]
108-
public sealed class AlignTo : BaseAlignOperationValue
108+
public sealed class AlignTo : BaseAlignOperationValue, IValueReader
109109
{
110+
#region Static
111+
112+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
113+
public static Value? Read(ValueHeader header, IIRReader reader)
114+
{
115+
var methodBuilder = header.Method?.MethodBuilder;
116+
if (methodBuilder is not null &&
117+
header.Block is not null &&
118+
header.Block.GetOrCreateBuilder(methodBuilder,
119+
out BasicBlock.Builder? blockBuilder))
120+
{
121+
return blockBuilder.CreateAlignTo(
122+
Location.Unknown,
123+
header.Nodes[0],
124+
header.Nodes[1]);
125+
}
126+
else
127+
{
128+
return null;
129+
}
130+
}
131+
132+
#endregion
133+
110134
#region Instance
111135

112136
/// <summary>
@@ -187,8 +211,32 @@ protected override string ToPrefixString() =>
187211
/// bytes.
188212
/// </summary>
189213
[ValueKind(ValueKind.AsAligned)]
190-
public sealed class AsAligned : BaseAlignOperationValue
214+
public sealed class AsAligned : BaseAlignOperationValue, IValueReader
191215
{
216+
#region Static
217+
218+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
219+
public static Value? Read(ValueHeader header, IIRReader reader)
220+
{
221+
var methodBuilder = header.Method?.MethodBuilder;
222+
if (methodBuilder is not null &&
223+
header.Block is not null &&
224+
header.Block.GetOrCreateBuilder(methodBuilder,
225+
out BasicBlock.Builder? blockBuilder))
226+
{
227+
return blockBuilder.CreateAsAligned(
228+
Location.Unknown,
229+
header.Nodes[0],
230+
header.Nodes[1]);
231+
}
232+
else
233+
{
234+
return null;
235+
}
236+
}
237+
238+
#endregion
239+
192240
#region Instance
193241

194242
/// <summary>

Src/ILGPU/IR/Values/Cast.cs

+27-1
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,34 @@ protected internal override void Write(IIRWriter writer) =>
353353
/// Cast a pointer from one address space to another.
354354
/// </summary>
355355
[ValueKind(ValueKind.AddressSpaceCast)]
356-
public sealed class AddressSpaceCast : BaseAddressSpaceCast
356+
public sealed class AddressSpaceCast : BaseAddressSpaceCast, IValueReader
357357
{
358+
#region Static
359+
360+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
361+
public static Value? Read(ValueHeader header, IIRReader reader)
362+
{
363+
var methodBuilder = header.Method?.MethodBuilder;
364+
if (methodBuilder is not null &&
365+
header.Block is not null &&
366+
header.Block.GetOrCreateBuilder(methodBuilder,
367+
out BasicBlock.Builder? blockBuilder) &&
368+
reader.Read(out MemoryAddressSpace targetAddrSpace))
369+
{
370+
return blockBuilder.CreateAddressSpaceCast(
371+
Location.Unknown,
372+
header.Nodes[0],
373+
targetAddrSpace
374+
);
375+
}
376+
else
377+
{
378+
return null;
379+
}
380+
}
381+
382+
#endregion
383+
358384
#region Instance
359385

360386
/// <summary>

Src/ILGPU/IR/Values/DeviceConstants.cs

+23-1
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,30 @@ internal DeviceConstantValue(
4141
/// Represents the <see cref="Accelerator.AcceleratorType"/> property.
4242
/// </summary>
4343
[ValueKind(ValueKind.AcceleratorType)]
44-
public sealed class AcceleratorTypeValue : DeviceConstantValue
44+
public sealed class AcceleratorTypeValue : DeviceConstantValue, IValueReader
4545
{
46+
#region Static
47+
48+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
49+
public static Value? Read(ValueHeader header, IIRReader reader)
50+
{
51+
var methodBuilder = header.Method?.MethodBuilder;
52+
if (methodBuilder is not null &&
53+
header.Block is not null &&
54+
header.Block.GetOrCreateBuilder(methodBuilder,
55+
out BasicBlock.Builder? blockBuilder))
56+
{
57+
return blockBuilder.CreateAcceleratorTypeValue(
58+
Location.Unknown);
59+
}
60+
else
61+
{
62+
return null;
63+
}
64+
}
65+
66+
#endregion
67+
4668
#region Instance
4769

4870
/// <summary>

Src/ILGPU/IR/Values/Memory.cs

+32-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,35 @@ internal MemoryValue(in ValueInitializer initializer, TypeNode staticType)
4848
/// Represents an allocation operation on the stack.
4949
/// </summary>
5050
[ValueKind(ValueKind.Alloca)]
51-
public sealed class Alloca : MemoryValue
51+
public sealed class Alloca : MemoryValue, IValueReader
5252
{
53+
#region Static
54+
55+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
56+
public static Value? Read(ValueHeader header, IIRReader reader)
57+
{
58+
var methodBuilder = header.Method?.MethodBuilder;
59+
if (methodBuilder is not null &&
60+
header.Block is not null &&
61+
header.Block.GetOrCreateBuilder(methodBuilder,
62+
out BasicBlock.Builder? blockBuilder) &&
63+
64+
reader.Read(out long allocaTypeId) &&
65+
reader.Read(out MemoryAddressSpace addrSpace))
66+
{
67+
return blockBuilder.CreateAlloca(
68+
Location.Unknown,
69+
reader.Context.Types[allocaTypeId],
70+
addrSpace);
71+
}
72+
else
73+
{
74+
return null;
75+
}
76+
}
77+
78+
#endregion
79+
5380
#region Instance
5481

5582
/// <summary>
@@ -141,8 +168,11 @@ protected internal override Value Rebuild(
141168
rebuilder.Rebuild(ArrayLength));
142169

143170
/// <summary cref="Value.Write(IIRWriter)"/>
144-
protected internal override void Write(IIRWriter writer) =>
171+
protected internal override void Write(IIRWriter writer)
172+
{
173+
writer.Write("AllocaType", AllocaType.Id);
145174
writer.Write("AddressSpace", AddressSpace);
175+
}
146176

147177
/// <summary cref="Value.Accept"/>
148178
public override void Accept<T>(T visitor) => visitor.Visit(this);

Src/ILGPU/IR/Values/Undefined.cs

+22-1
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,29 @@ namespace ILGPU.IR.Values
1818
/// Represents an undefined value.
1919
/// </summary>
2020
[ValueKind(ValueKind.Undefined)]
21-
public sealed class UndefinedValue : Value
21+
public sealed class UndefinedValue : Value, IValueReader
2222
{
23+
#region Static
24+
25+
/// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
26+
public static Value? Read(ValueHeader header, IIRReader reader)
27+
{
28+
var methodBuilder = header.Method?.MethodBuilder;
29+
if (methodBuilder is not null &&
30+
header.Block is not null &&
31+
header.Block.GetOrCreateBuilder(methodBuilder,
32+
out BasicBlock.Builder? blockBuilder))
33+
{
34+
return blockBuilder.CreateUndefined();
35+
}
36+
else
37+
{
38+
return null;
39+
}
40+
}
41+
42+
#endregion
43+
2344
#region Instance
2445

2546
/// <summary>

Src/ILGPU/IR/Values/ValueKind.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using ILGPU.IR.Serialization;
1313
using ILGPU.Util;
1414
using System;
15+
using System.Collections.Concurrent;
1516
using System.Collections.Generic;
1617
using System.Reflection;
1718

@@ -396,7 +397,7 @@ public ValueKindAttribute(ValueKind kind)
396397
/// </summary>
397398
public static partial class ValueKinds
398399
{
399-
private readonly static Dictionary<ValueKind,
400+
private readonly static ConcurrentDictionary<ValueKind,
400401
GenericValueReader> _readerDelegates = new();
401402

402403
/// <summary>

0 commit comments

Comments
 (0)