STL/LDL have 13 bits to store imm offset. However the most significant
bit in the offset is a sign bit, so the positive offset is limited by
12 bits.
nir_opt_offsets only has the upper limit and doesn't deal with
negative offsets, so shared_max should be changed to `(1 << 12) - 1`.
The issue was found in "Monster Hunter: World".
Fixes:
0b2da9d795610df15346a594384c39a096be338f
("ir3: Limit the maximum imm offset in nir_opt_offset for shared vars")
Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20100>
(cherry picked from commit
8f0177b3345f8bcc3673b8a2a7c36ea36cbaa029)
"description": "ir3: Reduce the maximum allowed imm offset for shared var load/store",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "0b2da9d795610df15346a594384c39a096be338f"
},
*/
.uniform_max = (1 << 9) - 1,
- .shared_max = (1 << 13) - 1,
+ /* STL/LDL have 13b for offset with MSB being a sign bit, but this opt
+ * doesn't deal with negative offsets.
+ */
+ .shared_max = (1 << 12) - 1,
.buffer_max = ~0,
};