Skip to content

Implement a specialization to remove unused actions from tables. #141

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 54 additions & 4 deletions core/specialization/passes/elim_dead_code.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "backends/p4tools/common/lib/table_utils.h"
#include "backends/p4tools/modules/flay/core/lib/return_macros.h"
#include "backends/p4tools/modules/flay/options.h"
#include "ir/indexed_vector.h"
#include "ir/node.h"
#include "ir/vector.h"
#include "lib/error.h"
Expand Down Expand Up @@ -83,14 +84,15 @@ const IR::Node *ElimDeadCode::preorder(IR::SwitchStatement *switchStmt) {
}
continue;
}
printInfo("---DEAD_CODE--- %1% can be deleted.", switchCase->label);
printInfo("---DEAD_CODE--- SwitchCase %1% can be deleted.", switchCase->label);
_eliminatedNodes.emplace_back(switchCase, nullptr);
printInfo("---DEAD_CODE--- Switchcase %1% can be deleted.", switchCase->label);
// We are removing a statement that had previous fall-through labels.
if (previousFallThrough && !filteredSwitchCases.empty() &&
switchCase->statement != nullptr) {
auto *previous = filteredSwitchCases.back()->clone();
printInfo("---DEAD_CODE--- Merging statements of %1% into %2%.", switchCase->label,
previous->label);
printInfo("---DEAD_CODE--- Merging statements of switchcase %1% into switchcase %2%.",
switchCase->label, previous->label);
previous->statement = switchCase->statement;
filteredSwitchCases.pop_back();
filteredSwitchCases.push_back(previous);
Expand Down Expand Up @@ -150,6 +152,54 @@ const IR::Node *ElimDeadCode::preorder(IR::Member *member) {
return result;
}

const IR::Node *ElimDeadCode::preorder(IR::P4Table *table) {
IR::IndexedVector<IR::ActionListElement> actionListVector;

ASSIGN_OR_RETURN_WITH_MESSAGE(const auto &defaultAction, table->getDefaultAction(), table,
::P4::error("Table %1% does not have a default action.", table));
ASSIGN_OR_RETURN_WITH_MESSAGE(
const auto &defaultActionCall, defaultAction.to<IR::MethodCallExpression>(), table,
::P4::error("%1% is not a method call expression.", defaultAction));

const auto *actionList = table->getActionList();
for (const auto *action : actionList->actionList) {
// Do not remove actions which have a default only annotation.
// Do not remove the default action.
if (action->getAnnotation(IR::Annotation::defaultOnlyAnnotation) != nullptr ||
defaultActionCall.method->toString() ==
action->expression->checkedTo<IR::MethodCallExpression>()->method->toString()) {
actionListVector.push_back(action);
continue;
}
auto reachabilityOpt = _reachabilityMap.get().isNodeReachable(action);
if (!reachabilityOpt.has_value()) {
actionListVector.push_back(action);
continue;
}
if (reachabilityOpt.value()) {
printInfo("---DEAD_CODE--- ActionListElement %1% will always be executed.", action);
actionListVector.clear();
actionListVector.push_back(action);
break;
}
_eliminatedNodes.emplace_back(action, nullptr);
printInfo("---DEAD_CODE--- ActionListElement %1% can be deleted.", action);
}
auto *newActionList = new IR::ActionList(actionListVector);
IR::TableProperties properties;
for (const auto *property : table->properties->properties) {
if (property->name == IR::TableProperties::actionsPropertyName) {
auto *newProp = property->clone();
newProp->value = newActionList;
properties.push_back(newProp);
} else {
properties.push_back(property);
}
}
table->properties = new IR::TableProperties(properties);
return table;
}

const IR::Node *ElimDeadCode::preorder(IR::MethodCallStatement *stmt) {
const auto *call = stmt->methodCall->method->to<IR::Member>();
RETURN_IF_FALSE(call != nullptr && call->member == IR::IApply::applyMethodName, stmt);
Expand All @@ -169,7 +219,7 @@ const IR::Node *ElimDeadCode::preorder(IR::MethodCallStatement *stmt) {
::P4::error("Table %1% does not have a default action.", tableDecl));
ASSIGN_OR_RETURN_WITH_MESSAGE(
const auto &defaultActionCall, defaultAction.to<IR::MethodCallExpression>(), stmt,
::P4::error("%1% is not a method call expression.", table.getDefaultAction()));
::P4::error("%1% is not a method call expression.", defaultAction));
for (const auto *action : tableActionList) {
// Do not remove the default action.
if (defaultActionCall.method->toString() ==
Expand Down
1 change: 1 addition & 0 deletions core/specialization/passes/elim_dead_code.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class ElimDeadCode : public Transform {
std::vector<EliminatedReplacedPair> _eliminatedNodes;

const IR::Node *preorder(IR::P4Parser *parser) override;
const IR::Node *preorder(IR::P4Table *p4Table) override;
const IR::Node *preorder(IR::IfStatement *stmt) override;
const IR::Node *preorder(IR::SwitchStatement *switchStmt) override;
const IR::Node *preorder(IR::MethodCallStatement *stmt) override;
Expand Down
1 change: 1 addition & 0 deletions targets/bmv2/test/testdata/action-two-params.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Eliminated node at line 69: actions = {actTbl; drop;}
Eliminated node at line 77: if (hdr.ipv4.isValid()) {
Replaced node at line 67: hdr.ipv4.dstAddr : exact; with 0
statement_count_before:2
Expand Down
2 changes: 2 additions & 0 deletions targets/bmv2/test/testdata/action_profile-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Eliminated node at line 37: actions = { drop; NoAction; }
Eliminated node at line 44: actions = { drop; NoAction; }
Eliminated node at line 50: indirect.apply();
Eliminated node at line 51: indirect_ws.apply();
Replaced node at line 43: key = { meta.hash1 : selector; } with 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Eliminated node at line 37: actions = { drop; NoAction; }
Eliminated node at line 49: actions = { drop; NoAction; }
Eliminated node at line 61: indirect.apply();
Eliminated node at line 62: indirect_ws.apply();
Replaced node at line 48: key = { meta.hash1 : selector; } with 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Eliminated node at line 52: actions = { drop; NoAction; }
Eliminated node at line 59: actions = { drop; NoAction; }
Eliminated node at line 65: indirect.apply();
Eliminated node at line 66: indirect_ws.apply();
Replaced node at line 58: key = { meta.hash1 : selector; } with 0
Expand Down
2 changes: 2 additions & 0 deletions targets/bmv2/test/testdata/action_selector_shared-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Eliminated node at line 39: actions = { drop; NoAction; }
Eliminated node at line 47: actions = { drop; NoAction; }
Eliminated node at line 53: indirect_ws.apply();
Eliminated node at line 54: indirect_ws_1.apply();
Replaced node at line 38: key = { meta.hash1 : selector; } with 0
Expand Down
1 change: 1 addition & 0 deletions targets/bmv2/test/testdata/annotation-inline-propagate.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Eliminated node at line 68: set_hdr;
Eliminated node at line 75: if (table1.apply().miss) {
statement_count_before:4
statement_count_after:4
Expand Down
2 changes: 2 additions & 0 deletions targets/bmv2/test/testdata/basic2-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Eliminated node at line 88: ipv4_forward;
Eliminated node at line 89: drop;
Eliminated node at line 100: ipv4_lpm.apply();
Replaced node at line 84: hdr.ipv4.dstAddr: ternary; with 0
Replaced node at line 85: hdr.ipv4.srcAddr: lpm; with 0
Expand Down
10 changes: 10 additions & 0 deletions targets/bmv2/test/testdata/basic_routing-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
Eliminated node at line 66: on_miss;
Eliminated node at line 67: rewrite_src_dst_mac;
Eliminated node at line 75: rewrite_mac.apply();
Eliminated node at line 97: set_vrf;
Eliminated node at line 106: on_miss;
Eliminated node at line 107: fib_hit_nexthop;
Eliminated node at line 117: on_miss;
Eliminated node at line 118: fib_hit_nexthop;
Eliminated node at line 128: on_miss;
Eliminated node at line 129: set_egress_details;
Eliminated node at line 138: set_bd;
Eliminated node at line 147: port_mapping.apply();
Eliminated node at line 148: bd.apply();
Eliminated node at line 150: on_miss: {
Expand Down
10 changes: 10 additions & 0 deletions targets/bmv2/test/testdata/config/basic_routing-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
Eliminated node at line 66: on_miss;
Eliminated node at line 67: rewrite_src_dst_mac;
Eliminated node at line 75: rewrite_mac.apply();
Eliminated node at line 97: set_vrf;
Eliminated node at line 106: on_miss;
Eliminated node at line 107: fib_hit_nexthop;
Eliminated node at line 117: on_miss;
Eliminated node at line 118: fib_hit_nexthop;
Eliminated node at line 128: on_miss;
Eliminated node at line 129: set_egress_details;
Eliminated node at line 138: set_bd;
Eliminated node at line 147: port_mapping.apply();
Eliminated node at line 148: bd.apply();
Eliminated node at line 150: on_miss: {
Expand Down
32 changes: 32 additions & 0 deletions targets/bmv2/test/testdata/config/dash-pipeline-v1model-bmv2.ref
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,45 @@ Eliminated node at line 574: meta.overlay_data.dmac = (overlay_dmac == 0 ? meta.
Eliminated node at line 365: hdr.u0_ethernet.dst_addr = (overlay_dmac == 0 ? hdr.u0_ethernet.dst_addr : overlay_dmac);
Eliminated node at line 365: hdr.u0_ethernet.dst_addr = (overlay_dmac == 0 ? hdr.u0_ethernet.dst_addr : overlay_dmac);
Eliminated node at line 365: hdr.u0_ethernet.dst_addr = (overlay_dmac == 0 ? hdr.u0_ethernet.dst_addr : overlay_dmac);
Eliminated node at line 1024: accept;
Eliminated node at line 1051: if (dash_tunnel_dscp_mode == dash_tunnel_dscp_mode_t.PIPE_MODEL) {
Eliminated node at line 1056: if (meta.is_overlay_ip_v6 == 1) {
Eliminated node at line 1074: if (meta.direction == dash_direction_t.OUTBOUND) {
Eliminated node at line 1098: set_eni_attrs;
Eliminated node at line 1114: permit;
Eliminated node at line 1126: tunnel_decap(hdr, meta);
Eliminated node at line 1127: tunnel_decap_pa_validate;
Eliminated node at line 1134: if (meta.is_overlay_ip_v6 == 1) {
Eliminated node at line 871: set_eni;
Eliminated node at line 486: permit;
Eliminated node at line 487: permit_and_continue;
Eliminated node at line 489: deny_and_continue;
Eliminated node at line 505: permit;
Eliminated node at line 506: permit_and_continue;
Eliminated node at line 508: deny_and_continue;
Eliminated node at line 524: permit;
Eliminated node at line 525: permit_and_continue;
Eliminated node at line 527: deny_and_continue;
Eliminated node at line 714: route_vnet_direct(hdr, meta);
Eliminated node at line 715: route_direct(hdr, meta);
Eliminated node at line 716: route_service_tunnel(hdr, meta);
Eliminated node at line 739: set_tunnel_mapping(hdr, meta);
Eliminated node at line 740: set_private_link_mapping(hdr, meta);
Eliminated node at line 754: set_vnet_attrs;
Eliminated node at line 486: permit;
Eliminated node at line 487: permit_and_continue;
Eliminated node at line 489: deny_and_continue;
Eliminated node at line 505: permit;
Eliminated node at line 506: permit_and_continue;
Eliminated node at line 508: deny_and_continue;
Eliminated node at line 524: permit;
Eliminated node at line 525: permit_and_continue;
Eliminated node at line 527: deny_and_continue;
Eliminated node at line 988: } else if (packet_action == 1) {
Eliminated node at line 897: if (meta.is_overlay_ip_v6 == 1) {
Eliminated node at line 901: if (meta.is_overlay_ip_v6 == 0) {
Eliminated node at line 911: check_ip_addr_family;
Eliminated node at line 923: set_policy_meter_class;
Eliminated node at line 1152: if (meta.is_fast_path_icmp_flow_redirection_packet) {
Eliminated node at line 1156: meta.encap_data.underlay_sip = hdr.u0_ipv4.dst_addr;
Eliminated node at line 1155: if (vip.apply().hit) {
Expand Down
41 changes: 41 additions & 0 deletions targets/bmv2/test/testdata/config/pins_middleblock.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,42 @@
Eliminated node at line 985: @proto_id(1) mark_for_tunnel_decap_and_set_vrf;
Eliminated node at line 849: @proto_id(1) disable_vlan_checks;
Eliminated node at line 1463: @proto_id(1) set_vrf;
Eliminated node at line 484: @proto_id(2) set_nexthop_id(local_metadata);
Eliminated node at line 485: @proto_id(3) set_wcmp_group_id;
Eliminated node at line 486: @proto_id(5) set_nexthop_id_and_metadata;
Eliminated node at line 487: @proto_id(6) set_wcmp_group_id_and_metadata;
Eliminated node at line 488: @proto_id(7) set_metadata_and_drop;
Eliminated node at line 500: @proto_id(2) set_nexthop_id(local_metadata);
Eliminated node at line 501: @proto_id(3) set_wcmp_group_id;
Eliminated node at line 502: @proto_id(5) set_nexthop_id_and_metadata;
Eliminated node at line 503: @proto_id(6) set_wcmp_group_id_and_metadata;
Eliminated node at line 504: @proto_id(7) set_metadata_and_drop;
Eliminated node at line 515: @proto_id(1) set_multicast_group_id;
Eliminated node at line 525: @proto_id(1) set_multicast_group_id;
Eliminated node at line 1219: @proto_id(1) acl_copy();
Eliminated node at line 1220: @proto_id(2) acl_trap();
Eliminated node at line 1221: @proto_id(3) acl_forward();
Eliminated node at line 1222: @proto_id(4) acl_mirror();
Eliminated node at line 1223: @proto_id(5) acl_drop(local_metadata);
Eliminated node at line 1336: @proto_id(4) acl_forward();
Eliminated node at line 1337: @proto_id(1) acl_mirror();
Eliminated node at line 1338: @proto_id(2) redirect_to_nexthop();
Eliminated node at line 1339: @proto_id(3) redirect_to_ipmc_group();
Eliminated node at line 1381: @proto_id(1) acl_forward();
Eliminated node at line 1382: @proto_id(2) acl_drop(local_metadata);
Eliminated node at line 1383: @proto_id(3) acl_deny();
Eliminated node at line 562: @proto_id(1) set_dst_mac;
Eliminated node at line 583: @proto_id(1) set_port_and_src_mac;
Eliminated node at line 584: @proto_id(2) set_port_and_src_mac_and_vlan_id;
Eliminated node at line 615: @proto_id(1) set_nexthop;
Eliminated node at line 616: @proto_id(2) set_p2p_tunnel_encap_nexthop;
Eliminated node at line 617: @proto_id(3) set_ip_nexthop;
Eliminated node at line 618: @proto_id(4) set_ip_nexthop_and_disable_rewrites;
Eliminated node at line 635: @proto_id(1) mark_for_p2p_tunnel_encap;
Eliminated node at line 648: @proto_id(1) set_nexthop_id(local_metadata);
Eliminated node at line 734: @proto_id(1) mirror_as_ipv4_erspan;
Eliminated node at line 735: @proto_id(2) mirror_with_vlan_tag_and_ipfix_encapsulation;
Eliminated node at line 708: @proto_id(1) ingress_clone;
Eliminated node at line 992: ipv6_tunnel_termination_table.apply();
Eliminated node at line 862: disable_vlan_checks_table.apply();
Eliminated node at line 1540: acl_pre_ingress_table.apply();
Expand All @@ -16,6 +55,8 @@ Eliminated node at line 660: if (local_metadata.nexthop_id_valid) {
Eliminated node at line 673: if (local_metadata.acl_drop) {
Eliminated node at line 742: if (local_metadata.marked_to_mirror) {
Eliminated node at line 712: ingress_clone_table.apply();
Eliminated node at line 931: @proto_id(1) set_multicast_src_mac;
Eliminated node at line 1061: @proto_id(1) acl_drop(local_metadata);
Eliminated node at line (unknown):
Eliminated node at line 936: multicast_router_interface_table.apply();
Eliminated node at line 946: if (local_metadata.enable_src_mac_rewrite) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Eliminated node at line 68: check();
Eliminated node at line 77: toggle_check.apply();
Eliminated node at line 80: if (check_l3) {
statement_count_before:7
Expand Down
1 change: 1 addition & 0 deletions targets/bmv2/test/testdata/control-hs-index-test6.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Eliminated node at line 47: actions = { set_data; }
Eliminated node at line 51: t.apply();
statement_count_before:13
statement_count_after:8
Expand Down
1 change: 1 addition & 0 deletions targets/bmv2/test/testdata/copyprop1.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Eliminated node at line 33: actions = { a1; }
Eliminated node at line 40: t1.apply();
Eliminated node at line 42: t1.apply();
statement_count_before:7
Expand Down
2 changes: 2 additions & 0 deletions targets/bmv2/test/testdata/custom-type-restricted-fields.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Eliminated node at line 151: set_addr;
Eliminated node at line 152: my_drop;
Eliminated node at line 158: t1.apply();
statement_count_before:9
statement_count_after:8
Expand Down
38 changes: 38 additions & 0 deletions targets/bmv2/test/testdata/dash-pipeline-v1model-bmv2.ref
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,53 @@ Eliminated node at line 335: hdr.customer_ethernet.dst_addr = (overlay_dmac == 0
Eliminated node at line 365: hdr.u0_ethernet.dst_addr = (overlay_dmac == 0 ? hdr.u0_ethernet.dst_addr : overlay_dmac);
Eliminated node at line 365: hdr.u0_ethernet.dst_addr = (overlay_dmac == 0 ? hdr.u0_ethernet.dst_addr : overlay_dmac);
Eliminated node at line 365: hdr.u0_ethernet.dst_addr = (overlay_dmac == 0 ? hdr.u0_ethernet.dst_addr : overlay_dmac);
Eliminated node at line 1024: accept;
Eliminated node at line 1038: set_appliance;
Eliminated node at line 1051: if (dash_tunnel_dscp_mode == dash_tunnel_dscp_mode_t.PIPE_MODEL) {
Eliminated node at line 1056: if (meta.is_overlay_ip_v6 == 1) {
Eliminated node at line 1074: if (meta.direction == dash_direction_t.OUTBOUND) {
Eliminated node at line 1098: set_eni_attrs;
Eliminated node at line 1114: permit;
Eliminated node at line 1126: tunnel_decap(hdr, meta);
Eliminated node at line 1127: tunnel_decap_pa_validate;
Eliminated node at line 1134: if (meta.is_overlay_ip_v6 == 1) {
Eliminated node at line 1138: if (meta.is_overlay_ip_v6 == 0) {
Eliminated node at line 1148: set_acl_group_attrs();
Eliminated node at line 848: set_outbound_direction;
Eliminated node at line 871: set_eni;
Eliminated node at line 486: permit;
Eliminated node at line 487: permit_and_continue;
Eliminated node at line 489: deny_and_continue;
Eliminated node at line 505: permit;
Eliminated node at line 506: permit_and_continue;
Eliminated node at line 508: deny_and_continue;
Eliminated node at line 524: permit;
Eliminated node at line 525: permit_and_continue;
Eliminated node at line 527: deny_and_continue;
Eliminated node at line 713: route_vnet(hdr, meta);
Eliminated node at line 714: route_vnet_direct(hdr, meta);
Eliminated node at line 715: route_direct(hdr, meta);
Eliminated node at line 716: route_service_tunnel(hdr, meta);
Eliminated node at line 739: set_tunnel_mapping(hdr, meta);
Eliminated node at line 740: set_private_link_mapping(hdr, meta);
Eliminated node at line 754: set_vnet_attrs;
Eliminated node at line 486: permit;
Eliminated node at line 487: permit_and_continue;
Eliminated node at line 489: deny_and_continue;
Eliminated node at line 505: permit;
Eliminated node at line 506: permit_and_continue;
Eliminated node at line 508: deny_and_continue;
Eliminated node at line 524: permit;
Eliminated node at line 525: permit_and_continue;
Eliminated node at line 527: deny_and_continue;
Eliminated node at line 987: meta.dropped = true;
Eliminated node at line 988: } else if (packet_action == 1) {
Eliminated node at line 1000: pkt_act;
Eliminated node at line 897: if (meta.is_overlay_ip_v6 == 1) {
Eliminated node at line 901: if (meta.is_overlay_ip_v6 == 0) {
Eliminated node at line 911: check_ip_addr_family;
Eliminated node at line 923: set_policy_meter_class;
Eliminated node at line 939: meter_bucket_action;
Eliminated node at line 1152: if (meta.is_fast_path_icmp_flow_redirection_packet) {
Eliminated node at line 1156: meta.encap_data.underlay_sip = hdr.u0_ipv4.dst_addr;
Eliminated node at line 1155: if (vip.apply().hit) {
Expand Down
2 changes: 2 additions & 0 deletions targets/bmv2/test/testdata/flag_lost-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
Eliminated node at line 79: ipv4_forward; drop;
Eliminated node at line 79: ipv4_forward; drop;
Eliminated node at line 89: ipv4_lpm.apply();
Eliminated node at line (unknown):
statement_count_before:9
Expand Down
10 changes: 10 additions & 0 deletions targets/bmv2/test/testdata/flowlet_switching-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
Eliminated node at line 95: rewrite_mac;
Eliminated node at line 96: _drop;
Eliminated node at line 106: send_frame.apply();
Eliminated node at line 141: _drop;
Eliminated node at line 142: set_ecmp_select;
Eliminated node at line 153: _drop;
Eliminated node at line 154: set_nhop;
Eliminated node at line 165: lookup_flowlet_map;
Eliminated node at line 172: set_dmac;
Eliminated node at line 173: _drop;
Eliminated node at line 184: update_flowlet_id;
Eliminated node at line 191: flowlet.apply();
Eliminated node at line 192: if (meta.ingress_metadata.flow_ipg > 32w50000)
Eliminated node at line 195: ecmp_group.apply();
Expand Down
1 change: 1 addition & 0 deletions targets/bmv2/test/testdata/gauntlet_action_return-bmv2.ref
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
Eliminated node at line 25: val = 8w2;
Eliminated node at line 39: do_action(h.h.a);
Eliminated node at line 43: simple_table.apply();
Replaced node at line 36: tmp_key : exact @name("bKiScA") ; with 2
statement_count_before:9
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Eliminated node at line 42: dummy();
Eliminated node at line 49: dummy: {
Eliminated node at line 56: do_action();
statement_count_before:8
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Eliminated node at line 37: exit_action();
Eliminated node at line 42: simple_table.apply();
statement_count_before:6
statement_count_after:3
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

Eliminated node at line 40: simple_action();
statement_count_before:6
statement_count_after:3
cyclomatic_complexity:5
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

Eliminated node at line 35: simple_action();
statement_count_before:6
statement_count_after:4
cyclomatic_complexity:5
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

Eliminated node at line 35: exit_action();
statement_count_before:6
statement_count_after:3
cyclomatic_complexity:4
Expand Down
Loading
Loading