Skip to content

Commit cff0f48

Browse files
committed
C++: Work around join-order issue in flow-through
In this non-linear recursion, a `#prev` relation was joined earlier than the `#prev_delta` relation. As a result, each iteration of the predicate processes every tuple from previous iterations. This quadratic behavior caused severe slowdowns on oneapi-src/oneDNN.
1 parent 17beb2d commit cff0f48

File tree

4 files changed

+36
-8
lines changed

4 files changed

+36
-8
lines changed

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,23 @@ private module Cached {
198198
compatibleTypes(getErasedNodeTypeBound(p), read.getContainerType())
199199
)
200200
or
201+
parameterValueFlow0_0(TReadStepTypesNone(), p, node, read)
202+
}
203+
204+
pragma[nomagic]
205+
private predicate parameterValueFlow0_0(
206+
ReadStepTypesOption mustBeNone, ParameterNode p, Node node, ReadStepTypesOption read
207+
) {
201208
// flow through: no prior read
202209
exists(ArgumentNode arg |
203-
parameterValueFlowArg(p, arg, TReadStepTypesNone()) and
210+
parameterValueFlowArg(p, arg, mustBeNone) and
204211
argumentValueFlowsThrough(arg, read, node)
205212
)
206213
or
207214
// flow through: no read inside method
208215
exists(ArgumentNode arg |
209216
parameterValueFlowArg(p, arg, read) and
210-
argumentValueFlowsThrough(arg, TReadStepTypesNone(), node)
217+
argumentValueFlowsThrough(arg, mustBeNone, node)
211218
)
212219
}
213220

cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,23 @@ private module Cached {
198198
compatibleTypes(getErasedNodeTypeBound(p), read.getContainerType())
199199
)
200200
or
201+
parameterValueFlow0_0(TReadStepTypesNone(), p, node, read)
202+
}
203+
204+
pragma[nomagic]
205+
private predicate parameterValueFlow0_0(
206+
ReadStepTypesOption mustBeNone, ParameterNode p, Node node, ReadStepTypesOption read
207+
) {
201208
// flow through: no prior read
202209
exists(ArgumentNode arg |
203-
parameterValueFlowArg(p, arg, TReadStepTypesNone()) and
210+
parameterValueFlowArg(p, arg, mustBeNone) and
204211
argumentValueFlowsThrough(arg, read, node)
205212
)
206213
or
207214
// flow through: no read inside method
208215
exists(ArgumentNode arg |
209216
parameterValueFlowArg(p, arg, read) and
210-
argumentValueFlowsThrough(arg, TReadStepTypesNone(), node)
217+
argumentValueFlowsThrough(arg, mustBeNone, node)
211218
)
212219
}
213220

csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,23 @@ private module Cached {
198198
compatibleTypes(getErasedNodeTypeBound(p), read.getContainerType())
199199
)
200200
or
201+
parameterValueFlow0_0(TReadStepTypesNone(), p, node, read)
202+
}
203+
204+
pragma[nomagic]
205+
private predicate parameterValueFlow0_0(
206+
ReadStepTypesOption mustBeNone, ParameterNode p, Node node, ReadStepTypesOption read
207+
) {
201208
// flow through: no prior read
202209
exists(ArgumentNode arg |
203-
parameterValueFlowArg(p, arg, TReadStepTypesNone()) and
210+
parameterValueFlowArg(p, arg, mustBeNone) and
204211
argumentValueFlowsThrough(arg, read, node)
205212
)
206213
or
207214
// flow through: no read inside method
208215
exists(ArgumentNode arg |
209216
parameterValueFlowArg(p, arg, read) and
210-
argumentValueFlowsThrough(arg, TReadStepTypesNone(), node)
217+
argumentValueFlowsThrough(arg, mustBeNone, node)
211218
)
212219
}
213220

java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,23 @@ private module Cached {
198198
compatibleTypes(getErasedNodeTypeBound(p), read.getContainerType())
199199
)
200200
or
201+
parameterValueFlow0_0(TReadStepTypesNone(), p, node, read)
202+
}
203+
204+
pragma[nomagic]
205+
private predicate parameterValueFlow0_0(
206+
ReadStepTypesOption mustBeNone, ParameterNode p, Node node, ReadStepTypesOption read
207+
) {
201208
// flow through: no prior read
202209
exists(ArgumentNode arg |
203-
parameterValueFlowArg(p, arg, TReadStepTypesNone()) and
210+
parameterValueFlowArg(p, arg, mustBeNone) and
204211
argumentValueFlowsThrough(arg, read, node)
205212
)
206213
or
207214
// flow through: no read inside method
208215
exists(ArgumentNode arg |
209216
parameterValueFlowArg(p, arg, read) and
210-
argumentValueFlowsThrough(arg, TReadStepTypesNone(), node)
217+
argumentValueFlowsThrough(arg, mustBeNone, node)
211218
)
212219
}
213220

0 commit comments

Comments
 (0)