summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2020-12-30 10:28:54 +0100
committerDylan Baker <dylan.c.baker@intel.com>2021-01-02 10:40:13 -0800
commitc7430bbc3eb044ea7eabd2e103ed879bf601d493 (patch)
tree94160fa16356c3b3b93c49383cdcb5a094ad9f15
parent2b66910037b0c0e545eae3d8305cf955bd907742 (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.json2
-rw-r--r--src/compiler/nir/nir_range_analysis.c60
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);