diff options
Diffstat (limited to 'llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp b/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp index f005280..ad3ad99 100644 --- a/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp +++ b/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp @@ -2269,14 +2269,14 @@ static bool removeRedundantDbgLocsUsingBackwardScan(const BasicBlock *BB, FunctionVarLocsBuilder &FnVarLocs) { bool Changed = false; - SmallDenseMap<DebugAggregate, BitVector> VariableDefinedBits; + SmallDenseMap<DebugAggregate, BitVector> VariableDefinedBytes; // Scan over the entire block, not just over the instructions mapped by // FnVarLocs, because wedges in FnVarLocs may only be seperated by debug // instructions. for (const Instruction &I : reverse(*BB)) { if (!isa<DbgVariableIntrinsic>(I)) { // Sequence of consecutive defs ended. Clear map for the next one. - VariableDefinedBits.clear(); + VariableDefinedBytes.clear(); } // Get the location defs that start just before this instruction. @@ -2295,9 +2295,15 @@ removeRedundantDbgLocsUsingBackwardScan(const BasicBlock *BB, DebugAggregate Aggr = getAggregate(FnVarLocs.getVariable(RIt->VariableID)); uint64_t SizeInBits = Aggr.first->getSizeInBits().value_or(0); + uint64_t SizeInBytes = divideCeil(SizeInBits, 8); - if (SizeInBits == 0) { + // Cutoff for large variables to prevent expensive bitvector operations. + const uint64_t MaxSizeBytes = 2048; + + if (SizeInBytes == 0 || SizeInBytes > MaxSizeBytes) { // If the size is unknown (0) then keep this location def to be safe. + // Do the same for defs of large variables, which would be expensive + // to represent with a BitVector. NewDefsReversed.push_back(*RIt); continue; } @@ -2305,23 +2311,24 @@ removeRedundantDbgLocsUsingBackwardScan(const BasicBlock *BB, // Only keep this location definition if it is not fully eclipsed by // other definitions in this wedge that come after it - // Inert the bits the location definition defines. + // Inert the bytes the location definition defines. auto InsertResult = - VariableDefinedBits.try_emplace(Aggr, BitVector(SizeInBits)); + VariableDefinedBytes.try_emplace(Aggr, BitVector(SizeInBytes)); bool FirstDefinition = InsertResult.second; - BitVector &DefinedBits = InsertResult.first->second; + BitVector &DefinedBytes = InsertResult.first->second; DIExpression::FragmentInfo Fragment = RIt->Expr->getFragmentInfo().value_or( DIExpression::FragmentInfo(SizeInBits, 0)); bool InvalidFragment = Fragment.endInBits() > SizeInBits; + uint64_t StartInBytes = Fragment.startInBits() / 8; + uint64_t EndInBytes = divideCeil(Fragment.endInBits(), 8); - // If this defines any previously undefined bits, keep it. + // If this defines any previously undefined bytes, keep it. if (FirstDefinition || InvalidFragment || - DefinedBits.find_first_unset_in(Fragment.startInBits(), - Fragment.endInBits()) != -1) { + DefinedBytes.find_first_unset_in(StartInBytes, EndInBytes) != -1) { if (!InvalidFragment) - DefinedBits.set(Fragment.startInBits(), Fragment.endInBits()); + DefinedBytes.set(StartInBytes, EndInBytes); NewDefsReversed.push_back(*RIt); continue; } |