From 5cdd4ba70d9fca571372c341d8f091e378c08781 Mon Sep 17 00:00:00 2001 From: Jay Foad 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 d1abdb74ea4a9..b9d404aaee5fd 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); } }