@@ -159,26 +159,56 @@ private predicate fieldAddressValueNumber(
159159 tvalueNumber ( instr .getObjectAddress ( ) ) = objectAddress
160160}
161161
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]
162180private predicate binaryValueNumber (
163181 BinaryInstruction instr , IRFunction irFunc , Opcode opcode , TValueNumber leftOperand ,
164182 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
165192) {
166193 instr .getEnclosingIRFunction ( ) = irFunc and
167- not instr instanceof PointerArithmeticInstruction and
168194 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+ )
171203}
172204
205+ pragma [ assume_small_delta]
173206private predicate pointerArithmeticValueNumber (
174207 PointerArithmeticInstruction instr , IRFunction irFunc , Opcode opcode , int elementSize ,
175208 TValueNumber leftOperand , TValueNumber rightOperand
176209) {
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 )
182212}
183213
184214private predicate unaryValueNumber (
@@ -203,14 +233,29 @@ private predicate inheritanceConversionValueNumber(
203233 unique( | | instr .getDerivedClass ( ) ) = derivedClass
204234}
205235
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]
206253private predicate loadTotalOverlapValueNumber (
207254 LoadTotalOverlapInstruction instr , IRFunction irFunc , IRType type , TValueNumber memOperand ,
208255 TValueNumber operand
209256) {
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 )
214259}
215260
216261/**
0 commit comments