Skip to content

Commit

Permalink
[NFC] Fix compile time regression seen on some benchmarks after a630ea3
Browse files Browse the repository at this point in the history
… commit

The goal of this change is fixing most of compile time slowdown seen after a630ea3 commit on lencod and sqlite3 benchmarks.
There are 3 improvements included in this patch:

1. In getNumOperands when possible get value directly from SmallNumOps.
2. Inline getLargePtr by moving its definition to header.
3. In TBAAStructTypeNode::getField get all operands once instead taking operands in loop one after one.

Differential Revision: https://reviews.llvm.org/D129468
  • Loading branch information
yurai007 committed Jul 12, 2022
1 parent 81b62f7 commit 165240f
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 24 deletions.
16 changes: 14 additions & 2 deletions llvm/include/llvm/IR/Metadata.h
Expand Up @@ -999,7 +999,13 @@ class MDNode : public Metadata {
alignTo(getAllocSize(), alignof(uint64_t));
}

void *getLargePtr() const;
void *getLargePtr() const {
static_assert(alignof(LargeStorageVector) <= alignof(Header),
"LargeStorageVector too strongly aligned");
return reinterpret_cast<char *>(const_cast<Header *>(this)) -
sizeof(LargeStorageVector);
}

void *getSmallPtr();

LargeStorageVector &getLarge() {
Expand Down Expand Up @@ -1032,6 +1038,12 @@ class MDNode : public Metadata {
return makeArrayRef(reinterpret_cast<const MDOperand *>(this) - SmallSize,
SmallNumOps);
}

unsigned getNumOperands() const {
if (!IsLarge)
return SmallNumOps;
return getLarge().size();
}
};

Header &getHeader() { return *(reinterpret_cast<Header *>(this) - 1); }
Expand Down Expand Up @@ -1283,7 +1295,7 @@ class MDNode : public Metadata {
}

/// Return number of MDNode operands.
unsigned getNumOperands() const { return getHeader().operands().size(); }
unsigned getNumOperands() const { return getHeader().getNumOperands(); }

/// Methods for support type inquiry through isa, cast, and dyn_cast:
static bool classof(const Metadata *MD) {
Expand Down
34 changes: 19 additions & 15 deletions llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp
Expand Up @@ -303,24 +303,27 @@ class TBAAStructTypeNode {
/// given offset. Update the offset to be relative to the field type.
TBAAStructTypeNode getField(uint64_t &Offset) const {
bool NewFormat = isNewFormat();
const ArrayRef<MDOperand> Operands(Node->op_begin(), Node->op_end());
const unsigned NumOperands = Operands.size();

if (NewFormat) {
// New-format root and scalar type nodes have no fields.
if (Node->getNumOperands() < 6)
if (NumOperands < 6)
return TBAAStructTypeNode();
} else {
// Parent can be omitted for the root node.
if (Node->getNumOperands() < 2)
if (NumOperands < 2)
return TBAAStructTypeNode();

// Fast path for a scalar type node and a struct type node with a single
// field.
if (Node->getNumOperands() <= 3) {
uint64_t Cur = Node->getNumOperands() == 2
? 0
: mdconst::extract<ConstantInt>(Node->getOperand(2))
->getZExtValue();
if (NumOperands <= 3) {
uint64_t Cur =
NumOperands == 2
? 0
: mdconst::extract<ConstantInt>(Operands[2])->getZExtValue();
Offset -= Cur;
MDNode *P = dyn_cast_or_null<MDNode>(Node->getOperand(1));
MDNode *P = dyn_cast_or_null<MDNode>(Operands[1]);
if (!P)
return TBAAStructTypeNode();
return TBAAStructTypeNode(P);
Expand All @@ -332,10 +335,11 @@ class TBAAStructTypeNode {
unsigned FirstFieldOpNo = NewFormat ? 3 : 1;
unsigned NumOpsPerField = NewFormat ? 3 : 2;
unsigned TheIdx = 0;
for (unsigned Idx = FirstFieldOpNo; Idx < Node->getNumOperands();

for (unsigned Idx = FirstFieldOpNo; Idx < NumOperands;
Idx += NumOpsPerField) {
uint64_t Cur = mdconst::extract<ConstantInt>(Node->getOperand(Idx + 1))
->getZExtValue();
uint64_t Cur =
mdconst::extract<ConstantInt>(Operands[Idx + 1])->getZExtValue();
if (Cur > Offset) {
assert(Idx >= FirstFieldOpNo + NumOpsPerField &&
"TBAAStructTypeNode::getField should have an offset match!");
Expand All @@ -345,11 +349,11 @@ class TBAAStructTypeNode {
}
// Move along the last field.
if (TheIdx == 0)
TheIdx = Node->getNumOperands() - NumOpsPerField;
uint64_t Cur = mdconst::extract<ConstantInt>(Node->getOperand(TheIdx + 1))
->getZExtValue();
TheIdx = NumOperands - NumOpsPerField;
uint64_t Cur =
mdconst::extract<ConstantInt>(Operands[TheIdx + 1])->getZExtValue();
Offset -= Cur;
MDNode *P = dyn_cast_or_null<MDNode>(Node->getOperand(TheIdx));
MDNode *P = dyn_cast_or_null<MDNode>(Operands[TheIdx]);
if (!P)
return TBAAStructTypeNode();
return TBAAStructTypeNode(P);
Expand Down
7 changes: 0 additions & 7 deletions llvm/lib/IR/Metadata.cpp
Expand Up @@ -592,13 +592,6 @@ MDNode::Header::~Header() {
(void)(O - 1)->~MDOperand();
}

void *MDNode::Header::getLargePtr() const {
static_assert(alignof(LargeStorageVector) <= alignof(Header),
"LargeStorageVector too strongly aligned");
return reinterpret_cast<char *>(const_cast<Header *>(this)) -
sizeof(LargeStorageVector);
}

void *MDNode::Header::getSmallPtr() {
static_assert(alignof(MDOperand) <= alignof(Header),
"MDOperand too strongly aligned");
Expand Down

0 comments on commit 165240f

Please sign in to comment.