diff options
Diffstat (limited to 'llvm/test/Transforms/GlobalOpt')
| -rw-r--r-- | llvm/test/Transforms/GlobalOpt/evaluate-bitcast-2.ll | 51 | ||||
| -rw-r--r-- | llvm/test/Transforms/GlobalOpt/evaluate-bitcast-3.ll | 42 |
2 files changed, 93 insertions, 0 deletions
diff --git a/llvm/test/Transforms/GlobalOpt/evaluate-bitcast-2.ll b/llvm/test/Transforms/GlobalOpt/evaluate-bitcast-2.ll new file mode 100644 index 00000000000..50c7b15c720 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/evaluate-bitcast-2.ll @@ -0,0 +1,51 @@ +; RUN: opt < %s -globalopt -S | FileCheck %s + +; Test the evaluation of a store and a load via a bitcast, and check +; that globals are constant folded to the correct value. + +; CHECK: @u = dso_local local_unnamed_addr global %union.A { i8* inttoptr (i64 12345 to i8*) }, align 8 +; CHECK: @l = dso_local local_unnamed_addr global i64 12345, align 8 + +; Test derived from: +; +; union A { +; A(long long ll) : l(ll) {} +; void *p; +; long long l; +; } u(12345); +; +; long long l = u.l; + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%union.A = type { i8* } + +$_ZN1AC2Ex = comdat any + +@u = dso_local global %union.A zeroinitializer, align 8 +@l = dso_local global i64 0, align 8 +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_test.cpp, i8* null }] + +define internal void @__cxx_global_var_init() section ".text.startup" { + call void @_ZN1AC2Ex(%union.A* @u, i64 12345) + ret void +} + +define linkonce_odr dso_local void @_ZN1AC2Ex(%union.A* %this, i64 %ll) unnamed_addr comdat align 2 { + %l = bitcast %union.A* %this to i64* + store i64 %ll, i64* %l, align 8 + ret void +} + +define internal void @__cxx_global_var_init.1() section ".text.startup" { + %1 = load i64, i64* bitcast (%union.A* @u to i64*), align 8 + store i64 %1, i64* @l, align 8 + ret void +} + +define internal void @_GLOBAL__sub_I_test.cpp() section ".text.startup" { + call void @__cxx_global_var_init() + call void @__cxx_global_var_init.1() + ret void +} diff --git a/llvm/test/Transforms/GlobalOpt/evaluate-bitcast-3.ll b/llvm/test/Transforms/GlobalOpt/evaluate-bitcast-3.ll new file mode 100644 index 00000000000..dae89cd23ff --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/evaluate-bitcast-3.ll @@ -0,0 +1,42 @@ +; RUN: opt < %s -globalopt -S | FileCheck %s + +; Test the evaluation of a load via a bitcast and a store via a GEP. +; Check that globals are constant folded to the correct value. + +; CHECK: @u = dso_local local_unnamed_addr global %union.A { i8* inttoptr (i64 12345 to i8*) }, align 8 +; CHECK: @l = dso_local local_unnamed_addr global i64 12345, align 8 + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%union.A = type { i8* } + +$_ZN1AC2Ex = comdat any + +@u = dso_local global %union.A zeroinitializer, align 8 +@l = dso_local global i64 0, align 8 +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_test.cpp, i8* null }] + +define internal void @__cxx_global_var_init() section ".text.startup" { + call void @_ZN1AC2Ex(%union.A* @u, i64 12345) + ret void +} + +define linkonce_odr dso_local void @_ZN1AC2Ex(%union.A* %this, i64 %ll) unnamed_addr comdat align 2 { + %l = inttoptr i64 %ll to i8* + %p = getelementptr inbounds %union.A, %union.A* %this, i64 0, i32 0 + store i8* %l, i8** %p + ret void +} + +define internal void @__cxx_global_var_init.1() section ".text.startup" { + %1 = load i64, i64* bitcast (%union.A* @u to i64*), align 8 + store i64 %1, i64* @l, align 8 + ret void +} + +define internal void @_GLOBAL__sub_I_test.cpp() section ".text.startup" { + call void @__cxx_global_var_init() + call void @__cxx_global_var_init.1() + ret void +} |

