35 if (block->needs_frame())
continue;
36 for (
int i = block->code_start(); i < block->code_end(); ++
i) {
38 if (
instr->IsCall() ||
instr->IsDeoptimizeCall() ||
39 instr->arch_opcode() == ArchOpcode::kArchStackPointerGreaterThan ||
40 instr->arch_opcode() == ArchOpcode::kArchFramePointer) {
41 block->mark_needs_frame();
44 if (
instr->arch_opcode() == ArchOpcode::kArchStackSlot &&
45 ((
instr->InputAt(0)->IsImmediate() &&
57 block->mark_needs_frame();
71 if (block->needs_frame()) {
73 if (block->predecessors().empty()) {
74 block->mark_must_construct_frame();
75 if (block->SuccessorCount() == 0) {
81 if (last->IsRet() || last->IsJump()) {
82 block->mark_must_deconstruct_frame();
88 for (
RpoNumber& succ : block->successors()) {
93 if (last->IsThrow() || last->IsTailCall() ||
94 last->IsDeoptimizeCall()) {
100 DCHECK(last->IsRet() || last->IsJump());
101 block->mark_must_deconstruct_frame();
104 if (block->SuccessorCount() == 0) {
108 if (last->IsRet() || last->IsJump()) {
109 block->mark_must_deconstruct_frame();
114 for (
RpoNumber& succ : block->successors()) {
142 if (block->needs_frame())
return false;
149 if (block->successors().empty())
return false;
154 for (
RpoNumber& pred : block->predecessors()) {
157 block->mark_needs_frame();
163 bool need_frame_successors =
false;
164 if (block->SuccessorCount() == 1) {
166 need_frame_successors =
174 for (
RpoNumber& succ : block->successors()) {
179 need_frame_successors =
true;
186 if (need_frame_successors) {
187 block->mark_needs_frame();