diff options
author | Dan Gohman <gohman@apple.com> | 2009-08-18 14:58:19 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-08-18 14:58:19 +0000 |
commit | f0080a1f68db309b258710251612593bf4d73759 (patch) | |
tree | ce428698790658c836026f249449099e2447dac6 /test/Transforms/GlobalOpt | |
parent | 584094537862974c605758ef631836eeaee97c71 (diff) | |
download | external_llvm-f0080a1f68db309b258710251612593bf4d73759.zip external_llvm-f0080a1f68db309b258710251612593bf4d73759.tar.gz external_llvm-f0080a1f68db309b258710251612593bf4d73759.tar.bz2 |
Fix a bug that caused globalopt to miscompile tramp3d: don't miss
unruly indices for arrays that are members of structs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79337 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/GlobalOpt')
-rw-r--r-- | test/Transforms/GlobalOpt/globalsra-unknown-index.ll | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/test/Transforms/GlobalOpt/globalsra-unknown-index.ll b/test/Transforms/GlobalOpt/globalsra-unknown-index.ll new file mode 100644 index 0000000..7a5d5b7 --- /dev/null +++ b/test/Transforms/GlobalOpt/globalsra-unknown-index.ll @@ -0,0 +1,41 @@ +; RUN: llvm-as < %s | opt -globalopt | llvm-dis > %t +; RUN: grep {@Y = internal global \\\[3 x \[%\]struct.X\\\] zeroinitializer} %t +; RUN: grep load %t | count 6 +; RUN: grep {add i32 \[%\]a, \[%\]b} %t | count 3 + +; globalopt should not sra the global, because it can't see the index. + +%struct.X = type { [3 x i32], [3 x i32] } + +@Y = internal global [3 x %struct.X] zeroinitializer + +@addr = external global i8 + +define void @frob() { + store i32 1, i32* getelementptr inbounds ([3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 ptrtoint (i8* @addr to i64)), align 4 + ret void +} +define i32 @borf(i64 %i, i64 %j) { + %p = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 0 + %a = load i32* %p + %q = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 0, i32 1, i64 0 + %b = load i32* %q + %c = add i32 %a, %b + ret i32 %c +} +define i32 @borg(i64 %i, i64 %j) { + %p = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 1, i32 0, i64 1 + %a = load i32* %p + %q = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 1, i32 1, i64 1 + %b = load i32* %q + %c = add i32 %a, %b + ret i32 %c +} +define i32 @borh(i64 %i, i64 %j) { + %p = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 2, i32 0, i64 2 + %a = load i32* %p + %q = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 2, i32 1, i64 2 + %b = load i32* %q + %c = add i32 %a, %b + ret i32 %c +} |