mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 22:56:05 +00:00

This PR depends on https://github.com/llvm/llvm-project/pull/90264 In the current implementation, only leaf children of each internal node in the suffix tree are included as candidates for outlining. But all leaf descendants are outlining candidates, which we include in the new implementation. This is enabled on a flag `outliner-leaf-descendants` which is default to be true. The reason for _enabling this on a flag_ is because machine outliner is not the only pass that uses suffix tree. The reason for _having this default to be true_ is because including all leaf descendants show consistent size win. * For Clang/LLD, it shows around 3% reduction in text segment size when compared to the baseline `-Oz` linker binary. * For selected benchmark tests in LLVM test suite | run (CTMark/) | only leaf children | all leaf descendants | reduction % | |------------------|--------------------|----------------------|-------------| | lencod | 349624 | 348564 | -0.2004% | | SPASS | 219672 | 218440 | -0.4738% | | kc | 271956 | 250068 | -0.4506% | | sqlite3 | 223920 | 222484 | -0.5471% | | 7zip-benchmark | 405364 | 401244 | -0.3428% | | bullet | 139820 | 138340 | -0.8315% | | consumer-typeset | 295684 | 286628 | -1.2295% | | pairlocalalign | 72236 | 71936 | -0.2164% | | tramp3d-v4 | 189572 | 183676 | -2.9668% | This is part of an enhanced version of machine outliner -- see [RFC](https://discourse.llvm.org/t/rfc-enhanced-machine-outliner-part-1-fulllto-part-2-thinlto-nolto-to-come/78732).
46 lines
1.8 KiB
C++
46 lines
1.8 KiB
C++
//===- llvm/ADT/SuffixTreeNode.cpp - Nodes for SuffixTrees --------*- C++
|
|
//-*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines nodes for use within a SuffixTree.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/SuffixTreeNode.h"
|
|
#include "llvm/Support/Casting.h"
|
|
|
|
using namespace llvm;
|
|
|
|
unsigned SuffixTreeNode::getStartIdx() const { return StartIdx; }
|
|
void SuffixTreeNode::incrementStartIdx(unsigned Inc) { StartIdx += Inc; }
|
|
void SuffixTreeNode::setConcatLen(unsigned Len) { ConcatLen = Len; }
|
|
unsigned SuffixTreeNode::getConcatLen() const { return ConcatLen; }
|
|
|
|
bool SuffixTreeInternalNode::isRoot() const {
|
|
return getStartIdx() == EmptyIdx;
|
|
}
|
|
unsigned SuffixTreeInternalNode::getEndIdx() const { return EndIdx; }
|
|
void SuffixTreeInternalNode::setLink(SuffixTreeInternalNode *L) {
|
|
assert(L && "Cannot set a null link?");
|
|
Link = L;
|
|
}
|
|
SuffixTreeInternalNode *SuffixTreeInternalNode::getLink() const { return Link; }
|
|
|
|
unsigned SuffixTreeLeafNode::getEndIdx() const {
|
|
assert(EndIdx && "EndIdx is empty?");
|
|
return *EndIdx;
|
|
}
|
|
|
|
unsigned SuffixTreeLeafNode::getSuffixIdx() const { return SuffixIdx; }
|
|
void SuffixTreeLeafNode::setSuffixIdx(unsigned Idx) { SuffixIdx = Idx; }
|
|
|
|
unsigned SuffixTreeNode::getLeftLeafIdx() const { return LeftLeafIdx; }
|
|
unsigned SuffixTreeNode::getRightLeafIdx() const { return RightLeafIdx; }
|
|
void SuffixTreeNode::setLeftLeafIdx(unsigned Idx) { LeftLeafIdx = Idx; }
|
|
void SuffixTreeNode::setRightLeafIdx(unsigned Idx) { RightLeafIdx = Idx; }
|