Skip to content

Commit 4ec5099

Browse files
authored
Merge pull request #65 from OpenVADL/bugfix/56-instalias-order
lcb: Fixed #56 - Use TableGen operand order
2 parents f75bab4 + 4f34cc7 commit 4ec5099

16 files changed

+127
-105
lines changed

vadl/main/vadl/gcb/passes/assembly/AssemblyConcatBuiltinMergingPass.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import vadl.pass.PassResults;
2727
import vadl.types.BuiltInTable;
2828
import vadl.viam.Specification;
29+
import vadl.viam.graph.control.ReturnNode;
2930
import vadl.viam.graph.dependency.BuiltInCall;
3031
import vadl.viam.graph.dependency.ExpressionNode;
3132

@@ -56,7 +57,14 @@ public Object execute(PassResults passResults, Specification viam) throws IOExce
5657
.map(isa -> isa.ownInstructions().stream())
5758
.orElseGet(Stream::empty)
5859
.flatMap(
59-
instruction -> instruction.assembly().function().behavior().getNodes(BuiltInCall.class))
60+
instruction -> {
61+
var nodes = new ArrayList<BuiltInCall>();
62+
var returnNode =
63+
instruction.assembly().function().behavior().getNodes(ReturnNode.class)
64+
.findFirst().orElseThrow();
65+
returnNode.collectInputsWithChildren(nodes, BuiltInCall.class);
66+
return nodes.stream();
67+
})
6068
.filter(builtin -> builtin.builtIn() == BuiltInTable.CONCATENATE_STRINGS)
6169
// only find concat strings that are not used by other concat strings.
6270
// we will recursively resolve them, so we want only the root objects.

vadl/main/vadl/lcb/codegen/expansion/PseudoExpansionCodeGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public class PseudoExpansionCodeGenerator extends FunctionCodeGenerator {
8484
private final PseudoInstruction pseudoInstruction;
8585
private final SymbolTable symbolTable;
8686
private final GenerateLinkerComponentsPass.VariantKindStore variantKindStore;
87-
private final IdentityHashMap<Instruction, LlvmLoweringRecord> machineInstructionRecords;
87+
private final IdentityHashMap<Instruction, LlvmLoweringRecord.Machine> machineInstructionRecords;
8888

8989

9090
/**
@@ -100,7 +100,7 @@ public PseudoExpansionCodeGenerator(TargetName targetName,
100100
variantKindStore,
101101
PseudoInstruction pseudoInstruction,
102102
Function function,
103-
IdentityHashMap<Instruction, LlvmLoweringRecord>
103+
IdentityHashMap<Instruction, LlvmLoweringRecord.Machine>
104104
machineInstructionRecords) {
105105
super(function);
106106
this.targetName = targetName;

vadl/main/vadl/lcb/passes/llvmLowering/LlvmLoweringPass.java

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import vadl.lcb.codegen.model.llvm.ValueType;
3838
import vadl.lcb.passes.TableGenInstructionCtx;
3939
import vadl.lcb.passes.isaMatching.IsaPseudoInstructionMatchingPass;
40-
import vadl.lcb.passes.llvmLowering.domain.LlvmLoweringPseudoRecord;
4140
import vadl.lcb.passes.llvmLowering.domain.LlvmLoweringRecord;
4241
import vadl.lcb.passes.llvmLowering.domain.RegisterRef;
4342
import vadl.lcb.passes.llvmLowering.domain.machineDag.LcbMachineInstructionNode;
@@ -241,8 +240,8 @@ public static Flags withIsAsCheapAsMove(Flags flags) {
241240
* tablegen records for machine instructions and pseudo instructions.
242241
*/
243242
public record LlvmLoweringPassResult(
244-
IdentityHashMap<Instruction, LlvmLoweringRecord> machineInstructionRecords,
245-
IdentityHashMap<PseudoInstruction, LlvmLoweringPseudoRecord> pseudoInstructionRecords) {
243+
IdentityHashMap<Instruction, LlvmLoweringRecord.Machine> machineInstructionRecords,
244+
IdentityHashMap<PseudoInstruction, LlvmLoweringRecord.Pseudo> pseudoInstructionRecords) {
246245

247246
}
248247

@@ -264,7 +263,7 @@ public Object execute(PassResults passResults, Specification viam) throws IOExce
264263
() -> Diagnostic.error("Cannot find semantics of the instructions", viam.sourceLocation()));
265264
var fieldUsages = (IdentifyFieldUsagePass.ImmediateDetectionContainer) passResults.lastResultOf(
266265
IdentifyFieldUsagePass.class);
267-
var abi = (Abi) viam.definitions().filter(x -> x instanceof Abi).findFirst().get();
266+
var abi = (Abi) viam.definitions().filter(x -> x instanceof Abi).findFirst().orElseThrow();
268267

