if (ftable) {
DEBUG_PRINTF("ftable fd=%u fmd %u\n", t->floatingDistance,
t->floatingMinDistance);
- if (t->noFloatingRoots && tctxt->depth == 1) {
+ if (t->noFloatingRoots && !roseHasInFlightMatches(t, state, scratch)) {
DEBUG_PRINTF("skip FLOATING: no inflight matches\n");
goto exit;
}
mmbit_sparse_iter_unset(role_state, numStates, it, si_state);
}
+static rose_inline
+int roseHasInFlightMatches(const struct RoseEngine *t, u8 *state,
+ const struct hs_scratch *scratch) {
+ if (scratch->al_log_sum) {
+ DEBUG_PRINTF("anchored literals in log\n");
+ return 1;
+ }
+
+ if (scratch->tctxt.filledDelayedSlots) {
+ DEBUG_PRINTF("delayed literal\n");
+ return 1;
+ }
+
+ if (mmbit_any(getRoleState(state), t->rolesWithStateCount)) {
+ DEBUG_PRINTF("role state is set\n");
+ return 1;
+ }
+
+ return 0;
+}
+
#endif
const struct HWLM *ftable = getFLiteralMatcher(t);
if (ftable) {
- if (t->noFloatingRoots && tctxt->depth == 1) {
+ if (t->noFloatingRoots && !roseHasInFlightMatches(t, state, scratch)) {
DEBUG_PRINTF("skip FLOATING: no inflight matches\n");
goto flush_delay_and_exit;
}