Index: llvm/lib/Transforms/Utils/Local.cpp =================================================================== --- llvm/lib/Transforms/Utils/Local.cpp +++ llvm/lib/Transforms/Utils/Local.cpp @@ -1599,13 +1599,8 @@ // Insert the offset before the first deref. // We could just change the offset argument of dbg.value, but it's unsigned... - if (Offset) { - SmallVector Ops; - DIExpression::appendOffset(Ops, Offset); - Ops.append(DIExpr->elements_begin() + 1, DIExpr->elements_end()); - Ops.push_back(dwarf::DW_OP_deref); - DIExpr = Builder.createExpression(Ops); - } + if (Offset) + DIExpr = DIExpression::prepend(DIExpr, 0, Offset); Builder.insertDbgValueIntrinsic(NewAddress, DIVar, DIExpr, Loc, DVI); DVI->eraseFromParent(); Index: llvm/test/Transforms/SafeStack/X86/debug-loc2.ll =================================================================== --- llvm/test/Transforms/SafeStack/X86/debug-loc2.ll +++ llvm/test/Transforms/SafeStack/X86/debug-loc2.ll @@ -24,6 +24,10 @@ ; CHECK: call void @llvm.dbg.value(metadata ![[EMPTY]], metadata !{{.*}}, metadata !{{.*}}) tail call void @llvm.dbg.value(metadata i32* %x1, metadata !10, metadata !24), !dbg !16 +; Supported dbg.value: rewritted based on the [[USP]] value. +; CHECK: call void @llvm.dbg.value(metadata i8* %[[USP]], metadata ![[X1:.*]], metadata !DIExpression(DW_OP_constu, 4, DW_OP_minus, DW_OP_deref, DW_OP_LLVM_fragment, 0, 4)) + tail call void @llvm.dbg.value(metadata i32* %x1, metadata !10, metadata !25), !dbg !16 + ; Supported dbg.value: rewritted based on the [[USP]] value. ; CHECK: call void @llvm.dbg.value(metadata i8* %[[USP]], metadata ![[X1:.*]], metadata !DIExpression(DW_OP_constu, 4, DW_OP_minus, DW_OP_deref)) tail call void @llvm.dbg.value(metadata i32* %x1, metadata !10, metadata !15), !dbg !16 @@ -94,3 +98,4 @@ !22 = !DILexicalBlockFile(scope: !6, file: !1, discriminator: 1) !23 = !DIExpression() !24 = !DIExpression(DW_OP_constu, 42, DW_OP_minus) +!25 = !DIExpression(DW_OP_deref, DW_OP_LLVM_fragment, 0, 4)