mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 13:06:09 +00:00
Fix crash in LLVM Dialect inliner interface: add support for llvm.return
The LLVM inliner was missing the `handleTerminator` method in the Dialect interface implementation. Fixes #60093 Differential Revision: https://reviews.llvm.org/D141901
This commit is contained in:
parent
9d7da415d2
commit
6a9933519d
@ -2871,6 +2871,21 @@ struct LLVMInlinerInterface : public DialectInlinerInterface {
|
||||
})
|
||||
.Default([](auto) { return false; });
|
||||
}
|
||||
/// Handle the given inlined terminator by replacing it with a new operation
|
||||
/// as necessary. Required when the region has only one block.
|
||||
void handleTerminator(Operation *op,
|
||||
ArrayRef<Value> valuesToRepl) const final {
|
||||
|
||||
// Only handle "llvm.return" here.
|
||||
auto returnOp = dyn_cast<ReturnOp>(op);
|
||||
if (!returnOp)
|
||||
return;
|
||||
|
||||
// Replace the values directly with the return operands.
|
||||
assert(returnOp.getNumOperands() == valuesToRepl.size());
|
||||
for (const auto &it : llvm::enumerate(returnOp.getOperands()))
|
||||
valuesToRepl[it.index()].replaceAllUsesWith(it.value());
|
||||
}
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
|
@ -56,3 +56,17 @@ func.func @test_not_inline(%ptr : !llvm.ptr) -> () {
|
||||
call @with_mem_attr(%ptr) : (!llvm.ptr) -> ()
|
||||
return
|
||||
}
|
||||
|
||||
// -----
|
||||
// Check that llvm.return is correctly handled
|
||||
|
||||
func.func @func(%arg0 : i32) -> i32 {
|
||||
llvm.return %arg0 : i32
|
||||
}
|
||||
// CHECK-LABEL: @llvm_ret
|
||||
// CHECK-NOT: call
|
||||
// CHECK: return %arg0
|
||||
func.func @llvm_ret(%arg0 : i32) -> i32 {
|
||||
%res = call @func(%arg0) : (i32) -> (i32)
|
||||
return %res : i32
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user