[llvm-branch-commits] [llvm] [LLVM-C] Add LLVMBuildByteCast (PR #221886)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Sep 7 23:05:27 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Anshil Gandhi (gandhi56)

<details>
<summary>Changes</summary>

## Summary
- Add `LLVMBuildByteCast` C API builder mirroring `LLVMBuildBitCast`.
- Teach `llvm-c-test --echo` to clone `bytecast` instructions via the new builder.
- Add `llvm/test/Bindings/llvm-c/bytecast.ll` round-trip coverage.

## Test plan
- [x] `ninja check-llvm` passes on this branch
- [x] `llvm/test/Bindings/llvm-c/bytecast.ll` passes

Depends on #<!-- -->221884


Made with [Cursor](https://cursor.com)

---
Full diff: https://github.com/llvm/llvm-project/pull/221886.diff


4 Files Affected:

- (modified) llvm/include/llvm-c/Core.h (+2) 
- (modified) llvm/lib/IR/Core.cpp (+6) 
- (added) llvm/test/Bindings/llvm-c/bytecast.ll (+53) 
- (modified) llvm/tools/llvm-c-test/echo.cpp (+5) 


``````````diff
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);

``````````

</details>


https://github.com/llvm/llvm-project/pull/221886


More information about the llvm-branch-commits mailing list