aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-14 23:44:11 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-14 23:44:11 +0100
commitefa34e180428f0161c49cef814aacadbe3e1166d (patch)
treea591edbc1ef11fb2603426aa8111a67bf01a98d6 /src/main/java
parent7e18cdc5a90b2d713af44ee6720bea947988345c (diff)
Add LLVM phi instructions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java16
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhi.java13
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhiPair.java10
4 files changed, 40 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
index 1c53beac..033dd062 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
@@ -105,6 +105,22 @@ public class LlvmIrSerializer {
writer.append(", ptr ");
serializeOperand(load.pointer(), writer);
}
+ case LlvmPhi phi -> {
+ serializeVariable(phi.target(), writer);
+ writer.append(" = phi ");
+ serializeType(phi.type(), writer);
+ forEachInterspersed(
+ phi.pairs(),
+ phiPair -> {
+ writer.append(" [ ");
+ serializeOperand(phiPair.value(), writer);
+ writer.append(", ");
+ serializeVariable(phiPair.predecessorBasicBlockName(), writer);
+ writer.append(" ]");
+ },
+ () -> writer.append(",")
+ );
+ }
case LlvmPtrToInt ptrToInt -> {
serializeVariable(ptrToInt.target(), writer);
writer.append(" = ptrtoint ptr ");
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
index 2d49464d..9f55361c 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
-public sealed interface LlvmInstruction permits LlvmAdd, LlvmCall, LlvmGetElementPtr, LlvmIcmp, LlvmIntToPtr, LlvmLoad, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmTrunc, LlvmZext {
+public sealed interface LlvmInstruction permits LlvmAdd, LlvmCall, LlvmGetElementPtr, LlvmIcmp, LlvmIntToPtr, LlvmLoad, LlvmPhi, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmTrunc, LlvmZext {
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhi.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhi.java
new file mode 100644
index 00000000..c66f7308
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhi.java
@@ -0,0 +1,13 @@
+package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
+
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariable;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
+
+import java.util.List;
+
+public record LlvmPhi(
+ LlvmVariable target,
+ LlvmType type,
+ List<LlvmPhiPair> pairs
+) implements LlvmInstruction {
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhiPair.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhiPair.java
new file mode 100644
index 00000000..90ab0c70
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmPhiPair.java
@@ -0,0 +1,10 @@
+package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
+
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal;
+
+public record LlvmPhiPair(
+ LlvmOperand value,
+ LlvmVariableLocal predecessorBasicBlockName
+) {
+}