Skip to content

Commit d95114f

Browse files
committed
SSA: Extend consistency queries.
1 parent 38bf9c6 commit d95114f

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

shared/ssa/codeql/ssa/Ssa.qll

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,6 +1379,56 @@ module Make<LocationSig Location, InputSig<Location> Input> {
13791379
not def.definesAt(v, getImmediateBasicBlockDominator*(bb), _)
13801380
)
13811381
}
1382+
1383+
/** Holds if the end of a basic block can be reached by multiple definitions. */
1384+
query predicate nonUniqueDefReachesEndOfBlock(Definition def, SourceVariable v, BasicBlock bb) {
1385+
ssaDefReachesEndOfBlock(bb, def, v) and
1386+
not exists(unique(Definition def0 | ssaDefReachesEndOfBlock(bb, def0, v)))
1387+
}
1388+
1389+
/** Holds if a phi node has less than two inputs. */
1390+
query predicate uselessPhiNode(PhiNode phi, int inputs) {
1391+
inputs = count(Definition inp | phiHasInputFromBlock(phi, inp, _)) and
1392+
inputs < 2
1393+
}
1394+
1395+
/** Holds if a certain read does not have a prior reference. */
1396+
query predicate readWithoutPriorRef(SourceVariable v, BasicBlock bb, int i) {
1397+
variableRead(bb, i, v, true) and
1398+
not AdjacentSsaRefs::adjacentRefRead(_, _, bb, i, v)
1399+
}
1400+
1401+
/**
1402+
* Holds if a certain read has multiple prior references. The introduction
1403+
* of phi reads should make the prior reference unique.
1404+
*/
1405+
query predicate readWithMultiplePriorRefs(
1406+
SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2
1407+
) {
1408+
AdjacentSsaRefs::adjacentRefRead(bb1, i1, bb2, i2, v) and
1409+
2 <=
1410+
strictcount(BasicBlock bb0, int i0 | AdjacentSsaRefs::adjacentRefRead(bb0, i0, bb1, i1, v))
1411+
}
1412+
1413+
/** Holds if `phi` has less than 2 immediately prior references. */
1414+
query predicate phiWithoutTwoPriorRefs(PhiNode phi, int inputRefs) {
1415+
exists(BasicBlock bbPhi, SourceVariable v |
1416+
phi.definesAt(v, bbPhi, _) and
1417+
inputRefs =
1418+
count(BasicBlock bb, int i | AdjacentSsaRefs::adjacentRefPhi(bb, i, _, bbPhi, v)) and
1419+
inputRefs < 2
1420+
)
1421+
}
1422+
1423+
/**
1424+
* Holds if the phi read for `v` at `bb` has less than 2 immediately prior
1425+
* references.
1426+
*/
1427+
query predicate phiReadWithoutTwoPriorRefs(BasicBlock bbPhi, SourceVariable v, int inputRefs) {
1428+
synthPhiRead(bbPhi, v) and
1429+
inputRefs = count(BasicBlock bb, int i | AdjacentSsaRefs::adjacentRefPhi(bb, i, _, bbPhi, v)) and
1430+
inputRefs < 2
1431+
}
13821432
}
13831433

13841434
/** Provides the input to `DataFlowIntegration`. */

0 commit comments

Comments
 (0)