[llvm] [TableGen] Fix computeRegUnitLaneMasks for ad hoc aliasing (PR #79462)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 25 07:57:15 PST 2024
https://github.com/jayfoad created https://github.com/llvm/llvm-project/pull/79462
With ad hoc aliasing (using the Aliases field in register definitions)
we can have subregisters with disjoint lane masks that nevertheless
share a regunit. In this case we need to take the union of their
lane masks, not the intersection.
This was inadvertently broken by https://reviews.llvm.org/D157864
>From 5cdd4ba70d9fca571372c341d8f091e378c08781 Mon Sep 17 00:00:00 2001
From: Jay Foad <jay.foad at amd.com>
Date: Thu, 25 Jan 2024 15:33:06 +0000
Subject: [PATCH] [TableGen] Fix computeRegUnitLaneMasks for ad hoc aliasing
With ad hoc aliasing (using the Aliases field in register definitions)
we can have subregisters with disjoint lane masks that nevertheless
share a regunit. In this case we need to take the union of their
lane masks, not the intersection.
This was inadvertently broken by https://reviews.llvm.org/D157864
---
llvm/utils/TableGen/CodeGenRegisters.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/llvm/utils/TableGen/CodeGenRegisters.cpp b/llvm/utils/TableGen/CodeGenRegisters.cpp
index d1abdb74ea4a982..b9d404aaee5fd79 100644
--- a/llvm/utils/TableGen/CodeGenRegisters.cpp
+++ b/llvm/utils/TableGen/CodeGenRegisters.cpp
@@ -2144,7 +2144,7 @@ void CodeGenRegBank::computeRegUnitLaneMasks() {
// Create an initial lane mask for all register units.
const auto &RegUnits = Register.getRegUnits();
CodeGenRegister::RegUnitLaneMaskList RegUnitLaneMasks(
- RegUnits.count(), LaneBitmask::getAll());
+ RegUnits.count(), LaneBitmask::getNone());
// Iterate through SubRegisters.
typedef CodeGenRegister::SubRegMap SubRegMap;
const SubRegMap &SubRegs = Register.getSubRegs();
@@ -2163,7 +2163,7 @@ void CodeGenRegBank::computeRegUnitLaneMasks() {
unsigned u = 0;
for (unsigned RU : RegUnits) {
if (SUI == RU) {
- RegUnitLaneMasks[u] &= LaneMask;
+ RegUnitLaneMasks[u] |= LaneMask;
assert(!Found);
Found = true;
}
@@ -2173,6 +2173,10 @@ void CodeGenRegBank::computeRegUnitLaneMasks() {
assert(Found);
}
}
+ for (auto &Mask : RegUnitLaneMasks) {
+ if (Mask.none())
+ Mask = LaneBitmask::getAll();
+ }
Register.setRegUnitLaneMasks(RegUnitLaneMasks);
}
}
More information about the llvm-commits
mailing list