@@ -401,43 +401,50 @@ private predicate isRelatableMemoryLocation(VariableMemoryLocation vml) {
401401 vml .getStartBitOffset ( ) != Ints:: unknown ( )
402402}
403403
404- private predicate isCoveredOffset ( VariableMemoryLocation vml , VirtualVariable vv , int offsetRank ) {
404+ private predicate isCoveredOffset (
405+ VirtualVariable vv , IRVariable var , int offsetRank , VariableMemoryLocation vml
406+ ) {
405407 exists ( int startRank , int endRank |
406408 vml .getStartBitOffset ( ) = rank [ startRank ] ( IntValue offset_ | isRelevantOffset ( vv , offset_ ) ) and
407409 vml .getEndBitOffset ( ) = rank [ endRank ] ( IntValue offset_ | isRelevantOffset ( vv , offset_ ) ) and
408- vv = vml . getVirtualVariable ( ) and
410+ hasVariableAndVirtualVariable ( vv , var , vml ) and
409411 isRelatableMemoryLocation ( vml ) and
410412 offsetRank in [ startRank .. endRank ]
411413 )
412414}
413415
414- private predicate hasUnknownOffset ( VariableMemoryLocation vml , VirtualVariable vv ) {
415- vml . getVirtualVariable ( ) = vv and
416+ private predicate hasUnknownOffset ( VirtualVariable vv , IRVariable var , VariableMemoryLocation vml ) {
417+ hasVariableAndVirtualVariable ( vv , var , vml ) and
416418 (
417419 vml .getStartBitOffset ( ) = Ints:: unknown ( ) or
418420 vml .getEndBitOffset ( ) = Ints:: unknown ( )
419421 )
420422}
421423
422- private predicate overlappingVariableMemoryLocations (
423- VariableMemoryLocation def , VariableMemoryLocation use
424+ private predicate hasVariableAndVirtualVariable (
425+ VirtualVariable vv , IRVariable var , VariableMemoryLocation vml
424426) {
425- exists ( VirtualVariable vv , int offsetRank |
426- isCoveredOffset ( def , vv , offsetRank ) and isCoveredOffset ( use , vv , offsetRank )
427- )
428- or
429- hasUnknownOffset ( def , use .getVirtualVariable ( ) )
430- or
431- hasUnknownOffset ( use , def .getVirtualVariable ( ) )
427+ var = vml .getVariable ( ) and
428+ vv = vml .getVirtualVariable ( )
432429}
433430
434- // Internal ticket: QL-937
435- pragma [ noopt]
436431private predicate overlappingIRVariableMemoryLocations (
437432 VariableMemoryLocation def , VariableMemoryLocation use
438433) {
439- overlappingVariableMemoryLocations ( def , use ) and
440- def .getVariable ( ) = use .getVariable ( )
434+ exists ( VirtualVariable vv , IRVariable var , int offsetRank |
435+ isCoveredOffset ( vv , var , offsetRank , def ) and
436+ isCoveredOffset ( vv , var , offsetRank , use )
437+ )
438+ or
439+ exists ( VirtualVariable vv , IRVariable var |
440+ hasUnknownOffset ( vv , var , def ) and
441+ hasVariableAndVirtualVariable ( vv , var , use )
442+ )
443+ or
444+ exists ( VirtualVariable vv , IRVariable var |
445+ hasUnknownOffset ( vv , var , use ) and
446+ hasVariableAndVirtualVariable ( vv , var , def )
447+ )
441448}
442449
443450private Overlap getVariableMemoryLocationOverlap (
0 commit comments