Skip to content

Commit f628a54

Browse files
authored
[ConstantFold] Fold inttoptr, ptrtoaddr to bitcast (#161087)
Fixes #157334.
1 parent ce70773 commit f628a54

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

llvm/lib/IR/Instructions.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2847,6 +2847,7 @@ unsigned CastInst::isEliminableCastPair(
28472847
// FPTRUNC > FloatPt n/a FloatPt n/a
28482848
// FPEXT < FloatPt n/a FloatPt n/a
28492849
// PTRTOINT n/a Pointer n/a Integral Unsigned
2850+
// PTRTOADDR n/a Pointer n/a Integral Unsigned
28502851
// INTTOPTR n/a Integral Unsigned Pointer n/a
28512852
// BITCAST = FirstClass n/a FirstClass n/a
28522853
// ADDRSPCST n/a Pointer n/a Pointer n/a
@@ -2878,7 +2879,7 @@ unsigned CastInst::isEliminableCastPair(
28782879
{ 99,99,99, 2, 2,99,99, 8, 2,99,99,99, 4, 0}, // FPExt |
28792880
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 7, 3, 0}, // PtrToInt |
28802881
{ 1, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // PtrToAddr |
2881-
{ 99,99,99,99,99,99,99,99,99,11,99,99,15, 0}, // IntToPtr |
2882+
{ 99,99,99,99,99,99,99,99,99,11,11,99,15, 0}, // IntToPtr |
28822883
{ 5, 5, 5, 0, 0, 5, 5, 0, 0,16,16, 5, 1,14}, // BitCast |
28832884
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,12}, // AddrSpaceCast -+
28842885
};
@@ -2972,7 +2973,8 @@ unsigned CastInst::isEliminableCastPair(
29722973
// zext, sext -> zext, because sext can't sign extend after zext
29732974
return Instruction::ZExt;
29742975
case 11: {
2975-
// inttoptr, ptrtoint -> bitcast if SrcSize<=PtrSize and SrcSize==DstSize
2976+
// inttoptr, ptrtoint/ptrtoaddr -> bitcast if SrcSize<=PtrSize and
2977+
// SrcSize==DstSize
29762978
if (!MidIntPtrTy)
29772979
return 0;
29782980
unsigned PtrSize = MidIntPtrTy->getScalarSizeInBits();
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
target datalayout = "p1:64:64:64:32"
4+
5+
define i32 @ptrtoaddr_inttoptr_arg(i32 %a) {
6+
; CHECK-LABEL: define i32 @ptrtoaddr_inttoptr_arg(
7+
; CHECK-SAME: i32 [[A:%.*]]) {
8+
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[A]] to i64
9+
; CHECK-NEXT: [[TOPTR:%.*]] = inttoptr i64 [[TMP1]] to ptr addrspace(1)
10+
; CHECK-NEXT: [[TOADDR:%.*]] = ptrtoaddr ptr addrspace(1) [[TOPTR]] to i32
11+
; CHECK-NEXT: ret i32 [[TOADDR]]
12+
;
13+
%toptr = inttoptr i32 %a to ptr addrspace(1)
14+
%toaddr = ptrtoaddr ptr addrspace(1) %toptr to i32
15+
ret i32 %toaddr
16+
}
17+
18+
define i32 @ptrtoaddr_inttoptr() {
19+
; CHECK-LABEL: define i32 @ptrtoaddr_inttoptr() {
20+
; CHECK-NEXT: ret i32 -1
21+
;
22+
ret i32 ptrtoaddr (ptr addrspace(1) inttoptr (i32 -1 to ptr addrspace(1)) to i32)
23+
}
24+
25+
define i32 @ptrtoaddr_inttoptr_diff_size1() {
26+
; CHECK-LABEL: define i32 @ptrtoaddr_inttoptr_diff_size1() {
27+
; CHECK-NEXT: ret i32 ptrtoaddr (ptr addrspace(1) inttoptr (i64 -1 to ptr addrspace(1)) to i32)
28+
;
29+
ret i32 ptrtoaddr (ptr addrspace(1) inttoptr (i64 -1 to ptr addrspace(1)) to i32)
30+
}
31+
32+
define i32 @ptrtoaddr_inttoptr_diff_size2() {
33+
; CHECK-LABEL: define i32 @ptrtoaddr_inttoptr_diff_size2() {
34+
; CHECK-NEXT: ret i32 ptrtoaddr (ptr addrspace(1) inttoptr (i16 -1 to ptr addrspace(1)) to i32)
35+
;
36+
ret i32 ptrtoaddr (ptr addrspace(1) inttoptr (i16 -1 to ptr addrspace(1)) to i32)
37+
}
38+
39+
define i64 @ptrtoaddr_inttoptr_noas1() {
40+
; CHECK-LABEL: define i64 @ptrtoaddr_inttoptr_noas1() {
41+
; CHECK-NEXT: ret i64 1
42+
;
43+
ret i64 ptrtoaddr (ptr getelementptr (i8, ptr null, i64 1) to i64)
44+
}
45+
46+
define i64 @ptr2addr2_inttoptr_noas2() {
47+
; CHECK-LABEL: define i64 @ptr2addr2_inttoptr_noas2() {
48+
; CHECK-NEXT: ret i64 123
49+
;
50+
ret i64 ptrtoaddr (ptr inttoptr (i64 123 to ptr) to i64)
51+
}
52+
53+
define i64 @ptrtoaddr_inttoptr_noas_diff_size1() {
54+
; CHECK-LABEL: define i64 @ptrtoaddr_inttoptr_noas_diff_size1() {
55+
; CHECK-NEXT: ret i64 ptrtoaddr (ptr inttoptr (i32 -1 to ptr) to i64)
56+
;
57+
ret i64 ptrtoaddr (ptr inttoptr (i32 -1 to ptr) to i64)
58+
}
59+
60+
define i64 @ptrtoaddr_inttoptr_noas_diff_size2() {
61+
; CHECK-LABEL: define i64 @ptrtoaddr_inttoptr_noas_diff_size2() {
62+
; CHECK-NEXT: ret i64 ptrtoaddr (ptr inttoptr (i128 -1 to ptr) to i64)
63+
;
64+
ret i64 ptrtoaddr (ptr inttoptr (i128 -1 to ptr) to i64)
65+
}

0 commit comments

Comments
 (0)