Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
4 changes: 2 additions & 2 deletions mlir/lib/Transforms/RemoveDeadValues.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -345,8 +345,6 @@ static void processFuncOp(FunctionOpInterface funcOp, Operation *module,
// since it forwards only to non-live value(s) (%1#1).
Operation *lastReturnOp = funcOp.back().getTerminator();
size_t numReturns = lastReturnOp->getNumOperands();
if (numReturns == 0)
return;
BitVector nonLiveRets(numReturns, true);
for (SymbolTable::SymbolUse use : uses) {
Operation *callOp = use.getUser();
Expand All @@ -368,6 +366,8 @@ static void processFuncOp(FunctionOpInterface funcOp, Operation *module,
cl.functions.push_back({funcOp, nonLiveArgs, nonLiveRets});

// Do (5) and (6).
if (numReturns == 0)
return;
for (SymbolTable::SymbolUse use : uses) {
Operation *callOp = use.getUser();
assert(isa<CallOpInterface>(callOp) && "expected a call-like user");
Expand Down
40 changes: 40 additions & 0 deletions mlir/test/Transforms/remove-dead-values.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -548,3 +548,43 @@ func.func @test_atomic_yield(%I: memref<10xf32>, %idx : index) {
func.return
}

// CHECK-LABEL: module @return_void_with_unused_argument {
// CHECK-LABEL: func.func private @noop() {
// CHECK-NEXT: return
// CHECK-NEXT: }
// CHECK-LABEL: func.func private @fn_return_void_with_unused_argument(%arg0: memref<1x1xsi8, 1>, %arg1: memref<1x1xsi16, 1>) {
// CHECK-NEXT: %alloc = memref.alloc() {alignment = 8 : i64} : memref<1x73xsi8, 3>
// CHECK-NEXT: %alloc_0 = memref.alloc() {alignment = 8 : i64} : memref<1x1xsi16, 3>
// CHECK-NEXT: %alloc_1 = memref.alloc() {alignment = 8 : i64} : memref<1x1xsi8, 3>
// CHECK-NEXT: memref.copy %arg0, %alloc_1 : memref<1x1xsi8, 1> to memref<1x1xsi8, 3>
// CHECK-NEXT: memref.copy %arg1, %alloc_0 : memref<1x1xsi16, 1> to memref<1x1xsi16, 3>
// CHECK-NEXT: call @noop() : () -> ()
// CHECK-NEXT: return
// CHECK-NEXT: }
// CHECK-LABEL: func.func @main(%arg0: memref<1x73xsi8, 1>, %arg1: memref<1x1xsi8, 1>, %arg2: memref<1x1xsi16, 1>) -> memref<1x73xsi8, 1> {
// CHECK-NEXT: %alloc = memref.alloc() : memref<1x73xsi8, 1>
// CHECK-NEXT: call @fn_return_void_with_unused_argument(%arg1, %arg2) : (memref<1x1xsi8, 1>, memref<1x1xsi16, 1>) -> ()
// CHECK-NEXT: return %alloc : memref<1x73xsi8, 1>
// CHECK-NEXT: }
// CHECK-NEXT:}
module @return_void_with_unused_argument {
func.func private @noop(%arg0: memref<1x1xsi8, 3>, %arg1: memref<1x1xsi16, 3>, %arg2: memref<1x73xsi8, 1>) {
return
}
func.func private @fn_return_void_with_unused_argument(%arg0: memref<1x73xsi8, 1> , %arg1: memref<1x1xsi8, 1> , %arg2: memref<1x1xsi16, 1> , %arg3: memref<1x73xsi8, 1>) {
%alloc = memref.alloc() {alignment = 8 : i64} : memref<1x73xsi8, 3>
%alloc_0 = memref.alloc() {alignment = 8 : i64} : memref<1x1xsi16, 3>
%alloc_1 = memref.alloc() {alignment = 8 : i64} : memref<1x1xsi8, 3>
memref.copy %arg1, %alloc_1 : memref<1x1xsi8, 1> to memref<1x1xsi8, 3>
memref.copy %arg2, %alloc_0 : memref<1x1xsi16, 1> to memref<1x1xsi16, 3>
call @noop(%alloc_1, %alloc_0, %arg0) :
(memref<1x1xsi8, 3>, memref<1x1xsi16, 3>, memref<1x73xsi8, 1>) -> ()
return
}
func.func @main(%arg0: memref<1x73xsi8, 1> , %arg1: memref<1x1xsi8, 1> , %arg2: memref<1x1xsi16, 1>) -> (memref<1x73xsi8, 1> ) {
%alloc = memref.alloc() : memref<1x73xsi8, 1>
call @fn_return_void_with_unused_argument(%arg0, %arg1, %arg2, %alloc) : (memref<1x73xsi8, 1>, memref<1x1xsi8, 1>, memref<1x1xsi16, 1>, memref<1x73xsi8, 1>) -> ()
return %alloc : memref<1x73xsi8, 1>
}
}