269268
var architectureType =
270269
ensurePresent(ValueType.from(abi.stackPointer().registerFile().resultType()),
@@ -288,7 +287,7 @@ public Object execute(PassResults passResults, Specification viam) throws IOExce
288287
List.of(new LlvmPseudoInstructionLoweringUnconditionalJumpsStrategyImpl(machineStrategies),
289288
new LlvmPseudoInstructionLoweringDefaultStrategyImpl(machineStrategies));
290289

291-
var machineRecords = generateRecordsForMachineInstructions(viam, abi, machineStrategies,
290+
var machineRecords = machineInstructions(viam, abi, machineStrategies,
292291
labelingResult);
293292
var pseudoRecords = pseudoInstructions(machineRecords, viam, fieldUsages, abi,
294293
pseudoStrategies, labelingResult, labelingResultPseudo);
@@ -297,11 +296,11 @@ public Object execute(PassResults passResults, Specification viam) throws IOExce
297296
}
298297

299298

300-
private IdentityHashMap<Instruction, LlvmLoweringRecord> generateRecordsForMachineInstructions(
299+
private IdentityHashMap<Instruction, LlvmLoweringRecord.Machine> machineInstructions(
301300
Specification viam, Abi abi,
302301
List<LlvmInstructionLoweringStrategy> strategies,
303302
IsaMachineInstructionMatchingPass.Result labelledMachineInstructions) {
304-
var tableGenRecords = new IdentityHashMap<Instruction, LlvmLoweringRecord>();
303+
var tableGenRecords = new IdentityHashMap<Instruction, LlvmLoweringRecord.Machine>();
305304

306305
viam.isa().map(isa -> isa.ownInstructions().stream()).orElseGet(Stream::empty)
307306
.forEach(instruction -> {
@@ -337,16 +336,16 @@ var record =
337336
return tableGenRecords;
338337
}
339338

340-
private IdentityHashMap<PseudoInstruction, LlvmLoweringPseudoRecord> pseudoInstructions(
341-
IdentityHashMap<Instruction, LlvmLoweringRecord> machineRecords,
339+
private IdentityHashMap<PseudoInstruction, LlvmLoweringRecord.Pseudo> pseudoInstructions(
340+
IdentityHashMap<Instruction, LlvmLoweringRecord.Machine> machineRecords,
342341
Specification viam,
343342
IdentifyFieldUsagePass.ImmediateDetectionContainer fieldUsages,
344343
Abi abi,
345344
List<LlvmPseudoInstructionLowerStrategy> pseudoStrategies,
346345
IsaMachineInstructionMatchingPass.Result labelledMachineInstructions,
347346
IsaPseudoInstructionMatchingPass.Result labelledPseudoInstructions
348347
) {
349-
var tableGenRecords = new IdentityHashMap<PseudoInstruction, LlvmLoweringPseudoRecord>();
348+
var tableGenRecords = new IdentityHashMap<PseudoInstruction, LlvmLoweringRecord.Pseudo>();
350349

351350
viam.isa().map(isa -> isa.ownPseudoInstructions().stream()).orElseGet(Stream::empty)
352351
.forEach(pseudo -> {
@@ -372,7 +371,7 @@ var record =
372371
}
373372

374373
private @Nonnull List<TableGenInstAlias> instAliases(
375-
IdentityHashMap<Instruction, LlvmLoweringRecord> machineRecords,
374+
IdentityHashMap<Instruction, LlvmLoweringRecord.Machine> machineRecords,
376375
IdentifyFieldUsagePass.ImmediateDetectionContainer fieldUsages,
377376
PseudoInstruction pseudo) {
378377
if (pseudo.behavior().getNodes(InstrCallNode.class).toList().size() != 1) {
@@ -388,14 +387,13 @@ var record =
388387
graph.addWithInputs(
389388
new LcbMachineInstructionNode(new NodeList<>(args), instruction.target()));
390389

391-
var instAliases = List.of(
390+
return List.of(
392391
new TableGenInstAlias(
393392
pseudo,
394393
pseudo.assembly(),
395394
graph
396395
)
397396
);
398-
return instAliases;
399397
}
400398

401399
private List<ExpressionNode> getArgsForInstAlias(
@@ -404,8 +402,8 @@ private List<ExpressionNode> getArgsForInstAlias(
404402
InstrCallNode instruction) {
405403
var args = new ArrayList<ExpressionNode>();
406404

407-
for (int i = 0; i < instruction.arguments().size(); i++) {
408-
var field = instruction.getParamFields().get(i);
405+
for (int i = 0; i < machineRecord.info().outputInputOperandsFormatFields().size(); i++) {
406+
var field = machineRecord.info().outputInputOperandsFormatFields().get(i);
409407
var argument = instruction.getArgument(field);
410408
var fieldUsageMap = fieldUsages.getFieldUsages(instruction.target());
411409

vadl/main/vadl/lcb/passes/llvmLowering/domain/LlvmLoweringPseudoRecord.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

vadl/main/vadl/lcb/passes/llvmLowering/domain/LlvmLoweringRecord.java

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,24 @@
1919

2020
import java.util.List;
2121
import vadl.lcb.passes.llvmLowering.LlvmLoweringPass;
22+
import vadl.lcb.passes.llvmLowering.tablegen.model.TableGenInstAlias;
2223
import vadl.lcb.passes.llvmLowering.tablegen.model.TableGenPattern;
24+
import vadl.viam.Instruction;
25+
import vadl.viam.PseudoInstruction;
2326

2427
/**
2528
* Contains information for the lowering of instructions.
2629
*/
27-
public class LlvmLoweringRecord {
30+
public abstract class LlvmLoweringRecord {
2831
private final LlvmLoweringPass.BaseInstructionInfo info;
2932
private final List<TableGenPattern> patterns;
3033

3134
/**
3235
* Constructor.
3336
*/
34-
public LlvmLoweringRecord(LlvmLoweringPass.BaseInstructionInfo info,
35-
List<TableGenPattern> patterns) {
37+
public LlvmLoweringRecord(
38+
LlvmLoweringPass.BaseInstructionInfo info,
39+
List<TableGenPattern> patterns) {
3640
this.info = info;
3741
this.patterns = patterns;
3842
}
@@ -44,4 +48,48 @@ public List<TableGenPattern> patterns() {
4448
public LlvmLoweringPass.BaseInstructionInfo info() {
4549
return info;
4650
}
51+
52+
/**
53+
* Represents a {@link LlvmLoweringRecord} for {@link Instruction}.
54+
*/
55+
public static class Machine extends LlvmLoweringRecord {
56+
private final Instruction instructionRef;
57+
58+
/**
59+
* Constructor.
60+
*/
61+
public Machine(Instruction instructionRef, LlvmLoweringPass.BaseInstructionInfo info,
62+
List<TableGenPattern> patterns) {
63+
super(info, patterns);
64+
this.instructionRef = instructionRef;
65+
}
66+
67+
68+
public Instruction instruction() {
69+
return instructionRef;
70+
}
71+
}
72+
73+
/**
74+
* Represents a {@link LlvmLoweringRecord} for {@link PseudoInstruction}.
75+
*/
76+
public static class Pseudo extends LlvmLoweringRecord {
77+
private final List<TableGenInstAlias> instAliases;
78+
79+
/**
80+
* Constructor.
81+
*/
82+
public Pseudo(LlvmLoweringPass.BaseInstructionInfo info,
83+
List<TableGenPattern> patterns,
84+
List<TableGenInstAlias> instAliases
85+
) {
86+
super(info, patterns);
87+
this.instAliases = instAliases;
88+
}
89+
90+
public List<TableGenInstAlias> instAliases() {
91+
return instAliases;
92+
}
93+
94+
}
4795
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public LlvmLoweringPass.BaseInstructionInfo lowerBaseInfo(Graph behavior) {
285285
* Generate a lowering result for the given {@link Graph} for pseudo instructions.
286286
* If it is not lowerable then return {@link Optional#empty()}.
287287
*/
288-
public Optional<LlvmLoweringRecord> lowerInstruction(
288+
public Optional<LlvmLoweringRecord.Machine> lowerInstruction(
289289
IsaMachineInstructionMatchingPass.Result labelledMachineInstructions,
290290
Instruction instruction,
291291
Graph unmodifiedBehavior,
@@ -340,12 +340,14 @@ public Optional<LlvmLoweringRecord> lowerInstruction(
340340
info.outputs(),
341341
patterns,
342342
abi);
343-
return Optional.of(new LlvmLoweringRecord(
343+
return Optional.of(new LlvmLoweringRecord.Machine(
344+
instruction,
344345
info,
345346
Stream.concat(patterns.stream(), alternativePatterns.stream()).toList()
346347
));
347348
} else {
348-
return Optional.of(new LlvmLoweringRecord(
349+
return Optional.of(new LlvmLoweringRecord.Machine(
350+
instruction,
349351
info,
350352
Collections.emptyList()
351353
));

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import vadl.gcb.passes.PseudoInstructionLabel;
3333
import vadl.gcb.passes.pseudo.PseudoFuncParamNode;
3434
import vadl.lcb.passes.llvmLowering.LlvmLoweringPass;
35-
import vadl.lcb.passes.llvmLowering.domain.LlvmLoweringPseudoRecord;
3635
import vadl.lcb.passes.llvmLowering.domain.LlvmLoweringRecord;
3736
import vadl.lcb.passes.llvmLowering.domain.RegisterRef;
3837
import vadl.lcb.passes.llvmLowering.domain.machineDag.LcbMachineInstructionNode;
@@ -90,9 +89,9 @@ public boolean isApplicable(@Nullable PseudoInstructionLabel pseudoInstructionLa
9089
}
9190

9291
/**
93-
* Lower a {@link PseudoInstruction} into a {@link LlvmLoweringPseudoRecord}.
92+
* Lower a {@link PseudoInstruction} into a {@link LlvmLoweringRecord.Pseudo}.
9493
*/
95-
public Optional<LlvmLoweringPseudoRecord> lowerInstruction(
94+
public Optional<LlvmLoweringRecord.Pseudo> lowerInstruction(
9695
Abi abi,
9796
List<TableGenInstAlias> instAliases,
9897
PseudoInstruction pseudo,
@@ -257,7 +256,7 @@ pseudo instruction MOV( rd : Index, rs1 : Index ) =
257256
dedup(defs)
258257
);
259258

260-
return Optional.of(new LlvmLoweringPseudoRecord(
259+
return Optional.of(new LlvmLoweringRecord.Pseudo(
261260
info,
262261
patterns,
263262
instAliases

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected Set<MachineInstructionLabel> getSupportedInstructionLabels() {
8484
}
8585

8686
@Override
87-
public Optional<LlvmLoweringRecord> lowerInstruction(
87+
public Optional<LlvmLoweringRecord.Machine> lowerInstruction(
8888
IsaMachineInstructionMatchingPass.Result labelledMachineInstructions,
8989
Instruction instruction,
9090
Graph uninlinedBehavior,
@@ -101,7 +101,7 @@ public Optional<LlvmLoweringRecord> lowerInstruction(
101101
createIntermediateResult(labelledMachineInstructions, instruction, copy, abi));
102102
}
103103

104-
private LlvmLoweringRecord createIntermediateResult(
104+
private LlvmLoweringRecord.Machine createIntermediateResult(
105105
IsaMachineInstructionMatchingPass.Result supportedInstructions,
106106
Instruction instruction,
107107
Graph visitedGraph,
@@ -123,7 +123,8 @@ private LlvmLoweringRecord createIntermediateResult(
123123
.map(LoweringStrategyUtils::replaceBasicBlockByLabelImmediateInMachineInstruction)
124124
.toList();
125125

126-
return new LlvmLoweringRecord(
126+
return new LlvmLoweringRecord.Machine(
127+
instruction,
127128
info,
128129
allPatterns
129130
);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ protected Set<MachineInstructionLabel> getSupportedInstructionLabels() {
7474
}
7575

7676
@Override
77-
public Optional<LlvmLoweringRecord> lowerInstruction(
77+
public Optional<LlvmLoweringRecord.Machine> lowerInstruction(
7878
IsaMachineInstructionMatchingPass.Result labelledMachineInstructions,
7979
Instruction instruction,
8080
Graph unmodifiedBehavior,
@@ -94,7 +94,8 @@ public Optional<LlvmLoweringRecord> lowerInstruction(
9494
var patterns = generatePatterns(instruction,
9595
inputOperands,
9696
copy.getNodes(WriteResourceNode.class).toList());
97-
return Optional.of(new LlvmLoweringRecord(
97+
return Optional.of(new LlvmLoweringRecord.Machine(
98+
instruction,
9899
new LlvmLoweringPass.BaseInstructionInfo(inputOperands,
99100
info.outputs(),
100101
info.flags(),

0 commit comments

Comments
 (0)