summaryrefslogtreecommitdiff
path: root/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-01-05 23:03:32 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-01-05 23:03:32 +0000
commitfb54ad19e7ef1b4f7177a005332ca8aca9bdbcb1 (patch)
tree4638f78d76cc176e7ff549d2d1b92e5213cf3b47 /test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll
parent3ed8815541d2118728a91bbd5bee054fbcfba71f (diff)
downloadllvm-fb54ad19e7ef1b4f7177a005332ca8aca9bdbcb1.tar.gz
llvm-fb54ad19e7ef1b4f7177a005332ca8aca9bdbcb1.tar.bz2
llvm-fb54ad19e7ef1b4f7177a005332ca8aca9bdbcb1.tar.xz
PR11705, part 2: globalopt shouldn't put inttoptr/ptrtoint operations into global initializers if there's an implied extension or truncation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147625 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll')
-rw-r--r--test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll19
1 files changed, 15 insertions, 4 deletions
diff --git a/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll b/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll
index 204f979ed3..e3bc473f52 100644
--- a/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll
+++ b/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