diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index e4ef23c0094bd1..e213de2b73f4de 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -2514,7 +2514,7 @@ void coro::salvageDebugInfo( bool OutermostLoad = true; Value *Storage = DVI->getVariableLocationOp(0); Value *OriginalStorage = Storage; - while (auto *Inst = dyn_cast(Storage)) { + while (auto *Inst = dyn_cast_or_null(Storage)) { if (auto *LdInst = dyn_cast(Inst)) { Storage = LdInst->getOperand(0); // FIXME: This is a heuristic that works around the fact that @@ -2543,6 +2543,8 @@ void coro::salvageDebugInfo( Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, /*StackValue*/ false); } } + if (!Storage) + return; // Store a pointer to the coroutine frame object in an alloca so it // is available throughout the function when producing unoptimized diff --git a/llvm/test/Transforms/Coroutines/coro-debug.ll b/llvm/test/Transforms/Coroutines/coro-debug.ll index 1e86b656d62ea4..ec5924fc3ea900 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug.ll @@ -34,8 +34,10 @@ sw.bb: ; preds = %entry call void @llvm.dbg.declare(metadata i32 %direct, metadata !25, metadata !13), !dbg !14 call void @llvm.dbg.declare(metadata i32* %x.addr, metadata !12, metadata !13), !dbg !14 call void @llvm.dbg.declare(metadata i8** %coro_hdl, metadata !15, metadata !13), !dbg !16 - call void @llvm.dbg.declare(metadata i8* null, metadata !28, metadata !13), !dbg !16 call void @llvm.dbg.declare(metadata i32* %late_local, metadata !29, metadata !13), !dbg !16 + ; don't crash when encountering nonsensical debug info, verfifier doesn't yet reject these + call void @llvm.dbg.declare(metadata i8* null, metadata !28, metadata !13), !dbg !16 + call void @llvm.dbg.declare(metadata !{}, metadata !28, metadata !13), !dbg !16 br label %next, !dbg !18 next: