Skip to content

Commit 04e0fd2

Browse files
committed
Allow constant folding of serializable enums of different types
Signed-off-by: Chris Dodd <[email protected]>
1 parent 19c7641 commit 04e0fd2

File tree

7 files changed

+304
-2
lines changed

7 files changed

+304
-2
lines changed

frontends/common/constantFolding.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -461,8 +461,7 @@ const IR::Node *DoConstantFolding::compare(const IR::Operation_Binary *e) {
461461
if (typesKnown) {
462462
auto le = EnumInstance::resolve(eleft, typeMap);
463463
auto re = EnumInstance::resolve(eright, typeMap);
464-
if (le != nullptr && re != nullptr) {
465-
BUG_CHECK(le->type == re->type, "%1%: different enum types in comparison", e);
464+
if (le != nullptr && re != nullptr && le->type == re->type) {
466465
bool bresult = (le->name == re->name) == eqTest;
467466
return new IR::BoolLiteral(e->srcInfo, IR::Type_Boolean::get(), bresult);
468467
}

testdata/p4_16_samples/enumCmp.p4

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
control proto<P>(inout P pkt);
2+
package top<P>(proto<P> p);
3+
4+
enum bit<8> E1 { A = 1, B = 2, C = 10 }
5+
enum bit<8> E2 { X = 2, Y = 1, Z = 3 }
6+
7+
header data_t {
8+
E1 e1;
9+
E2 e2;
10+
bit<8> a;
11+
bit<8> b;
12+
bit<8> c;
13+
}
14+
15+
struct headers {
16+
data_t data;
17+
}
18+
19+
20+
control c(inout headers hdr) {
21+
apply {
22+
if (hdr.data.e1 == hdr.data.e2) { hdr.data.a[0+:1] = 1; }
23+
if (hdr.data.e1 == E1.A) { hdr.data.a[1+:1] = 1; }
24+
if (hdr.data.e1 == E2.X) { hdr.data.a[2+:1] = 1; }
25+
if (hdr.data.e1 == hdr.data.c) { hdr.data.a[3+:1] = 1; }
26+
if (hdr.data.c == E1.B) { hdr.data.a[4+:1] = 1; }
27+
if (hdr.data.c == E2.Y) { hdr.data.a[5+:1] = 1; }
28+
if (E1.A == E2.X) { hdr.data.b[0+:1] = 1; }
29+
if (E1.A == E2.Y) { hdr.data.b[1+:1] = 1; }
30+
}
31+
}
32+
33+
top(c()) main;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
control proto<P>(inout P pkt);
2+
package top<P>(proto<P> p);
3+
enum bit<8> E1 {
4+
A = 8w1,
5+
B = 8w2,
6+
C = 8w10
7+
}
8+
9+
enum bit<8> E2 {
10+
X = 8w2,
11+
Y = 8w1,
12+
Z = 8w3
13+
}
14+
15+
header data_t {
16+
E1 e1;
17+
E2 e2;
18+
bit<8> a;
19+
bit<8> b;
20+
bit<8> c;
21+
}
22+
23+
struct headers {
24+
data_t data;
25+
}
26+
27+
control c(inout headers hdr) {
28+
apply {
29+
if (hdr.data.e1 == hdr.data.e2) {
30+
hdr.data.a[0:0] = 1w1;
31+
}
32+
if (hdr.data.e1 == E1.A) {
33+
hdr.data.a[1:1] = 1w1;
34+
}
35+
if (hdr.data.e1 == E2.X) {
36+
hdr.data.a[2:2] = 1w1;
37+
}
38+
if (hdr.data.e1 == hdr.data.c) {
39+
hdr.data.a[3:3] = 1w1;
40+
}
41+
if (hdr.data.c == E1.B) {
42+
hdr.data.a[4:4] = 1w1;
43+
}
44+
if (hdr.data.c == E2.Y) {
45+
hdr.data.a[5:5] = 1w1;
46+
}
47+
if (E1.A == E2.X) {
48+
hdr.data.b[0:0] = 1w1;
49+
}
50+
if (E1.A == E2.Y) {
51+
hdr.data.b[1:1] = 1w1;
52+
}
53+
}
54+
}
55+
56+
top<headers>(c()) main;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
control proto<P>(inout P pkt);
2+
package top<P>(proto<P> p);
3+
enum bit<8> E1 {
4+
A = 8w1,
5+
B = 8w2,
6+
C = 8w10
7+
}
8+
9+
enum bit<8> E2 {
10+
X = 8w2,
11+
Y = 8w1,
12+
Z = 8w3
13+
}
14+
15+
header data_t {
16+
E1 e1;
17+
E2 e2;
18+
bit<8> a;
19+
bit<8> b;
20+
bit<8> c;
21+
}
22+
23+
struct headers {
24+
data_t data;
25+
}
26+
27+
control c(inout headers hdr) {
28+
apply {
29+
if (hdr.data.e1 == hdr.data.e2) {
30+
hdr.data.a[0:0] = 1w1;
31+
}
32+
if (hdr.data.e1 == E1.A) {
33+
hdr.data.a[1:1] = 1w1;
34+
}
35+
if (hdr.data.e1 == E2.X) {
36+
hdr.data.a[2:2] = 1w1;
37+
}
38+
if (hdr.data.e1 == hdr.data.c) {
39+
hdr.data.a[3:3] = 1w1;
40+
}
41+
if (hdr.data.c == E1.B) {
42+
hdr.data.a[4:4] = 1w1;
43+
}
44+
if (hdr.data.c == E2.Y) {
45+
hdr.data.a[5:5] = 1w1;
46+
}
47+
if (E1.A == E2.X) {
48+
hdr.data.b[0:0] = 1w1;
49+
}
50+
if (E1.A == E2.Y) {
51+
hdr.data.b[1:1] = 1w1;
52+
}
53+
}
54+
}
55+
56+
top<headers>(c()) main;
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
control proto<P>(inout P pkt);
2+
package top<P>(proto<P> p);
3+
header data_t {
4+
bit<8> e1;
5+
bit<8> e2;
6+
bit<8> a;
7+
bit<8> b;
8+
bit<8> c;
9+
}
10+
11+
struct headers {
12+
data_t data;
13+
}
14+
15+
control c(inout headers hdr) {
16+
@hidden action enumCmp22() {
17+
hdr.data.a[0:0] = 1w1;
18+
}
19+
@hidden action enumCmp23() {
20+
hdr.data.a[1:1] = 1w1;
21+
}
22+
@hidden action enumCmp24() {
23+
hdr.data.a[2:2] = 1w1;
24+
}
25+
@hidden action enumCmp25() {
26+
hdr.data.a[3:3] = 1w1;
27+
}
28+
@hidden action enumCmp26() {
29+
hdr.data.a[4:4] = 1w1;
30+
}
31+
@hidden action enumCmp27() {
32+
hdr.data.a[5:5] = 1w1;
33+
}
34+
@hidden action enumCmp29() {
35+
hdr.data.b[1:1] = 1w1;
36+
}
37+
@hidden table tbl_enumCmp22 {
38+
actions = {
39+
enumCmp22();
40+
}
41+
const default_action = enumCmp22();
42+
}
43+
@hidden table tbl_enumCmp23 {
44+
actions = {
45+
enumCmp23();
46+
}
47+
const default_action = enumCmp23();
48+
}
49+
@hidden table tbl_enumCmp24 {
50+
actions = {
51+
enumCmp24();
52+
}
53+
const default_action = enumCmp24();
54+
}
55+
@hidden table tbl_enumCmp25 {
56+
actions = {
57+
enumCmp25();
58+
}
59+
const default_action = enumCmp25();
60+
}
61+
@hidden table tbl_enumCmp26 {
62+
actions = {
63+
enumCmp26();
64+
}
65+
const default_action = enumCmp26();
66+
}
67+
@hidden table tbl_enumCmp27 {
68+
actions = {
69+
enumCmp27();
70+
}
71+
const default_action = enumCmp27();
72+
}
73+
@hidden table tbl_enumCmp29 {
74+
actions = {
75+
enumCmp29();
76+
}
77+
const default_action = enumCmp29();
78+
}
79+
apply {
80+
if (hdr.data.e1 == hdr.data.e2) {
81+
tbl_enumCmp22.apply();
82+
}
83+
if (hdr.data.e1 == 8w1) {
84+
tbl_enumCmp23.apply();
85+
}
86+
if (hdr.data.e1 == 8w2) {
87+
tbl_enumCmp24.apply();
88+
}
89+
if (hdr.data.e1 == hdr.data.c) {
90+
tbl_enumCmp25.apply();
91+
}
92+
if (hdr.data.c == 8w2) {
93+
tbl_enumCmp26.apply();
94+
}
95+
if (hdr.data.c == 8w1) {
96+
tbl_enumCmp27.apply();
97+
}
98+
tbl_enumCmp29.apply();
99+
}
100+
}
101+
102+
top<headers>(c()) main;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
control proto<P>(inout P pkt);
2+
package top<P>(proto<P> p);
3+
enum bit<8> E1 {
4+
A = 1,
5+
B = 2,
6+
C = 10
7+
}
8+
9+
enum bit<8> E2 {
10+
X = 2,
11+
Y = 1,
12+
Z = 3
13+
}
14+
15+
header data_t {
16+
E1 e1;
17+
E2 e2;
18+
bit<8> a;
19+
bit<8> b;
20+
bit<8> c;
21+
}
22+
23+
struct headers {
24+
data_t data;
25+
}
26+
27+
control c(inout headers hdr) {
28+
apply {
29+
if (hdr.data.e1 == hdr.data.e2) {
30+
hdr.data.a[0+:1] = 1;
31+
}
32+
if (hdr.data.e1 == E1.A) {
33+
hdr.data.a[1+:1] = 1;
34+
}
35+
if (hdr.data.e1 == E2.X) {
36+
hdr.data.a[2+:1] = 1;
37+
}
38+
if (hdr.data.e1 == hdr.data.c) {
39+
hdr.data.a[3+:1] = 1;
40+
}
41+
if (hdr.data.c == E1.B) {
42+
hdr.data.a[4+:1] = 1;
43+
}
44+
if (hdr.data.c == E2.Y) {
45+
hdr.data.a[5+:1] = 1;
46+
}
47+
if (E1.A == E2.X) {
48+
hdr.data.b[0+:1] = 1;
49+
}
50+
if (E1.A == E2.Y) {
51+
hdr.data.b[1+:1] = 1;
52+
}
53+
}
54+
}
55+
56+
top(c()) main;

testdata/p4_16_samples_outputs/enumCmp.p4-stderr

Whitespace-only changes.

0 commit comments

Comments
 (0)