-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGenericSyntaxBuilder.cs
More file actions
84 lines (73 loc) · 2.76 KB
/
GenericSyntaxBuilder.cs
File metadata and controls
84 lines (73 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
namespace MLIR.Transforms;
using System.Collections.Generic;
using MLIR.Syntax;
/// <summary>
/// Rewrites MLIR concrete syntax trees into their generic operation-body form when a generic projection is available.
/// </summary>
public static class GenericSyntaxBuilder
{
/// <summary>
/// Rewrites a module syntax tree into generic MLIR syntax.
/// </summary>
/// <param name="module">The module syntax tree to rewrite.</param>
/// <returns>The rewritten module syntax tree.</returns>
public static ModuleSyntax BuildModule(ModuleSyntax module)
{
var builder = new Builder();
return builder.BuildModule(module);
}
private sealed class Builder
{
public ModuleSyntax BuildModule(ModuleSyntax module)
{
var operations = new List<OperationSyntax>(module.Operations.Count);
foreach (var operation in module.Operations)
{
operations.Add(BuildOperation(operation));
}
return new ModuleSyntax(operations, module.EndOfFileToken);
}
private OperationSyntax BuildOperation(OperationSyntax operation)
{
if (!operation.TryGetGenericBody(out var genericBody))
{
return operation;
}
var regions = new List<RegionSyntax>(genericBody!.Regions.Count);
foreach (var region in genericBody.Regions)
{
regions.Add(BuildRegion(region));
}
return new OperationSyntax(
operation.ResultTokens,
operation.ResultCommaTokens,
operation.EqualsToken,
operation.NameToken,
new GenericOperationBodySyntax(
genericBody.OperandList,
genericBody.SuccessorList,
regions,
genericBody.Attributes,
genericBody.TypeSignatureColonToken,
genericBody.TypeSignatureSyntax));
}
private RegionSyntax BuildRegion(RegionSyntax region)
{
var blocks = new List<BlockSyntax>(region.Blocks.Count);
foreach (var block in region.Blocks)
{
blocks.Add(BuildBlock(block));
}
return new RegionSyntax(region.OpenBraceToken, blocks, region.CloseBraceToken);
}
private BlockSyntax BuildBlock(BlockSyntax block)
{
var operations = new List<OperationSyntax>(block.Operations.Count);
foreach (var operation in block.Operations)
{
operations.Add(BuildOperation(operation));
}
return new BlockSyntax(block.LabelToken, block.Arguments, block.ColonToken, operations);
}
}
}