summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/instruction-selector-impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/instruction-selector-impl.h')
-rw-r--r--deps/v8/src/compiler/instruction-selector-impl.h37
1 files changed, 28 insertions, 9 deletions
diff --git a/deps/v8/src/compiler/instruction-selector-impl.h b/deps/v8/src/compiler/instruction-selector-impl.h
index 5cca8880d5..e750aed19a 100644
--- a/deps/v8/src/compiler/instruction-selector-impl.h
+++ b/deps/v8/src/compiler/instruction-selector-impl.h
@@ -303,22 +303,32 @@ class FlagsContinuation final {
DCHECK_NOT_NULL(false_block);
}
- // Creates a new flags continuation from the given condition and result node.
- FlagsContinuation(FlagsCondition condition, Node* result)
- : mode_(kFlags_set), condition_(condition), result_(result) {
- DCHECK_NOT_NULL(result);
+ // Creates a new flags continuation for an eager deoptimization exit.
+ static FlagsContinuation ForDeoptimize(FlagsCondition condition,
+ Node* frame_state) {
+ return FlagsContinuation(kFlags_deoptimize, condition, frame_state);
+ }
+
+ // Creates a new flags continuation for a boolean value.
+ static FlagsContinuation ForSet(FlagsCondition condition, Node* result) {
+ return FlagsContinuation(kFlags_set, condition, result);
}
bool IsNone() const { return mode_ == kFlags_none; }
bool IsBranch() const { return mode_ == kFlags_branch; }
+ bool IsDeoptimize() const { return mode_ == kFlags_deoptimize; }
bool IsSet() const { return mode_ == kFlags_set; }
FlagsCondition condition() const {
DCHECK(!IsNone());
return condition_;
}
+ Node* frame_state() const {
+ DCHECK(IsDeoptimize());
+ return frame_state_or_result_;
+ }
Node* result() const {
DCHECK(IsSet());
- return result_;
+ return frame_state_or_result_;
}
BasicBlock* true_block() const {
DCHECK(IsBranch());
@@ -355,11 +365,20 @@ class FlagsContinuation final {
}
private:
- FlagsMode mode_;
+ FlagsContinuation(FlagsMode mode, FlagsCondition condition,
+ Node* frame_state_or_result)
+ : mode_(mode),
+ condition_(condition),
+ frame_state_or_result_(frame_state_or_result) {
+ DCHECK_NOT_NULL(frame_state_or_result);
+ }
+
+ FlagsMode const mode_;
FlagsCondition condition_;
- Node* result_; // Only valid if mode_ == kFlags_set.
- BasicBlock* true_block_; // Only valid if mode_ == kFlags_branch.
- BasicBlock* false_block_; // Only valid if mode_ == kFlags_branch.
+ Node* frame_state_or_result_; // Only valid if mode_ == kFlags_deoptimize
+ // or mode_ == kFlags_set.
+ BasicBlock* true_block_; // Only valid if mode_ == kFlags_branch.
+ BasicBlock* false_block_; // Only valid if mode_ == kFlags_branch.
};
} // namespace compiler