diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2012-01-05 23:03:32 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2012-01-05 23:03:32 +0000 |
| commit | 55fa49f32d91815dc05224f264398489cd46e0b6 (patch) | |
| tree | 1b3e5ff1ee49c1b08b8128d33a6005657d2d9e60 /llvm/test/Transforms/GlobalOpt | |
| parent | 23f8d64b582eaf3e9c1f6bb4b0b5291d7b11a8b3 (diff) | |
| download | bcm5719-llvm-55fa49f32d91815dc05224f264398489cd46e0b6.tar.gz bcm5719-llvm-55fa49f32d91815dc05224f264398489cd46e0b6.zip | |
PR11705, part 2: globalopt shouldn't put inttoptr/ptrtoint operations into global initializers if there's an implied extension or truncation.
llvm-svn: 147625
Diffstat (limited to 'llvm/test/Transforms/GlobalOpt')
| -rw-r--r-- | llvm/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/llvm/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll b/llvm/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll index 204f979ed3e..e3bc473f52a 100644 --- a/llvm/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll +++ b/llvm/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll @@ -4,20 +4,31 @@ target triple = "x86_64-apple-darwin10.0.0" %0 = type { i32, void ()* } %struct.foo = type { i32* } +%struct.bar = type { i128 } @G = global i32 0, align 4 @H = global i32 0, align 4 @X = global %struct.foo zeroinitializer, align 8 -@llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @init }] +@X2 = global %struct.bar zeroinitializer, align 8 +@llvm.global_ctors = appending global [2 x %0] [%0 { i32 65535, void ()* @init1 }, %0 { i32 65535, void ()* @init2 }] ; PR8710 - GlobalOpt shouldn't change the global's initializer to have this ; arbitrary constant expression, the code generator can't handle it. -define internal void @init() { +define internal void @init1() { entry: %tmp = getelementptr inbounds %struct.foo* @X, i32 0, i32 0 store i32* inttoptr (i64 sdiv (i64 ptrtoint (i32* @G to i64), i64 ptrtoint (i32* @H to i64)) to i32*), i32** %tmp, align 8 ret void } - -; CHECK: @init +; CHECK: @init1 ; CHECK: store i32* + +; PR11705 - ptrtoint isn't safe in general in global initializers. +define internal void @init2() { +entry: + %tmp = getelementptr inbounds %struct.bar* @X2, i32 0, i32 0 + store i128 ptrtoint (i32* @G to i128), i128* %tmp, align 16 + ret void +} +; CHECK: @init2 +; CHECK: store i128 |

