mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
fix PR6858: a dangling pointer use bug which was caused
by switching CachedFunctionInfo from a std::map to a ValueMap (which is implemented in terms of a DenseMap). DenseMap has different iterator invalidation semantics than std::map. This should hopefully fix the dragonegg builder. llvm-svn: 101658
This commit is contained in:
parent
d506ae2617
commit
a5eb6419eb
@ -319,8 +319,13 @@ InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS,
|
||||
FunctionInfo &CallerFI = CachedFunctionInfo[Caller];
|
||||
|
||||
// If we haven't calculated this information yet, do so now.
|
||||
if (CallerFI.Metrics.NumBlocks == 0)
|
||||
if (CallerFI.Metrics.NumBlocks == 0) {
|
||||
CallerFI.analyzeFunction(Caller);
|
||||
|
||||
// Recompute the CalleeFI pointer, getting Caller could have invalidated
|
||||
// it.
|
||||
CalleeFI = &CachedFunctionInfo[Callee];
|
||||
}
|
||||
|
||||
// Don't inline a callee with dynamic alloca into a caller without them.
|
||||
// Functions containing dynamic alloca's are inefficient in various ways;
|
||||
@ -426,6 +431,8 @@ InlineCostAnalyzer::growCachedCostInfo(Function *Caller, Function *Callee) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Since CalleeMetrics were already calculated, we know that the CallerMetrics
|
||||
// reference isn't invalidated: both were in the DenseMap.
|
||||
CallerMetrics.NeverInline |= CalleeMetrics.NeverInline;
|
||||
CallerMetrics.usesDynamicAlloca |= CalleeMetrics.usesDynamicAlloca;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user