Lunderberg opened a new pull request, #13708:
URL: https://github.com/apache/tvm/pull/13708

   Negative numerators to modulo/remainder operations are not supported by the 
Vulkan API.  While the SPIR-V instructions
   
[`OpSRem`](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpSRem)
 and 
[`OpSMod`](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpSMod)
 have identical semantics to `tir::Mod` and `tir::FloorMod`, respectively, use 
of either instruction within Vulkan results in undefined behavior.  From the 
[Vulkan 
spec](https://registry.khronos.org/vulkan/specs/1.3/html/chap37.html#spirvenv-op-prec):
   
   > For the OpSRem and OpSMod instructions, if either operand is negative the 
result is undefined.
   >
   > Note: While the OpSRem and OpSMod instructions are supported by the Vulkan 
environment, they require non-negative values and thus do not enable additional 
functionality beyond what OpUMod provides.
   
   This issue was first noticed in https://github.com/apache/tvm/pull/13530, 
where use of integer arithmetic resulted in negative numerators.  This hadn't 
caused issues previously, because most use of div/mod use a denominator that is 
a power of two.  In these cases, `tir.LowerIntrin` implements floordiv and 
floormod using only bitwise operations.  When the denominator isn't a power of 
two, both `tir::FloorDiv` and `tir::FloorMod` are implemented in terms of 
`tir::Mod`, which triggers the undefined behavior for negative numerators.
   
   This commit implements additional simplification rules that preferentially 
removes negative values from the numerators.  For example, simplifying 
`floormod(i - 2, 8)` to `floormod(i + 6, 8)`, and simplifying `floordiv(i - 2, 
8)` to `floordiv(i + 6, 8) - 1`.  These handle the most common case, where some 
index variable is being offset by a negative constant.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to