15struct AddTypeAssertionsImpl {
20 SimplifiedOperatorBuilder* simplified =
jsgraph->simplified();
24 void ProcessBlock(BasicBlock* block);
25 void InsertAssertion(Node* asserted, Node* effect_successor);
28void AddTypeAssertionsImpl::Run() {
29 for (BasicBlock* block : *(
schedule->rpo_order())) {
34void AddTypeAssertionsImpl::ProcessBlock(BasicBlock* block) {
39 std::vector<Node*> pending;
40 bool inside_of_region =
false;
41 for (Node* node : *block) {
42 if (node->opcode() == IrOpcode::kBeginRegion) {
43 inside_of_region =
true;
44 }
else if (inside_of_region) {
45 if (node->opcode() == IrOpcode::kFinishRegion) {
46 inside_of_region =
false;
50 if (node->op()->EffectOutputCount() == 1 &&
51 node->op()->EffectInputCount() == 1) {
52 for (Node* pending_node : pending) {
53 InsertAssertion(pending_node, node);
57 if (node->opcode() == IrOpcode::kAssertType ||
58 node->opcode() == IrOpcode::kAllocate ||
59 node->opcode() == IrOpcode::kObjectState ||
60 node->opcode() == IrOpcode::kObjectId ||
61 node->opcode() == IrOpcode::kPhi || !NodeProperties::IsTyped(node) ||
62 node->opcode() == IrOpcode::kUnreachable) {
65 Type type = NodeProperties::GetType(node);
66 if (type.CanBeAsserted()) {
67 pending.push_back(node);
72void AddTypeAssertionsImpl::InsertAssertion(Node* asserted,
73 Node* effect_successor) {
74 Node* assertion = graph->NewNode(
75 simplified->AssertType(NodeProperties::GetType(asserted)), asserted,
76 NodeProperties::GetEffectInput(effect_successor));
77 NodeProperties::ReplaceEffectInput(effect_successor, assertion);
void AddTypeAssertions(JSGraph *jsgraph, Schedule *schedule, Zone *phase_zone)