Skip to content

Commit cdf2d97

Browse files
committed
Auto upgrade bitcode to new vararg representation for coro.id.retcon.once intrinsic
The signature of coro.id.retcon.once intrinsic was modified in #10015 with an extra vararg. This commit adds an auto upgrader to LLVM in order to be compatible with compilers generating old bitcode (intrinsic without the vararg). rdar://147426562 (cherry picked from commit bb25095)
1 parent ab4d429 commit cdf2d97

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

Diff for: llvm/lib/IR/AutoUpgrade.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,13 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn,
11021102
return true;
11031103
}
11041104

1105+
if (F->arg_size() == 6 && Name == "coro.id.retcon.once") {
1106+
rename(F);
1107+
NewFn = Intrinsic::getDeclaration(F->getParent(),
1108+
Intrinsic::coro_id_retcon_once);
1109+
return true;
1110+
}
1111+
11051112
break;
11061113
}
11071114
case 'd':
@@ -4509,6 +4516,12 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
45094516
break;
45104517
}
45114518

4519+
case Intrinsic::coro_id_retcon_once: {
4520+
SmallVector<Value *, 8> Args(CI->args());
4521+
NewCall = Builder.CreateCall(NewFn, Args);
4522+
break;
4523+
}
4524+
45124525
case Intrinsic::vector_extract: {
45134526
StringRef Name = F->getName();
45144527
Name = Name.substr(5); // Strip llvm
+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s
2+
3+
target datalayout = "p:64:64:64"
4+
5+
declare void @prototype_f(ptr, i1)
6+
7+
declare noalias ptr @allocate(i32 %size)
8+
declare void @deallocate(ptr %ptr)
9+
declare void @init(ptr %ptr)
10+
declare void @use(ptr %ptr)
11+
declare void @use_addr_val(i64 %val, ptr %addr)
12+
13+
define { ptr, ptr } @f(ptr %buffer) presplitcoroutine {
14+
entry:
15+
%tmp = alloca { i64, i64 }, align 8
16+
%proj.1 = getelementptr inbounds { i64, i64 }, ptr %tmp, i64 0, i32 0
17+
%proj.2 = getelementptr inbounds { i64, i64 }, ptr %tmp, i64 0, i32 1
18+
store i64 0, ptr %proj.1, align 8
19+
store i64 0, ptr %proj.2, align 8
20+
%escape_addr = ptrtoint ptr %tmp to i64
21+
%id = call token (i32, i32, ptr, ptr, ptr, ptr) @llvm.coro.id.retcon.once(i32 32, i32 8, ptr %buffer, ptr @prototype_f, ptr @allocate, ptr @deallocate)
22+
%hdl = call ptr @llvm.coro.begin(token %id, ptr null)
23+
%proj.2.2 = getelementptr inbounds { i64, i64 }, ptr %tmp, i64 0, i32 1
24+
call void @init(ptr %proj.1)
25+
call void @init(ptr %proj.2.2)
26+
call void @use_addr_val(i64 %escape_addr, ptr %tmp)
27+
%abort = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %tmp)
28+
br i1 %abort, label %end, label %resume
29+
30+
resume:
31+
call void @use(ptr %tmp)
32+
br label %end
33+
34+
end:
35+
call i1 @llvm.coro.end(ptr %hdl, i1 0, token none)
36+
unreachable
37+
}
38+
; Make sure we don't lose writes to the frame.
39+
; CHECK-LABEL: define { ptr, ptr } @f(ptr %buffer) {
40+
; CHECK: [[PROJ2:%.*]] = getelementptr inbounds { i64, i64 }, ptr %buffer, i64 0, i32 1
41+
; CHECK: store i64 0, ptr %buffer
42+
; CHECK: store i64 0, ptr [[PROJ2]]
43+
; CHECK: [[ESCAPED_ADDR:%.*]] = ptrtoint ptr %buffer to i64
44+
; CHECK: call void @init(ptr %buffer)
45+
; CHECK: call void @init(ptr [[PROJ2]])
46+
; CHECK: call void @use_addr_val(i64 [[ESCAPED_ADDR]], ptr %buffer)
47+
48+
; CHECK-LABEL: define internal void @f.resume.0(ptr {{.*}} %0, i1 %1) {
49+
; CHECK: resume:
50+
; CHECK: call void @use(ptr %0)
51+
52+
declare token @llvm.coro.id.retcon.once(i32, i32, ptr, ptr, ptr, ptr)
53+
declare ptr @llvm.coro.begin(token, ptr)
54+
declare i1 @llvm.coro.suspend.retcon.i1(...)
55+
declare i1 @llvm.coro.end(ptr, i1, token)
56+

0 commit comments

Comments
 (0)