Index: llvm/lib/Transforms/Coroutines/CoroFrame.cpp =================================================================== --- llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -2527,22 +2527,21 @@ OutermostLoad = false; } else if (auto *StInst = dyn_cast(Storage)) { Storage = StInst->getOperand(0); - } else if (auto *GEPInst = dyn_cast(Storage)) { + } else if (auto *Inst = dyn_cast(Storage)) { SmallVector Ops; SmallVector AdditionalValues; - Storage = llvm::salvageDebugInfoImpl( - *GEPInst, Expr ? Expr->getNumLocationOperands() : 0, Ops, + Value *Op = llvm::salvageDebugInfoImpl( + *Inst, Expr ? Expr->getNumLocationOperands() : 0, Ops, AdditionalValues); - if (!Storage) + if (!Op) break; // Debug declares cannot currently handle additional location // operands. if (!AdditionalValues.empty()) break; + Storage = Op; Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, /*StackValue*/false); - } else if (auto *BCInst = dyn_cast(Storage)) - Storage = BCInst->getOperand(0); - else + } else break; } if (!Storage) Index: llvm/test/Transforms/Coroutines/coro-debug.ll =================================================================== --- llvm/test/Transforms/Coroutines/coro-debug.ll +++ llvm/test/Transforms/Coroutines/coro-debug.ll @@ -154,7 +154,7 @@ ; CHECK: call void @llvm.dbg.declare(metadata %f.Frame** %[[DBG_PTR]], metadata ![[RESUME_DIRECT:[0-9]+]], metadata !DIExpression(DW_OP_deref, DW_OP_plus_uconst, [[EXPR_TAIL]]) ; CHECK: store %f.Frame* {{.*}}, %f.Frame** %[[DBG_PTR]] ; CHECK-NOT: alloca %struct.test* -; CHECK: call void @llvm.dbg.declare(metadata i32 0, metadata ![[RESUME_CONST:[0-9]+]], metadata !DIExpression()) +; CHECK: call void @llvm.dbg.declare(metadata i8 0, metadata ![[RESUME_CONST:[0-9]+]], metadata !DIExpression(DW_OP_LLVM_convert, 8, DW_ATE_signed, DW_OP_LLVM_convert, 32, DW_ATE_signed)) ; Note that keeping the undef value here could be acceptable, too. ; CHECK-NOT: call void @llvm.dbg.declare(metadata i32* undef, metadata !{{[0-9]+}}, metadata !DIExpression()) ; CHECK: call void @coro.devirt.trigger(i8* null)