diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2020-12-30 10:28:54 +0100 |
---|---|---|
committer | Dylan Baker <dylan.c.baker@intel.com> | 2021-01-02 10:40:13 -0800 |
commit | c7430bbc3eb044ea7eabd2e103ed879bf601d493 (patch) | |
tree | 94160fa16356c3b3b93c49383cdcb5a094ad9f15 | |
parent | 2b66910037b0c0e545eae3d8305cf955bd907742 (diff) |
nir: fix determining if an addition might overflow for phi sources
nir_addition_might_overflow() expects the parent instruction to be
an alu instr but it might be a phi instr. Fix it by assuming that
the addition might overflow.
This fixes compiler crashes with Horizon Zero Dawn.
No fossils-db changes.
Cc: mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8268>
(cherry picked from commit 0b503d8de96c7006c0fe1c8bfdcd8de02f255992)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/compiler/nir/nir_range_analysis.c | 60 |
2 files changed, 32 insertions, 30 deletions
diff --git a/.pick_status.json b/.pick_status.json index 5a72c7d76ba..28aa43ae00d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -499,7 +499,7 @@ "description": "nir: fix determining if an addition might overflow for phi sources", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/compiler/nir/nir_range_analysis.c b/src/compiler/nir/nir_range_analysis.c index 04449a91232..903f0b302c2 100644 --- a/src/compiler/nir/nir_range_analysis.c +++ b/src/compiler/nir/nir_range_analysis.c @@ -1456,36 +1456,38 @@ nir_addition_might_overflow(nir_shader *shader, struct hash_table *range_ht, nir_ssa_scalar ssa, unsigned const_val, const nir_unsigned_upper_bound_config *config) { - nir_op alu_op = nir_ssa_scalar_alu_op(ssa); - - /* iadd(imul(a, #b), #c) */ - if (alu_op == nir_op_imul || alu_op == nir_op_ishl) { - nir_ssa_scalar mul_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0); - nir_ssa_scalar mul_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1); - uint32_t stride = 1; - if (nir_ssa_scalar_is_const(mul_src0)) - stride = nir_ssa_scalar_as_uint(mul_src0); - else if (nir_ssa_scalar_is_const(mul_src1)) - stride = nir_ssa_scalar_as_uint(mul_src1); - - if (alu_op == nir_op_ishl) - stride = 1u << (stride % 32u); - - if (!stride || const_val <= UINT32_MAX - (UINT32_MAX / stride * stride)) - return false; - } + if (nir_ssa_scalar_is_alu(ssa)) { + nir_op alu_op = nir_ssa_scalar_alu_op(ssa); + + /* iadd(imul(a, #b), #c) */ + if (alu_op == nir_op_imul || alu_op == nir_op_ishl) { + nir_ssa_scalar mul_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0); + nir_ssa_scalar mul_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1); + uint32_t stride = 1; + if (nir_ssa_scalar_is_const(mul_src0)) + stride = nir_ssa_scalar_as_uint(mul_src0); + else if (nir_ssa_scalar_is_const(mul_src1)) + stride = nir_ssa_scalar_as_uint(mul_src1); + + if (alu_op == nir_op_ishl) + stride = 1u << (stride % 32u); + + if (!stride || const_val <= UINT32_MAX - (UINT32_MAX / stride * stride)) + return false; + } - /* iadd(iand(a, #b), #c) */ - if (alu_op == nir_op_iand) { - nir_ssa_scalar and_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0); - nir_ssa_scalar and_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1); - uint32_t mask = 0xffffffff; - if (nir_ssa_scalar_is_const(and_src0)) - mask = nir_ssa_scalar_as_uint(and_src0); - else if (nir_ssa_scalar_is_const(and_src1)) - mask = nir_ssa_scalar_as_uint(and_src1); - if (mask == 0 || const_val < (1u << (ffs(mask) - 1))) - return false; + /* iadd(iand(a, #b), #c) */ + if (alu_op == nir_op_iand) { + nir_ssa_scalar and_src0 = nir_ssa_scalar_chase_alu_src(ssa, 0); + nir_ssa_scalar and_src1 = nir_ssa_scalar_chase_alu_src(ssa, 1); + uint32_t mask = 0xffffffff; + if (nir_ssa_scalar_is_const(and_src0)) + mask = nir_ssa_scalar_as_uint(and_src0); + else if (nir_ssa_scalar_is_const(and_src1)) + mask = nir_ssa_scalar_as_uint(and_src1); + if (mask == 0 || const_val < (1u << (ffs(mask) - 1))) + return false; + } } uint32_t ub = nir_unsigned_upper_bound(shader, range_ht, ssa, config); |