Skip to content

Commit 4fab22e

Browse files
committed
[mlir][LLVMIR] Add folders for llvm.inttoptr and llvm.ptrtoint
This PR adds folders for `inttoptr(ptrtoint(x))` and `ptrtoint(inttoptr(x))`.
1 parent dd885f1 commit 4fab22e

File tree

3 files changed

+64
-5
lines changed

3 files changed

+64
-5
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,10 +622,14 @@ def LLVM_AddrSpaceCastOp : LLVM_CastOp<"addrspacecast", "AddrSpaceCast",
622622
}
623623
def LLVM_IntToPtrOp : LLVM_DereferenceableCastOp<"inttoptr", "IntToPtr",
624624
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
625-
LLVM_ScalarOrVectorOf<LLVM_AnyPointer>>;
625+
LLVM_ScalarOrVectorOf<LLVM_AnyPointer>> {
626+
let hasFolder = 1;
627+
}
626628
def LLVM_PtrToIntOp : LLVM_CastOp<"ptrtoint", "PtrToInt",
627629
LLVM_ScalarOrVectorOf<LLVM_AnyPointer>,
628-
LLVM_ScalarOrVectorOf<AnySignlessInteger>>;
630+
LLVM_ScalarOrVectorOf<AnySignlessInteger>> {
631+
let hasFolder = 1;
632+
}
629633
def LLVM_SExtOp : LLVM_CastOp<"sext", "SExt",
630634
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
631635
LLVM_ScalarOrVectorOf<AnySignlessInteger>> {

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3562,6 +3562,35 @@ LogicalResult LLVM::BitcastOp::verify() {
35623562
return success();
35633563
}
35643564

3565+
//===----------------------------------------------------------------------===//
3566+
// IntToPtrOp
3567+
//===----------------------------------------------------------------------===//
3568+
3569+
template <typename CastOp, typename ReverseCastOp>
3570+
static OpFoldResult foldReversibleCast(CastOp castOp) {
3571+
auto reverseCastOp = castOp.getArg().template getDefiningOp<ReverseCastOp>();
3572+
if (!reverseCastOp)
3573+
return {};
3574+
3575+
// cast(reverse_cast(x)) -> x
3576+
if (reverseCastOp.getArg().getType() == castOp.getType())
3577+
return reverseCastOp.getArg();
3578+
3579+
return {};
3580+
}
3581+
3582+
OpFoldResult LLVM::IntToPtrOp::fold(FoldAdaptor adaptor) {
3583+
return foldReversibleCast<LLVM::IntToPtrOp, LLVM::PtrToIntOp>(*this);
3584+
}
3585+
3586+
//===----------------------------------------------------------------------===//
3587+
// PtrToIntOp
3588+
//===----------------------------------------------------------------------===//
3589+
3590+
OpFoldResult LLVM::PtrToIntOp::fold(FoldAdaptor adaptor) {
3591+
return foldReversibleCast<LLVM::PtrToIntOp, LLVM::IntToPtrOp>(*this);
3592+
}
3593+
35653594
//===----------------------------------------------------------------------===//
35663595
// Folder for LLVM::AddrSpaceCastOp
35673596
//===----------------------------------------------------------------------===//

mlir/test/Dialect/LLVMIR/canonicalize.mlir

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,10 @@ llvm.func @fold_unrelated_extractvalue(%arr: !llvm.array<4 x f32>) -> f32 {
103103
// -----
104104
// CHECK-LABEL: fold_extract_extractvalue
105105
llvm.func @fold_extract_extractvalue(%arr: !llvm.struct<(i64, array<1 x ptr<1>>)>) -> !llvm.ptr<1> {
106-
// CHECK: llvm.extractvalue %{{.*}}[1, 0]
106+
// CHECK: llvm.extractvalue %{{.*}}[1, 0]
107107
// CHECK-NOT: extractvalue
108-
%a = llvm.extractvalue %arr[1] : !llvm.struct<(i64, array<1 x ptr<1>>)>
109-
%b = llvm.extractvalue %a[0] : !llvm.array<1 x ptr<1>>
108+
%a = llvm.extractvalue %arr[1] : !llvm.struct<(i64, array<1 x ptr<1>>)>
109+
%b = llvm.extractvalue %a[0] : !llvm.array<1 x ptr<1>>
110110
llvm.return %b : !llvm.ptr<1>
111111
}
112112

@@ -134,6 +134,32 @@ llvm.func @fold_extract_splat() -> f64 {
134134

135135
// -----
136136

137+
// CHECK-LABEL: fold_inttoptr_ptrtoint
138+
// CHECK-SAME: %[[ARG:.+]]: i32) -> i32
139+
// CHECK-NOT: inttoptr
140+
// CHECK-NOT: ptrtoint
141+
// CHECK-NEXT: llvm.return %[[ARG]]
142+
llvm.func @fold_inttoptr_ptrtoint(%x : i32) -> i32 {
143+
%c = llvm.inttoptr %x : i32 to !llvm.ptr
144+
%d = llvm.ptrtoint %c : !llvm.ptr to i32
145+
llvm.return %d : i32
146+
}
147+
148+
// -----
149+
150+
// CHECK-LABEL: fold_ptrtoint_inttoptr
151+
// CHECK-SAME: %[[ARG:.+]]: !llvm.ptr<3>) -> !llvm.ptr<3>
152+
// CHECK-NOT: inttoptr
153+
// CHECK-NOT: ptrtoint
154+
// CHECK-NEXT: llvm.return %[[ARG]]
155+
llvm.func @fold_ptrtoint_inttoptr(%x : !llvm.ptr<3>) -> !llvm.ptr<3> {
156+
%c = llvm.ptrtoint %x : !llvm.ptr<3> to i32
157+
%d = llvm.inttoptr %c : i32 to !llvm.ptr<3>
158+
llvm.return %d : !llvm.ptr<3>
159+
}
160+
161+
// -----
162+
137163
// CHECK-LABEL: fold_bitcast
138164
// CHECK-SAME: %[[ARG:[[:alnum:]]+]]
139165
// CHECK-NEXT: llvm.return %[[ARG]]

0 commit comments

Comments
 (0)