aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-08 18:58:22 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-08 19:07:06 +0100
commit870cbd63018d9e253c476ebe0692fd3c27d9a1d3 (patch)
tree5e276438bce1f59059363fdfe48ca1ac7399c949
parent634a91a27700a139d714501a27021a1db732c966 (diff)
Add insertvalue instruction to LLVM IR
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java17
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInsertValue.java17
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java2
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java19
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java11
5 files changed, 65 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 b2f3f7b6..4508f90b 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
@@ -110,6 +110,23 @@ public class LlvmIrSerializer {
writer.append(", ");
serializeOperand(icmp.right(), writer);
}
+
+ case LlvmInsertValue insertValue -> {
+ serializeVariable(insertValue.destination(), writer);
+ writer.append(" = insertvalue ");
+ serializeType(insertValue.aggregateType(), writer);
+ writer.append(" ");
+ serializeOperand(insertValue.aggregate(), writer);
+ writer.append(", ");
+ serializeType(insertValue.elementType(), writer);
+ writer.append(" ");
+ serializeOperand(insertValue.element(), writer);
+ for (var index : insertValue.indexes()) {
+ writer.append(", ");
+ writer.append(index.toString());
+ }
+ }
+
case LlvmIntToPtr intToPtr -> {
serializeVariable(intToPtr.destination(), writer);
writer.append(" = inttoptr ");
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInsertValue.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInsertValue.java
new file mode 100644
index 00000000..a8ef2b8e
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInsertValue.java
@@ -0,0 +1,17 @@
+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.LlvmVariable;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
+
+import java.util.List;
+
+public record LlvmInsertValue(
+ LlvmVariable destination,
+ LlvmType aggregateType,
+ LlvmOperand aggregate,
+ LlvmType elementType,
+ LlvmOperand element,
+ List<Integer> indexes
+) implements LlvmInstruction {
+}
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 a8467bf9..e38e49e7 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, LlvmAlloca, LlvmCall, LlvmExtractValue, LlvmGetElementPtr, LlvmIcmp, LlvmIntToPtr, LlvmLoad, LlvmPhi, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmTrunc, LlvmZext {
+public sealed interface LlvmInstruction permits LlvmAdd, LlvmAlloca, LlvmCall, LlvmExtractValue, LlvmGetElementPtr, LlvmIcmp, LlvmInsertValue, LlvmIntToPtr, LlvmLoad, LlvmPhi, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmTrunc, LlvmZext {
}
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 6c0123e0..9fc59d0b 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
@@ -160,6 +160,25 @@ public class LlvmIrSerializerInstructionTests {
}
@Test
+ public void insertValueIsSerialized() throws IOException {
+ var instruction = LlvmIr.insertValue(
+ LlvmIr.variableLocal("x"),
+ LlvmTypes.array(
+ 10,
+ LlvmTypes.structure(List.of(LlvmTypes.INT_64, LlvmTypes.INT_32))
+ ),
+ LlvmIr.variableLocal("y"),
+ LlvmTypes.INT_32,
+ LlvmIr.operandInt(42),
+ List.of(3, 1)
+ );
+
+ var result = serializeToString(instruction, LlvmIrSerializer::serializeInstruction);
+
+ assertThat(result, equalTo("%x = insertvalue [10 x {i64, i32}] %y, i32 42, 3, 1"));
+ }
+
+ @Test
public void intToPtrIsSerialized() throws IOException {
var instruction = LlvmIr.intToPtr(
LlvmIr.variableLocal("x"),
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 7e771717..08a5b706 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
@@ -102,6 +102,17 @@ public class LlvmIr {
return new LlvmIcmp(destination, conditionCode, type, left, right);
}
+ public static LlvmInsertValue insertValue(
+ LlvmVariable destination,
+ LlvmType aggregateType,
+ LlvmOperand aggregate,
+ LlvmType elementType,
+ LlvmOperand element,
+ List<Integer> indexes
+ ) {
+ return new LlvmInsertValue(destination, aggregateType, aggregate, elementType, element, indexes);
+ }
+
public static LlvmIntToPtr intToPtr(
LlvmVariable destination,
LlvmTypeScalar sourceType,