Special case aliases in GlobalValue::getAlignment.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 6 May 2014 16:48:58 +0000 (16:48 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 6 May 2014 16:48:58 +0000 (16:48 +0000)
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

include/llvm/IR/GlobalValue.h
lib/IR/Globals.cpp
lib/IR/Verifier.cpp
test/CodeGen/AArch64/global-alignment.ll

index 7c4dd0796ce05c963746e229c903b432946e4f55..5d0e3791e85f41dc7ceea1943f548f1e7b3ee26c 100644 (file)
@@ -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; }
index 76baa6202a7c6e5a0cc208a9312b7898bde748b5..2265e4c2b72f75669fd98b8cec111367c437215a 100644 (file)
@@ -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!");
index 0bc5c509ebe9175f635295f2255b8baaecff2a15..bc378aed16ba77e6055305b4459468232bd76195 100644 (file)
@@ -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);
index 24e6618e98bdd6a295a59009405472b04e62271f..36b74e5a57c887931b880aaac9aebf791486d455 100644 (file)
@@ -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() {