diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-08-28 15:18:46 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-08-28 15:18:46 +0100 |
| commit | 816a0931f0fa858279939f9ad1b35b2dbeba941a (patch) | |
| tree | 071813f69177573a041600e02c6bfe4f13631a6d /src/main/java | |
| parent | 11d6ee8d4eeba3f73414a2325d7bd8bfd7ac6a11 (diff) | |
Tidy up LLVM labels for branches
Diffstat (limited to 'src/main/java')
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 ) ) )); |
