@@ -9,18 +9,15 @@ newtype TValueNumber =
99 initializeParameterValueNumber ( _, irFunc , var )
1010 } or
1111 TInitializeThisValueNumber ( IRFunction irFunc ) { initializeThisValueNumber ( _, irFunc ) } or
12- TConstantValueNumber ( IRFunction irFunc , IRType type , string value ) {
13- constantValueNumber ( _, irFunc , type , value )
14- } or
12+ TConstantValueNumber ( IRFunction irFunc , string value ) { constantValueNumber ( _, irFunc , value ) } or
1513 TStringConstantValueNumber ( IRFunction irFunc , IRType type , string value ) {
1614 stringConstantValueNumber ( _, irFunc , type , value )
1715 } or
1816 TFieldAddressValueNumber ( IRFunction irFunc , Field field , TValueNumber objectAddress ) {
1917 fieldAddressValueNumber ( _, irFunc , field , objectAddress )
2018 } or
2119 TBinaryValueNumber (
22- IRFunction irFunc , Opcode opcode , TValueNumber leftOperand ,
23- TValueNumber rightOperand
20+ IRFunction irFunc , Opcode opcode , TValueNumber leftOperand , TValueNumber rightOperand
2421 ) {
2522 binaryValueNumber ( _, irFunc , opcode , leftOperand , rightOperand )
2623 } or
@@ -38,9 +35,7 @@ newtype TValueNumber =
3835 ) {
3936 inheritanceConversionValueNumber ( _, irFunc , opcode , baseClass , derivedClass , operand )
4037 } or
41- TLoadTotalOverlapValueNumber (
42- IRFunction irFunc , TValueNumber memOperand , TValueNumber operand
43- ) {
38+ TLoadTotalOverlapValueNumber ( IRFunction irFunc , TValueNumber memOperand , TValueNumber operand ) {
4439 loadTotalOverlapValueNumber ( _, irFunc , memOperand , operand )
4540 } or
4641 TUniqueValueNumber ( IRFunction irFunc , Instruction instr ) { uniqueValueNumber ( instr , irFunc ) }
@@ -102,15 +97,24 @@ private predicate numberableInstruction(Instruction instr) {
10297predicate multipleValueNumbers ( Instruction instr , int n ) {
10398 n > 1 and
10499 (
105- n = strictcount ( IRFunction irFunc , Language:: AST ast | variableAddressValueNumber ( instr , irFunc , ast ) )
100+ n =
101+ strictcount ( IRFunction irFunc , Language:: AST ast |
102+ variableAddressValueNumber ( instr , irFunc , ast )
103+ )
106104 or
107- n = strictcount ( IRFunction irFunc , Language:: AST var | initializeParameterValueNumber ( instr , irFunc , var ) )
105+ n =
106+ strictcount ( IRFunction irFunc , Language:: AST var |
107+ initializeParameterValueNumber ( instr , irFunc , var )
108+ )
108109 or
109110 n = strictcount ( IRFunction irFunc | initializeThisValueNumber ( instr , irFunc ) )
110111 or
111- n = strictcount ( IRFunction irFunc , IRType type , string value | constantValueNumber ( instr , irFunc , type , value ) )
112+ n = strictcount ( IRFunction irFunc , string value | constantValueNumber ( instr , irFunc , value ) )
112113 or
113- n = strictcount ( IRFunction irFunc , IRType type , string value | stringConstantValueNumber ( instr , irFunc , type , value ) )
114+ n =
115+ strictcount ( IRFunction irFunc , IRType type , string value |
116+ stringConstantValueNumber ( instr , irFunc , type , value )
117+ )
114118 )
115119}
116120
@@ -139,11 +143,8 @@ private predicate initializeThisValueNumber(InitializeThisInstruction instr, IRF
139143 instr .getEnclosingIRFunction ( ) = irFunc
140144}
141145
142- private predicate constantValueNumber (
143- ConstantInstruction instr , IRFunction irFunc , IRType type , string value
144- ) {
146+ predicate constantValueNumber ( ConstantInstruction instr , IRFunction irFunc , string value ) {
145147 instr .getEnclosingIRFunction ( ) = irFunc and
146- instr .getResultIRType ( ) = type and
147148 instr .getValue ( ) = value
148149}
149150
@@ -161,6 +162,7 @@ private predicate fieldAddressValueNumber(
161162) {
162163 instr .getEnclosingIRFunction ( ) = irFunc and
163164 instr .getField ( ) = field and
165+ strictcount ( instr .getField ( ) ) = 1 and
164166 tvalueNumber ( instr .getObjectAddress ( ) ) = objectAddress
165167}
166168
@@ -176,8 +178,8 @@ private predicate binaryValueNumber(
176178}
177179
178180private predicate pointerArithmeticValueNumber (
179- PointerArithmeticInstruction instr , IRFunction irFunc , Opcode opcode ,
180- int elementSize , TValueNumber leftOperand , TValueNumber rightOperand
181+ PointerArithmeticInstruction instr , IRFunction irFunc , Opcode opcode , int elementSize ,
182+ TValueNumber leftOperand , TValueNumber rightOperand
181183) {
182184 instr .getEnclosingIRFunction ( ) = irFunc and
183185 instr .getOpcode ( ) = opcode and
@@ -267,9 +269,9 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
267269 initializeThisValueNumber ( instr , irFunc ) and
268270 result = TInitializeThisValueNumber ( irFunc )
269271 or
270- exists ( IRType type , string value |
271- constantValueNumber ( instr , irFunc , type , value ) and
272- result = TConstantValueNumber ( irFunc , type , value )
272+ exists ( string value |
273+ constantValueNumber ( instr , irFunc , value ) and
274+ result = TConstantValueNumber ( irFunc , value )
273275 )
274276 or
275277 exists ( IRType type , string value |
@@ -299,12 +301,8 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
299301 result = TInheritanceConversionValueNumber ( irFunc , opcode , baseClass , derivedClass , operand )
300302 )
301303 or
302- exists (
303- Opcode opcode , int elementSize , TValueNumber leftOperand ,
304- TValueNumber rightOperand
305- |
306- pointerArithmeticValueNumber ( instr , irFunc , opcode , elementSize , leftOperand ,
307- rightOperand ) and
304+ exists ( Opcode opcode , int elementSize , TValueNumber leftOperand , TValueNumber rightOperand |
305+ pointerArithmeticValueNumber ( instr , irFunc , opcode , elementSize , leftOperand , rightOperand ) and
308306 result =
309307 TPointerArithmeticValueNumber ( irFunc , opcode , elementSize , leftOperand , rightOperand )
310308 )
0 commit comments