Index: lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- lib/Transforms/IPO/GlobalOpt.cpp +++ lib/Transforms/IPO/GlobalOpt.cpp @@ -1610,35 +1610,40 @@ // If initialized to zero and storing one into the global, we can use a cast // instead of a select to synthesize the desired value. bool IsOneZero = false; + bool EmitOneOrZero = true; if (ConstantInt *CI = dyn_cast(OtherVal)){ IsOneZero = InitVal->isNullValue() && CI->isOne(); - ConstantInt *CIInit = dyn_cast(GV->getInitializer()); - uint64_t ValInit = CIInit->getZExtValue(); - uint64_t ValOther = CI->getZExtValue(); - uint64_t ValMinus = ValOther - ValInit; - - for(auto *GVe : GVs){ - DIGlobalVariable *DGV = GVe->getVariable(); - DIExpression *E = GVe->getExpression(); - - // val * (ValOther - ValInit) + ValInit: - // DW_OP_deref DW_OP_constu - // DW_OP_mul DW_OP_constu DW_OP_plus DW_OP_stack_value - E = DIExpression::get(NewGV->getContext(), - {dwarf::DW_OP_deref, - dwarf::DW_OP_constu, - ValMinus, - dwarf::DW_OP_mul, - dwarf::DW_OP_constu, - ValInit, - dwarf::DW_OP_plus, - dwarf::DW_OP_stack_value}); - DIGlobalVariableExpression *DGVE = - DIGlobalVariableExpression::get(NewGV->getContext(), DGV, E); - NewGV->addDebugInfo(DGVE); + if (ConstantInt *CIInit = dyn_cast(GV->getInitializer())){ + uint64_t ValInit = CIInit->getZExtValue(); + uint64_t ValOther = CI->getZExtValue(); + uint64_t ValMinus = ValOther - ValInit; + + for(auto *GVe : GVs){ + DIGlobalVariable *DGV = GVe->getVariable(); + DIExpression *E = GVe->getExpression(); + + // val * (ValOther - ValInit) + ValInit: + // DW_OP_deref DW_OP_constu + // DW_OP_mul DW_OP_constu DW_OP_plus DW_OP_stack_value + E = DIExpression::get(NewGV->getContext(), + {dwarf::DW_OP_deref, + dwarf::DW_OP_constu, + ValMinus, + dwarf::DW_OP_mul, + dwarf::DW_OP_constu, + ValInit, + dwarf::DW_OP_plus, + dwarf::DW_OP_stack_value}); + DIGlobalVariableExpression *DGVE = + DIGlobalVariableExpression::get(NewGV->getContext(), DGV, E); + NewGV->addDebugInfo(DGVE); + } + EmitOneOrZero = false; } - } else { + } + + if (EmitOneOrZero) { // FIXME: This will only emit address for debugger on which will // be written only 0 or 1. for(auto *GV : GVs)