diff options
author | Chris Lattner <sabre@nondot.org> | 2008-04-26 07:40:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-04-26 07:40:11 +0000 |
commit | 998182b3802d2be8d081ca484b5d4fd5e1188950 (patch) | |
tree | e48bcd8cb6915f866189ae09b1aedd8a0afd182c /test/Transforms/GlobalOpt | |
parent | aea6a6f71737c193456f83211ac636197c0f8694 (diff) | |
download | llvm-998182b3802d2be8d081ca484b5d4fd5e1188950.tar.gz llvm-998182b3802d2be8d081ca484b5d4fd5e1188950.tar.bz2 llvm-998182b3802d2be8d081ca484b5d4fd5e1188950.tar.xz |
When SRoA'ing a global variable, make sure the new globals get the
appropriate alignment. This fixes a miscompilation of 252.eon on
x86-64 (rdar://5891920).
Bill, please pull this into Tak.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50308 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/GlobalOpt')
-rw-r--r-- | test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll b/test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll new file mode 100644 index 0000000000..3464be9018 --- /dev/null +++ b/test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll @@ -0,0 +1,32 @@ +; Verify that when @G is SROA'd that the new globals have correct +; alignments. Elements 0 and 2 must be 16-byte aligned, and element +; 1 must be at least 8 byte aligned (but could be more). + +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@G.0 = internal global .*align 16} +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@G.1 = internal global .*align 8} +; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@G.2 = internal global .*align 16} +; rdar://5891920 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" +target triple = "x86_64-apple-darwin8" + +%T = type { double, double, double } + +@G = internal global %T zeroinitializer, align 16 + + +define void @test() { + store double 1.0, double* getelementptr (%T* @G, i32 0, i32 0), align 16 + store double 2.0, double* getelementptr (%T* @G, i32 0, i32 1), align 8 + store double 3.0, double* getelementptr (%T* @G, i32 0, i32 2), align 16 + ret void +} + +define double @test2() { + %V1 = load double* getelementptr (%T* @G, i32 0, i32 0), align 16 + %V2 = load double* getelementptr (%T* @G, i32 0, i32 1), align 8 + %V3 = load double* getelementptr (%T* @G, i32 0, i32 2), align 16 + %R = add double %V1, %V2 + %R2 = add double %R, %V3 + ret double %R2 +} |