Skip to content

Commit 2ae5011

Browse files
committed
[Coroutines] Handle CallBrInst in SalvageDebugInfo
Reviewed by: StephenTozer Differential Revision: https://reviews.llvm.org/D115139
1 parent 5d27abe commit 2ae5011

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

llvm/lib/Transforms/Coroutines/CoroFrame.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2574,6 +2574,8 @@ void coro::salvageDebugInfo(
25742574
if (!isa<DbgValueInst>(DVI)) {
25752575
if (auto *II = dyn_cast<InvokeInst>(Storage))
25762576
DVI->moveBefore(II->getNormalDest()->getFirstNonPHI());
2577+
else if (auto *CBI = dyn_cast<CallBrInst>(Storage))
2578+
DVI->moveBefore(CBI->getDefaultDest()->getFirstNonPHI());
25772579
else if (auto *InsertPt = dyn_cast<Instruction>(Storage)) {
25782580
assert(!InsertPt->isTerminator() &&
25792581
"Unimaged terminator that could return a storage.");

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,18 @@ sw.epilog: ; preds = %sw.bb
5656
%4 = load i32, i32* %x.addr, align 4, !dbg !20
5757
%add = add nsw i32 %4, 1, !dbg !21
5858
store i32 %add, i32* %x.addr, align 4, !dbg !22
59-
br label %coro_Cleanup, !dbg !23
59+
%asm_res = callbr i32 asm "", "=r,r,X"(i32 %x, i8* blockaddress(@f, %indirect.dest))
60+
to label %coro_Cleanup [label %indirect.dest]
61+
62+
indirect.dest:
63+
call void @log(), !dbg !18
64+
br label %coro_Cleanup
6065

6166
coro_Cleanup: ; preds = %sw.epilog, %sw.bb1
6267
%5 = load i8*, i8** %coro_hdl, align 8, !dbg !24
6368
%6 = call i8* @llvm.coro.free(token %0, i8* %5), !dbg !24
6469
call void @free(i8* %6), !dbg !24
70+
call void @llvm.dbg.declare(metadata i32 %asm_res, metadata !32, metadata !13), !dbg !16
6571
br label %coro_Suspend, !dbg !24
6672

6773
coro_Suspend: ; preds = %coro_Cleanup, %sw.default
@@ -89,6 +95,7 @@ declare token @llvm.coro.id(i32, i8* readnone, i8* nocapture readonly, i8*) #2
8995
declare i8* @malloc(i64) #3
9096
declare i8* @allocate()
9197
declare void @print({ i8*, i32 })
98+
declare void @log()
9299

93100
; Function Attrs: nounwind readnone
94101
declare i64 @llvm.coro.size.i64() #4
@@ -162,9 +169,10 @@ attributes #7 = { noduplicate }
162169
!29 = !DILocalVariable(name: "partial_dead", scope: !6, file: !7, line: 55, type: !11)
163170
!30 = !DILocalVariable(name: "direct_value", scope: !6, file: !7, line: 55, type: !11)
164171
!31 = !DILocalVariable(name: "allocated", scope: !6, file: !7, line: 55, type: !11)
172+
!32 = !DILocalVariable(name: "inline_asm", scope: !6, file: !7, line: 55, type: !11)
165173

166174
; CHECK: define i8* @f(i32 %x) #0 personality i32 0 !dbg ![[ORIG:[0-9]+]]
167-
; CHECK: define internal fastcc void @f.resume(%f.Frame* noalias nonnull align 8 dereferenceable(32) %FramePtr) #0 personality i32 0 !dbg ![[RESUME:[0-9]+]]
175+
; CHECK: define internal fastcc void @f.resume(%f.Frame* noalias nonnull align 8 dereferenceable(40) %FramePtr) #0 personality i32 0 !dbg ![[RESUME:[0-9]+]]
168176
; CHECK: entry.resume:
169177
; CHECK: %[[DBG_PTR:.*]] = alloca %f.Frame*
170178
; CHECK: call void @llvm.dbg.declare(metadata %f.Frame** %[[DBG_PTR]], metadata ![[RESUME_COROHDL:[0-9]+]], metadata !DIExpression(DW_OP_deref, DW_OP_plus_uconst,
@@ -182,8 +190,12 @@ attributes #7 = { noduplicate }
182190
; CHECK-NEXT: to label %[[NORMAL_DEST:.+]] unwind
183191
; CHECK: [[NORMAL_DEST]]
184192
; CHEKC-NEXT: call void @llvm.dbg.declare(metadata i8* %[[ALLOCATED_STORAGE]]
185-
; CHECK: define internal fastcc void @f.destroy(%f.Frame* noalias nonnull align 8 dereferenceable(32) %FramePtr) #0 personality i32 0 !dbg ![[DESTROY:[0-9]+]]
186-
; CHECK: define internal fastcc void @f.cleanup(%f.Frame* noalias nonnull align 8 dereferenceable(32) %FramePtr) #0 personality i32 0 !dbg ![[CLEANUP:[0-9]+]]
193+
; CHECK: %[[CALLBR_RES:.+]] = callbr i32 asm
194+
; CHECK-NEXT: to label %[[DEFAULT_DEST:.+]] [label
195+
; CHECK: [[DEFAULT_DEST]]:
196+
; CHECK-NEXT: call void @llvm.dbg.declare(metadata i32 %[[CALLBR_RES]]
197+
; CHECK: define internal fastcc void @f.destroy(%f.Frame* noalias nonnull align 8 dereferenceable(40) %FramePtr) #0 personality i32 0 !dbg ![[DESTROY:[0-9]+]]
198+
; CHECK: define internal fastcc void @f.cleanup(%f.Frame* noalias nonnull align 8 dereferenceable(40) %FramePtr) #0 personality i32 0 !dbg ![[CLEANUP:[0-9]+]]
187199

188200
; CHECK: ![[ORIG]] = distinct !DISubprogram(name: "f", linkageName: "flink"
189201

0 commit comments

Comments
 (0)