[llvm] [llubi] Fix ptrtoint's return type (PR #212839)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 29 11:46:05 PDT 2026


https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/212839

>From c851c0e0362bc2820b977e8c86dec25fe8c6284e Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 30 Jul 2026 02:24:58 +0800
Subject: [PATCH 1/2] [llubi] Fix ptrtoint's return type

---
 llvm/test/tools/llubi/ptrtoint_cast.ll | 24 ++++++++++++++++++++++++
 llvm/tools/llubi/lib/Context.cpp       |  6 +++---
 llvm/tools/llubi/lib/Interpreter.cpp   |  3 ++-
 3 files changed, 29 insertions(+), 4 deletions(-)
 create mode 100644 llvm/test/tools/llubi/ptrtoint_cast.ll

diff --git a/llvm/test/tools/llubi/ptrtoint_cast.ll b/llvm/test/tools/llubi/ptrtoint_cast.ll
new file mode 100644
index 0000000000000..5aa2c1211acb6
--- /dev/null
+++ b/llvm/test/tools/llubi/ptrtoint_cast.ll
@@ -0,0 +1,24 @@
+; NOTE: Assertions have been autogenerated by utils/update_llubi_test_checks.py UTC_ARGS: --version 6
+; RUN: llubi --verbose < %s 2>&1 | FileCheck %s
+
+target datalayout = "p:64:64:64"
+
+define void @main() {
+entry:
+  %ptr = inttoptr i64 -1 to ptr
+  %ptr_to_int_trunc = ptrtoint ptr %ptr to i8
+  %ptr_to_int_zext = ptrtoint ptr %ptr to i128
+  %ptr_to_int_constant_trunc = add i8 ptrtoint (ptr inttoptr (i64 -1 to ptr) to i8), 0
+  %ptr_to_int_constant_zext = add i128 ptrtoint (ptr inttoptr (i64 -1 to ptr) to i128), 0
+  %ptr_to_int_constant_zext_vec = add <2 x i128> splat(i128 ptrtoint (ptr inttoptr (i64 -1 to ptr) to i128)), zeroinitializer
+  ret void
+}
+; CHECK: Entering function: main
+; CHECK-NEXT:   %ptr = inttoptr i64 -1 to ptr => ptr 0xFFFFFFFFFFFFFFFF [nullary]
+; CHECK-NEXT:   %ptr_to_int_trunc = ptrtoint ptr %ptr to i8 => i8 -1
+; CHECK-NEXT:   %ptr_to_int_zext = ptrtoint ptr %ptr to i128 => i128 18446744073709551615
+; CHECK-NEXT:   %ptr_to_int_constant_trunc = add i8 ptrtoint (ptr inttoptr (i64 -1 to ptr) to i8), 0 => i8 -1
+; CHECK-NEXT:   %ptr_to_int_constant_zext = add i128 ptrtoint (ptr inttoptr (i64 -1 to ptr) to i128), 0 => i128 18446744073709551615
+; CHECK-NEXT:   %ptr_to_int_constant_zext_vec = add <2 x i128> <i128 ptrtoint (ptr inttoptr (i64 -1 to ptr) to i128), i128 ptrtoint (ptr inttoptr (i64 -1 to ptr) to i128)>, zeroinitializer => { i128 18446744073709551615, i128 18446744073709551615 }
+; CHECK-NEXT:   ret void
+; CHECK-NEXT: Exiting function: main
diff --git a/llvm/tools/llubi/lib/Context.cpp b/llvm/tools/llubi/lib/Context.cpp
index 9ff8f86af36a2..5055b8d1af462 100644
--- a/llvm/tools/llubi/lib/Context.cpp
+++ b/llvm/tools/llubi/lib/Context.cpp
@@ -312,15 +312,15 @@ MaterializedConstant Context::evaluateConstantExpression(ConstantExpr *CE) {
     if (Src->isPointer()) {
       if (Opc == Instruction::PtrToInt)
         exposeProvenance(Src->asPointer().provenance());
-      return MaterializedConstant(Src->asPointer().address().trunc(BitWidth),
-                                  Cacheable);
+      return MaterializedConstant(
+          Src->asPointer().address().zextOrTrunc(BitWidth), Cacheable);
     }
     std::vector<AnyValue> Vec = Src->asAggregate();
     for (auto &V : Vec) {
       if (V.isPointer()) {
         if (Opc == Instruction::PtrToInt)
           exposeProvenance(V.asPointer().provenance());
-        V = V.asPointer().address().trunc(BitWidth);
+        V = V.asPointer().address().zextOrTrunc(BitWidth);
       }
     }
     return MaterializedConstant(std::move(Vec), Cacheable);
diff --git a/llvm/tools/llubi/lib/Interpreter.cpp b/llvm/tools/llubi/lib/Interpreter.cpp
index 52908a4a8c035..3477b97c330fe 100644
--- a/llvm/tools/llubi/lib/Interpreter.cpp
+++ b/llvm/tools/llubi/lib/Interpreter.cpp
@@ -2674,11 +2674,12 @@ class InstExecutor : public InstVisitor<InstExecutor, void>,
   }
 
   void visitPtrToInt(PtrToIntInst &I) {
+    unsigned BitWidth = I.getType()->getScalarSizeInBits();
     return visitUnOp(I, [&](const AnyValue &V) -> AnyValue {
       if (V.isPoison())
         return AnyValue::poison();
       Ctx.exposeProvenance(V.asPointer().provenance());
-      return V.asPointer().address();
+      return V.asPointer().address().zextOrTrunc(BitWidth);
     });
   }
 

>From c453b4ae8fbc04253b7619ccb4b3870718ba5f84 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 30 Jul 2026 02:45:26 +0800
Subject: [PATCH 2/2] [llubi] Use explict capture list. NFC.

---
 llvm/tools/llubi/lib/Interpreter.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/tools/llubi/lib/Interpreter.cpp b/llvm/tools/llubi/lib/Interpreter.cpp
index 3477b97c330fe..aa2d903bfb5f1 100644
--- a/llvm/tools/llubi/lib/Interpreter.cpp
+++ b/llvm/tools/llubi/lib/Interpreter.cpp
@@ -2675,7 +2675,7 @@ class InstExecutor : public InstVisitor<InstExecutor, void>,
 
   void visitPtrToInt(PtrToIntInst &I) {
     unsigned BitWidth = I.getType()->getScalarSizeInBits();
-    return visitUnOp(I, [&](const AnyValue &V) -> AnyValue {
+    return visitUnOp(I, [this, BitWidth](const AnyValue &V) -> AnyValue {
       if (V.isPoison())
         return AnyValue::poison();
       Ctx.exposeProvenance(V.asPointer().provenance());



More information about the llvm-commits mailing list