mirror of
https://github.com/github/codeql.git
synced 2025-12-24 04:36:35 +01:00
C++: Unroll recursion in inStaticInitializer
This gets rid of some slow recursive magic.
On Wireshark, this improves the timing of the involved predicates from
m#Variable::runtimeExprInStaticInitializer#b ..................... 3.1s (executed 86 times)
Variable::runtimeExprInStaticInitializer#b#antijoin_rhs .......... 1.6s
Variable::runtimeExprInStaticInitializer#b ....................... 985ms (executed 6 times)
Variable::runtimeExprInStaticInitializer#b#loop_invariant_prefix . 845ms
#Expr::Expr::getParent_dispred#fbPlus ............................ 3.6s (executed 86 times)
#Expr::Expr::getParent_dispred#fbPlus_10#join_rhs ................ 988ms
to
Variable::runtimeExprInStaticInitializer#f#antijoin_rhs . 1.8s
Variable::runtimeExprInStaticInitializer#f .............. 1.1s (executed 6 times)
Variable::inStaticInitializer#f ......................... 3.2s (executed 86 times)
This commit is contained in:
@@ -404,7 +404,9 @@ private predicate runtimeExprInStaticInitializer(Expr e) {
|
||||
|
||||
/** Holds if `e` is part of the initializer of a `StaticStorageDurationVariable`. */
|
||||
private predicate inStaticInitializer(Expr e) {
|
||||
exists(StaticStorageDurationVariable var | e.getParent+() = var.getInitializer())
|
||||
exists(StaticStorageDurationVariable var | e = var.getInitializer().getExpr())
|
||||
or
|
||||
inStaticInitializer(e.getParent())
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user