Fix the ARMGlobalMerge pass to look at variable sizes instead of pointer sizes.
authorBob Wilson <bob.wilson@apple.com>
Wed, 17 Nov 2010 21:25:27 +0000 (21:25 +0000)
committerBob Wilson <bob.wilson@apple.com>
Wed, 17 Nov 2010 21:25:27 +0000 (21:25 +0000)
It was mistakenly looking at the pointer type when checking for the size of
global variables.  This is a partial fix for Radar 8673120.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119563 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMGlobalMerge.cpp
test/CodeGen/ARM/global-merge.ll [new file with mode: 0644]

index fdcb67062f9967da932d88617c87d07399e90ffc..b25915a0bd37d7eb442aa84e55b4c7118956a0f1 100644 (file)
@@ -179,7 +179,7 @@ bool ARMGlobalMerge::doInitialization(Module &M) {
         I->getName().startswith(".llvm."))
       continue;
 
-    if (TD->getTypeAllocSize(I->getType()) < MaxOffset) {
+    if (TD->getTypeAllocSize(I->getType()->getElementType()) < MaxOffset) {
       if (I->isConstant())
         ConstGlobals.push_back(I);
       else
diff --git a/test/CodeGen/ARM/global-merge.ll b/test/CodeGen/ARM/global-merge.ll
new file mode 100644 (file)
index 0000000..9cadebd
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: llc < %s -march=thumb | FileCheck %s
+; Test the ARMGlobalMerge pass.  Use -march=thumb because it has a small
+; value for the maximum offset (127).
+
+; A local array that exceeds the maximum offset should not be merged.
+; CHECK: g0:
+@g0 = internal global [32 x i32] [ i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2 ]
+
+; CHECK: merged:
+@g1 = internal global i32 1
+@g2 = internal global i32 2