Skip to content

Commit bc93a02

Browse files
authored
lcb: Use artificial resource as register class (#464)
* lcb: Adding conditions for red flags * lcb: Use artificial resource as register class
1 parent 2caff8b commit bc93a02

File tree

5 files changed

+961
-916
lines changed

5 files changed

+961
-916
lines changed

vadl/main/vadl/gcb/passes/operands/model/GcbInstructionRegisterFileOperand.java

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
import java.util.List;
2020
import vadl.gcb.passes.operands.ReferencesFormatField;
2121
import vadl.viam.Format;
22+
import vadl.viam.GeneratesRegisterFileName;
2223
import vadl.viam.RegisterTensor;
2324
import vadl.viam.graph.dependency.FieldRefNode;
24-
import vadl.viam.graph.dependency.FuncParamNode;
2525
import vadl.viam.graph.dependency.ReadArtificialResNode;
2626
import vadl.viam.graph.dependency.ReadRegTensorNode;
2727
import vadl.viam.graph.dependency.WriteArtificialResNode;
@@ -33,7 +33,7 @@
3333
public class GcbInstructionRegisterFileOperand
3434
extends GcbDefaultInstructionOperand
3535
implements ReferencesFormatField {
36-
private final RegisterTensor registerFile;
36+
private final GeneratesRegisterFileName registerFile;
3737
private final Format.Field formatField;
3838

3939
/**
@@ -42,7 +42,6 @@ public class GcbInstructionRegisterFileOperand
4242
public GcbInstructionRegisterFileOperand(ReadRegTensorNode node, Format.Field address) {
4343
super(node, node.regTensor().simpleName(), address.identifier.simpleName());
4444
this.registerFile = node.regTensor();
45-
this.registerFile.ensure(registerFile.isRegisterFile(), "must be registerfile");
4645
this.formatField = address;
4746
node.regTensor().ensure(registerFile.isRegisterFile(), "must be registerfile");
4847
}
@@ -51,10 +50,9 @@ public GcbInstructionRegisterFileOperand(ReadRegTensorNode node, Format.Field ad
5150
* Constructor.
5251
*/
5352
public GcbInstructionRegisterFileOperand(ReadArtificialResNode node, Format.Field address) {
54-
super(node, node.resourceDefinition().innerResourceRef().simpleName(),
53+
super(node, node.resourceDefinition().simpleName(),
5554
address.identifier.simpleName());
56-
this.registerFile = (RegisterTensor) node.resourceDefinition().innerResourceRef();
57-
this.registerFile.ensure(registerFile.isRegisterFile(), "must be registerfile");
55+
this.registerFile = node.resourceDefinition();
5856
this.formatField = address;
5957
node.resourceDefinition().innerResourceRef()
6058
.ensure(registerFile.isRegisterFile(), "must be registerfile");
@@ -66,7 +64,6 @@ public GcbInstructionRegisterFileOperand(ReadArtificialResNode node, Format.Fiel
6664
public GcbInstructionRegisterFileOperand(WriteRegTensorNode node, FieldRefNode address) {
6765
super(node, node.regTensor().simpleName(), address.formatField().identifier.simpleName());
6866
this.registerFile = node.regTensor();
69-
this.registerFile.ensure(registerFile.isRegisterFile(), "must be registerfile");
7067
this.formatField = address.formatField();
7168
}
7269

@@ -77,27 +74,12 @@ public GcbInstructionRegisterFileOperand(WriteArtificialResNode node, Format.Fie
7774
super(node, node.resourceDefinition().innerResourceRef().simpleName(),
7875
address.identifier.simpleName());
7976
this.registerFile = (RegisterTensor) node.resourceDefinition().innerResourceRef();
80-
this.registerFile.ensure(registerFile.isRegisterFile(), "must be registerfile");
8177
this.formatField = address;
8278
node.resourceDefinition().innerResourceRef()
8379
.ensure(registerFile.isRegisterFile(), "must be registerfile");
8480
}
8581

86-
/**
87-
* Constructor for pseudo instructions. Pseudo instructions will have a {@link ReadRegTensorNode}
88-
* or {@link WriteRegTensorNode} because they are constructed over {@link FuncParamNode}.
89-
*/
90-
public GcbInstructionRegisterFileOperand(RegisterTensor registerFile,
91-
Format.Field field,
92-
FuncParamNode funcParamNode) {
93-
super(funcParamNode, registerFile.simpleName(),
94-
funcParamNode.parameter().identifier.simpleName());
95-
this.registerFile = registerFile;
96-
this.formatField = field;
97-
this.registerFile.ensure(registerFile.isRegisterFile(), "must be registerfile");
98-
}
99-
100-
public RegisterTensor registerFile() {
82+
public GeneratesRegisterFileName registerFile() {
10183
return registerFile;
10284
}
10385

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// SPDX-FileCopyrightText : © 2025 TU Wien <vadl@tuwien.ac.at>
2+
// SPDX-License-Identifier: GPL-3.0-or-later
3+
//
4+
// This program is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// This program is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU General Public License
15+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
16+
17+
package vadl.lcb.passes.llvmLowering.domain.selectionDag;
18+
19+
import javax.annotation.Nullable;
20+
import vadl.error.Diagnostic;
21+
import vadl.types.DataType;
22+
import vadl.viam.ArtificialResource;
23+
import vadl.viam.Counter;
24+
import vadl.viam.GeneratesRegisterFileName;
25+
import vadl.viam.RegisterTensor;
26+
import vadl.viam.graph.dependency.ExpressionNode;
27+
import vadl.viam.graph.dependency.FieldRefNode;
28+
29+
/**
30+
* Factory for creating reading instances.
31+
*/
32+
public class LlvmReadResourceFactory {
33+
/**
34+
* Based on the {@code registerFile} creates a node.
35+
*/
36+
public ExpressionNode create(GeneratesRegisterFileName registerFile,
37+
FieldRefNode address,
38+
DataType type,
39+
@Nullable Counter counter) {
40+
if (registerFile instanceof RegisterTensor registerTensor) {
41+
return new LlvmReadRegFileNode(registerTensor, address, type, counter);
42+
} else if (registerFile instanceof ArtificialResource artificialResource) {
43+
return new LlvmReadArtificialResourceNode(artificialResource, address, type);
44+
} else {
45+
throw Diagnostic.error("Cannot create a llvm type", registerFile.location()).build();
46+
}
47+
}
48+
}

vadl/main/vadl/lcb/passes/llvmLowering/strategies/LlvmInstructionLoweringStrategy.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import vadl.viam.graph.dependency.ReadMemNode;
9191
import vadl.viam.graph.dependency.ReadRegTensorNode;
9292
import vadl.viam.graph.dependency.ReadResourceNode;
93+
import vadl.viam.graph.dependency.SelectNode;
9394
import vadl.viam.graph.dependency.SideEffectNode;
9495
import vadl.viam.graph.dependency.SignExtendNode;
9596
import vadl.viam.graph.dependency.WriteMemNode;
@@ -428,7 +429,8 @@ protected boolean hasRedFlags(
428429
|| hasMultipleOutputs(graph)
429430
|| rejectWhenReadingFromMemory(graph)
430431
|| rejectWhenWritingToMemory(graph)
431-
|| hasUnreplacedBuiltins(graph)) {
432+
|| hasUnreplacedBuiltins(graph)
433+
|| hasSelectNodes(graph)) {
432434
return true;
433435
}
434436

@@ -455,6 +457,13 @@ Here we essentially have X(rd) = X(rn) which creates the pattern:
455457
.anyMatch(writeResourceNode -> writeResourceNode.value() instanceof ReadResourceNode);
456458
}
457459

460+
/**
461+
* If there are any {@link SelectNode} in the graph.
462+
*/
463+
private boolean hasSelectNodes(Graph graph) {
464+
return graph.getNodes(SelectNode.class).toList().size() == 1;
465+
}
466+
458467
/**
459468
* If there is a {@link BuiltInCall} which is not {@link LlvmNodeLowerable} and thus
460469
* wasn't replaced.

vadl/main/vadl/lcb/passes/llvmLowering/strategies/instruction/LlvmInstructionLoweringIndirectJumpAndLinkStrategyImpl.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import vadl.lcb.passes.llvmLowering.domain.selectionDag.LlvmBrindSD;
4444
import vadl.lcb.passes.llvmLowering.domain.selectionDag.LlvmFieldAccessRefNode;
4545
import vadl.lcb.passes.llvmLowering.domain.selectionDag.LlvmReadRegFileNode;
46+
import vadl.lcb.passes.llvmLowering.domain.selectionDag.LlvmReadResourceFactory;
4647
import vadl.lcb.passes.llvmLowering.domain.selectionDag.LlvmTargetCallSD;
4748
import vadl.lcb.passes.llvmLowering.strategies.LlvmInstructionLoweringStrategy;
4849
import vadl.lcb.passes.llvmLowering.tablegen.model.TableGenPattern;
@@ -52,8 +53,8 @@
5253
import vadl.types.Type;
5354
import vadl.viam.Abi;
5455
import vadl.viam.Constant;
56+
import vadl.viam.GeneratesRegisterFileName;
5557
import vadl.viam.Instruction;
56-
import vadl.viam.RegisterTensor;
5758
import vadl.viam.graph.Graph;
5859
import vadl.viam.graph.NodeList;
5960
import vadl.viam.graph.dependency.ConstantNode;
@@ -166,10 +167,13 @@ protected List<TableGenPattern> generatePatternVariations(
166167
var selector = new Graph("selector");
167168
var ref = (ReadRegTensorNode) inputRegister.origin().copy();
168169
var address = (FieldRefNode) ref.address().copy();
169-
selector.addWithInputs(new LlvmTargetCallSD(new NodeList<>(new LlvmReadRegFileNode(
170-
inputRegister.registerFile(), address, inputRegister.formatField().type(),
171-
ref.staticCounterAccess()
172-
)),
170+
var factory = new LlvmReadResourceFactory();
171+
selector.addWithInputs(new LlvmTargetCallSD(
172+
new NodeList<>(
173+
factory.create(inputRegister.registerFile(), address,
174+
inputRegister.formatField().type(),
175+
ref.staticCounterAccess())
176+
),
173177
Type.dummy()));
174178

175179
var database = new Database(supportedInstructions);
@@ -272,7 +276,8 @@ private TableGenPattern generateBranchIndirectWithAdd(
272276
var selector = new Graph("selector");
273277
var ref = (ReadRegTensorNode) inputRegister.origin().copy();
274278
var address = (FieldRefNode) ref.address().copy();
275-
var llvmRegister = new LlvmReadRegFileNode(
279+
var factory = new LlvmReadResourceFactory();
280+
var llvmRegister = factory.create(
276281
inputRegister.registerFile(), address, inputRegister.formatField().type(),
277282
ref.staticCounterAccess()
278283
);
@@ -301,7 +306,8 @@ private TableGenPattern generateBranchIndirectWithZero(
301306
var selector = new Graph("selector");
302307
var ref = (ReadRegTensorNode) inputRegister.origin().copy();
303308
var address = (FieldRefNode) ref.address().copy();
304-
var llvmRegister = new LlvmReadRegFileNode(
309+
var factory = new LlvmReadResourceFactory();
310+
var llvmRegister = factory.create(
305311
inputRegister.registerFile(), address, inputRegister.formatField().type(),
306312
ref.staticCounterAccess()
307313
);
@@ -319,7 +325,7 @@ private TableGenPattern generateBranchIndirectWithZero(
319325
return new TableGenSelectionWithOutputPattern(selector, machine);
320326
}
321327

322-
private static String zeroRegister(RegisterTensor registerFile) {
328+
private static String zeroRegister(GeneratesRegisterFileName registerFile) {
323329
var constraint =
324330
ensurePresent(
325331
Arrays.stream(registerFile.constraints()).filter(x -> x.value().intValue() == 0)
@@ -328,6 +334,6 @@ private static String zeroRegister(RegisterTensor registerFile) {
328334
registerFile.location())
329335
);
330336

331-
return registerFile.simpleName() + constraint.indices().getFirst().intValue();
337+
return registerFile.identifier().simpleName() + constraint.indices().getFirst().intValue();
332338
}
333339
}

0 commit comments

Comments
 (0)