[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