Index: llvm/trunk/lib/Transforms/Utils/Local.cpp =================================================================== --- llvm/trunk/lib/Transforms/Utils/Local.cpp +++ llvm/trunk/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/trunk/test/Transforms/SafeStack/X86/debug-loc2.ll =================================================================== --- llvm/trunk/test/Transforms/SafeStack/X86/debug-loc2.ll +++ llvm/trunk/test/Transforms/SafeStack/X86/debug-loc2.ll @@ -25,6 +25,10 @@ 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 call void @capture(i32* nonnull %x1), !dbg !17 @@ -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)