In the vector distribute patterns, we used to move
vector.transfer_reads out of vector.warp_execute_on_lane0s
irrespectively of how they were defined.
This could create transfer_read operations that would read values from
within the warpOp's body from outside of the body.
E.g.,
warpop { %defined_in_body %read = transfer_read %defined_in_body vector.yield %read }
>
warpop { %defined_in_body vector.yield ... } // %defined_in_body is referenced outside of its scope. %read = transfer_read %defined_in_body
The fix consists in checking that all the values feeding the new
transfer_read are defined outside of warpOp's body.
Note: We could do this check before creating any operation, but that would
mean knowing what affine::makeComposedAffineApply actually do. So the
current fix is a trade off of coupling the implementations of this
propagation and makeComposedAffineApply versus compile time.