@@ -159,26 +159,56 @@ private predicate fieldAddressValueNumber(
159
159
tvalueNumber ( instr .getObjectAddress ( ) ) = objectAddress
160
160
}
161
161
162
+ pragma [ nomagic]
163
+ private predicate binaryValueNumber0 (
164
+ BinaryInstruction instr , IRFunction irFunc , Opcode opcode , boolean isLeft ,
165
+ TValueNumber valueNumber
166
+ ) {
167
+ not instr instanceof PointerArithmeticInstruction and
168
+ instr .getEnclosingIRFunction ( ) = irFunc and
169
+ instr .getOpcode ( ) = opcode and
170
+ (
171
+ isLeft = true and
172
+ tvalueNumber ( instr .getLeft ( ) ) = valueNumber
173
+ or
174
+ isLeft = false and
175
+ tvalueNumber ( instr .getRight ( ) ) = valueNumber
176
+ )
177
+ }
178
+
179
+ pragma [ assume_small_delta]
162
180
private predicate binaryValueNumber (
163
181
BinaryInstruction instr , IRFunction irFunc , Opcode opcode , TValueNumber leftOperand ,
164
182
TValueNumber rightOperand
183
+ ) {
184
+ binaryValueNumber0 ( instr , irFunc , opcode , true , leftOperand ) and
185
+ binaryValueNumber0 ( instr , irFunc , opcode , false , rightOperand )
186
+ }
187
+
188
+ pragma [ nomagic]
189
+ private predicate pointerArithmeticValueNumber0 (
190
+ PointerArithmeticInstruction instr , IRFunction irFunc , Opcode opcode , int elementSize ,
191
+ boolean isLeft , TValueNumber valueNumber
165
192
) {
166
193
instr .getEnclosingIRFunction ( ) = irFunc and
167
- not instr instanceof PointerArithmeticInstruction and
168
194
instr .getOpcode ( ) = opcode and
169
- tvalueNumber ( instr .getLeft ( ) ) = leftOperand and
170
- tvalueNumber ( instr .getRight ( ) ) = rightOperand
195
+ instr .getElementSize ( ) = elementSize and
196
+ (
197
+ isLeft = true and
198
+ tvalueNumber ( instr .getLeft ( ) ) = valueNumber
199
+ or
200
+ isLeft = false and
201
+ tvalueNumber ( instr .getRight ( ) ) = valueNumber
202
+ )
171
203
}
172
204
205
+ pragma [ assume_small_delta]
173
206
private predicate pointerArithmeticValueNumber (
174
207
PointerArithmeticInstruction instr , IRFunction irFunc , Opcode opcode , int elementSize ,
175
208
TValueNumber leftOperand , TValueNumber rightOperand
176
209
) {
177
- instr .getEnclosingIRFunction ( ) = irFunc and
178
- instr .getOpcode ( ) = opcode and
179
- instr .getElementSize ( ) = elementSize and
180
- tvalueNumber ( instr .getLeft ( ) ) = leftOperand and
181
- tvalueNumber ( instr .getRight ( ) ) = rightOperand
210
+ pointerArithmeticValueNumber0 ( instr , irFunc , opcode , elementSize , true , leftOperand ) and
211
+ pointerArithmeticValueNumber0 ( instr , irFunc , opcode , elementSize , false , rightOperand )
182
212
}
183
213
184
214
private predicate unaryValueNumber (
@@ -203,14 +233,29 @@ private predicate inheritanceConversionValueNumber(
203
233
unique( | | instr .getDerivedClass ( ) ) = derivedClass
204
234
}
205
235
236
+ pragma [ nomagic]
237
+ private predicate loadTotalOverlapValueNumber0 (
238
+ LoadTotalOverlapInstruction instr , IRFunction irFunc , IRType type , TValueNumber valueNumber ,
239
+ boolean isAddress
240
+ ) {
241
+ instr .getEnclosingIRFunction ( ) = irFunc and
242
+ instr .getResultIRType ( ) = type and
243
+ (
244
+ isAddress = true and
245
+ tvalueNumberOfOperand ( instr .getSourceAddressOperand ( ) ) = valueNumber
246
+ or
247
+ isAddress = false and
248
+ tvalueNumber ( instr .getSourceValueOperand ( ) .getAnyDef ( ) ) = valueNumber
249
+ )
250
+ }
251
+
252
+ pragma [ assume_small_delta]
206
253
private predicate loadTotalOverlapValueNumber (
207
254
LoadTotalOverlapInstruction instr , IRFunction irFunc , IRType type , TValueNumber memOperand ,
208
255
TValueNumber operand
209
256
) {
210
- instr .getEnclosingIRFunction ( ) = irFunc and
211
- tvalueNumber ( instr .getAnOperand ( ) .( MemoryOperand ) .getAnyDef ( ) ) = memOperand and
212
- tvalueNumberOfOperand ( instr .getAnOperand ( ) .( AddressOperand ) ) = operand and
213
- instr .getResultIRType ( ) = type
257
+ loadTotalOverlapValueNumber0 ( instr , irFunc , type , operand , true ) and
258
+ loadTotalOverlapValueNumber0 ( instr , irFunc , type , memOperand , false )
214
259
}
215
260
216
261
/**
0 commit comments