From 05d022e31ee217ead678590ae49dc0f448ec16d8 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Fri, 14 Apr 2017 21:17:36 +0000 Subject: [PATCH] [RDF] Correctly enumerate reg units for reg masks git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300368 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Hexagon/RDFRegisters.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Target/Hexagon/RDFRegisters.cpp b/lib/Target/Hexagon/RDFRegisters.cpp index 4e16bad11fb..5c5496a548a 100644 --- a/lib/Target/Hexagon/RDFRegisters.cpp +++ b/lib/Target/Hexagon/RDFRegisters.cpp @@ -246,13 +246,15 @@ bool RegisterAggr::hasCoverOf(RegisterRef RR) const { RegisterAggr &RegisterAggr::insert(RegisterRef RR) { if (PhysicalRegisterInfo::isRegMaskId(RR.Reg)) { - // XXX SLOW + BitVector PU(PRI.getTRI().getNumRegUnits()); // Preserved units. const uint32_t *MB = PRI.getRegMaskBits(RR.Reg); for (unsigned i = 1, e = PRI.getTRI().getNumRegs(); i != e; ++i) { - if (MB[i/32] & (1u << (i%32))) + if (!(MB[i/32] & (1u << (i%32)))) continue; - insert(RegisterRef(i, LaneBitmask::getAll())); + for (MCRegUnitIterator U(i, &PRI.getTRI()); U.isValid(); ++U) + PU.set(*U); } + Units |= PU.flip(); return *this; } -- 2.40.0