[LLVM][Alignment] Introduce Alignment In GlobalObject

Summary:
This is patch is part of a serie to introduce an Alignment type.
See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html
See this patch for the introduction of the type: https://reviews.llvm.org/D64790

Reviewers: jfb

Subscribers: hiraditya, dexonsmith, llvm-commits, courbet

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D65748

Address comments

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368000 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Guillaume Chatelet 2019-08-06 09:03:21 +00:00
parent f5f4196fbf
commit 0557373d00
5 changed files with 20 additions and 9 deletions

View File

@ -17,6 +17,7 @@
#include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringRef.h"
#include "llvm/IR/GlobalValue.h" #include "llvm/IR/GlobalValue.h"
#include "llvm/IR/Value.h" #include "llvm/IR/Value.h"
#include "llvm/Support/Alignment.h"
#include <string> #include <string>
#include <utility> #include <utility>
@ -58,9 +59,13 @@ public:
unsigned getAlignment() const { unsigned getAlignment() const {
unsigned Data = getGlobalValueSubClassData(); unsigned Data = getGlobalValueSubClassData();
unsigned AlignmentData = Data & AlignmentMask; unsigned AlignmentData = Data & AlignmentMask;
return (1u << AlignmentData) >> 1; MaybeAlign Align = decodeMaybeAlign(AlignmentData);
return Align ? Align->value() : 0;
} }
/// FIXME: Remove this setter once the migration to MaybeAlign is over.
void setAlignment(unsigned Align); void setAlignment(unsigned Align);
void setAlignment(MaybeAlign Align);
unsigned getGlobalObjectSubClassData() const { unsigned getGlobalObjectSubClassData() const {
unsigned ValueData = getGlobalValueSubClassData(); unsigned ValueData = getGlobalValueSubClassData();

View File

@ -101,7 +101,7 @@ public:
explicit MaybeAlign(uint64_t Value) { explicit MaybeAlign(uint64_t Value) {
assert((Value == 0 || llvm::isPowerOf2_64(Value)) && assert((Value == 0 || llvm::isPowerOf2_64(Value)) &&
"Alignment is not 0 or a power of 2"); "Alignment is neither 0 nor a power of 2");
if (Value) if (Value)
emplace(Value); emplace(Value);
} }

View File

@ -114,13 +114,17 @@ unsigned GlobalValue::getAddressSpace() const {
} }
void GlobalObject::setAlignment(unsigned Align) { void GlobalObject::setAlignment(unsigned Align) {
assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!"); setAlignment(MaybeAlign(Align));
assert(Align <= MaximumAlignment && }
"Alignment is greater than MaximumAlignment!");
unsigned AlignmentData = Log2_32(Align) + 1; void GlobalObject::setAlignment(MaybeAlign Align) {
assert(!Align || Align <= MaximumAlignment &&
"Alignment is greater than MaximumAlignment!");
unsigned AlignmentData = encode(Align);
unsigned OldData = getGlobalValueSubClassData(); unsigned OldData = getGlobalValueSubClassData();
setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData); setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData);
assert(getAlignment() == Align && "Alignment representation error!"); assert(MaybeAlign(getAlignment()) == Align &&
"Alignment representation error!");
} }
void GlobalObject::copyAttributesFrom(const GlobalObject *Src) { void GlobalObject::copyAttributesFrom(const GlobalObject *Src) {

View File

@ -99,7 +99,8 @@ TEST(GlobalTest, AlignDeath) {
Constant::getAllOnesValue(Int32Ty), "var", nullptr, Constant::getAllOnesValue(Int32Ty), "var", nullptr,
GlobalVariable::NotThreadLocal, 1); GlobalVariable::NotThreadLocal, 1);
EXPECT_DEATH(Var->setAlignment(536870913U), "Alignment is not a power of 2"); EXPECT_DEATH(Var->setAlignment(536870913U),
"Alignment is neither 0 nor a power of 2");
EXPECT_DEATH(Var->setAlignment(1073741824U), EXPECT_DEATH(Var->setAlignment(1073741824U),
"Alignment is greater than MaximumAlignment"); "Alignment is greater than MaximumAlignment");
} }

View File

@ -256,7 +256,8 @@ TEST(AlignmentDeathTest, InvalidCTors) {
EXPECT_DEATH((Align(0)), "Value must not be 0"); EXPECT_DEATH((Align(0)), "Value must not be 0");
for (uint64_t Value : getNonPowerOfTwo()) { for (uint64_t Value : getNonPowerOfTwo()) {
EXPECT_DEATH((Align(Value)), "Alignment is not a power of 2"); EXPECT_DEATH((Align(Value)), "Alignment is not a power of 2");
EXPECT_DEATH((MaybeAlign(Value)), "Alignment is not 0 or a power of 2"); EXPECT_DEATH((MaybeAlign(Value)),
"Alignment is neither 0 nor a power of 2");
} }
} }