[llvm] ba65710 - [RISCV] Avoid redundant SchedRead on _TIED VPseudos (#113940)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 29 10:49:39 PDT 2024
Author: Min-Yih Hsu
Date: 2024-10-29T10:49:35-07:00
New Revision: ba65710908137fe68e7c039f1e2829c3d37480f3
URL: https://github.com/llvm/llvm-project/commit/ba65710908137fe68e7c039f1e2829c3d37480f3
DIFF: https://github.com/llvm/llvm-project/commit/ba65710908137fe68e7c039f1e2829c3d37480f3.diff
LOG: [RISCV] Avoid redundant SchedRead on _TIED VPseudos (#113940)
_TIED and _MASK_TIED pseudos have one less operand compared to other
pseudos, thus we shouldn't attach the same number of SchedRead for these
instructions.
I don't think we have a way to (explicitly) check scheduling classes. So
I only test this patch with existing tests.
Added:
Modified:
llvm/lib/Target/RISCV/RISCVInstrInfoV.td
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
index 4e8619c5ec2392..8e0c4826ac00de 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
@@ -104,13 +104,28 @@ class SchedCommon<list<SchedWrite> writes, list<SchedRead> reads,
string mx = "WorstCase", int sew = 0, bit forceMasked = 0,
bit forcePassthruRead = 0> : Sched<[]> {
defvar isMasked = !ne(!find(NAME, "_MASK"), -1);
+ defvar isTied = !ne(!find(NAME, "_TIED"), -1);
defvar isMaskedOrForceMasked = !or(forceMasked, isMasked);
+ defvar isTiedMasked = !and(isMaskedOrForceMasked, isTied);
defvar passthruRead = !if(!or(!eq(mx, "WorstCase"), !eq(sew, 0)),
!cast<SchedRead>("ReadVPassthru_" # mx),
!cast<SchedRead>("ReadVPassthru_" # mx # "_E" #sew));
- defvar needsPassthruRead = !or(isMaskedOrForceMasked, forcePassthruRead);
+ // We don't need passthru operand if it's already _TIED without mask.
+ defvar needsForcePassthruRead = !and(forcePassthruRead, !not(isTied));
+ defvar needsPassthruRead = !or(isMaskedOrForceMasked, needsForcePassthruRead);
+ // If this is a _TIED + masked operation, $rs2 (i.e. the first operand) is
+ // merged with the mask.
+ // NOTE: the following if statement is written in such a weird way because
+ // should we want to write something like
+ // `!if(!and(!not(!empty(reads), isTiedMasked), !tail(reads), reads)`
+ // since `!if` doesn't have a proper short-circuit behavior, if the
+ // condition of this `!if` cannot be resolved right away, `!tail(reads)` will
+ // be immediately evaluated anyway even when `reads` is empty, which leads to
+ // an assertion failure.
+ defvar readsWithTiedMask =
+ !if(isTiedMasked, !if(!not(!empty(reads)), !tail(reads), reads), reads);
defvar readsWithMask =
- !if(isMaskedOrForceMasked, !listconcat(reads, [ReadVMask]), reads);
+ !if(isMaskedOrForceMasked, !listconcat(readsWithTiedMask, [ReadVMask]), reads);
defvar allReads =
!if(needsPassthruRead, !listconcat([passthruRead], readsWithMask), reads);
let SchedRW = !listconcat(writes, allReads);
More information about the llvm-commits
mailing list