mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-21 03:32:21 +00:00
Revert "InstrProf: Don't keep a large sparse list around just to zero it"
This seems to be crashing on some buildbots. Reverting to investigate. This reverts commit r218879. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218881 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1476756523
commit
a740e5d8d6
@ -103,6 +103,8 @@ struct CounterExpression {
|
|||||||
class CounterExpressionBuilder {
|
class CounterExpressionBuilder {
|
||||||
/// \brief A list of all the counter expressions
|
/// \brief A list of all the counter expressions
|
||||||
llvm::SmallVector<CounterExpression, 16> Expressions;
|
llvm::SmallVector<CounterExpression, 16> Expressions;
|
||||||
|
/// \brief An array of terms used in expression simplification.
|
||||||
|
llvm::SmallVector<int, 16> Terms;
|
||||||
|
|
||||||
/// \brief Return the counter which corresponds to the given expression.
|
/// \brief Return the counter which corresponds to the given expression.
|
||||||
///
|
///
|
||||||
@ -111,19 +113,18 @@ class CounterExpressionBuilder {
|
|||||||
/// expression is added to the builder's collection of expressions.
|
/// expression is added to the builder's collection of expressions.
|
||||||
Counter get(const CounterExpression &E);
|
Counter get(const CounterExpression &E);
|
||||||
|
|
||||||
/// \brief Gather the terms of the expression tree for processing.
|
/// \brief Convert the expression tree represented by a counter
|
||||||
///
|
/// into a polynomial in the form of K1Counter1 + .. + KNCounterN
|
||||||
/// This collects each addition and subtraction referenced by the counter into
|
/// where K1 .. KN are integer constants that are stored in the Terms array.
|
||||||
/// a sequence that can be sorted and combined to build a simplified counter
|
void extractTerms(Counter C, int Sign = 1);
|
||||||
/// expression.
|
|
||||||
void extractTerms(Counter C, int Sign,
|
|
||||||
SmallVectorImpl<std::pair<unsigned, int>> &Terms);
|
|
||||||
|
|
||||||
/// \brief Simplifies the given expression tree
|
/// \brief Simplifies the given expression tree
|
||||||
/// by getting rid of algebraically redundant operations.
|
/// by getting rid of algebraically redundant operations.
|
||||||
Counter simplify(Counter ExpressionTree);
|
Counter simplify(Counter ExpressionTree);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
CounterExpressionBuilder(unsigned NumCounterValues);
|
||||||
|
|
||||||
ArrayRef<CounterExpression> getExpressions() const { return Expressions; }
|
ArrayRef<CounterExpression> getExpressions() const { return Expressions; }
|
||||||
|
|
||||||
/// \brief Return a counter that represents the expression
|
/// \brief Return a counter that represents the expression
|
||||||
|
@ -27,6 +27,10 @@ using namespace coverage;
|
|||||||
|
|
||||||
#define DEBUG_TYPE "coverage-mapping"
|
#define DEBUG_TYPE "coverage-mapping"
|
||||||
|
|
||||||
|
CounterExpressionBuilder::CounterExpressionBuilder(unsigned NumCounterValues) {
|
||||||
|
Terms.resize(NumCounterValues);
|
||||||
|
}
|
||||||
|
|
||||||
Counter CounterExpressionBuilder::get(const CounterExpression &E) {
|
Counter CounterExpressionBuilder::get(const CounterExpression &E) {
|
||||||
for (unsigned I = 0, S = Expressions.size(); I < S; ++I) {
|
for (unsigned I = 0, S = Expressions.size(); I < S; ++I) {
|
||||||
if (Expressions[I] == E)
|
if (Expressions[I] == E)
|
||||||
@ -36,68 +40,50 @@ Counter CounterExpressionBuilder::get(const CounterExpression &E) {
|
|||||||
return Counter::getExpression(Expressions.size() - 1);
|
return Counter::getExpression(Expressions.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CounterExpressionBuilder::extractTerms(
|
void CounterExpressionBuilder::extractTerms(Counter C, int Sign) {
|
||||||
Counter C, int Sign, SmallVectorImpl<std::pair<unsigned, int>> &Terms) {
|
|
||||||
switch (C.getKind()) {
|
switch (C.getKind()) {
|
||||||
case Counter::Zero:
|
case Counter::Zero:
|
||||||
break;
|
break;
|
||||||
case Counter::CounterValueReference:
|
case Counter::CounterValueReference:
|
||||||
Terms.push_back(std::make_pair(C.getCounterID(), Sign));
|
Terms[C.getCounterID()] += Sign;
|
||||||
break;
|
break;
|
||||||
case Counter::Expression:
|
case Counter::Expression:
|
||||||
const auto &E = Expressions[C.getExpressionID()];
|
const auto &E = Expressions[C.getExpressionID()];
|
||||||
extractTerms(E.LHS, Sign, Terms);
|
extractTerms(E.LHS, Sign);
|
||||||
extractTerms(E.RHS, E.Kind == CounterExpression::Subtract ? -Sign : Sign,
|
extractTerms(E.RHS, E.Kind == CounterExpression::Subtract ? -Sign : Sign);
|
||||||
Terms);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Counter CounterExpressionBuilder::simplify(Counter ExpressionTree) {
|
Counter CounterExpressionBuilder::simplify(Counter ExpressionTree) {
|
||||||
// Gather constant terms.
|
// Gather constant terms.
|
||||||
llvm::SmallVector<std::pair<unsigned, int>, 32> Terms;
|
for (auto &I : Terms)
|
||||||
extractTerms(ExpressionTree, +1, Terms);
|
I = 0;
|
||||||
|
extractTerms(ExpressionTree);
|
||||||
// Group the terms by counter ID.
|
|
||||||
std::sort(Terms.begin(), Terms.end(),
|
|
||||||
[](const std::pair<unsigned, int> &LHS,
|
|
||||||
const std::pair<unsigned, int> &RHS) {
|
|
||||||
return LHS.first < RHS.first;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Combine terms by counter ID to eliminate counters that sum to zero.
|
|
||||||
auto Prev = Terms.begin();
|
|
||||||
for (auto I = Prev + 1, E = Terms.end(); I != E; ++I) {
|
|
||||||
if (I->first == Prev->first) {
|
|
||||||
Prev->second += I->second;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
++Prev;
|
|
||||||
*Prev = *I;
|
|
||||||
}
|
|
||||||
Terms.erase(++Prev, Terms.end());
|
|
||||||
|
|
||||||
Counter C;
|
Counter C;
|
||||||
// Create additions. We do this before subtractions to avoid constructs like
|
// Create additions.
|
||||||
// ((0 - X) + Y), as opposed to (Y - X).
|
// Note: the additions are created first
|
||||||
for (auto Term : Terms) {
|
// to avoid creation of a tree like ((0 - X) + Y) instead of (Y - X).
|
||||||
if (Term.second <= 0)
|
for (unsigned I = 0, S = Terms.size(); I < S; ++I) {
|
||||||
|
if (Terms[I] <= 0)
|
||||||
continue;
|
continue;
|
||||||
for (int I = 0; I < Term.second; ++I)
|
for (int J = 0; J < Terms[I]; ++J) {
|
||||||
if (C.isZero())
|
if (C.isZero())
|
||||||
C = Counter::getCounter(Term.first);
|
C = Counter::getCounter(I);
|
||||||
else
|
else
|
||||||
C = get(CounterExpression(CounterExpression::Add, C,
|
C = get(CounterExpression(CounterExpression::Add, C,
|
||||||
Counter::getCounter(Term.first)));
|
Counter::getCounter(I)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create subtractions.
|
// Create subtractions.
|
||||||
for (auto Term : Terms) {
|
for (unsigned I = 0, S = Terms.size(); I < S; ++I) {
|
||||||
if (Term.second >= 0)
|
if (Terms[I] >= 0)
|
||||||
continue;
|
continue;
|
||||||
for (int I = 0; I < -Term.second; ++I)
|
for (int J = 0; J < (-Terms[I]); ++J)
|
||||||
C = get(CounterExpression(CounterExpression::Subtract, C,
|
C = get(CounterExpression(CounterExpression::Subtract, C,
|
||||||
Counter::getCounter(Term.first)));
|
Counter::getCounter(I)));
|
||||||
}
|
}
|
||||||
return C;
|
return C;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user