From 57827e69036ae963272c6880729ac990b9ed22af Mon Sep 17 00:00:00 2001 From: Friedrich Vock Date: Thu, 8 Dec 2022 21:26:28 +0100 Subject: [PATCH] nir: Do not consider phis with incompatible dests equal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CSE tries to collapse equal instructions, and collapsing two phis with incompatible dests is illegal. Reviewed-by: Konstantin Seurer Reviewed-by: Daniel Schürmann Reviewed-by: Jason Ekstrand Fixes: 6bdce55c ("nir: Add a basic CSE pass") Part-of: (cherry picked from commit a54c2c828941ef1325fc1a3b49eba32f3c964f0d) --- .pick_status.json | 2 +- src/compiler/nir/nir_instr_set.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 1bc68430bf4..46418079807 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1228,7 +1228,7 @@ "description": "nir: Do not consider phis with incompatible dests equal", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "6bdce55c44a45fc8ec8426996572c18ecf88bd64" }, diff --git a/src/compiler/nir/nir_instr_set.c b/src/compiler/nir/nir_instr_set.c index 032fcbcb918..985db65c0a1 100644 --- a/src/compiler/nir/nir_instr_set.c +++ b/src/compiler/nir/nir_instr_set.c @@ -707,6 +707,14 @@ nir_instrs_equal(const nir_instr *instr1, const nir_instr *instr2) if (phi1->instr.block != phi2->instr.block) return false; + /* In case of phis with no sources, the dest needs to be checked + * to ensure that phis with incompatible dests won't get merged + * during CSE. */ + if (phi1->dest.ssa.num_components != phi2->dest.ssa.num_components) + return false; + if (phi1->dest.ssa.bit_size != phi2->dest.ssa.bit_size) + return false; + nir_foreach_phi_src(src1, phi1) { nir_foreach_phi_src(src2, phi2) { if (src1->pred == src2->pred) {