@@ -70,3 +70,66 @@ private GvnKind getKind(ControlFlowElement cfe) {
70
70
result = TGvnKindStmt ( kind )
71
71
)
72
72
}
73
+
74
+ /**
75
+ * Type for containing the global value number of a control flow element.
76
+ * A global value number, can either be a constant or a list of global value numbers,
77
+ * where the list also carries a `kind`, which is used to distinguish between general expressions,
78
+ * declarations and statements.
79
+ */
80
+ private newtype TGvn =
81
+ TConstantGvn ( string s ) { s = any ( Expr e ) .getValue ( ) } or
82
+ TListGvn ( GvnList l )
83
+
84
+ /** The global value number of a control flow element. */
85
+ abstract class Gvn extends TGvn {
86
+ /** Gets the string representation of this global value number. */
87
+ abstract string toString ( ) ;
88
+ }
89
+
90
+ private class ConstantGvn extends Gvn , TConstantGvn {
91
+ override string toString ( ) { this = TConstantGvn ( result ) }
92
+ }
93
+
94
+ private class ListGvn extends Gvn , TListGvn {
95
+ private GvnList l ;
96
+
97
+ ListGvn ( ) { this = TListGvn ( l ) }
98
+
99
+ override string toString ( ) { result = "[" + l .toString ( ) + "]" }
100
+ }
101
+
102
+ /**
103
+ * Type for containing a list of global value numbers with a kind.
104
+ * The empty list carries the kind of the controlflowelement.
105
+ */
106
+ private newtype TGvnList =
107
+ TGvnNil ( GvnKind gkind ) or
108
+ TGvnCons ( Gvn head , GvnList tail ) { gvnConstructedCons ( _, _, _, head , tail ) }
109
+
110
+ abstract private class GvnList extends TGvnList {
111
+ abstract string toString ( ) ;
112
+ }
113
+
114
+ private class GvnNil extends GvnList , TGvnNil {
115
+ private GvnKind kind ;
116
+
117
+ GvnNil ( ) { this = TGvnNil ( kind ) }
118
+
119
+ override string toString ( ) { result = "(kind:" + kind + ")" }
120
+ }
121
+
122
+ private class GvnCons extends GvnList , TGvnCons {
123
+ private Gvn head ;
124
+ private GvnList tail ;
125
+
126
+ GvnCons ( ) { this = TGvnCons ( head , tail ) }
127
+
128
+ override string toString ( ) { result = head .toString ( ) + " :: " + tail .toString ( ) }
129
+ }
130
+
131
+ private predicate gvnConstructedCons (
132
+ ControlFlowElement e , GvnKind kind , int index , Gvn head , GvnList tail
133
+ ) {
134
+ none ( )
135
+ }
0 commit comments