From efa34e180428f0161c49cef814aacadbe3e1166d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 14 Jul 2023 23:44:11 +0100 Subject: Add LLVM phi instructions --- .../llvm/ir/LlvmIrSerializerInstructionTests.java | 16 ++++++++++++++++ .../shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java | 15 +++++++++++++++ 2 files changed, 31 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java index eb55a95c..83bf54bb 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java @@ -156,6 +156,22 @@ public class LlvmIrSerializerInstructionTests { assertThat(result, equalTo("%target = load i64, ptr %source")); } + @Test + public void phiIsSerialized() throws IOException { + var instruction = LlvmIr.phi( + LlvmIr.variableLocal("target"), + LlvmTypes.INT_64, + List.of( + LlvmIr.phiPair(LlvmIr.variableLocal("x1"), LlvmIr.variableLocal("p1")), + LlvmIr.phiPair(LlvmIr.variableLocal("x2"), LlvmIr.variableLocal("p2")) + ) + ); + + var result = serializeToString(instruction, LlvmIrSerializer::serializeInstruction); + + assertThat(result, equalTo("%target = phi i64 [ %x1, %p1 ], [ %x2, %p2 ]")); + } + @Test public void ptrToIntIsSerialized() throws IOException { var instruction = LlvmIr.ptrToInt( diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java index 5d957365..8bd93a6f 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java @@ -134,6 +134,21 @@ public class LlvmIr { return new LlvmParam(type, name); } + public static LlvmPhi phi( + LlvmVariable target, + LlvmType type, + List pairs + ) { + return new LlvmPhi(target, type, pairs); + } + + public static LlvmPhiPair phiPair( + LlvmOperand value, + LlvmVariableLocal predecessorBasicBlockName + ) { + return new LlvmPhiPair(value, predecessorBasicBlockName); + } + public static LlvmPtrToInt ptrToInt( LlvmVariable target, LlvmOperand value, -- cgit v1.2.3