The point of hoisting towards entry is to reduce code size, as the changelog indicates. It's safe to hoist the expression from program points P_{0..i..n-1} to some point Q that dominates all P_i if the expression is available at each P_i. That reduces the number of occurrences by n - 1.
It's a basic corollary of PRE.
This is identical to what LLVM's load-store motion does for loads, except for all expressions and not just loads.
Writing "TODO: generalize to other regions" in a crazy N^3/N^4 approach to merging load/stores is like writing "TODO: solve prime number conjecture" in somebody's hand-rolled two's complement addition code.
Maybe it happens, but it ain't gonna happen with anything like this code :)
This is identical to what LLVM's load-store motion does for loads, except for all expressions and not just loads.