summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiangning Liu <jiangning.liu@arm.com>2014-04-22 03:33:26 +0000
committerJiangning Liu <jiangning.liu@arm.com>2014-04-22 03:33:26 +0000
commit0240286c23735cbfd2e0507bb74a2688a9208b65 (patch)
treec7335fbe1a503fbaf77ef9b3ec30962e2027e3be
parent846a14340c4c699d55b42e73e2336490c9255f11 (diff)
downloadllvm-0240286c23735cbfd2e0507bb74a2688a9208b65.tar.gz
llvm-0240286c23735cbfd2e0507bb74a2688a9208b65.tar.bz2
llvm-0240286c23735cbfd2e0507bb74a2688a9208b65.tar.xz
[AArch64] Enable global merge pass.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206861 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/AArch64/AArch64ISelLowering.cpp7
-rw-r--r--lib/Target/AArch64/AArch64ISelLowering.h4
-rw-r--r--lib/Target/AArch64/AArch64TargetMachine.cpp9
-rw-r--r--test/CodeGen/AArch64/global_merge_1.ll17
4 files changed, 37 insertions, 0 deletions
diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp
index 18ac2da248..3e40f76bd2 100644
--- a/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -5538,3 +5538,10 @@ int AArch64TargetLowering::getScalingFactorCost(const AddrMode &AM,
return AM.Scale != 0 && AM.Scale != 1;
return -1;
}
+
+/// getMaximalGlobalOffset - Returns the maximal possible offset which can
+/// be used for loads / stores from the global.
+unsigned AArch64TargetLowering::getMaximalGlobalOffset() const {
+ return 4095;
+}
+
diff --git a/lib/Target/AArch64/AArch64ISelLowering.h b/lib/Target/AArch64/AArch64ISelLowering.h
index 154c1d7673..5e7716664a 100644
--- a/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/lib/Target/AArch64/AArch64ISelLowering.h
@@ -376,6 +376,10 @@ public:
virtual bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
unsigned Intrinsic) const override;
+ /// getMaximalGlobalOffset - Returns the maximal possible offset which can
+ /// be used for loads / stores from the global.
+ unsigned getMaximalGlobalOffset() const override;
+
protected:
std::pair<const TargetRegisterClass*, uint8_t>
findRepresentativeClass(MVT VT) const;
diff --git a/lib/Target/AArch64/AArch64TargetMachine.cpp b/lib/Target/AArch64/AArch64TargetMachine.cpp
index d9c990d7d5..844e8ab219 100644
--- a/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -19,6 +19,7 @@
#include "llvm/CodeGen/Passes.h"
#include "llvm/PassManager.h"
#include "llvm/Support/TargetRegistry.h"
+#include "llvm/Transforms/Scalar.h"
using namespace llvm;
@@ -86,11 +87,19 @@ public:
return *getAArch64TargetMachine().getSubtargetImpl();
}
+ bool addPreISel() override;
virtual bool addInstSelector();
virtual bool addPreEmitPass();
};
} // namespace
+bool AArch64PassConfig::addPreISel() {
+ if (TM->getOptLevel() != CodeGenOpt::None)
+ addPass(createGlobalMergePass(TM));
+
+ return false;
+}
+
TargetPassConfig *AArch64TargetMachine::createPassConfig(PassManagerBase &PM) {
return new AArch64PassConfig(this, PM);
}
diff --git a/test/CodeGen/AArch64/global_merge_1.ll b/test/CodeGen/AArch64/global_merge_1.ll
new file mode 100644
index 0000000000..e0587d6b90
--- /dev/null
+++ b/test/CodeGen/AArch64/global_merge_1.ll
@@ -0,0 +1,17 @@
+; RUN: llc < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
+
+@m = internal global i32 0, align 4
+@n = internal global i32 0, align 4
+
+define void @f1(i32 %a1, i32 %a2) {
+; CHECK-LABEL: f1:
+; CHECK: adrp x{{[0-9]+}}, _MergedGlobals
+; CHECK-NOT: adrp
+ store i32 %a1, i32* @m, align 4
+ store i32 %a2, i32* @n, align 4
+ ret void
+}
+
+; CHECK: .local _MergedGlobals
+; CHECK: .comm _MergedGlobals,8,8
+