mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-20 14:29:27 +00:00
Special case aliases in GlobalValue::getAlignment.
An alias has the address of what it points to, so it also has the same alignment. This allows a few optimizations to see past aliases for free. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208103 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bfc3f301b6
commit
b889448841
@ -81,9 +81,7 @@ public:
|
||||
removeDeadConstantUsers(); // remove any dead constants using this.
|
||||
}
|
||||
|
||||
unsigned getAlignment() const {
|
||||
return (1u << Alignment) >> 1;
|
||||
}
|
||||
unsigned getAlignment() const;
|
||||
void setAlignment(unsigned Align);
|
||||
|
||||
bool hasUnnamedAddr() const { return UnnamedAddr; }
|
||||
|
@ -63,6 +63,13 @@ void GlobalValue::copyAttributesFrom(const GlobalValue *Src) {
|
||||
setDLLStorageClass(Src->getDLLStorageClass());
|
||||
}
|
||||
|
||||
unsigned GlobalValue::getAlignment() const {
|
||||
if (auto *GA = dyn_cast<GlobalAlias>(this))
|
||||
return GA->getAliasedGlobal()->getAlignment();
|
||||
|
||||
return (1u << Alignment) >> 1;
|
||||
}
|
||||
|
||||
void GlobalValue::setAlignment(unsigned Align) {
|
||||
assert((!isa<GlobalAlias>(this)) &&
|
||||
"GlobalAlias should not have an alignment!");
|
||||
|
@ -477,7 +477,6 @@ void Verifier::visitGlobalAlias(const GlobalAlias &GA) {
|
||||
"Alias and aliasee types should match!", &GA);
|
||||
Assert1(!GA.hasUnnamedAddr(), "Alias cannot have unnamed_addr!", &GA);
|
||||
Assert1(!GA.hasSection(), "Alias cannot have a section!", &GA);
|
||||
Assert1(!GA.getAlignment(), "Alias connot have an alignment", &GA);
|
||||
|
||||
const Constant *Aliasee = GA.getAliasee();
|
||||
const GlobalValue *GV = dyn_cast<GlobalValue>(Aliasee);
|
||||
|
@ -4,6 +4,7 @@
|
||||
@var32 = global [3 x i32] zeroinitializer
|
||||
@var64 = global [3 x i64] zeroinitializer
|
||||
@var32_align64 = global [3 x i32] zeroinitializer, align 8
|
||||
@alias = alias [3 x i32]* @var32_align64
|
||||
|
||||
define i64 @test_align32() {
|
||||
; CHECK-LABEL: test_align32:
|
||||
@ -47,6 +48,19 @@ define i64 @test_var32_align64() {
|
||||
ret i64 %val
|
||||
}
|
||||
|
||||
define i64 @test_var32_alias() {
|
||||
; CHECK-LABEL: test_var32_alias:
|
||||
%addr = bitcast [3 x i32]* @alias to i64*
|
||||
|
||||
; Test that we can find the alignment for aliases.
|
||||
%val = load i64* %addr
|
||||
; CHECK: adrp x[[HIBITS:[0-9]+]], alias
|
||||
; CHECK-NOT: add x[[HIBITS]]
|
||||
; CHECK: ldr x0, [x[[HIBITS]], {{#?}}:lo12:alias]
|
||||
|
||||
ret i64 %val
|
||||
}
|
||||
|
||||
@yet_another_var = external global {i32, i32}
|
||||
|
||||
define i64 @test_yet_another_var() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user