[Mlir-commits] [mlir] [mlir][llvm] Improve alloca handling during inlining (PR #75961)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Dec 19 11:11:49 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-llvm
Author: Tobias Gysi (gysit)
<details>
<summary>Changes</summary>
This revision changes the alloca handling in the LLVM inliner. It ensures that alloca operations, even those nested within a region operation, can be relocated to the entry block.
While the LLVM dialect does not have any region operations, the inlining interface may be used on IR that mixes different dialects.
---
Full diff: https://github.com/llvm/llvm-project/pull/75961.diff
2 Files Affected:
- (modified) mlir/lib/Dialect/LLVMIR/IR/LLVMInlining.cpp (+5-2)
- (modified) mlir/test/Dialect/LLVMIR/inlining.mlir (+26)
``````````diff
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMInlining.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMInlining.cpp
index 6e9019f932aa8c..dd2b06a8981684 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMInlining.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMInlining.cpp
@@ -51,10 +51,13 @@ static void
handleInlinedAllocas(Operation *call,
iterator_range<Region::iterator> inlinedBlocks) {
Block *calleeEntryBlock = &(*inlinedBlocks.begin());
- Block *callerEntryBlock = &(*calleeEntryBlock->getParent()->begin());
- if (calleeEntryBlock == callerEntryBlock)
+ Block *callerEntryBlock = calleeEntryBlock;
+ if (auto funcOp = call->getParentOfType<LLVM::LLVMFuncOp>())
+ callerEntryBlock = &funcOp.getFunctionBody().front();
+ if (calleeEntryBlock == callerEntryBlock) {
// Nothing to do.
return;
+ }
SmallVector<std::tuple<LLVM::AllocaOp, IntegerAttr, bool>> allocasToMove;
bool shouldInsertLifetimes = false;
bool hasDynamicAlloca = false;
diff --git a/mlir/test/Dialect/LLVMIR/inlining.mlir b/mlir/test/Dialect/LLVMIR/inlining.mlir
index b684be1f9626b1..87e0ffb0a7e9d0 100644
--- a/mlir/test/Dialect/LLVMIR/inlining.mlir
+++ b/mlir/test/Dialect/LLVMIR/inlining.mlir
@@ -324,6 +324,32 @@ llvm.func @test_inline(%cond0 : i1, %cond1 : i1, %funcArg : f32) -> f32 {
// -----
+llvm.func @static_alloca(%cond: i1) -> f32 {
+ %0 = llvm.mlir.constant(4 : i32) : i32
+ %1 = llvm.alloca %0 x f32 : (i32) -> !llvm.ptr
+ %2 = llvm.load %1 : !llvm.ptr -> f32
+ llvm.return %2 : f32
+}
+
+// CHECK-LABEL: llvm.func @test_inline
+llvm.func @test_inline(%cond0 : i1) {
+ // Make sure the alloca has been moved to the entry block even if the
+ // callsite is nested in a region operation.
+ // CHECK: %[[ALLOCA:.+]] = llvm.alloca
+ // CHECK: "test.one_region_op"() ({
+ "test.one_region_op"() ({
+ %0 = llvm.call @static_alloca(%cond0) : (i1) -> f32
+ // CHECK-NEXT: llvm.intr.lifetime.start 4, %[[ALLOCA]]
+ // CHECK-NEXT: %[[RES:.+]] = llvm.load %[[ALLOCA]]
+ // CHECK-NEXT: llvm.intr.lifetime.end 4, %[[ALLOCA]]
+ // CHECK-NEXT: test.region_yield %[[RES]]
+ test.region_yield %0 : f32
+ }) : () -> ()
+ llvm.return
+}
+
+// -----
+
llvm.func @alloca_with_lifetime(%cond: i1) -> f32 {
%0 = llvm.mlir.constant(4 : i32) : i32
%1 = llvm.alloca %0 x f32 : (i32) -> !llvm.ptr
``````````
</details>
https://github.com/llvm/llvm-project/pull/75961
More information about the Mlir-commits
mailing list