Skip to content

Commit 840f921

Browse files
committed
[Transforms] Fix Coroutine transform on non-default addressspaces
Summary: This pass tries to get a pointer from the global. Some targets, like AMDGPU, emit globals to a qualified address space. This would result in an invalid cast. To fix this, we simply apply an addrspace cast, which is a no-op if none exit. Fixes: #102095
1 parent 88d2884 commit 840f921

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

llvm/lib/Transforms/Coroutines/CoroEarly.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ static void buildDebugInfoForNoopResumeDestroyFunc(Function *NoopFn) {
121121
}
122122

123123
void Lowerer::lowerCoroNoop(IntrinsicInst *II) {
124+
LLVMContext &C = Builder.getContext();
124125
if (!NoopCoro) {
125-
LLVMContext &C = Builder.getContext();
126126
Module &M = *II->getModule();
127127

128128
// Create a noop.frame struct type.
@@ -152,7 +152,8 @@ void Lowerer::lowerCoroNoop(IntrinsicInst *II) {
152152
}
153153

154154
Builder.SetInsertPoint(II);
155-
auto *NoopCoroVoidPtr = Builder.CreateBitCast(NoopCoro, Int8Ptr);
155+
auto *NoopCoroVoidPtr =
156+
Builder.CreateAddrSpaceCast(NoopCoro, PointerType::getUnqual(C));
156157
II->replaceAllUsesWith(NoopCoroVoidPtr);
157158
II->eraseFromParent();
158159
}

llvm/test/Transforms/Coroutines/coro-noop.ll

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
; Tests that CoroEarly pass correctly lowers coro.noop
2-
; RUN: opt < %s -S -passes=coro-early | FileCheck %s
2+
; RUN: opt -S -passes=coro-early < %s | FileCheck %s
3+
; RUN: opt -mtriple=amdgcn-- -S -passes=coro-early < %s | FileCheck %s --check-prefix=AMDGPU
34

45
; CHECK: %NoopCoro.Frame = type { ptr, ptr }
56
; CHECK: @NoopCoro.Frame.Const = private constant %NoopCoro.Frame { ptr @__NoopCoro_ResumeDestroy, ptr @__NoopCoro_ResumeDestroy }
7+
; AMDGPU: @NoopCoro.Frame.Const = private addrspace(1) constant %NoopCoro.Frame { ptr @__NoopCoro_ResumeDestroy, ptr @__NoopCoro_ResumeDestroy }
68

79

810
; CHECK-LABEL: @noop(
911
define ptr @noop() {
1012
; CHECK-NEXT: entry
1113
entry:
1214
; CHECK-NEXT: ret ptr @NoopCoro.Frame.Const
15+
; AMDGPU: ret ptr addrspacecast (ptr addrspace(1) @NoopCoro.Frame.Const to ptr)
1316
%n = call ptr @llvm.coro.noop()
1417
ret ptr %n
1518
}

0 commit comments

Comments
 (0)