@@ -9,39 +9,34 @@ 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 , IRType type , TValueNumber leftOperand ,
23- TValueNumber rightOperand
20+ IRFunction irFunc , Opcode opcode , TValueNumber leftOperand , TValueNumber rightOperand
2421 ) {
25- binaryValueNumber ( _, irFunc , opcode , type , leftOperand , rightOperand )
22+ binaryValueNumber ( _, irFunc , opcode , leftOperand , rightOperand )
2623 } or
2724 TPointerArithmeticValueNumber (
28- IRFunction irFunc , Opcode opcode , IRType type , int elementSize , TValueNumber leftOperand ,
25+ IRFunction irFunc , Opcode opcode , int elementSize , TValueNumber leftOperand ,
2926 TValueNumber rightOperand
3027 ) {
31- pointerArithmeticValueNumber ( _, irFunc , opcode , type , elementSize , leftOperand , rightOperand )
28+ pointerArithmeticValueNumber ( _, irFunc , opcode , elementSize , leftOperand , rightOperand )
3229 } or
33- TUnaryValueNumber ( IRFunction irFunc , Opcode opcode , IRType type , TValueNumber operand ) {
34- unaryValueNumber ( _, irFunc , opcode , type , operand )
30+ TUnaryValueNumber ( IRFunction irFunc , Opcode opcode , TValueNumber operand ) {
31+ unaryValueNumber ( _, irFunc , opcode , operand )
3532 } or
3633 TInheritanceConversionValueNumber (
3734 IRFunction irFunc , Opcode opcode , Class baseClass , Class derivedClass , TValueNumber operand
3835 ) {
3936 inheritanceConversionValueNumber ( _, irFunc , opcode , baseClass , derivedClass , operand )
4037 } or
41- TLoadTotalOverlapValueNumber (
42- IRFunction irFunc , IRType type , TValueNumber memOperand , TValueNumber operand
43- ) {
44- loadTotalOverlapValueNumber ( _, irFunc , type , memOperand , operand )
38+ TLoadTotalOverlapValueNumber ( IRFunction irFunc , TValueNumber memOperand , TValueNumber operand ) {
39+ loadTotalOverlapValueNumber ( _, irFunc , memOperand , operand )
4540 } or
4641 TUniqueValueNumber ( IRFunction irFunc , Instruction instr ) { uniqueValueNumber ( instr , irFunc ) }
4742
@@ -106,7 +101,8 @@ private predicate variableAddressValueNumber(
106101 // The underlying AST element is used as value-numbering key instead of the
107102 // `IRVariable` to work around a problem where a variable or expression with
108103 // multiple types gives rise to multiple `IRVariable`s.
109- instr .getIRVariable ( ) .getAST ( ) = ast
104+ instr .getIRVariable ( ) .getAST ( ) = ast and
105+ strictcount ( instr .getIRVariable ( ) .getAST ( ) ) = 1
110106}
111107
112108private predicate initializeParameterValueNumber (
@@ -123,11 +119,8 @@ private predicate initializeThisValueNumber(InitializeThisInstruction instr, IRF
123119 instr .getEnclosingIRFunction ( ) = irFunc
124120}
125121
126- private predicate constantValueNumber (
127- ConstantInstruction instr , IRFunction irFunc , IRType type , string value
128- ) {
122+ predicate constantValueNumber ( ConstantInstruction instr , IRFunction irFunc , string value ) {
129123 instr .getEnclosingIRFunction ( ) = irFunc and
130- instr .getResultIRType ( ) = type and
131124 instr .getValue ( ) = value
132125}
133126
@@ -145,42 +138,40 @@ private predicate fieldAddressValueNumber(
145138) {
146139 instr .getEnclosingIRFunction ( ) = irFunc and
147140 instr .getField ( ) = field and
141+ strictcount ( instr .getField ( ) ) = 1 and
148142 tvalueNumber ( instr .getObjectAddress ( ) ) = objectAddress
149143}
150144
151145private predicate binaryValueNumber (
152- BinaryInstruction instr , IRFunction irFunc , Opcode opcode , IRType type , TValueNumber leftOperand ,
146+ BinaryInstruction instr , IRFunction irFunc , Opcode opcode , TValueNumber leftOperand ,
153147 TValueNumber rightOperand
154148) {
155149 instr .getEnclosingIRFunction ( ) = irFunc and
156150 not instr instanceof PointerArithmeticInstruction and
157151 instr .getOpcode ( ) = opcode and
158- instr .getResultIRType ( ) = type and
159152 tvalueNumber ( instr .getLeft ( ) ) = leftOperand and
160153 tvalueNumber ( instr .getRight ( ) ) = rightOperand
161154}
162155
163156private predicate pointerArithmeticValueNumber (
164- PointerArithmeticInstruction instr , IRFunction irFunc , Opcode opcode , IRType type ,
165- int elementSize , TValueNumber leftOperand , TValueNumber rightOperand
157+ PointerArithmeticInstruction instr , IRFunction irFunc , Opcode opcode , int elementSize ,
158+ TValueNumber leftOperand , TValueNumber rightOperand
166159) {
167160 instr .getEnclosingIRFunction ( ) = irFunc and
168161 instr .getOpcode ( ) = opcode and
169- instr .getResultIRType ( ) = type and
170162 instr .getElementSize ( ) = elementSize and
171163 tvalueNumber ( instr .getLeft ( ) ) = leftOperand and
172164 tvalueNumber ( instr .getRight ( ) ) = rightOperand
173165}
174166
175167private predicate unaryValueNumber (
176- UnaryInstruction instr , IRFunction irFunc , Opcode opcode , IRType type , TValueNumber operand
168+ UnaryInstruction instr , IRFunction irFunc , Opcode opcode , TValueNumber operand
177169) {
178170 instr .getEnclosingIRFunction ( ) = irFunc and
179171 not instr instanceof InheritanceConversionInstruction and
180172 not instr instanceof CopyInstruction and
181173 not instr instanceof FieldAddressInstruction and
182174 instr .getOpcode ( ) = opcode and
183- instr .getResultIRType ( ) = type and
184175 tvalueNumber ( instr .getUnary ( ) ) = operand
185176}
186177
@@ -196,11 +187,10 @@ private predicate inheritanceConversionValueNumber(
196187}
197188
198189private predicate loadTotalOverlapValueNumber (
199- LoadTotalOverlapInstruction instr , IRFunction irFunc , IRType type , TValueNumber memOperand ,
190+ LoadTotalOverlapInstruction instr , IRFunction irFunc , TValueNumber memOperand ,
200191 TValueNumber operand
201192) {
202193 instr .getEnclosingIRFunction ( ) = irFunc and
203- instr .getResultIRType ( ) = type and
204194 tvalueNumber ( instr .getAnOperand ( ) .( MemoryOperand ) .getAnyDef ( ) ) = memOperand and
205195 tvalueNumberOfOperand ( instr .getAnOperand ( ) .( AddressOperand ) ) = operand
206196}
@@ -255,9 +245,9 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
255245 initializeThisValueNumber ( instr , irFunc ) and
256246 result = TInitializeThisValueNumber ( irFunc )
257247 or
258- exists ( IRType type , string value |
259- constantValueNumber ( instr , irFunc , type , value ) and
260- result = TConstantValueNumber ( irFunc , type , value )
248+ exists ( string value |
249+ constantValueNumber ( instr , irFunc , value ) and
250+ result = TConstantValueNumber ( irFunc , value )
261251 )
262252 or
263253 exists ( IRType type , string value |
@@ -270,14 +260,14 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
270260 result = TFieldAddressValueNumber ( irFunc , field , objectAddress )
271261 )
272262 or
273- exists ( Opcode opcode , IRType type , TValueNumber leftOperand , TValueNumber rightOperand |
274- binaryValueNumber ( instr , irFunc , opcode , type , leftOperand , rightOperand ) and
275- result = TBinaryValueNumber ( irFunc , opcode , type , leftOperand , rightOperand )
263+ exists ( Opcode opcode , TValueNumber leftOperand , TValueNumber rightOperand |
264+ binaryValueNumber ( instr , irFunc , opcode , leftOperand , rightOperand ) and
265+ result = TBinaryValueNumber ( irFunc , opcode , leftOperand , rightOperand )
276266 )
277267 or
278- exists ( Opcode opcode , IRType type , TValueNumber operand |
279- unaryValueNumber ( instr , irFunc , opcode , type , operand ) and
280- result = TUnaryValueNumber ( irFunc , opcode , type , operand )
268+ exists ( Opcode opcode , TValueNumber operand |
269+ unaryValueNumber ( instr , irFunc , opcode , operand ) and
270+ result = TUnaryValueNumber ( irFunc , opcode , operand )
281271 )
282272 or
283273 exists (
@@ -287,19 +277,15 @@ private TValueNumber nonUniqueValueNumber(Instruction instr) {
287277 result = TInheritanceConversionValueNumber ( irFunc , opcode , baseClass , derivedClass , operand )
288278 )
289279 or
290- exists (
291- Opcode opcode , IRType type , int elementSize , TValueNumber leftOperand ,
292- TValueNumber rightOperand
293- |
294- pointerArithmeticValueNumber ( instr , irFunc , opcode , type , elementSize , leftOperand ,
295- rightOperand ) and
280+ exists ( Opcode opcode , int elementSize , TValueNumber leftOperand , TValueNumber rightOperand |
281+ pointerArithmeticValueNumber ( instr , irFunc , opcode , elementSize , leftOperand , rightOperand ) and
296282 result =
297- TPointerArithmeticValueNumber ( irFunc , opcode , type , elementSize , leftOperand , rightOperand )
283+ TPointerArithmeticValueNumber ( irFunc , opcode , elementSize , leftOperand , rightOperand )
298284 )
299285 or
300- exists ( IRType type , TValueNumber memOperand , TValueNumber operand |
301- loadTotalOverlapValueNumber ( instr , irFunc , type , memOperand , operand ) and
302- result = TLoadTotalOverlapValueNumber ( irFunc , type , memOperand , operand )
286+ exists ( TValueNumber memOperand , TValueNumber operand |
287+ loadTotalOverlapValueNumber ( instr , irFunc , memOperand , operand ) and
288+ result = TLoadTotalOverlapValueNumber ( irFunc , memOperand , operand )
303289 )
304290 or
305291 // The value number of a copy is just the value number of its source value.
0 commit comments