5#ifndef V8_COMPILER_TURBOSHAFT_STRING_ESCAPE_ANALYSIS_REDUCER_H_
6#define V8_COMPILER_TURBOSHAFT_STRING_ESCAPE_ANALYSIS_REDUCER_H_
37 graph.op_id_count(), false,
zone_, &graph),
132 return data.og_index;
136 return data.ig_index;
140 if (
kind != other.kind)
return false;
143 return ig_index() == other.ig_index();
144 case Kind::kNotElided:
145 return og_index() == other.og_index();
158 if (
v8_flags.turboshaft_string_concat_escape_analysis) {
167 return Next::ReduceInputGraphStringConcat(ig_index, op);
169 if (!
v8_flags.turboshaft_string_concat_escape_analysis)
goto no_change;
182 return Next::ReduceInputGraphFrameState(ig_index, frame_state);
184 if (!
v8_flags.turboshaft_string_concat_escape_analysis)
goto no_change;
194 return Next::ReduceInputGraphStringLength(ig_index, op);
196 if (!
v8_flags.turboshaft_string_concat_escape_analysis)
goto no_change;
203 return __ UntagSmi(
__ MapToNewGraph(input->length()));
220 for (uint32_t
id = 0;
id <
string_ids_.size();
id++) {
225 uint32_t new_id =
static_cast<uint32_t
>(
string_ids_.size());
227 return {new_id,
false};
256 if (input_frame_state.
inlined) {
277 for (
int i = 0;
i < info.parameter_count();
i++) {
285 for (
int i = 0;
i < info.local_count();
i++) {
290 for (
int i = 0;
i < info.stack_count();
i++) {
301 switch (it->current_instr()) {
303 case Instr::kInput: {
306 it->ConsumeInput(&type, &input);
312 builder->
AddInput(type,
__ MapToNewGraph(input));
316 case Instr::kDematerializedObject: {
318 uint32_t field_count;
319 it->ConsumeDematerializedObject(&old_id, &field_count);
321 for (uint32_t
i = 0;
i < field_count; ++
i) {
326 case Instr::kDematerializedObjectReference: {
328 it->ConsumeDematerializedObjectReference(&old_id);
332 case Instr::kArgumentsElements: {
334 it->ConsumeArgumentsElements(&type);
338 case Instr::kArgumentsLength:
339 it->ConsumeArgumentsLength();
342 case Instr::kRestLength:
343 it->ConsumeRestLength();
346 case Instr::kUnusedRegister:
347 it->ConsumeUnusedRegister();
350 case FrameStateData::Instr::kDematerializedStringConcat:
351 case FrameStateData::Instr::kDematerializedStringConcatReference:
371 std::pair<ElidedStringPart, ElidedStringPart> inputs =
396 &Asm().input_graph()};
#define REDUCE_INPUT_GRAPH(operation)
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static constexpr MachineType AnyTagged()
void AddArgumentsLength()
const FrameStateData * AllocateFrameStateData(const FrameStateInfo &info, Zone *zone)
void AddParentFrameState(V< FrameState > parent)
void AddDematerializedObject(uint32_t id, uint32_t field_count)
base::Vector< const OpIndex > Inputs()
void AddDematerializedStringConcat(uint32_t id)
void AddArgumentsElements(CreateArgumentsType type)
void AddInput(MachineType type, OpIndex input)
void AddDematerializedStringConcatReference(uint32_t id)
void AddDematerializedObjectReference(uint32_t id)
DuplicatedId GetDuplicatedIdForElidedString(ElidedStringPart index)
ZoneVector< ElidedStringPart > string_ids_
Deduplicator * clone(Zone *zone) const
Deduplicator(const ZoneVector< ElidedStringPart > &string_ids)
V< Word32 > REDUCE_INPUT_GRAPH StringLength(V< Word32 > ig_index, const StringLengthOp &op)
SparseOpIndexSideTable< Deduplicator * > deduplicators_
void BuildMaybeElidedString(FrameStateData::Builder *builder, ElidedStringPart maybe_elided, Deduplicator *deduplicator)
V< FrameState > BuildFrameState(const FrameStateOp &input_frame_state, OpIndex ig_index)
V< FrameState > REDUCE_INPUT_GRAPH FrameState(V< FrameState > ig_index, const FrameStateOp &frame_state)
void BuildFrameStateInput(FrameStateData::Builder *builder, FrameStateData::Iterator *it, Deduplicator *deduplicator)
V< String > REDUCE_INPUT_GRAPH StringConcat(V< String > ig_index, const StringConcatOp &op)
StringEscapeAnalyzer analyzer_
ZoneAbslFlatHashMap< V< String >, std::pair< ElidedStringPart, ElidedStringPart > > elided_strings_
ElidedStringPart GetElidedStringInput(V< String > ig_index)
bool IsEscaping(OpIndex idx) const
ZoneVector< V< String > > maybe_non_escaping_string_concats_
void MarkNextFrameStateInputAsEscaping(FrameStateData::Iterator *it)
void MarkAllInputsAsEscaping(const Operation &op)
void ProcessFrameState(V< FrameState > index, const FrameStateOp &framestate)
void MarkAsEscaping(OpIndex index)
bool ShouldReconstructFrameState(V< FrameState > idx)
uint32_t max_frame_state_input_count_
void RecursiveMarkAsShouldReconstruct(V< FrameState > idx)
StringEscapeAnalyzer(const Graph &graph, Zone *phase_zone)
FixedOpIndexSidetable< bool > escaping_operations_and_frame_states_to_reconstruct_
void RecursivelyMarkAllStringConcatInputsAsEscaping(const StringConcatOp *concat)
ZoneVector< V< FrameState > > maybe_to_reconstruct_frame_states_
void ProcessBlock(const Block &block)
void ReprocessStringConcats()
void ComputeFrameStatesToReconstruct()
#define TURBOSHAFT_REDUCER_BOILERPLATE(Name)
#define LABEL_BLOCK(label)
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
bool TryCast(Tagged< From > value, Tagged< To > *out)
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
OpIndex parent_frame_state() const
const FrameStateData * data
base::Vector< const OpIndex > state_values() const
V< String > og_index() const
bool operator==(const ElidedStringPart &other) const
V< String > ig_index() const
static ElidedStringPart NotElided(V< String > og_index)
ElidedStringPart(Kind kind, V< String > index)
static ElidedStringPart Invalid()
static ElidedStringPart Elided(V< String > ig_index)