aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-08-28 15:18:46 +0100
committerMichael Williamson <mike@zwobble.org>2023-08-28 15:18:46 +0100
commit816a0931f0fa858279939f9ad1b35b2dbeba941a (patch)
tree071813f69177573a041600e02c6bfe4f13631a6d /src/main/java
parent11d6ee8d4eeba3f73414a2325d7bd8bfd7ac6a11 (diff)
Tidy up LLVM labels for branches
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java6
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java49
3 files changed, 37 insertions, 22 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
index 36898220..a0d04143 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
@@ -156,13 +156,13 @@ public class LlvmCodeGen {
context = condition1Result.context();
var ifTrueLabelResult = context.generateVariableLocal(
- LlvmCodeGenLocalVariableSpace.IF_TRUE
+ LlvmCodeGenLocalVariableSpace.IF_TRUE_START
);
var ifTrueLabel = ifTrueLabelResult.value();
context = ifTrueLabelResult.context();
var ifFalseLabelResult = context.generateVariableLocal(
- LlvmCodeGenLocalVariableSpace.IF_FALSE
+ LlvmCodeGenLocalVariableSpace.IF_FALSE_START
);
var ifFalseLabel = ifFalseLabelResult.value();
context = ifFalseLabelResult.context();
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 a8149228..ba5019c2 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
@@ -12,8 +12,10 @@ public enum LlvmCodeGenLocalVariableSpace {
FIELD("field"),
FIELD_POINTER("fieldPointer"),
IF_END("ifEnd"),
- IF_FALSE("ifFalse"),
- IF_TRUE("ifTrue"),
+ IF_FALSE_START("ifFalseStart"),
+ IF_FALSE_END("ifFalseEnd"),
+ IF_TRUE_START("ifTrueStart"),
+ IF_TRUE_END("ifTrueEnd"),
LOCAL("local"),
NAMESPACE("namespace"),
NAMESPACE_STRUCT_POINTER("namespaceStructPointer"),
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 ef8f8355..a9919af8 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -262,17 +262,29 @@ public class LlvmPatioCodeGen {
}
case PatioIf patioIf -> {
- var ifTrueLabelResult = context.allocateLocalName(
- LlvmCodeGenLocalVariableSpace.IF_TRUE
+ var ifTrueStartLabelResult = context.allocateLocalName(
+ LlvmCodeGenLocalVariableSpace.IF_TRUE_START
);
- var ifTrueLabel = ifTrueLabelResult.value();
- context = ifTrueLabelResult.context();
+ var ifTrueStartLabel = ifTrueStartLabelResult.value();
+ context = ifTrueStartLabelResult.context();
- var ifFalseLabelResult = context.allocateLocalName(
- LlvmCodeGenLocalVariableSpace.IF_FALSE
+ var ifTrueEndLabelResult = context.allocateLocalName(
+ LlvmCodeGenLocalVariableSpace.IF_TRUE_END
);
- var ifFalseLabel = ifFalseLabelResult.value();
- context = ifFalseLabelResult.context();
+ var ifTrueEndLabel = ifTrueEndLabelResult.value();
+ context = ifTrueEndLabelResult.context();
+
+ var ifFalseStartLabelResult = context.allocateLocalName(
+ LlvmCodeGenLocalVariableSpace.IF_FALSE_START
+ );
+ var ifFalseStartLabel = ifFalseStartLabelResult.value();
+ context = ifFalseStartLabelResult.context();
+
+ var ifFalseEndLabelResult = context.allocateLocalName(
+ LlvmCodeGenLocalVariableSpace.IF_FALSE_END
+ );
+ var ifFalseEndLabel = ifFalseEndLabelResult.value();
+ context = ifFalseEndLabelResult.context();
var endLabelResult = context.allocateLocalName(
LlvmCodeGenLocalVariableSpace.IF_END
@@ -282,20 +294,21 @@ public class LlvmPatioCodeGen {
context = context.addTerminatorInstruction(new LlvmBr(
patioOperandToLlvmOperand(patioIf.condition(), context),
- ifTrueLabel.name(),
- ifFalseLabel.name()
+ ifTrueStartLabel.name(),
+ ifFalseStartLabel.name()
));
- context = context.setBasicBlockLabel(ifTrueLabel.name());
+ context = context.setBasicBlockLabel(ifTrueStartLabel.name());
context = generateInstructions(patioIf.trueBody().body(), context);
- // TODO: remove this hack!
- var ifTrueEndLabel = context.basicBlockLabel.orElseThrow();
+ // TODO: only allow basic block label to be set with terminator instruction?
+ context = context.addTerminatorInstruction(new LlvmBrUnconditional(ifTrueEndLabel.name()));
+ context = context.setBasicBlockLabel(ifTrueEndLabel.name());
context = context.addTerminatorInstruction(new LlvmBrUnconditional(endLabel.name()));
- context = context.setBasicBlockLabel(ifFalseLabel.name());
+ context = context.setBasicBlockLabel(ifFalseStartLabel.name());
context = generateInstructions(patioIf.falseBody().body(), context);
- // TODO: remove this hack!
- var ifFalseEndLabel = context.basicBlockLabel.orElseThrow();
+ context = context.addTerminatorInstruction(new LlvmBrUnconditional(ifFalseEndLabel.name()));
+ context = context.setBasicBlockLabel(ifFalseEndLabel.name());
context = context.addTerminatorInstruction(new LlvmBrUnconditional(endLabel.name()));
context = context.setBasicBlockLabel(endLabel.name());
@@ -313,11 +326,11 @@ public class LlvmPatioCodeGen {
List.of(
new LlvmPhiPair(
patioOperandToLlvmOperand(patioIf.trueBody().results().get(targetIndex), context),
- new LlvmVariableLocal(ifTrueEndLabel)
+ ifTrueEndLabel
),
new LlvmPhiPair(
patioOperandToLlvmOperand(patioIf.falseBody().results().get(targetIndex), context),
- new LlvmVariableLocal(ifFalseEndLabel)
+ ifFalseEndLabel
)
)
));