Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,24 @@ def LLVM_InvariantEndOp : LLVM_ZeroResultIntrOp<"invariant.end", [2],
"qualified(type($ptr))";
}

def LLVM_LaunderInvariantGroupOp
: LLVM_OneResultIntrOp<"launder.invariant.group", [], [0],
[DeclareOpInterfaceMethods<PromotableOpInterface>,
SameOperandsAndResultType]> {
let arguments = (ins LLVM_AnyPointer:$ptr);
let results = (outs LLVM_AnyPointer:$res);
let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
}

def LLVM_StripInvariantGroupOp
: LLVM_OneResultIntrOp<"strip.invariant.group", [], [0],
[DeclareOpInterfaceMethods<PromotableOpInterface>,
SameOperandsAndResultType]> {
let arguments = (ins LLVM_AnyPointer:$ptr);
let results = (outs LLVM_AnyPointer:$res);
let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
}

// Constrained Floating-Point Intrinsics.

class LLVM_ConstrainedIntr<string mnem, int numArgs,
Expand Down
24 changes: 24 additions & 0 deletions mlir/lib/Dialect/LLVMIR/IR/LLVMMemorySlot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,30 @@ DeletionKind LLVM::InvariantEndOp::removeBlockingUses(
return DeletionKind::Delete;
}

bool LLVM::LaunderInvariantGroupOp::canUsesBeRemoved(
const SmallPtrSetImpl<OpOperand *> &blockingUses,
SmallVectorImpl<OpOperand *> &newBlockingUses,
const DataLayout &dataLayout) {
return forwardToUsers(*this, newBlockingUses);
}

DeletionKind LLVM::LaunderInvariantGroupOp::removeBlockingUses(
const SmallPtrSetImpl<OpOperand *> &blockingUses, OpBuilder &builder) {
return DeletionKind::Delete;
}

bool LLVM::StripInvariantGroupOp::canUsesBeRemoved(
const SmallPtrSetImpl<OpOperand *> &blockingUses,
SmallVectorImpl<OpOperand *> &newBlockingUses,
const DataLayout &dataLayout) {
return forwardToUsers(*this, newBlockingUses);
}

DeletionKind LLVM::StripInvariantGroupOp::removeBlockingUses(
const SmallPtrSetImpl<OpOperand *> &blockingUses, OpBuilder &builder) {
return DeletionKind::Delete;
}

bool LLVM::DbgDeclareOp::canUsesBeRemoved(
const SmallPtrSetImpl<OpOperand *> &blockingUses,
SmallVectorImpl<OpOperand *> &newBlockingUses,
Expand Down
12 changes: 12 additions & 0 deletions mlir/test/Dialect/LLVMIR/mem2reg.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,18 @@ llvm.func @ignore_lifetime() {

// -----

// CHECK-LABEL: llvm.func @ignore_invariant_group
// CHECK-NOT: llvm.alloca
llvm.func @ignore_invariant_group() {
%0 = llvm.mlir.constant(1 : i32) : i32
%1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr
%2 = llvm.intr.launder.invariant.group %1 : !llvm.ptr
%3 = llvm.intr.strip.invariant.group %2 : !llvm.ptr
llvm.return
}

// -----

// CHECK-LABEL: llvm.func @ignore_discardable_tree
// CHECK-NOT: = llvm.alloca
llvm.func @ignore_discardable_tree() {
Expand Down
10 changes: 10 additions & 0 deletions mlir/test/Dialect/LLVMIR/roundtrip.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,16 @@ llvm.func @invariant(%p: !llvm.ptr) {
llvm.return
}

// CHECK-LABEL: @invariant_group_intrinsics
// CHECK-SAME: %[[P:.+]]: !llvm.ptr
llvm.func @invariant_group_intrinsics(%p: !llvm.ptr) {
// CHECK: %{{.+}} = llvm.intr.launder.invariant.group %[[P]] : !llvm.ptr
%1 = llvm.intr.launder.invariant.group %p : !llvm.ptr
// CHECK: %{{.+}} = llvm.intr.strip.invariant.group %[[P]] : !llvm.ptr
%2 = llvm.intr.strip.invariant.group %p : !llvm.ptr
llvm.return
}

// CHECK-LABEL: @vararg_func
llvm.func @vararg_func(%arg0: i32, ...) {
// CHECK: %[[C:.*]] = llvm.mlir.constant(1 : i32)
Expand Down
11 changes: 11 additions & 0 deletions mlir/test/Target/LLVMIR/Import/intrinsic.ll
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,15 @@ define void @invariant(ptr %0) {
ret void
}

; CHECK-LABEL: llvm.func @invariant_group
define void @invariant_group(ptr %0) {
; CHECK: %{{.+}} = llvm.intr.launder.invariant.group %{{.*}} : !llvm.ptr
%2 = call ptr @llvm.launder.invariant.group.p0(ptr %0)
; CHECK: %{{.+}} = llvm.intr.strip.invariant.group %{{.*}} : !llvm.ptr
%3 = call ptr @llvm.strip.invariant.group.p0(ptr %0)
ret void
}

; CHECK-LABEL: llvm.func @vector_insert
define void @vector_insert(<vscale x 4 x float> %0, <4 x float> %1) {
; CHECK: llvm.intr.vector.insert %{{.*}}, %{{.*}}[4] : vector<4xf32> into !llvm.vec<? x 4 x f32>
Expand Down Expand Up @@ -1191,6 +1200,8 @@ declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
declare ptr @llvm.invariant.start.p0(i64 immarg, ptr nocapture)
declare void @llvm.invariant.end.p0(ptr, i64 immarg, ptr nocapture)
declare ptr @llvm.launder.invariant.group.p0(ptr nocapture)
declare ptr @llvm.strip.invariant.group.p0(ptr nocapture)

declare void @llvm.assume(i1)
declare float @llvm.ssa.copy.f32(float returned)
Expand Down
9 changes: 9 additions & 0 deletions mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -1020,6 +1020,15 @@ llvm.func @invariant(%p: !llvm.ptr) {
llvm.return
}

// CHECK-LABEL: @invariant_group
llvm.func @invariant_group(%p: !llvm.ptr) {
// CHECK: call ptr @llvm.launder.invariant.group
%1 = llvm.intr.launder.invariant.group %p : !llvm.ptr
// CHECK: call ptr @llvm.strip.invariant.group
%2 = llvm.intr.strip.invariant.group %p : !llvm.ptr
llvm.return
}

// CHECK-LABEL: @ssa_copy
llvm.func @ssa_copy(%arg: f32) -> f32 {
// CHECK: call float @llvm.ssa.copy
Expand Down
Loading