Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: src/compiler/instruction.h

Issue 1485183002: [turbofan] Deopt support for escape analysis (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@ea-local
Patch Set: Rebase Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/frame-states.cc ('k') | src/compiler/instruction.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_COMPILER_INSTRUCTION_H_ 5 #ifndef V8_COMPILER_INSTRUCTION_H_
6 #define V8_COMPILER_INSTRUCTION_H_ 6 #define V8_COMPILER_INSTRUCTION_H_
7 7
8 #include <deque> 8 #include <deque>
9 #include <iosfwd> 9 #include <iosfwd>
10 #include <map> 10 #include <map>
11 #include <set> 11 #include <set>
12 12
13 #include "src/compiler/common-operator.h" 13 #include "src/compiler/common-operator.h"
14 #include "src/compiler/frame.h" 14 #include "src/compiler/frame.h"
15 #include "src/compiler/instruction-codes.h" 15 #include "src/compiler/instruction-codes.h"
16 #include "src/compiler/opcodes.h" 16 #include "src/compiler/opcodes.h"
17 #include "src/compiler/source-position.h" 17 #include "src/compiler/source-position.h"
18 #include "src/macro-assembler.h" 18 #include "src/macro-assembler.h"
19 #include "src/register-configuration.h" 19 #include "src/register-configuration.h"
20 #include "src/zone-allocator.h" 20 #include "src/zone-allocator.h"
21 21
22 namespace v8 { 22 namespace v8 {
23 namespace internal { 23 namespace internal {
24 namespace compiler { 24 namespace compiler {
25 25
26 // Forward declarations.
26 class Schedule; 27 class Schedule;
27 28
29
28 class InstructionOperand { 30 class InstructionOperand {
29 public: 31 public:
30 static const int kInvalidVirtualRegister = -1; 32 static const int kInvalidVirtualRegister = -1;
31 33
32 // TODO(dcarney): recover bit. INVALID can be represented as UNALLOCATED with 34 // TODO(dcarney): recover bit. INVALID can be represented as UNALLOCATED with
33 // kInvalidVirtualRegister and some DCHECKS. 35 // kInvalidVirtualRegister and some DCHECKS.
34 enum Kind { INVALID, UNALLOCATED, CONSTANT, IMMEDIATE, EXPLICIT, ALLOCATED }; 36 enum Kind { INVALID, UNALLOCATED, CONSTANT, IMMEDIATE, EXPLICIT, ALLOCATED };
35 37
36 InstructionOperand() : InstructionOperand(INVALID) {} 38 InstructionOperand() : InstructionOperand(INVALID) {}
37 39
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 explicit InstructionOperand(Kind kind) : value_(KindField::encode(kind)) {} 103 explicit InstructionOperand(Kind kind) : value_(KindField::encode(kind)) {}
102 104
103 inline uint64_t GetCanonicalizedValue() const; 105 inline uint64_t GetCanonicalizedValue() const;
104 106
105 class KindField : public BitField64<Kind, 0, 3> {}; 107 class KindField : public BitField64<Kind, 0, 3> {};
106 108
107 uint64_t value_; 109 uint64_t value_;
108 }; 110 };
109 111
110 112
113 typedef ZoneVector<InstructionOperand> InstructionOperandVector;
114
115
111 struct PrintableInstructionOperand { 116 struct PrintableInstructionOperand {
112 const RegisterConfiguration* register_configuration_; 117 const RegisterConfiguration* register_configuration_;
113 InstructionOperand op_; 118 InstructionOperand op_;
114 }; 119 };
115 120
116 121
117 std::ostream& operator<<(std::ostream& os, 122 std::ostream& operator<<(std::ostream& os,
118 const PrintableInstructionOperand& op); 123 const PrintableInstructionOperand& op);
119 124
120 125
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 DCHECK_EQ(kHeapObject, type()); 939 DCHECK_EQ(kHeapObject, type());
935 return bit_cast<Handle<HeapObject> >(static_cast<intptr_t>(value_)); 940 return bit_cast<Handle<HeapObject> >(static_cast<intptr_t>(value_));
936 } 941 }
937 942
938 private: 943 private:
939 Type type_; 944 Type type_;
940 int64_t value_; 945 int64_t value_;
941 }; 946 };
942 947
943 948
949 std::ostream& operator<<(std::ostream& os, const Constant& constant);
950
951
952 // Forward declarations.
953 class FrameStateDescriptor;
954
955
956 enum class StateValueKind { kPlain, kNested, kDuplicate };
957
958
959 class StateValueDescriptor {
960 public:
961 explicit StateValueDescriptor(Zone* zone)
962 : kind_(StateValueKind::kPlain),
963 type_(MachineType::AnyTagged()),
964 id_(0),
965 fields_(zone) {}
966
967 static StateValueDescriptor Plain(Zone* zone, MachineType type) {
968 return StateValueDescriptor(StateValueKind::kPlain, zone, type, 0);
969 }
970 static StateValueDescriptor Recursive(Zone* zone, size_t id) {
971 return StateValueDescriptor(StateValueKind::kNested, zone,
972 MachineType::AnyTagged(), id);
973 }
974 static StateValueDescriptor Duplicate(Zone* zone, size_t id) {
975 return StateValueDescriptor(StateValueKind::kDuplicate, zone,
976 MachineType::AnyTagged(), id);
977 }
978
979 size_t size() { return fields_.size(); }
980 ZoneVector<StateValueDescriptor>& fields() { return fields_; }
981 int IsPlain() { return kind_ == StateValueKind::kPlain; }
982 int IsNested() { return kind_ == StateValueKind::kNested; }
983 int IsDuplicate() { return kind_ == StateValueKind::kDuplicate; }
984 MachineType type() const { return type_; }
985 MachineType GetOperandType(size_t index) const {
986 return fields_[index].type_;
987 }
988 size_t id() const { return id_; }
989
990 private:
991 StateValueDescriptor(StateValueKind kind, Zone* zone, MachineType type,
992 size_t id)
993 : kind_(kind), type_(type), id_(id), fields_(zone) {}
994
995 StateValueKind kind_;
996 MachineType type_;
997 size_t id_;
998 ZoneVector<StateValueDescriptor> fields_;
999 };
1000
1001
944 class FrameStateDescriptor : public ZoneObject { 1002 class FrameStateDescriptor : public ZoneObject {
945 public: 1003 public:
946 FrameStateDescriptor(Zone* zone, FrameStateType type, BailoutId bailout_id, 1004 FrameStateDescriptor(Zone* zone, FrameStateType type, BailoutId bailout_id,
947 OutputFrameStateCombine state_combine, 1005 OutputFrameStateCombine state_combine,
948 size_t parameters_count, size_t locals_count, 1006 size_t parameters_count, size_t locals_count,
949 size_t stack_count, 1007 size_t stack_count,
950 MaybeHandle<SharedFunctionInfo> shared_info, 1008 MaybeHandle<SharedFunctionInfo> shared_info,
951 FrameStateDescriptor* outer_state = nullptr); 1009 FrameStateDescriptor* outer_state = nullptr);
952 1010
953 FrameStateType type() const { return type_; } 1011 FrameStateType type() const { return type_; }
954 BailoutId bailout_id() const { return bailout_id_; } 1012 BailoutId bailout_id() const { return bailout_id_; }
955 OutputFrameStateCombine state_combine() const { return frame_state_combine_; } 1013 OutputFrameStateCombine state_combine() const { return frame_state_combine_; }
956 size_t parameters_count() const { return parameters_count_; } 1014 size_t parameters_count() const { return parameters_count_; }
957 size_t locals_count() const { return locals_count_; } 1015 size_t locals_count() const { return locals_count_; }
958 size_t stack_count() const { return stack_count_; } 1016 size_t stack_count() const { return stack_count_; }
959 MaybeHandle<SharedFunctionInfo> shared_info() const { return shared_info_; } 1017 MaybeHandle<SharedFunctionInfo> shared_info() const { return shared_info_; }
960 FrameStateDescriptor* outer_state() const { return outer_state_; } 1018 FrameStateDescriptor* outer_state() const { return outer_state_; }
961 bool HasContext() const { 1019 bool HasContext() const {
962 return FrameStateFunctionInfo::IsJSFunctionType(type_); 1020 return FrameStateFunctionInfo::IsJSFunctionType(type_);
963 } 1021 }
964 1022
965 size_t GetSize(OutputFrameStateCombine combine = 1023 size_t GetSize(OutputFrameStateCombine combine =
966 OutputFrameStateCombine::Ignore()) const; 1024 OutputFrameStateCombine::Ignore()) const;
967 size_t GetTotalSize() const; 1025 size_t GetTotalSize() const;
968 size_t GetFrameCount() const; 1026 size_t GetFrameCount() const;
969 size_t GetJSFrameCount() const; 1027 size_t GetJSFrameCount() const;
970 1028
971 MachineType GetType(size_t index) const; 1029 MachineType GetType(size_t index) const {
972 void SetType(size_t index, MachineType type); 1030 return values_.GetOperandType(index);
1031 }
1032 StateValueDescriptor* GetStateValueDescriptor() { return &values_; }
973 1033
974 private: 1034 private:
975 FrameStateType type_; 1035 FrameStateType type_;
976 BailoutId bailout_id_; 1036 BailoutId bailout_id_;
977 OutputFrameStateCombine frame_state_combine_; 1037 OutputFrameStateCombine frame_state_combine_;
978 size_t parameters_count_; 1038 size_t parameters_count_;
979 size_t locals_count_; 1039 size_t locals_count_;
980 size_t stack_count_; 1040 size_t stack_count_;
981 ZoneVector<MachineType> types_; 1041 StateValueDescriptor values_;
982 MaybeHandle<SharedFunctionInfo> const shared_info_; 1042 MaybeHandle<SharedFunctionInfo> const shared_info_;
983 FrameStateDescriptor* outer_state_; 1043 FrameStateDescriptor* outer_state_;
984 }; 1044 };
985 1045
986 std::ostream& operator<<(std::ostream& os, const Constant& constant); 1046
1047 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector;
987 1048
988 1049
989 class PhiInstruction final : public ZoneObject { 1050 class PhiInstruction final : public ZoneObject {
990 public: 1051 public:
991 typedef ZoneVector<InstructionOperand> Inputs; 1052 typedef ZoneVector<InstructionOperand> Inputs;
992 1053
993 PhiInstruction(Zone* zone, int virtual_register, size_t input_count); 1054 PhiInstruction(Zone* zone, int virtual_register, size_t input_count);
994 1055
995 void SetInput(size_t offset, int virtual_register); 1056 void SetInput(size_t offset, int virtual_register);
996 1057
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1093 bool must_deconstruct_frame_; 1154 bool must_deconstruct_frame_;
1094 RpoNumber last_deferred_; 1155 RpoNumber last_deferred_;
1095 }; 1156 };
1096 1157
1097 typedef ZoneDeque<Constant> ConstantDeque; 1158 typedef ZoneDeque<Constant> ConstantDeque;
1098 typedef std::map<int, Constant, std::less<int>, 1159 typedef std::map<int, Constant, std::less<int>,
1099 zone_allocator<std::pair<const int, Constant> > > ConstantMap; 1160 zone_allocator<std::pair<const int, Constant> > > ConstantMap;
1100 1161
1101 typedef ZoneDeque<Instruction*> InstructionDeque; 1162 typedef ZoneDeque<Instruction*> InstructionDeque;
1102 typedef ZoneDeque<ReferenceMap*> ReferenceMapDeque; 1163 typedef ZoneDeque<ReferenceMap*> ReferenceMapDeque;
1103 typedef ZoneVector<FrameStateDescriptor*> DeoptimizationVector;
1104 typedef ZoneVector<InstructionBlock*> InstructionBlocks; 1164 typedef ZoneVector<InstructionBlock*> InstructionBlocks;
1105 1165
1166
1167 // Forward declarations.
1106 struct PrintableInstructionSequence; 1168 struct PrintableInstructionSequence;
1107 1169
1108 1170
1109 // Represents architecture-specific generated code before, during, and after 1171 // Represents architecture-specific generated code before, during, and after
1110 // register allocation. 1172 // register allocation.
1111 class InstructionSequence final : public ZoneObject { 1173 class InstructionSequence final : public ZoneObject {
1112 public: 1174 public:
1113 static InstructionBlocks* InstructionBlocksFor(Zone* zone, 1175 static InstructionBlocks* InstructionBlocksFor(Zone* zone,
1114 const Schedule* schedule); 1176 const Schedule* schedule);
1115 // Puts the deferred blocks last. 1177 // Puts the deferred blocks last.
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 1349
1288 1350
1289 std::ostream& operator<<(std::ostream& os, 1351 std::ostream& operator<<(std::ostream& os,
1290 const PrintableInstructionSequence& code); 1352 const PrintableInstructionSequence& code);
1291 1353
1292 } // namespace compiler 1354 } // namespace compiler
1293 } // namespace internal 1355 } // namespace internal
1294 } // namespace v8 1356 } // namespace v8
1295 1357
1296 #endif // V8_COMPILER_INSTRUCTION_H_ 1358 #endif // V8_COMPILER_INSTRUCTION_H_
OLDNEW
« no previous file with comments | « src/compiler/frame-states.cc ('k') | src/compiler/instruction.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698