mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 11:46:08 +00:00

Reuse the APInt::BitWidth to eliminate DynamicAPInt::HoldsLarge, cutting the size of DynamicAPInt by four bytes. This is implemented by making DynamicAPInt a friend of SlowDynamicAPInt and APInt, so it can directly access SlowDynamicAPInt::Val and APInt::BitWidth. We get a speedup of 4% with this patch.
36 lines
1.2 KiB
C++
36 lines
1.2 KiB
C++
//===- DynamicAPInt.cpp - DynamicAPInt Implementation -----------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "llvm/ADT/DynamicAPInt.h"
|
|
#include "llvm/ADT/Hashing.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
hash_code llvm::hash_value(const DynamicAPInt &X) {
|
|
if (X.isSmall())
|
|
return llvm::hash_value(X.getSmall());
|
|
return detail::hash_value(X.getLarge());
|
|
}
|
|
|
|
void DynamicAPInt::static_assert_layout() {
|
|
constexpr size_t ValLargeOffset =
|
|
offsetof(DynamicAPInt, ValLarge.Val.BitWidth);
|
|
constexpr size_t ValSmallOffset = offsetof(DynamicAPInt, ValSmall);
|
|
constexpr size_t ValSmallSize = sizeof(ValSmall);
|
|
static_assert(ValLargeOffset >= ValSmallOffset + ValSmallSize);
|
|
}
|
|
|
|
raw_ostream &DynamicAPInt::print(raw_ostream &OS) const {
|
|
if (isSmall())
|
|
return OS << ValSmall;
|
|
return OS << ValLarge;
|
|
}
|
|
|
|
void DynamicAPInt::dump() const { print(dbgs()); }
|