Index: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp @@ -1654,6 +1654,9 @@ for(auto *GVe : GVs){ DIGlobalVariable *DGV = GVe->getVariable(); DIExpression *E = GVe->getExpression(); + const DataLayout &DL = GV->getParent()->getDataLayout(); + unsigned SizeInOctets = + DL.getTypeAllocSizeInBits(NewGV->getType()->getElementType()) / 8; // It is expected that the address of global optimized variable is on // top of the stack. After optimization, value of that variable will @@ -1664,8 +1667,9 @@ // DW_OP_deref DW_OP_constu // DW_OP_mul DW_OP_constu DW_OP_plus DW_OP_stack_value SmallVector Ops = { - dwarf::DW_OP_deref, dwarf::DW_OP_constu, ValMinus, - dwarf::DW_OP_mul, dwarf::DW_OP_constu, ValInit, + dwarf::DW_OP_deref_size, SizeInOctets, + dwarf::DW_OP_constu, ValMinus, + dwarf::DW_OP_mul, dwarf::DW_OP_constu, ValInit, dwarf::DW_OP_plus}; E = DIExpression::prependOpcodes(E, Ops, DIExpression::WithStackValue); DIGlobalVariableExpression *DGVE = Index: llvm/trunk/test/Transforms/GlobalOpt/integer-bool-dwarf.ll =================================================================== --- llvm/trunk/test/Transforms/GlobalOpt/integer-bool-dwarf.ll +++ llvm/trunk/test/Transforms/GlobalOpt/integer-bool-dwarf.ll @@ -2,7 +2,7 @@ ;CHECK: @foo = internal unnamed_addr global i1 false, align 4, !dbg ![[VAR:.*]] ;CHECK: ![[VAR]] = !DIGlobalVariableExpression(var: !1, expr: -;CHECK-SAME: !DIExpression(DW_OP_deref, DW_OP_constu, 111, DW_OP_mul, +;CHECK-SAME: !DIExpression(DW_OP_deref_size, 1, DW_OP_constu, 111, DW_OP_mul, ;CHECK-SAME: DW_OP_constu, 0, DW_OP_plus, DW_OP_stack_value, ;CHECK-SAME: DW_OP_LLVM_fragment, 0, 1))