Description

With Sequencer.CustomTaskScheduling enabled, a task graph with more than 512 tasks can hang FEntitySystemScheduler::ExecuteTasks. Reported by a licensee, they hit it with a 528 task graph under Clang.

FTaskBitSet is a TDynamicSparseBitSet with 512 bits per bucket. Two bugs in SparseBitSet.h:

  1. TDynamicSparseBitSet::IsBitSet passes the absolute bit index to the bucket instead of a bucket-relative one, unlike SetBit. For bit 512 and up this shifts a uint32 by 32 or more, which is undefined behavior and gives wrong answers under Clang. AddPrerequisite uses IsBitSet to avoid double counting dependencies, so NumPrerequisites stops matching the number of signalers, WaitCount never reaches zero and ExecuteTasks never returns.
  1. TDynamicSparseBitSet::operator|= drops any of Other's buckets past this set's last bucket, so {bucket 0}

    |=

    {bucket 0, bucket 1}

    loses bucket 1. PropagatePrerequisite uses it, so system dependencies on tasks 512 and up can be lost.

Fix: IsBitSet subtracts the bucket offset from the bit index (as SetBit does), and operator|= appends the remaining entries from Other after the merge loop.

Added System.Engine.Sequencer.SparseBitSetMultiBucket. It fails on operator|= before the fix and passes after. The IsBitSet shift only misbehaves under Clang, so the test cannot fail without that fix on MSVC.

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-402072 in the post.

0
Login to Vote

Fixed
ComponentUE - ACT Character - Sequencer
Affects Versions5.8.4
Target Fix5.8.5
Fix Commit59310494
CreatedOct 12, 2026
ResolvedOct 15, 2026
UpdatedOct 19, 2026
View Jira Issue