Skip to content

Commit 9ef1a9c

Browse files
authored
Merge pull request github#17225 from geoffw0/aliasperf2
C++: Improve AliasedSSA performance
2 parents 490f814 + e36a1c7 commit 9ef1a9c

File tree

8 files changed

+782
-4
lines changed

8 files changed

+782
-4
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,8 +683,13 @@ private Overlap getExtentOverlap(MemoryLocation0 def, MemoryLocation0 use) {
683683
def.getVirtualVariable() = use.getVirtualVariable() and
684684
def instanceof EntireAllocationMemoryLocation and
685685
(
686-
// EntireAllocationMemoryLocation exactly overlaps itself.
687-
use instanceof EntireAllocationMemoryLocation and
686+
// EntireAllocationMemoryLocation exactly overlaps any EntireAllocationMemoryLocation for the
687+
// same allocation. Checking the allocation, rather than the memory location itself, ensures
688+
// that we get the right relationship between the "must" and "may" memory locations for that
689+
// allocation.
690+
// Note that if one of the locations is a "may" access, the overlap will be downgraded to
691+
// `MustTotallyOverlap` or `MayPartialOverlap` in `getOverlap()`.
692+
use.(EntireAllocationMemoryLocation).getAnAllocation() = def.getAnAllocation() and
688693
result instanceof MustExactlyOverlap
689694
or
690695
not use instanceof EntireAllocationMemoryLocation and

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,3 +2200,65 @@ ssa.cpp:
22002200
# 439| r439_15(glval<int>) = VariableAddress[#temp439:13] :
22012201
# 439| m439_16(int) = Store[#temp439:13] : &:r439_15, r439_14
22022202
#-----| Goto -> Block 1
2203+
2204+
# 442| void NonEscapingParams(void*, void*)
2205+
# 442| Block 0
2206+
# 442| v442_1(void) = EnterFunction :
2207+
# 442| m442_2(unknown) = AliasedDefinition :
2208+
# 442| m442_3(unknown) = InitializeNonLocal :
2209+
# 442| m442_4(unknown) = Chi : total:m442_2, partial:m442_3
2210+
# 442| r442_5(glval<void *>) = VariableAddress[a] :
2211+
# 442| m442_6(void *) = InitializeParameter[a] : &:r442_5
2212+
# 442| r442_7(void *) = Load[a] : &:r442_5, m442_6
2213+
# 442| m442_8(unknown) = InitializeIndirection[a] : &:r442_7
2214+
# 442| r442_9(glval<void *>) = VariableAddress[b] :
2215+
# 442| m442_10(void *) = InitializeParameter[b] : &:r442_9
2216+
# 442| r442_11(void *) = Load[b] : &:r442_9, m442_10
2217+
# 442| m442_12(unknown) = InitializeIndirection[b] : &:r442_11
2218+
# 444| v444_1(void) = NoOp :
2219+
# 442| v442_13(void) = ReturnIndirection[a] : &:r442_7, m442_8
2220+
# 442| v442_14(void) = ReturnIndirection[b] : &:r442_11, m442_12
2221+
# 442| v442_15(void) = ReturnVoid :
2222+
# 442| v442_16(void) = AliasedUse : m442_3
2223+
# 442| v442_17(void) = ExitFunction :
2224+
2225+
# 446| void EscapingParams(void*, void*)
2226+
# 446| Block 0
2227+
# 446| v446_1(void) = EnterFunction :
2228+
# 446| m446_2(unknown) = AliasedDefinition :
2229+
# 446| m446_3(unknown) = InitializeNonLocal :
2230+
# 446| m446_4(unknown) = Chi : total:m446_2, partial:m446_3
2231+
# 446| r446_5(glval<void *>) = VariableAddress[a] :
2232+
# 446| m446_6(void *) = InitializeParameter[a] : &:r446_5
2233+
# 446| r446_7(void *) = Load[a] : &:r446_5, m446_6
2234+
# 446| m446_8(unknown) = InitializeIndirection[a] : &:r446_7
2235+
# 446| m446_9(unknown) = Chi : total:m446_4, partial:m446_8
2236+
# 446| r446_10(glval<void *>) = VariableAddress[b] :
2237+
# 446| m446_11(void *) = InitializeParameter[b] : &:r446_10
2238+
# 446| r446_12(void *) = Load[b] : &:r446_10, m446_11
2239+
# 446| m446_13(unknown) = InitializeIndirection[b] : &:r446_12
2240+
# 446| m446_14(unknown) = Chi : total:m446_9, partial:m446_13
2241+
# 448| r448_1(glval<unknown>) = FunctionAddress[Escape] :
2242+
# 448| r448_2(glval<void *>) = VariableAddress[a] :
2243+
# 448| r448_3(void *) = Load[a] : &:r448_2, m446_6
2244+
# 448| v448_4(void) = Call[Escape] : func:r448_1, 0:r448_3
2245+
# 448| m448_5(unknown) = ^CallSideEffect : ~m446_14
2246+
# 448| m448_6(unknown) = Chi : total:m446_14, partial:m448_5
2247+
# 448| v448_7(void) = ^BufferReadSideEffect[0] : &:r448_3, ~m448_6
2248+
# 448| m448_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r448_3
2249+
# 448| m448_9(unknown) = Chi : total:m448_6, partial:m448_8
2250+
# 449| r449_1(glval<unknown>) = FunctionAddress[Escape] :
2251+
# 449| r449_2(glval<void *>) = VariableAddress[b] :
2252+
# 449| r449_3(void *) = Load[b] : &:r449_2, m446_11
2253+
# 449| v449_4(void) = Call[Escape] : func:r449_1, 0:r449_3
2254+
# 449| m449_5(unknown) = ^CallSideEffect : ~m448_9
2255+
# 449| m449_6(unknown) = Chi : total:m448_9, partial:m449_5
2256+
# 449| v449_7(void) = ^BufferReadSideEffect[0] : &:r449_3, ~m449_6
2257+
# 449| m449_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r449_3
2258+
# 449| m449_9(unknown) = Chi : total:m449_6, partial:m449_8
2259+
# 450| v450_1(void) = NoOp :
2260+
# 446| v446_15(void) = ReturnIndirection[a] : &:r446_7, ~m449_9
2261+
# 446| v446_16(void) = ReturnIndirection[b] : &:r446_12, ~m449_9
2262+
# 446| v446_17(void) = ReturnVoid :
2263+
# 446| v446_18(void) = AliasedUse : ~m449_9
2264+
# 446| v446_19(void) = ExitFunction :

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,3 +2200,65 @@ ssa.cpp:
22002200
# 439| r439_15(glval<int>) = VariableAddress[#temp439:13] :
22012201
# 439| m439_16(int) = Store[#temp439:13] : &:r439_15, r439_14
22022202
#-----| Goto -> Block 1
2203+
2204+
# 442| void NonEscapingParams(void*, void*)
2205+
# 442| Block 0
2206+
# 442| v442_1(void) = EnterFunction :
2207+
# 442| m442_2(unknown) = AliasedDefinition :
2208+
# 442| m442_3(unknown) = InitializeNonLocal :
2209+
# 442| m442_4(unknown) = Chi : total:m442_2, partial:m442_3
2210+
# 442| r442_5(glval<void *>) = VariableAddress[a] :
2211+
# 442| m442_6(void *) = InitializeParameter[a] : &:r442_5
2212+
# 442| r442_7(void *) = Load[a] : &:r442_5, m442_6
2213+
# 442| m442_8(unknown) = InitializeIndirection[a] : &:r442_7
2214+
# 442| r442_9(glval<void *>) = VariableAddress[b] :
2215+
# 442| m442_10(void *) = InitializeParameter[b] : &:r442_9
2216+
# 442| r442_11(void *) = Load[b] : &:r442_9, m442_10
2217+
# 442| m442_12(unknown) = InitializeIndirection[b] : &:r442_11
2218+
# 444| v444_1(void) = NoOp :
2219+
# 442| v442_13(void) = ReturnIndirection[a] : &:r442_7, m442_8
2220+
# 442| v442_14(void) = ReturnIndirection[b] : &:r442_11, m442_12
2221+
# 442| v442_15(void) = ReturnVoid :
2222+
# 442| v442_16(void) = AliasedUse : m442_3
2223+
# 442| v442_17(void) = ExitFunction :
2224+
2225+
# 446| void EscapingParams(void*, void*)
2226+
# 446| Block 0
2227+
# 446| v446_1(void) = EnterFunction :
2228+
# 446| m446_2(unknown) = AliasedDefinition :
2229+
# 446| m446_3(unknown) = InitializeNonLocal :
2230+
# 446| m446_4(unknown) = Chi : total:m446_2, partial:m446_3
2231+
# 446| r446_5(glval<void *>) = VariableAddress[a] :
2232+
# 446| m446_6(void *) = InitializeParameter[a] : &:r446_5
2233+
# 446| r446_7(void *) = Load[a] : &:r446_5, m446_6
2234+
# 446| m446_8(unknown) = InitializeIndirection[a] : &:r446_7
2235+
# 446| m446_9(unknown) = Chi : total:m446_4, partial:m446_8
2236+
# 446| r446_10(glval<void *>) = VariableAddress[b] :
2237+
# 446| m446_11(void *) = InitializeParameter[b] : &:r446_10
2238+
# 446| r446_12(void *) = Load[b] : &:r446_10, m446_11
2239+
# 446| m446_13(unknown) = InitializeIndirection[b] : &:r446_12
2240+
# 446| m446_14(unknown) = Chi : total:m446_9, partial:m446_13
2241+
# 448| r448_1(glval<unknown>) = FunctionAddress[Escape] :
2242+
# 448| r448_2(glval<void *>) = VariableAddress[a] :
2243+
# 448| r448_3(void *) = Load[a] : &:r448_2, m446_6
2244+
# 448| v448_4(void) = Call[Escape] : func:r448_1, 0:r448_3
2245+
# 448| m448_5(unknown) = ^CallSideEffect : ~m446_14
2246+
# 448| m448_6(unknown) = Chi : total:m446_14, partial:m448_5
2247+
# 448| v448_7(void) = ^BufferReadSideEffect[0] : &:r448_3, ~m448_6
2248+
# 448| m448_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r448_3
2249+
# 448| m448_9(unknown) = Chi : total:m448_6, partial:m448_8
2250+
# 449| r449_1(glval<unknown>) = FunctionAddress[Escape] :
2251+
# 449| r449_2(glval<void *>) = VariableAddress[b] :
2252+
# 449| r449_3(void *) = Load[b] : &:r449_2, m446_11
2253+
# 449| v449_4(void) = Call[Escape] : func:r449_1, 0:r449_3
2254+
# 449| m449_5(unknown) = ^CallSideEffect : ~m448_9
2255+
# 449| m449_6(unknown) = Chi : total:m448_9, partial:m449_5
2256+
# 449| v449_7(void) = ^BufferReadSideEffect[0] : &:r449_3, ~m449_6
2257+
# 449| m449_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r449_3
2258+
# 449| m449_9(unknown) = Chi : total:m449_6, partial:m449_8
2259+
# 450| v450_1(void) = NoOp :
2260+
# 446| v446_15(void) = ReturnIndirection[a] : &:r446_7, ~m449_9
2261+
# 446| v446_16(void) = ReturnIndirection[b] : &:r446_12, ~m449_9
2262+
# 446| v446_17(void) = ReturnVoid :
2263+
# 446| v446_18(void) = AliasedUse : ~m449_9
2264+
# 446| v446_19(void) = ExitFunction :

0 commit comments

Comments
 (0)