Skip to content

Commit 07ceb0f

Browse files
committed
[mlir][LLVM] Add support for invariant group related intrinsics
This patch adds support for the following LLVM intrinsics: - `llvm.launder.invariant.group` - `llvm.strip.invariant.group`
1 parent 6d8d9fc commit 07ceb0f

File tree

6 files changed

+84
-0
lines changed

6 files changed

+84
-0
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,24 @@ def LLVM_InvariantEndOp : LLVM_ZeroResultIntrOp<"invariant.end", [2],
320320
"qualified(type($ptr))";
321321
}
322322

323+
def LLVM_LaunderInvariantGroupOp
324+
: LLVM_OneResultIntrOp<"launder.invariant.group", [], [0],
325+
[DeclareOpInterfaceMethods<PromotableOpInterface>,
326+
SameOperandsAndResultType]> {
327+
let arguments = (ins LLVM_AnyPointer:$ptr);
328+
let results = (outs LLVM_AnyPointer:$res);
329+
let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
330+
}
331+
332+
def LLVM_StripInvariantGroupOp
333+
: LLVM_OneResultIntrOp<"strip.invariant.group", [], [0],
334+
[DeclareOpInterfaceMethods<PromotableOpInterface>,
335+
SameOperandsAndResultType]> {
336+
let arguments = (ins LLVM_AnyPointer:$ptr);
337+
let results = (outs LLVM_AnyPointer:$res);
338+
let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
339+
}
340+
323341
// Constrained Floating-Point Intrinsics.
324342

325343
class LLVM_ConstrainedIntr<string mnem, int numArgs,

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,30 @@ DeletionKind LLVM::InvariantEndOp::removeBlockingUses(
590590
return DeletionKind::Delete;
591591
}
592592

593+
bool LLVM::LaunderInvariantGroupOp::canUsesBeRemoved(
594+
const SmallPtrSetImpl<OpOperand *> &blockingUses,
595+
SmallVectorImpl<OpOperand *> &newBlockingUses,
596+
const DataLayout &dataLayout) {
597+
return forwardToUsers(*this, newBlockingUses);
598+
}
599+
600+
DeletionKind LLVM::LaunderInvariantGroupOp::removeBlockingUses(
601+
const SmallPtrSetImpl<OpOperand *> &blockingUses, OpBuilder &builder) {
602+
return DeletionKind::Delete;
603+
}
604+
605+
bool LLVM::StripInvariantGroupOp::canUsesBeRemoved(
606+
const SmallPtrSetImpl<OpOperand *> &blockingUses,
607+
SmallVectorImpl<OpOperand *> &newBlockingUses,
608+
const DataLayout &dataLayout) {
609+
return forwardToUsers(*this, newBlockingUses);
610+
}
611+
612+
DeletionKind LLVM::StripInvariantGroupOp::removeBlockingUses(
613+
const SmallPtrSetImpl<OpOperand *> &blockingUses, OpBuilder &builder) {
614+
return DeletionKind::Delete;
615+
}
616+
593617
bool LLVM::DbgDeclareOp::canUsesBeRemoved(
594618
const SmallPtrSetImpl<OpOperand *> &blockingUses,
595619
SmallVectorImpl<OpOperand *> &newBlockingUses,

mlir/test/Dialect/LLVMIR/mem2reg.mlir

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,18 @@ llvm.func @ignore_lifetime() {
414414

415415
// -----
416416

417+
// CHECK-LABEL: llvm.func @ignore_invariant_group
418+
// CHECK-NOT: llvm.alloca
419+
llvm.func @ignore_invariant_group() {
420+
%0 = llvm.mlir.constant(1 : i32) : i32
421+
%1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr
422+
%2 = llvm.intr.launder.invariant.group %1 : !llvm.ptr
423+
%3 = llvm.intr.strip.invariant.group %2 : !llvm.ptr
424+
llvm.return
425+
}
426+
427+
// -----
428+
417429
// CHECK-LABEL: llvm.func @ignore_discardable_tree
418430
// CHECK-NOT: = llvm.alloca
419431
llvm.func @ignore_discardable_tree() {

mlir/test/Dialect/LLVMIR/roundtrip.mlir

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,16 @@ llvm.func @invariant(%p: !llvm.ptr) {
672672
llvm.return
673673
}
674674

675+
// CHECK-LABEL: @invariant_group_intrinsics
676+
// CHECK-SAME: %[[P:.+]]: !llvm.ptr
677+
llvm.func @invariant_group_intrinsics(%p: !llvm.ptr) {
678+
// CHECK: %{{.+}} = llvm.intr.launder.invariant.group %[[P]] : !llvm.ptr
679+
%1 = llvm.intr.launder.invariant.group %p : !llvm.ptr
680+
// CHECK: %{{.+}} = llvm.intr.strip.invariant.group %[[P]] : !llvm.ptr
681+
%2 = llvm.intr.strip.invariant.group %p : !llvm.ptr
682+
llvm.return
683+
}
684+
675685
// CHECK-LABEL: @vararg_func
676686
llvm.func @vararg_func(%arg0: i32, ...) {
677687
// CHECK: %[[C:.*]] = llvm.mlir.constant(1 : i32)

mlir/test/Target/LLVMIR/Import/intrinsic.ll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,15 @@ define void @invariant(ptr %0) {
802802
ret void
803803
}
804804

805+
; CHECK-LABEL: llvm.func @invariant_group
806+
define void @invariant_group(ptr %0) {
807+
; CHECK: %{{.+}} = llvm.intr.launder.invariant.group %{{.*}} : !llvm.ptr
808+
%2 = call ptr @llvm.launder.invariant.group.p0(ptr %0)
809+
; CHECK: %{{.+}} = llvm.intr.strip.invariant.group %{{.*}} : !llvm.ptr
810+
%3 = call ptr @llvm.strip.invariant.group.p0(ptr %0)
811+
ret void
812+
}
813+
805814
; CHECK-LABEL: llvm.func @vector_insert
806815
define void @vector_insert(<vscale x 4 x float> %0, <4 x float> %1) {
807816
; CHECK: llvm.intr.vector.insert %{{.*}}, %{{.*}}[4] : vector<4xf32> into !llvm.vec<? x 4 x f32>
@@ -1191,6 +1200,8 @@ declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
11911200
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
11921201
declare ptr @llvm.invariant.start.p0(i64 immarg, ptr nocapture)
11931202
declare void @llvm.invariant.end.p0(ptr, i64 immarg, ptr nocapture)
1203+
declare ptr @llvm.launder.invariant.group.p0(ptr nocapture)
1204+
declare ptr @llvm.strip.invariant.group.p0(ptr nocapture)
11941205

11951206
declare void @llvm.assume(i1)
11961207
declare float @llvm.ssa.copy.f32(float returned)

mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,15 @@ llvm.func @invariant(%p: !llvm.ptr) {
10201020
llvm.return
10211021
}
10221022

1023+
// CHECK-LABEL: @invariant_group
1024+
llvm.func @invariant_group(%p: !llvm.ptr) {
1025+
// CHECK: call ptr @llvm.launder.invariant.group
1026+
%1 = llvm.intr.launder.invariant.group %p : !llvm.ptr
1027+
// CHECK: call ptr @llvm.strip.invariant.group
1028+
%2 = llvm.intr.strip.invariant.group %p : !llvm.ptr
1029+
llvm.return
1030+
}
1031+
10231032
// CHECK-LABEL: @ssa_copy
10241033
llvm.func @ssa_copy(%arg: f32) -> f32 {
10251034
// CHECK: call float @llvm.ssa.copy

0 commit comments

Comments
 (0)