[llvm] [ConstantFold] Fold inttoptr, ptrtoaddr to bitcast (PR #161087)
Hongyu Chen via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 28 10:00:37 PDT 2025
https://github.com/XChy updated https://github.com/llvm/llvm-project/pull/161087
>From 267d813a62c8a84a937afd9ec1de645f5048e999 Mon Sep 17 00:00:00 2001
From: XChy <xxs_chy at outlook.com>
Date: Sun, 28 Sep 2025 23:27:59 +0800
Subject: [PATCH 1/4] [ConstantFold] inttoptr, ptrtoaddr is valid cast pair
---
llvm/lib/IR/Instructions.cpp | 3 ++-
.../InstCombine/constant-expr-datalayout.ll | 14 ++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index daebf447a2107..fb47768974f2b 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -2847,6 +2847,7 @@ unsigned CastInst::isEliminableCastPair(
// FPTRUNC > FloatPt n/a FloatPt n/a
// FPEXT < FloatPt n/a FloatPt n/a
// PTRTOINT n/a Pointer n/a Integral Unsigned
+ // PTRTOADDR n/a Pointer n/a Integral Unsigned
// INTTOPTR n/a Integral Unsigned Pointer n/a
// BITCAST = FirstClass n/a FirstClass n/a
// ADDRSPCST n/a Pointer n/a Pointer n/a
@@ -2878,7 +2879,7 @@ unsigned CastInst::isEliminableCastPair(
{ 99,99,99, 2, 2,99,99, 8, 2,99,99,99, 4, 0}, // FPExt |
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 7, 3, 0}, // PtrToInt |
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // PtrToAddr |
- { 99,99,99,99,99,99,99,99,99,11,99,99,15, 0}, // IntToPtr |
+ { 99,99,99,99,99,99,99,99,99,11, 0,99,15, 0}, // IntToPtr |
{ 5, 5, 5, 0, 0, 5, 5, 0, 0,16,16, 5, 1,14}, // BitCast |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,12}, // AddrSpaceCast -+
};
diff --git a/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll b/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll
index 442089eecfcbb..42814cf6c3682 100644
--- a/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll
+++ b/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll
@@ -32,3 +32,17 @@ define i64 @OpenFilter(i64 %x) {
%r = zext i8 %t to i64
ret i64 %r
}
+
+define i64 @ptr2addr1() {
+; CHECK-LABEL: @ptr2addr1(
+; CHECK-NEXT: ret i64 ptrtoaddr (ptr inttoptr (i64 1 to ptr) to i64)
+;
+ ret i64 ptrtoaddr (ptr getelementptr (i8, ptr null, i64 1) to i64)
+}
+
+define i64 @ptr2addr2() {
+; CHECK-LABEL: @ptr2addr2(
+; CHECK-NEXT: ret i64 ptrtoaddr (ptr inttoptr (i64 123 to ptr) to i64)
+;
+ ret i64 ptrtoaddr (ptr inttoptr (i64 123 to ptr) to i64)
+}
>From 5513266fe57a5d97570333faaf4aa1e3d630c15c Mon Sep 17 00:00:00 2001
From: XChy <xxs_chy at outlook.com>
Date: Mon, 29 Sep 2025 00:53:09 +0800
Subject: [PATCH 2/4] optimize inttoptr, ptrtoaddr
---
llvm/lib/IR/Instructions.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index fb47768974f2b..49d6bb4faa595 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -2878,7 +2878,7 @@ unsigned CastInst::isEliminableCastPair(
{ 99,99,99, 0, 0,99,99, 0, 0,99,99,99, 4, 0}, // FPTrunc |
{ 99,99,99, 2, 2,99,99, 8, 2,99,99,99, 4, 0}, // FPExt |
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 7, 3, 0}, // PtrToInt |
- { 1, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // PtrToAddr |
+ { 1, 0, 0,99,99, 0, 0,99,99,99,99,11, 3, 0}, // PtrToAddr |
{ 99,99,99,99,99,99,99,99,99,11, 0,99,15, 0}, // IntToPtr |
{ 5, 5, 5, 0, 0, 5, 5, 0, 0,16,16, 5, 1,14}, // BitCast |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,12}, // AddrSpaceCast -+
@@ -2973,7 +2973,7 @@ unsigned CastInst::isEliminableCastPair(
// zext, sext -> zext, because sext can't sign extend after zext
return Instruction::ZExt;
case 11: {
- // inttoptr, ptrtoint -> bitcast if SrcSize<=PtrSize and SrcSize==DstSize
+ // inttoptr, ptrtoint/ptrtoaddr -> bitcast if SrcSize<=PtrSize and SrcSize==DstSize
if (!MidIntPtrTy)
return 0;
unsigned PtrSize = MidIntPtrTy->getScalarSizeInBits();
>From fbdea3c46aba662b9670ce3c3c2f4f889db2ea68 Mon Sep 17 00:00:00 2001
From: XChy <xxs_chy at outlook.com>
Date: Mon, 29 Sep 2025 00:57:14 +0800
Subject: [PATCH 3/4] fix testcases
---
llvm/lib/IR/Instructions.cpp | 4 ++--
llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 49d6bb4faa595..89d4d13fcdb58 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -2878,8 +2878,8 @@ unsigned CastInst::isEliminableCastPair(
{ 99,99,99, 0, 0,99,99, 0, 0,99,99,99, 4, 0}, // FPTrunc |
{ 99,99,99, 2, 2,99,99, 8, 2,99,99,99, 4, 0}, // FPExt |
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 7, 3, 0}, // PtrToInt |
- { 1, 0, 0,99,99, 0, 0,99,99,99,99,11, 3, 0}, // PtrToAddr |
- { 99,99,99,99,99,99,99,99,99,11, 0,99,15, 0}, // IntToPtr |
+ { 1, 0, 0,99,99, 0, 0,99,99,99,99,99, 3, 0}, // PtrToAddr |
+ { 99,99,99,99,99,99,99,99,99,11, 11,99,15, 0}, // IntToPtr |
{ 5, 5, 5, 0, 0, 5, 5, 0, 0,16,16, 5, 1,14}, // BitCast |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,12}, // AddrSpaceCast -+
};
diff --git a/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll b/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll
index 42814cf6c3682..40d840459be4f 100644
--- a/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll
+++ b/llvm/test/Transforms/InstCombine/constant-expr-datalayout.ll
@@ -35,14 +35,14 @@ define i64 @OpenFilter(i64 %x) {
define i64 @ptr2addr1() {
; CHECK-LABEL: @ptr2addr1(
-; CHECK-NEXT: ret i64 ptrtoaddr (ptr inttoptr (i64 1 to ptr) to i64)
+; CHECK-NEXT: ret i64 1
;
ret i64 ptrtoaddr (ptr getelementptr (i8, ptr null, i64 1) to i64)
}
define i64 @ptr2addr2() {
; CHECK-LABEL: @ptr2addr2(
-; CHECK-NEXT: ret i64 ptrtoaddr (ptr inttoptr (i64 123 to ptr) to i64)
+; CHECK-NEXT: ret i64 123
;
ret i64 ptrtoaddr (ptr inttoptr (i64 123 to ptr) to i64)
}
>From 7ac93464fa2b851766c34efc2eac436ee7f2192a Mon Sep 17 00:00:00 2001
From: XChy <xxs_chy at outlook.com>
Date: Mon, 29 Sep 2025 01:00:23 +0800
Subject: [PATCH 4/4] format
---
llvm/lib/IR/Instructions.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 89d4d13fcdb58..1ee7cbd510dd1 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -2973,7 +2973,8 @@ unsigned CastInst::isEliminableCastPair(
// zext, sext -> zext, because sext can't sign extend after zext
return Instruction::ZExt;
case 11: {
- // inttoptr, ptrtoint/ptrtoaddr -> bitcast if SrcSize<=PtrSize and SrcSize==DstSize
+ // inttoptr, ptrtoint/ptrtoaddr -> bitcast if SrcSize<=PtrSize and
+ // SrcSize==DstSize
if (!MidIntPtrTy)
return 0;
unsigned PtrSize = MidIntPtrTy->getScalarSizeInBits();
More information about the llvm-commits
mailing list