Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 367d13c

Browse files
author
Robert Marsh
authored
Merge pull request #2570 from jbj/ir-overlappingVariableMemoryLocations
C++: Fix overlappingVariableMemoryLocations perf
2 parents ed21259 + 4830e43 commit 367d13c

1 file changed

Lines changed: 24 additions & 17 deletions

File tree

  • cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
436431
private 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

443450
private Overlap getVariableMemoryLocationOverlap(

0 commit comments

Comments
 (0)