blob: 8136b78fb5627e9dfc0fd875810aad113a32533f [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sts=4 et sw=4 tw=99:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef jit_IonAnalysis_h
#define jit_IonAnalysis_h
// This file declares various analysis passes that operate on MIR.
#include "IonAllocPolicy.h"
#include "MIR.h"
namespace js {
namespace jit {
class MIRGenerator;
class MIRGraph;
bool
SplitCriticalEdges(MIRGraph &graph);
enum Observability {
ConservativeObservability,
AggressiveObservability
};
bool
EliminatePhis(MIRGenerator *mir, MIRGraph &graph, Observability observe);
bool
EliminateDeadResumePointOperands(MIRGenerator *mir, MIRGraph &graph);
bool
EliminateDeadCode(MIRGenerator *mir, MIRGraph &graph);
bool
ApplyTypeInformation(MIRGenerator *mir, MIRGraph &graph);
bool
RenumberBlocks(MIRGraph &graph);
bool
BuildDominatorTree(MIRGraph &graph);
bool
BuildPhiReverseMapping(MIRGraph &graph);
void
AssertBasicGraphCoherency(MIRGraph &graph);
void
AssertGraphCoherency(MIRGraph &graph);
void
AssertExtendedGraphCoherency(MIRGraph &graph);
bool
EliminateRedundantChecks(MIRGraph &graph);
bool
UnsplitEdges(LIRGraph *lir);
class MDefinition;
// Simple linear sum of the form 'n' or 'x + n'.
struct SimpleLinearSum
{
MDefinition *term;
int32_t constant;
SimpleLinearSum(MDefinition *term, int32_t constant)
: term(term), constant(constant)
{}
};
SimpleLinearSum
ExtractLinearSum(MDefinition *ins);
bool
ExtractLinearInequality(MTest *test, BranchDirection direction,
SimpleLinearSum *plhs, MDefinition **prhs, bool *plessEqual);
struct LinearTerm
{
MDefinition *term;
int32_t scale;
LinearTerm(MDefinition *term, int32_t scale)
: term(term), scale(scale)
{
}
};
// General linear sum of the form 'x1*n1 + x2*n2 + ... + n'
class LinearSum
{
public:
LinearSum()
: constant_(0)
{
}
LinearSum(const LinearSum &other)
: constant_(other.constant_)
{
terms_.append(other.terms_);
}
bool multiply(int32_t scale);
bool add(const LinearSum &other);
bool add(MDefinition *term, int32_t scale);
bool add(int32_t constant);
int32_t constant() const { return constant_; }
size_t numTerms() const { return terms_.length(); }
LinearTerm term(size_t i) const { return terms_[i]; }
void print(Sprinter &sp) const;
private:
Vector<LinearTerm, 2, IonAllocPolicy> terms_;
int32_t constant_;
};
} // namespace jit
} // namespace js
#endif /* jit_IonAnalysis_h */