aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-08 16:49:03 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-08 16:49:03 +0100
commitebf5f513c8305ae37d03d990fb24e5b7a6623244 (patch)
treeca6870038c420a6552618747a917973e2e49c344 /src/main/java
parent2e491ca13d1035e10f4c5ed51af3d5246596820d (diff)
Support Patio switch with reachable default in LLVM code gen
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java3
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java36
2 files changed, 22 insertions, 17 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
index 989c657f..fb65ffb8 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
@@ -27,7 +27,8 @@ public enum LlvmCodeGenLocalVariableSpace {
SIZE("size"),
SWITCH_CASE_START("switchCaseStart"),
SWITCH_CASE_END("switchCaseEnd"),
- SWITCH_DEFAULT("switchDefault"),
+ SWITCH_DEFAULT_START("switchDefaultStart"),
+ SWITCH_DEFAULT_END("switchDefaultEnd"),
SWITCH_END("switchEnd"),
TEMPORARY("tmp");
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
index fce77ab8..e431a851 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -300,8 +300,8 @@ public class LlvmPatioCodeGen {
context = generateBranches(
patioIf.targets(),
List.of(
- new Branch(ifTrueStartLabel, Optional.of(ifTrueEndLabel), patioIf.trueBody()),
- new Branch(ifFalseStartLabel, Optional.of(ifFalseEndLabel), patioIf.falseBody())
+ new Branch(ifTrueStartLabel, ifTrueEndLabel, patioIf.trueBody()),
+ new Branch(ifFalseStartLabel, ifFalseEndLabel, patioIf.falseBody())
),
endLabel,
context
@@ -480,11 +480,17 @@ public class LlvmPatioCodeGen {
));
case PatioSwitch patioSwitch -> {
- var defaultLabelResult = context.allocateLocalName(
- LlvmCodeGenLocalVariableSpace.SWITCH_DEFAULT
+ var switchDefaultStartLabelResult = context.allocateLocalName(
+ LlvmCodeGenLocalVariableSpace.SWITCH_DEFAULT_START
);
- var switchDefaultLabel = defaultLabelResult.value();
- context = defaultLabelResult.context();
+ var switchDefaultStartLabel = switchDefaultStartLabelResult.value();
+ context = switchDefaultStartLabelResult.context();
+
+ var switchDefaultEndLabelResult = context.allocateLocalName(
+ LlvmCodeGenLocalVariableSpace.SWITCH_DEFAULT_END
+ );
+ var switchDefaultEndLabel = switchDefaultEndLabelResult.value();
+ context = switchDefaultEndLabelResult.context();
var switchEndLabelResult = context.allocateLocalName(
LlvmCodeGenLocalVariableSpace.SWITCH_END
@@ -511,7 +517,7 @@ public class LlvmPatioCodeGen {
branches.add(new Branch(
caseStartLabel,
- Optional.of(caseEndLabel),
+ caseEndLabel,
patioSwitchCase.body()
));
@@ -522,16 +528,15 @@ public class LlvmPatioCodeGen {
}
branches.add(new Branch(
- switchDefaultLabel,
- // TODO: handle defaults that don't terminate
- Optional.empty(),
+ switchDefaultStartLabel,
+ switchDefaultEndLabel,
patioSwitch.defaultBody()
));
context = context.addTerminatorInstruction(new LlvmSwitch(
LlvmTypes.INT_64,
patioOperandToLlvmOperand(patioSwitch.value(), context),
- switchDefaultLabel,
+ switchDefaultStartLabel,
llvmSwitchCases
));
@@ -587,7 +592,7 @@ public class LlvmPatioCodeGen {
record Branch(
LlvmVariableLocal startLabel,
- Optional<LlvmVariableLocal> endLabel,
+ LlvmVariableLocal endLabel,
PatioBlock body
) {}
@@ -607,17 +612,16 @@ public class LlvmPatioCodeGen {
.anyMatch(instruction -> instruction instanceof PatioUnreachable);
if (!endIsUnreachable) {
- var branchEndLabel = branch.endLabel.orElseThrow();
context = context.addTerminatorInstruction(new LlvmBrUnconditional(
- branchEndLabel
+ branch.endLabel
));
// TODO: only allow basic block label to be set with terminator instruction?
- context = context.setBasicBlockLabel(branchEndLabel.name());
+ context = context.setBasicBlockLabel(branch.endLabel.name());
context = context.addTerminatorInstruction(new LlvmBrUnconditional(
endLabel
));
- phiPredecessors.add(new PhiPredecessor(branch.body, branchEndLabel));
+ phiPredecessors.add(new PhiPredecessor(branch.body, branch.endLabel));
}
}