Skip to content

Commit 687dcb7

Browse files
committed
C++: Add testcase demonstrating unexpectly different value numbers
1 parent c0417ac commit 687dcb7

2 files changed

Lines changed: 336 additions & 0 deletions

File tree

cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected

Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,3 +850,297 @@ test.cpp:
850850
# 112| v112_7(void) = UnmodeledUse : mu*
851851
# 112| v112_8(void) = AliasedUse : m112_3
852852
# 112| v112_9(void) = ExitFunction :
853+
854+
# 124| void test_read_arg_same(A*, int)
855+
# 124| Block 0
856+
# 124| v124_1(void) = EnterFunction :
857+
# 124| m124_2(unknown) = AliasedDefinition :
858+
# 124| valnum = unique
859+
# 124| m124_3(unknown) = InitializeNonLocal :
860+
# 124| valnum = unique
861+
# 124| m124_4(unknown) = Chi : total:m124_2, partial:m124_3
862+
# 124| valnum = unique
863+
# 124| mu124_5(unknown) = UnmodeledDefinition :
864+
# 124| valnum = unique
865+
# 124| r124_6(glval<A *>) = VariableAddress[pa] :
866+
# 124| valnum = r124_6
867+
# 124| m124_7(A *) = InitializeParameter[pa] : &:r124_6
868+
# 124| valnum = m124_7
869+
# 124| r124_8(A *) = Load : &:r124_6, m124_7
870+
# 124| valnum = m124_7
871+
# 124| m124_9(unknown) = InitializeIndirection[pa] : &:r124_8
872+
# 124| valnum = unique
873+
# 124| r124_10(glval<int>) = VariableAddress[n] :
874+
# 124| valnum = r124_10
875+
# 124| m124_11(int) = InitializeParameter[n] : &:r124_10
876+
# 124| valnum = m124_11
877+
# 125| r125_1(glval<int>) = VariableAddress[b] :
878+
# 125| valnum = unique
879+
# 125| r125_2(glval<A *>) = VariableAddress[pa] :
880+
# 125| valnum = r124_6
881+
# 125| r125_3(A *) = Load : &:r125_2, m124_7
882+
# 125| valnum = m124_7
883+
# 125| r125_4(glval<int>) = FieldAddress[x] : r125_3
884+
# 125| valnum = r125_4
885+
# 125| r125_5(int) = Load : &:r125_4, ~m124_9
886+
# 125| valnum = r125_5
887+
# 125| m125_6(int) = Store : &:r125_1, r125_5
888+
# 125| valnum = r125_5
889+
# 126| r126_1(glval<int>) = VariableAddress[c] :
890+
# 126| valnum = unique
891+
# 126| r126_2(glval<A *>) = VariableAddress[pa] :
892+
# 126| valnum = r124_6
893+
# 126| r126_3(A *) = Load : &:r126_2, m124_7
894+
# 126| valnum = m124_7
895+
# 126| r126_4(glval<int>) = FieldAddress[x] : r126_3
896+
# 126| valnum = r125_4
897+
# 126| r126_5(int) = Load : &:r126_4, ~m124_9
898+
# 126| valnum = r126_5
899+
# 126| m126_6(int) = Store : &:r126_1, r126_5
900+
# 126| valnum = r126_5
901+
# 128| r128_1(glval<int>) = VariableAddress[n] :
902+
# 128| valnum = r124_10
903+
# 128| r128_2(int) = Load : &:r128_1, m124_11
904+
# 128| valnum = m124_11
905+
# 128| r128_3(glval<A *>) = VariableAddress[pa] :
906+
# 128| valnum = r124_6
907+
# 128| r128_4(A *) = Load : &:r128_3, m124_7
908+
# 128| valnum = m124_7
909+
# 128| r128_5(glval<int>) = FieldAddress[x] : r128_4
910+
# 128| valnum = r125_4
911+
# 128| m128_6(int) = Store : &:r128_5, r128_2
912+
# 128| valnum = m124_11
913+
# 128| m128_7(unknown) = Chi : total:m124_9, partial:m128_6
914+
# 128| valnum = unique
915+
# 129| r129_1(glval<int>) = VariableAddress[d] :
916+
# 129| valnum = unique
917+
# 129| r129_2(glval<A *>) = VariableAddress[pa] :
918+
# 129| valnum = r124_6
919+
# 129| r129_3(A *) = Load : &:r129_2, m124_7
920+
# 129| valnum = m124_7
921+
# 129| r129_4(glval<int>) = FieldAddress[x] : r129_3
922+
# 129| valnum = r125_4
923+
# 129| r129_5(int) = Load : &:r129_4, m128_6
924+
# 129| valnum = m124_11
925+
# 129| m129_6(int) = Store : &:r129_1, r129_5
926+
# 129| valnum = m124_11
927+
# 130| v130_1(void) = NoOp :
928+
# 124| v124_12(void) = ReturnIndirection : &:r124_8, ~m128_7
929+
# 124| v124_13(void) = ReturnVoid :
930+
# 124| v124_14(void) = UnmodeledUse : mu*
931+
# 124| v124_15(void) = AliasedUse : m124_3
932+
# 124| v124_16(void) = ExitFunction :
933+
934+
# 135| void test_read_global_same()
935+
# 135| Block 0
936+
# 135| v135_1(void) = EnterFunction :
937+
# 135| m135_2(unknown) = AliasedDefinition :
938+
# 135| valnum = unique
939+
# 135| m135_3(unknown) = InitializeNonLocal :
940+
# 135| valnum = unique
941+
# 135| m135_4(unknown) = Chi : total:m135_2, partial:m135_3
942+
# 135| valnum = unique
943+
# 135| mu135_5(unknown) = UnmodeledDefinition :
944+
# 135| valnum = unique
945+
# 136| r136_1(glval<int>) = VariableAddress[b] :
946+
# 136| valnum = unique
947+
# 136| r136_2(glval<A *>) = VariableAddress[global_a] :
948+
# 136| valnum = r136_2
949+
# 136| r136_3(A *) = Load : &:r136_2, ~m135_3
950+
# 136| valnum = unique
951+
# 136| r136_4(glval<int>) = FieldAddress[x] : r136_3
952+
# 136| valnum = unique
953+
# 136| r136_5(int) = Load : &:r136_4, ~m135_4
954+
# 136| valnum = r136_5
955+
# 136| m136_6(int) = Store : &:r136_1, r136_5
956+
# 136| valnum = r136_5
957+
# 137| r137_1(glval<int>) = VariableAddress[c] :
958+
# 137| valnum = unique
959+
# 137| r137_2(glval<A *>) = VariableAddress[global_a] :
960+
# 137| valnum = r136_2
961+
# 137| r137_3(A *) = Load : &:r137_2, ~m135_3
962+
# 137| valnum = unique
963+
# 137| r137_4(glval<int>) = FieldAddress[x] : r137_3
964+
# 137| valnum = unique
965+
# 137| r137_5(int) = Load : &:r137_4, ~m135_4
966+
# 137| valnum = r137_5
967+
# 137| m137_6(int) = Store : &:r137_1, r137_5
968+
# 137| valnum = r137_5
969+
# 139| r139_1(glval<int>) = VariableAddress[global_n] :
970+
# 139| valnum = unique
971+
# 139| r139_2(int) = Load : &:r139_1, ~m135_3
972+
# 139| valnum = r139_2
973+
# 139| r139_3(glval<A *>) = VariableAddress[global_a] :
974+
# 139| valnum = r136_2
975+
# 139| r139_4(A *) = Load : &:r139_3, ~m135_3
976+
# 139| valnum = unique
977+
# 139| r139_5(glval<int>) = FieldAddress[x] : r139_4
978+
# 139| valnum = unique
979+
# 139| m139_6(int) = Store : &:r139_5, r139_2
980+
# 139| valnum = r139_2
981+
# 139| m139_7(unknown) = Chi : total:m135_4, partial:m139_6
982+
# 139| valnum = unique
983+
# 140| r140_1(glval<int>) = VariableAddress[d] :
984+
# 140| valnum = unique
985+
# 140| r140_2(glval<A *>) = VariableAddress[global_a] :
986+
# 140| valnum = r136_2
987+
# 140| r140_3(A *) = Load : &:r140_2, ~m139_7
988+
# 140| valnum = unique
989+
# 140| r140_4(glval<int>) = FieldAddress[x] : r140_3
990+
# 140| valnum = unique
991+
# 140| r140_5(int) = Load : &:r140_4, ~m139_7
992+
# 140| valnum = r140_5
993+
# 140| m140_6(int) = Store : &:r140_1, r140_5
994+
# 140| valnum = r140_5
995+
# 141| v141_1(void) = NoOp :
996+
# 135| v135_6(void) = ReturnVoid :
997+
# 135| v135_7(void) = UnmodeledUse : mu*
998+
# 135| v135_8(void) = AliasedUse : ~m139_7
999+
# 135| v135_9(void) = ExitFunction :
1000+
1001+
# 143| void test_read_arg_different(A*)
1002+
# 143| Block 0
1003+
# 143| v143_1(void) = EnterFunction :
1004+
# 143| m143_2(unknown) = AliasedDefinition :
1005+
# 143| valnum = unique
1006+
# 143| m143_3(unknown) = InitializeNonLocal :
1007+
# 143| valnum = unique
1008+
# 143| m143_4(unknown) = Chi : total:m143_2, partial:m143_3
1009+
# 143| valnum = unique
1010+
# 143| mu143_5(unknown) = UnmodeledDefinition :
1011+
# 143| valnum = unique
1012+
# 143| r143_6(glval<A *>) = VariableAddress[pa] :
1013+
# 143| valnum = r143_6
1014+
# 143| m143_7(A *) = InitializeParameter[pa] : &:r143_6
1015+
# 143| valnum = m143_7
1016+
# 143| r143_8(A *) = Load : &:r143_6, m143_7
1017+
# 143| valnum = m143_7
1018+
# 143| m143_9(unknown) = InitializeIndirection[pa] : &:r143_8
1019+
# 143| valnum = unique
1020+
# 144| r144_1(glval<int>) = VariableAddress[b] :
1021+
# 144| valnum = unique
1022+
# 144| r144_2(glval<A *>) = VariableAddress[pa] :
1023+
# 144| valnum = r143_6
1024+
# 144| r144_3(A *) = Load : &:r144_2, m143_7
1025+
# 144| valnum = m143_7
1026+
# 144| r144_4(glval<int>) = FieldAddress[x] : r144_3
1027+
# 144| valnum = r144_4
1028+
# 144| r144_5(int) = Load : &:r144_4, ~m143_9
1029+
# 144| valnum = r144_5
1030+
# 144| m144_6(int) = Store : &:r144_1, r144_5
1031+
# 144| valnum = r144_5
1032+
# 145| r145_1(glval<int>) = VariableAddress[c] :
1033+
# 145| valnum = unique
1034+
# 145| r145_2(glval<A *>) = VariableAddress[pa] :
1035+
# 145| valnum = r143_6
1036+
# 145| r145_3(A *) = Load : &:r145_2, m143_7
1037+
# 145| valnum = m143_7
1038+
# 145| r145_4(glval<int>) = FieldAddress[y] : r145_3
1039+
# 145| valnum = r145_4
1040+
# 145| r145_5(int) = Load : &:r145_4, ~m143_9
1041+
# 145| valnum = r145_5
1042+
# 145| m145_6(int) = Store : &:r145_1, r145_5
1043+
# 145| valnum = r145_5
1044+
# 147| r147_1(glval<int>) = VariableAddress[global_n] :
1045+
# 147| valnum = unique
1046+
# 147| r147_2(int) = Load : &:r147_1, ~m143_3
1047+
# 147| valnum = r147_2
1048+
# 147| r147_3(glval<A *>) = VariableAddress[pa] :
1049+
# 147| valnum = r143_6
1050+
# 147| r147_4(A *) = Load : &:r147_3, m143_7
1051+
# 147| valnum = m143_7
1052+
# 147| r147_5(glval<int>) = FieldAddress[y] : r147_4
1053+
# 147| valnum = r145_4
1054+
# 147| m147_6(int) = Store : &:r147_5, r147_2
1055+
# 147| valnum = r147_2
1056+
# 147| m147_7(unknown) = Chi : total:m143_9, partial:m147_6
1057+
# 147| valnum = unique
1058+
# 149| r149_1(glval<int>) = VariableAddress[d] :
1059+
# 149| valnum = unique
1060+
# 149| r149_2(glval<A *>) = VariableAddress[pa] :
1061+
# 149| valnum = r143_6
1062+
# 149| r149_3(A *) = Load : &:r149_2, m143_7
1063+
# 149| valnum = m143_7
1064+
# 149| r149_4(glval<int>) = FieldAddress[x] : r149_3
1065+
# 149| valnum = r144_4
1066+
# 149| r149_5(int) = Load : &:r149_4, ~m143_9
1067+
# 149| valnum = r149_5
1068+
# 149| m149_6(int) = Store : &:r149_1, r149_5
1069+
# 149| valnum = r149_5
1070+
# 150| v150_1(void) = NoOp :
1071+
# 143| v143_10(void) = ReturnIndirection : &:r143_8, ~m147_7
1072+
# 143| v143_11(void) = ReturnVoid :
1073+
# 143| v143_12(void) = UnmodeledUse : mu*
1074+
# 143| v143_13(void) = AliasedUse : m143_3
1075+
# 143| v143_14(void) = ExitFunction :
1076+
1077+
# 152| void test_read_global_different(int)
1078+
# 152| Block 0
1079+
# 152| v152_1(void) = EnterFunction :
1080+
# 152| m152_2(unknown) = AliasedDefinition :
1081+
# 152| valnum = unique
1082+
# 152| m152_3(unknown) = InitializeNonLocal :
1083+
# 152| valnum = unique
1084+
# 152| m152_4(unknown) = Chi : total:m152_2, partial:m152_3
1085+
# 152| valnum = unique
1086+
# 152| mu152_5(unknown) = UnmodeledDefinition :
1087+
# 152| valnum = unique
1088+
# 152| r152_6(glval<int>) = VariableAddress[n] :
1089+
# 152| valnum = r152_6
1090+
# 152| m152_7(int) = InitializeParameter[n] : &:r152_6
1091+
# 152| valnum = m152_7
1092+
# 153| r153_1(glval<int>) = VariableAddress[b] :
1093+
# 153| valnum = unique
1094+
# 153| r153_2(glval<A *>) = VariableAddress[global_a] :
1095+
# 153| valnum = r153_2
1096+
# 153| r153_3(A *) = Load : &:r153_2, ~m152_3
1097+
# 153| valnum = unique
1098+
# 153| r153_4(glval<int>) = FieldAddress[x] : r153_3
1099+
# 153| valnum = unique
1100+
# 153| r153_5(int) = Load : &:r153_4, ~m152_4
1101+
# 153| valnum = r153_5
1102+
# 153| m153_6(int) = Store : &:r153_1, r153_5
1103+
# 153| valnum = r153_5
1104+
# 154| r154_1(glval<int>) = VariableAddress[c] :
1105+
# 154| valnum = unique
1106+
# 154| r154_2(glval<A *>) = VariableAddress[global_a] :
1107+
# 154| valnum = r153_2
1108+
# 154| r154_3(A *) = Load : &:r154_2, ~m152_3
1109+
# 154| valnum = unique
1110+
# 154| r154_4(glval<int>) = FieldAddress[x] : r154_3
1111+
# 154| valnum = unique
1112+
# 154| r154_5(int) = Load : &:r154_4, ~m152_4
1113+
# 154| valnum = r154_5
1114+
# 154| m154_6(int) = Store : &:r154_1, r154_5
1115+
# 154| valnum = r154_5
1116+
# 156| r156_1(glval<int>) = VariableAddress[n] :
1117+
# 156| valnum = r152_6
1118+
# 156| r156_2(int) = Load : &:r156_1, m152_7
1119+
# 156| valnum = m152_7
1120+
# 156| r156_3(glval<A *>) = VariableAddress[global_a] :
1121+
# 156| valnum = r153_2
1122+
# 156| r156_4(A *) = Load : &:r156_3, ~m152_3
1123+
# 156| valnum = unique
1124+
# 156| r156_5(glval<int>) = FieldAddress[y] : r156_4
1125+
# 156| valnum = unique
1126+
# 156| m156_6(int) = Store : &:r156_5, r156_2
1127+
# 156| valnum = m152_7
1128+
# 156| m156_7(unknown) = Chi : total:m152_4, partial:m156_6
1129+
# 156| valnum = unique
1130+
# 158| r158_1(glval<int>) = VariableAddress[d] :
1131+
# 158| valnum = unique
1132+
# 158| r158_2(glval<A *>) = VariableAddress[global_a] :
1133+
# 158| valnum = r153_2
1134+
# 158| r158_3(A *) = Load : &:r158_2, ~m156_7
1135+
# 158| valnum = unique
1136+
# 158| r158_4(glval<int>) = FieldAddress[x] : r158_3
1137+
# 158| valnum = unique
1138+
# 158| r158_5(int) = Load : &:r158_4, ~m156_7
1139+
# 158| valnum = r158_5
1140+
# 158| m158_6(int) = Store : &:r158_1, r158_5
1141+
# 158| valnum = r158_5
1142+
# 159| v159_1(void) = NoOp :
1143+
# 152| v152_8(void) = ReturnVoid :
1144+
# 152| v152_9(void) = UnmodeledUse : mu*
1145+
# 152| v152_10(void) = AliasedUse : ~m156_7
1146+
# 152| v152_11(void) = ExitFunction :

cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/test.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,45 @@ void test06() {
115115
"a";
116116
"c";
117117
}
118+
119+
struct A {
120+
int x;
121+
int y;
122+
};
123+
124+
void test_read_arg_same(A *pa, int n) {
125+
int b = pa->x;
126+
int c = pa->x;
127+
128+
pa->x = n;
129+
int d = pa->x;
130+
}
131+
132+
A* global_a;
133+
int global_n;
134+
135+
void test_read_global_same() {
136+
int b = global_a->x;
137+
int c = global_a->x;
138+
139+
global_a->x = global_n;
140+
int d = global_a->x;
141+
}
142+
143+
void test_read_arg_different(A *pa) {
144+
int b = pa->x;
145+
int c = pa->y;
146+
147+
pa->y = global_n;
148+
149+
int d = pa->x;
150+
}
151+
152+
void test_read_global_different(int n) {
153+
int b = global_a->x;
154+
int c = global_a->x;
155+
156+
global_a->y = n;
157+
158+
int d = global_a->x;
159+
}

0 commit comments

Comments
 (0)