@@ -119,27 +119,67 @@ module SemanticExprConfig {
119
119
result = block .getDisplayIndex ( )
120
120
}
121
121
122
- class SsaVariable instanceof IR:: Instruction {
123
- SsaVariable ( ) { super .hasMemoryResult ( ) }
122
+ newtype TSsaVariable =
123
+ TSsaInstruction ( IR:: Instruction instr ) { instr .hasMemoryResult ( ) } or
124
+ TSsaOperand ( IR:: Operand op ) { op .isDefinitionInexact ( ) }
124
125
125
- final string toString ( ) { result = super .toString ( ) }
126
+ class SsaVariable extends TSsaVariable {
127
+ string toString ( ) { none ( ) }
126
128
127
- final Location getLocation ( ) { result = super .getLocation ( ) }
129
+ Location getLocation ( ) { none ( ) }
130
+
131
+ IR:: Instruction asInstruction ( ) { none ( ) }
132
+
133
+ IR:: Operand asOperand ( ) { none ( ) }
128
134
}
129
135
130
- predicate explicitUpdate ( SsaVariable v , Expr sourceExpr ) { v = sourceExpr }
136
+ class SsaInstructionVariable extends SsaVariable , TSsaInstruction {
137
+ IR:: Instruction instr ;
138
+
139
+ SsaInstructionVariable ( ) { this = TSsaInstruction ( instr ) }
140
+
141
+ final override string toString ( ) { result = instr .toString ( ) }
142
+
143
+ final override Location getLocation ( ) { result = instr .getLocation ( ) }
131
144
132
- predicate phi ( SsaVariable v ) { v instanceof IR:: PhiInstruction }
145
+ final override IR:: Instruction asInstruction ( ) { result = instr }
146
+ }
147
+
148
+ class SsaOperand extends SsaVariable , TSsaOperand {
149
+ IR:: Operand op ;
150
+
151
+ SsaOperand ( ) { this = TSsaOperand ( op ) }
152
+
153
+ final override string toString ( ) { result = op .toString ( ) }
154
+
155
+ final override Location getLocation ( ) { result = op .getLocation ( ) }
156
+
157
+ final override IR:: Operand asOperand ( ) { result = op }
158
+ }
133
159
134
- SsaVariable getAPhiInput ( SsaVariable v ) { result = v . ( IR :: PhiInstruction ) . getAnInput ( ) }
160
+ predicate explicitUpdate ( SsaVariable v , Expr sourceExpr ) { v . asInstruction ( ) = sourceExpr }
135
161
136
- Expr getAUse ( SsaVariable v ) { result .( IR:: LoadInstruction ) .getSourceValue ( ) = v }
162
+ predicate phi ( SsaVariable v ) { v .asInstruction ( ) instanceof IR:: PhiInstruction }
163
+
164
+ SsaVariable getAPhiInput ( SsaVariable v ) {
165
+ exists ( IR:: PhiInstruction instr |
166
+ result .asInstruction ( ) = instr .getAnInput ( )
167
+ or
168
+ result .asOperand ( ) = instr .getAnInputOperand ( )
169
+ )
170
+ }
171
+
172
+ Expr getAUse ( SsaVariable v ) { result .( IR:: LoadInstruction ) .getSourceValue ( ) = v .asInstruction ( ) }
137
173
138
174
SemType getSsaVariableType ( SsaVariable v ) {
139
- result = getSemanticType ( v .( IR :: Instruction ) .getResultIRType ( ) )
175
+ result = getSemanticType ( v .asInstruction ( ) .getResultIRType ( ) )
140
176
}
141
177
142
- BasicBlock getSsaVariableBasicBlock ( SsaVariable v ) { result = v .( IR:: Instruction ) .getBlock ( ) }
178
+ BasicBlock getSsaVariableBasicBlock ( SsaVariable v ) {
179
+ result = v .asInstruction ( ) .getBlock ( )
180
+ or
181
+ result = v .asOperand ( ) .getUse ( ) .getBlock ( )
182
+ }
143
183
144
184
private newtype TReadPosition =
145
185
TReadPositionBlock ( IR:: IRBlock block ) or
@@ -169,7 +209,9 @@ module SemanticExprConfig {
169
209
170
210
final override predicate hasRead ( SsaVariable v ) {
171
211
exists ( IR:: Operand operand |
172
- operand .getDef ( ) = v and not operand instanceof IR:: PhiInputOperand
212
+ operand .getDef ( ) = v .asInstruction ( ) and
213
+ not operand instanceof IR:: PhiInputOperand and
214
+ operand .getUse ( ) .getBlock ( ) = block
173
215
)
174
216
}
175
217
}
@@ -186,7 +228,7 @@ module SemanticExprConfig {
186
228
187
229
final override predicate hasRead ( SsaVariable v ) {
188
230
exists ( IR:: PhiInputOperand operand |
189
- operand .getDef ( ) = v and
231
+ operand .getDef ( ) = v . asInstruction ( ) and
190
232
operand .getPredecessorBlock ( ) = pred and
191
233
operand .getUse ( ) .getBlock ( ) = succ
192
234
)
@@ -205,17 +247,16 @@ module SemanticExprConfig {
205
247
exists ( IR:: PhiInputOperand operand |
206
248
pos = TReadPositionPhiInputEdge ( operand .getPredecessorBlock ( ) , operand .getUse ( ) .getBlock ( ) )
207
249
|
208
- phi = operand .getUse ( ) and input = operand .getDef ( )
250
+ phi .asInstruction ( ) = operand .getUse ( ) and
251
+ (
252
+ input .asInstruction ( ) = operand .getDef ( )
253
+ or
254
+ input .asOperand ( ) = operand
255
+ )
209
256
)
210
257
}
211
258
212
259
class Bound instanceof IRBound:: Bound {
213
- Bound ( ) {
214
- this instanceof IRBound:: ZeroBound
215
- or
216
- this .( IRBound:: ValueNumberBound ) .getValueNumber ( ) .getAnInstruction ( ) instanceof SsaVariable
217
- }
218
-
219
260
string toString ( ) { result = super .toString ( ) }
220
261
221
262
final Location getLocation ( ) { result = super .getLocation ( ) }
@@ -228,21 +269,21 @@ module SemanticExprConfig {
228
269
229
270
override string toString ( ) {
230
271
result =
231
- min ( SsaVariable instr |
232
- instr = bound .getValueNumber ( ) .getAnInstruction ( )
272
+ min ( SsaVariable v |
273
+ v . asInstruction ( ) = bound .getValueNumber ( ) .getAnInstruction ( )
233
274
|
234
- instr
275
+ v
235
276
order by
236
- instr . ( IR :: Instruction ) .getBlock ( ) .getDisplayIndex ( ) ,
237
- instr . ( IR :: Instruction ) .getDisplayIndexInBlock ( )
277
+ v . asInstruction ( ) .getBlock ( ) .getDisplayIndex ( ) ,
278
+ v . asInstruction ( ) .getDisplayIndexInBlock ( )
238
279
) .toString ( )
239
280
}
240
281
}
241
282
242
283
predicate zeroBound ( Bound bound ) { bound instanceof IRBound:: ZeroBound }
243
284
244
285
predicate ssaBound ( Bound bound , SsaVariable v ) {
245
- v = bound .( IRBound:: ValueNumberBound ) .getValueNumber ( ) .getAnInstruction ( )
286
+ v . asInstruction ( ) = bound .( IRBound:: ValueNumberBound ) .getValueNumber ( ) .getAnInstruction ( )
246
287
}
247
288
248
289
Expr getBoundExpr ( Bound bound , int delta ) {
@@ -284,9 +325,13 @@ SemBasicBlock getSemanticBasicBlock(IR::IRBlock block) { result = block }
284
325
285
326
IR:: IRBlock getCppBasicBlock ( SemBasicBlock block ) { block = result }
286
327
287
- SemSsaVariable getSemanticSsaVariable ( IR:: Instruction instr ) { result = instr }
328
+ SemSsaVariable getSemanticSsaVariable ( IR:: Instruction instr ) {
329
+ result .( SemanticExprConfig:: SsaVariable ) .asInstruction ( ) = instr
330
+ }
288
331
289
- IR:: Instruction getCppSsaVariableInstruction ( SemSsaVariable v ) { v = result }
332
+ IR:: Instruction getCppSsaVariableInstruction ( SemSsaVariable var ) {
333
+ var .( SemanticExprConfig:: SsaVariable ) .asInstruction ( ) = result
334
+ }
290
335
291
336
SemBound getSemanticBound ( IRBound:: Bound bound ) { result = bound }
292
337
0 commit comments