summaryrefslogtreecommitdiffstats
path: root/src/amd/compiler
diff options
context:
space:
mode:
authorRhys Perry <[email protected]>2019-09-21 16:00:45 +0100
committerRhys Perry <[email protected]>2019-09-26 13:19:51 +0100
commit86ecf92c23ccd4a5493a27104e9c85b8fa41f3a3 (patch)
tree0503473f4917df3557a881bed8fd150e411dd26b /src/amd/compiler
parent3c966fd688c1b8eb846fd8675275c33a08786b07 (diff)
aco: don't CSE v_readlane_b32/v_readfirstlane_b32
Signed-off-by: Rhys Perry <[email protected]> Reviewed-by: Daniel Schürmann <[email protected]>
Diffstat (limited to 'src/amd/compiler')
-rw-r--r--src/amd/compiler/aco_opt_value_numbering.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/amd/compiler/aco_opt_value_numbering.cpp b/src/amd/compiler/aco_opt_value_numbering.cpp
index 8071ace1f97..100537fd47a 100644
--- a/src/amd/compiler/aco_opt_value_numbering.cpp
+++ b/src/amd/compiler/aco_opt_value_numbering.cpp
@@ -82,6 +82,10 @@ struct InstrPred {
return false;
if (a->operands.size() != b->operands.size() || a->definitions.size() != b->definitions.size())
return false; /* possible with pseudo-instructions */
+ /* We can't value number v_readlane_b32 across control flow or discards
+ * because of the possibility of live-range splits. */
+ if (a->opcode == aco_opcode::v_readfirstlane_b32 || a->opcode == aco_opcode::v_readlane_b32)
+ return false;
for (unsigned i = 0; i < a->operands.size(); i++) {
if (a->operands[i].isConstant()) {
if (!b->operands[i].isConstant())