// Copyright 2013 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_CRANKSHAFT_HYDROGEN_CHECK_ELIMINATION_H_
#define V8_CRANKSHAFT_HYDROGEN_CHECK_ELIMINATION_H_
#include "src/crankshaft/hydrogen.h"
#include "src/crankshaft/hydrogen-alias-analysis.h"
namespace v8 {
namespace internal {
// Remove CheckMaps instructions through flow- and branch-sensitive analysis.
class HCheckEliminationPhase : public HPhase {
public:
explicit HCheckEliminationPhase(HGraph* graph)
: HPhase("H_Check Elimination", graph), aliasing_(),
string_maps_(kStringMapsSize, zone()) {
// Compute the set of string maps.
#define ADD_STRING_MAP(type, size, name, Name) \
string_maps_.Add(Unique<Map>::CreateImmovable( \
graph->isolate()->factory()->name##_map()), zone());
STRING_TYPE_LIST(ADD_STRING_MAP)
#undef ADD_STRING_MAP
DCHECK_EQ(kStringMapsSize, string_maps_.size());
#ifdef DEBUG
redundant_ = 0;
removed_ = 0;
removed_cho_ = 0;
removed_cit_ = 0;
narrowed_ = 0;
loads_ = 0;
empty_ = 0;
compares_true_ = 0;
compares_false_ = 0;
transitions_ = 0;
#endif
}
void Run();
friend class HCheckTable;
private:
const UniqueSet<Map>* string_maps() const { return &string_maps_; }
void PrintStats();
HAliasAnalyzer* aliasing_;
#define COUNT(type, size, name, Name) + 1
static const int kStringMapsSize = 0 STRING_TYPE_LIST(COUNT);
#undef COUNT
UniqueSet<Map> string_maps_;
#ifdef DEBUG
int redundant_;
int removed_;
int removed_cho_;
int removed_cit_;
int narrowed_;
int loads_;
int empty_;
int compares_true_;
int compares_false_;
int transitions_;
#endif
};
} // namespace internal
} // namespace v8
#endif // V8_CRANKSHAFT_HYDROGEN_CHECK_ELIMINATION_H_