Guards: Simplify non-linear join.

This commit is contained in:
Anders Schack-Mulligen
2025-11-11 13:34:47 +01:00
parent 3c7522ca7d
commit 62e28d2dcf

View File

@@ -1082,6 +1082,15 @@ module Make<
guard.directlyValueControls(ret.getBasicBlock(), val) guard.directlyValueControls(ret.getBasicBlock(), val)
} }
private predicate parameterControlsReturnExpr(
SsaParameterInit param, GuardValue val, ReturnExpr ret
) {
exists(Guard g0, GuardValue v0 |
directlyControlsReturn(g0, v0, ret) and
BranchImplies::ssaControls(param, val, g0, v0)
)
}
/** /**
* Holds if `ret` is a return expression in a non-overridable method that * Holds if `ret` is a return expression in a non-overridable method that
* on a return value of `retval` allows the conclusion that the `ppos`th * on a return value of `retval` allows the conclusion that the `ppos`th
@@ -1095,11 +1104,8 @@ module Make<
ret = rankedReturnExpr(m, rnk) and ret = rankedReturnExpr(m, rnk) and
param.getParameter() = m.getParameter(ppos) param.getParameter() = m.getParameter(ppos)
| |
exists(Guard g0, GuardValue v0 | parameterControlsReturnExpr(param, val, ret) and
directlyControlsReturn(g0, v0, ret) and relevantReturnExprValue(m, ret, retval)
BranchImplies::ssaControls(param, val, g0, v0) and
relevantReturnExprValue(m, ret, retval)
)
or or
ReturnImplies::ssaControls(param, val, ret, retval) ReturnImplies::ssaControls(param, val, ret, retval)
) )