[llvm-branch-commits] [llvm] [LLVM-C] Add LLVMBuildByteCast (PR #221886)
Anshil Gandhi via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Sep 7 23:05:39 PDT 2026
https://github.com/gandhi56 updated https://github.com/llvm/llvm-project/pull/221886
>From 9edc5387637c3e9dd675f7ed2bbed665e72a2579 Mon Sep 17 00:00:00 2001
From: Anshil Gandhi <Anshil.Gandhi at amd.com>
Date: Mon, 7 Sep 2026 08:10:16 -0500
Subject: [PATCH] [LLVM-C] Add LLVMBuildByteCast
Expose a C API builder for the bytecast instruction, mirroring the existing
LLVMBuildBitCast entry point, and teach llvm-c-test --echo to clone bytecast
so the new entry point is exercised by a round-trip test.
Co-authored-by: Cursor <cursoragent at cursor.com>
---
llvm/include/llvm-c/Core.h | 2 +
llvm/lib/IR/Core.cpp | 6 +++
llvm/test/Bindings/llvm-c/bytecast.ll | 53 +++++++++++++++++++++++++++
llvm/tools/llvm-c-test/echo.cpp | 5 +++
4 files changed, 66 insertions(+)
create mode 100644 llvm/test/Bindings/llvm-c/bytecast.ll
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index f4431536dc481..f7e721cc64197 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -5063,6 +5063,8 @@ LLVM_C_ABI LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
LLVMTypeRef DestTy, const char *Name);
LLVM_C_ABI LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
LLVMTypeRef DestTy, const char *Name);
+LLVM_C_ABI LLVMValueRef LLVMBuildByteCast(LLVMBuilderRef, LLVMValueRef Val,
+ LLVMTypeRef DestTy, const char *Name);
LLVM_C_ABI LLVMValueRef LLVMBuildAddrSpaceCast(LLVMBuilderRef, LLVMValueRef Val,
LLVMTypeRef DestTy,
const char *Name);
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index d1ee8411e392c..a2b9067ddafe8 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -4358,6 +4358,12 @@ LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
}
+LLVMValueRef LLVMBuildByteCast(LLVMBuilderRef B, LLVMValueRef Val,
+ LLVMTypeRef DestTy, const char *Name) {
+ return wrap(unwrap(B)->CreateCast(Instruction::ByteCast, unwrap(Val),
+ unwrap(DestTy), Name));
+}
+
LLVMValueRef LLVMBuildAddrSpaceCast(LLVMBuilderRef B, LLVMValueRef Val,
LLVMTypeRef DestTy, const char *Name) {
return wrap(unwrap(B)->CreateAddrSpaceCast(unwrap(Val), unwrap(DestTy), Name));
diff --git a/llvm/test/Bindings/llvm-c/bytecast.ll b/llvm/test/Bindings/llvm-c/bytecast.ll
new file mode 100644
index 0000000000000..7552722ea94b7
--- /dev/null
+++ b/llvm/test/Bindings/llvm-c/bytecast.ll
@@ -0,0 +1,53 @@
+; RUN: llvm-as < %s | llvm-dis > %t.orig
+; RUN: llvm-as < %s | llvm-c-test --echo > %t.echo
+; RUN: diff -w %t.orig %t.echo
+
+define b64 @int_to_byte(i64 %i) {
+ %b = bytecast i64 %i to b64
+ ret b64 %b
+}
+
+define i64 @byte_to_int(b64 %b) {
+ %i = bytecast b64 %b to i64
+ ret i64 %i
+}
+
+define double @byte_to_fp(b64 %b) {
+ %d = bytecast b64 %b to double
+ ret double %d
+}
+
+define b64 @fp_to_byte(double %d) {
+ %b = bytecast double %d to b64
+ ret b64 %b
+}
+
+define ptr @byte_to_ptr(b64 %b) {
+ %p = bytecast b64 %b to ptr
+ ret ptr %p
+}
+
+define b64 @ptr_to_byte(ptr %p) {
+ %b = bytecast ptr %p to b64
+ ret b64 %b
+}
+
+define ptr addrspace(1) @byte_to_ptr_as1(b64 %b) {
+ %p = bytecast b64 %b to ptr addrspace(1)
+ ret ptr addrspace(1) %p
+}
+
+define <4 x i8> @byte_vector_to_int_vector(<4 x b8> %b) {
+ %i = bytecast <4 x b8> %b to <4 x i8>
+ ret <4 x i8> %i
+}
+
+define i64 @byte_vector_to_scalar(<2 x b32> %b) {
+ %i = bytecast <2 x b32> %b to i64
+ ret i64 %i
+}
+
+define <2 x b32> @scalar_to_byte_vector(i64 %i) {
+ %b = bytecast i64 %i to <2 x b32>
+ ret <2 x b32> %b
+}
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp
index 1574d0ffe84cc..3b5c800206d37 100644
--- a/llvm/tools/llvm-c-test/echo.cpp
+++ b/llvm/tools/llvm-c-test/echo.cpp
@@ -814,6 +814,11 @@ struct FunCloner {
Dst = LLVMBuildBitCast(Builder, V, CloneType(Src), Name);
break;
}
+ case LLVMByteCast: {
+ LLVMValueRef V = CloneValue(LLVMGetOperand(Src, 0));
+ Dst = LLVMBuildByteCast(Builder, V, CloneType(Src), Name);
+ break;
+ }
case LLVMICmp: {
LLVMIntPredicate Pred = LLVMGetICmpPredicate(Src);
LLVMBool IsSameSign = LLVMGetICmpSameSign(Src);
More information about the llvm-branch-commits
mailing list