1baee655cSJakob Stoklund Olesen //===-- llvm/ADT/IntEqClasses.cpp - Equivalence Classes of Integers -------===// 2baee655cSJakob Stoklund Olesen // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6baee655cSJakob Stoklund Olesen // 7baee655cSJakob Stoklund Olesen //===----------------------------------------------------------------------===// 8baee655cSJakob Stoklund Olesen // 9baee655cSJakob Stoklund Olesen // Equivalence classes for small integers. This is a mapping of the integers 10baee655cSJakob Stoklund Olesen // 0 .. N-1 into M equivalence classes numbered 0 .. M-1. 11baee655cSJakob Stoklund Olesen // 12baee655cSJakob Stoklund Olesen // Initially each integer has its own equivalence class. Classes are joined by 13baee655cSJakob Stoklund Olesen // passing a representative member of each class to join(). 14baee655cSJakob Stoklund Olesen // 15baee655cSJakob Stoklund Olesen // Once the classes are built, compress() will number them 0 .. M-1 and prevent 16baee655cSJakob Stoklund Olesen // further changes. 17baee655cSJakob Stoklund Olesen // 18baee655cSJakob Stoklund Olesen //===----------------------------------------------------------------------===// 19baee655cSJakob Stoklund Olesen 20baee655cSJakob Stoklund Olesen #include "llvm/ADT/IntEqClasses.h" 21*eb812efaSJoerg Sonnenberger #include <cassert> 22baee655cSJakob Stoklund Olesen 23baee655cSJakob Stoklund Olesen using namespace llvm; 24baee655cSJakob Stoklund Olesen grow(unsigned N)25baee655cSJakob Stoklund Olesenvoid IntEqClasses::grow(unsigned N) { 26baee655cSJakob Stoklund Olesen assert(NumClasses == 0 && "grow() called after compress()."); 274c278f82SJakob Stoklund Olesen EC.reserve(N); 28baee655cSJakob Stoklund Olesen while (EC.size() < N) 29baee655cSJakob Stoklund Olesen EC.push_back(EC.size()); 30baee655cSJakob Stoklund Olesen } 31baee655cSJakob Stoklund Olesen join(unsigned a,unsigned b)327c66afb8SMatthias Braununsigned IntEqClasses::join(unsigned a, unsigned b) { 33baee655cSJakob Stoklund Olesen assert(NumClasses == 0 && "join() called after compress()."); 34baee655cSJakob Stoklund Olesen unsigned eca = EC[a]; 35baee655cSJakob Stoklund Olesen unsigned ecb = EC[b]; 36baee655cSJakob Stoklund Olesen // Update pointers while searching for the leaders, compressing the paths 37baee655cSJakob Stoklund Olesen // incrementally. The larger leader will eventually be updated, joining the 38baee655cSJakob Stoklund Olesen // classes. 39baee655cSJakob Stoklund Olesen while (eca != ecb) 407a083814SRichard Trieu if (eca < ecb) { 417a083814SRichard Trieu EC[b] = eca; 427a083814SRichard Trieu b = ecb; 437a083814SRichard Trieu ecb = EC[b]; 447a083814SRichard Trieu } else { 457a083814SRichard Trieu EC[a] = ecb; 467a083814SRichard Trieu a = eca; 477a083814SRichard Trieu eca = EC[a]; 487a083814SRichard Trieu } 497c66afb8SMatthias Braun 507c66afb8SMatthias Braun return eca; 51baee655cSJakob Stoklund Olesen } 52baee655cSJakob Stoklund Olesen findLeader(unsigned a) const53baee655cSJakob Stoklund Olesenunsigned IntEqClasses::findLeader(unsigned a) const { 54baee655cSJakob Stoklund Olesen assert(NumClasses == 0 && "findLeader() called after compress()."); 55baee655cSJakob Stoklund Olesen while (a != EC[a]) 56baee655cSJakob Stoklund Olesen a = EC[a]; 57baee655cSJakob Stoklund Olesen return a; 58baee655cSJakob Stoklund Olesen } 59baee655cSJakob Stoklund Olesen compress()60baee655cSJakob Stoklund Olesenvoid IntEqClasses::compress() { 61baee655cSJakob Stoklund Olesen if (NumClasses) 62baee655cSJakob Stoklund Olesen return; 63baee655cSJakob Stoklund Olesen for (unsigned i = 0, e = EC.size(); i != e; ++i) 64baee655cSJakob Stoklund Olesen EC[i] = (EC[i] == i) ? NumClasses++ : EC[EC[i]]; 65baee655cSJakob Stoklund Olesen } 66baee655cSJakob Stoklund Olesen uncompress()67baee655cSJakob Stoklund Olesenvoid IntEqClasses::uncompress() { 68baee655cSJakob Stoklund Olesen if (!NumClasses) 69baee655cSJakob Stoklund Olesen return; 70baee655cSJakob Stoklund Olesen SmallVector<unsigned, 8> Leader; 71baee655cSJakob Stoklund Olesen for (unsigned i = 0, e = EC.size(); i != e; ++i) 72baee655cSJakob Stoklund Olesen if (EC[i] < Leader.size()) 73baee655cSJakob Stoklund Olesen EC[i] = Leader[EC[i]]; 74baee655cSJakob Stoklund Olesen else 75baee655cSJakob Stoklund Olesen Leader.push_back(EC[i] = i); 76baee655cSJakob Stoklund Olesen NumClasses = 0; 77baee655cSJakob Stoklund Olesen } 78