diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 |
commit | f8af5cf600354830d4ccf59732403f0f073eccb9 (patch) | |
tree | 2ba0398b4c42ad4f55561327538044fd2c925a8b /test/ExecutionEngine | |
parent | 59d6cff90eecf31cb3dd860c4e786674cfdd42eb (diff) |
Notes
Diffstat (limited to 'test/ExecutionEngine')
46 files changed, 1091 insertions, 94 deletions
diff --git a/test/ExecutionEngine/MCJIT/Inputs/cross-module-b.ll b/test/ExecutionEngine/MCJIT/Inputs/cross-module-b.ll new file mode 100644 index 0000000000000..687011741103c --- /dev/null +++ b/test/ExecutionEngine/MCJIT/Inputs/cross-module-b.ll @@ -0,0 +1,7 @@ +declare i32 @FA() + +define i32 @FB() { + %r = call i32 @FA( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/Inputs/multi-module-b.ll b/test/ExecutionEngine/MCJIT/Inputs/multi-module-b.ll new file mode 100644 index 0000000000000..103b601e7f088 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/Inputs/multi-module-b.ll @@ -0,0 +1,7 @@ +declare i32 @FC() + +define i32 @FB() { + %r = call i32 @FC( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/Inputs/multi-module-c.ll b/test/ExecutionEngine/MCJIT/Inputs/multi-module-c.ll new file mode 100644 index 0000000000000..b39306be9e3be --- /dev/null +++ b/test/ExecutionEngine/MCJIT/Inputs/multi-module-c.ll @@ -0,0 +1,4 @@ +define i32 @FC() { + ret i32 0 +} + diff --git a/test/ExecutionEngine/MCJIT/Inputs/multi-module-eh-b.ll b/test/ExecutionEngine/MCJIT/Inputs/multi-module-eh-b.ll new file mode 100644 index 0000000000000..d7dbb032b5d0a --- /dev/null +++ b/test/ExecutionEngine/MCJIT/Inputs/multi-module-eh-b.ll @@ -0,0 +1,30 @@ +declare i8* @__cxa_allocate_exception(i64) +declare void @__cxa_throw(i8*, i8*, i8*) +declare i32 @__gxx_personality_v0(...) +declare void @__cxa_end_catch() +declare i8* @__cxa_begin_catch(i8*) + +@_ZTIi = external constant i8* + +define void @throwException_B() { + %exception = tail call i8* @__cxa_allocate_exception(i64 4) + call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) + unreachable +} + +define i32 @FB() { +entry: + invoke void @throwException_B() + to label %try.cont unwind label %lpad + +lpad: + %p = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + %e = extractvalue { i8*, i32 } %p, 0 + call i8* @__cxa_begin_catch(i8* %e) + call void @__cxa_end_catch() + br label %try.cont + +try.cont: + ret i32 0 +} diff --git a/test/ExecutionEngine/MCJIT/cross-module-a.ll b/test/ExecutionEngine/MCJIT/cross-module-a.ll new file mode 100644 index 0000000000000..fe8d3864c9b65 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/cross-module-a.ll @@ -0,0 +1,13 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/cross-module-b.ll %s > /dev/null + +declare i32 @FB() + +define i32 @FA() { + ret i32 0 +} + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll b/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll new file mode 100644 index 0000000000000..ee26702dfae6e --- /dev/null +++ b/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll @@ -0,0 +1,14 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/cross-module-b.ll -relocation-model=pic -code-model=small %s > /dev/null +; XFAIL: mips, i686, i386, arm + +declare i32 @FB() + +define i32 @FA() { + ret i32 0 +} + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/eh-lg-pic.ll b/test/ExecutionEngine/MCJIT/eh-lg-pic.ll new file mode 100644 index 0000000000000..7c0227d74ed67 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/eh-lg-pic.ll @@ -0,0 +1,32 @@ +; RUN: %lli_mcjit -relocation-model=pic -code-model=large %s +; XFAIL: cygwin, win32, mingw, mips, powerpc64, i686, i386, aarch64, arm +declare i8* @__cxa_allocate_exception(i64) +declare void @__cxa_throw(i8*, i8*, i8*) +declare i32 @__gxx_personality_v0(...) +declare void @__cxa_end_catch() +declare i8* @__cxa_begin_catch(i8*) + +@_ZTIi = external constant i8* + +define void @throwException() { + %exception = tail call i8* @__cxa_allocate_exception(i64 4) + call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) + unreachable +} + +define i32 @main() { +entry: + invoke void @throwException() + to label %try.cont unwind label %lpad + +lpad: + %p = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + %e = extractvalue { i8*, i32 } %p, 0 + call i8* @__cxa_begin_catch(i8* %e) + call void @__cxa_end_catch() + br label %try.cont + +try.cont: + ret i32 0 +} diff --git a/test/ExecutionEngine/MCJIT/eh-sm-pic.ll b/test/ExecutionEngine/MCJIT/eh-sm-pic.ll new file mode 100644 index 0000000000000..00c2bb056ff38 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/eh-sm-pic.ll @@ -0,0 +1,32 @@ +; RUN: %lli_mcjit -relocation-model=pic -code-model=small %s +; XFAIL: cygwin, win32, mingw, mips, i686, i386, darwin, aarch64, arm +declare i8* @__cxa_allocate_exception(i64) +declare void @__cxa_throw(i8*, i8*, i8*) +declare i32 @__gxx_personality_v0(...) +declare void @__cxa_end_catch() +declare i8* @__cxa_begin_catch(i8*) + +@_ZTIi = external constant i8* + +define void @throwException() { + %exception = tail call i8* @__cxa_allocate_exception(i64 4) + call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) + unreachable +} + +define i32 @main() { +entry: + invoke void @throwException() + to label %try.cont unwind label %lpad + +lpad: + %p = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + %e = extractvalue { i8*, i32 } %p, 0 + call i8* @__cxa_begin_catch(i8* %e) + call void @__cxa_end_catch() + br label %try.cont + +try.cont: + ret i32 0 +} diff --git a/test/ExecutionEngine/MCJIT/hello-sm-pic.ll b/test/ExecutionEngine/MCJIT/hello-sm-pic.ll new file mode 100644 index 0000000000000..115846c78642f --- /dev/null +++ b/test/ExecutionEngine/MCJIT/hello-sm-pic.ll @@ -0,0 +1,12 @@ +; RUN: %lli_mcjit -relocation-model=pic -code-model=small %s > /dev/null +; XFAIL: mips, i686, i386, darwin, aarch64, arm + +@.LC0 = internal global [12 x i8] c"Hello World\00" ; <[12 x i8]*> [#uses=1] + +declare i32 @puts(i8*) + +define i32 @main() { + %reg210 = call i32 @puts( i8* getelementptr ([12 x i8]* @.LC0, i64 0, i64 0) ) ; <i32> [#uses=0] + ret i32 0 +} + diff --git a/test/ExecutionEngine/MCJIT/lit.local.cfg b/test/ExecutionEngine/MCJIT/lit.local.cfg index 30ed4e87e6c2f..fdb36ee1d71ce 100644 --- a/test/ExecutionEngine/MCJIT/lit.local.cfg +++ b/test/ExecutionEngine/MCJIT/lit.local.cfg @@ -1,12 +1,4 @@ -config.suffixes = ['.ll', '.c', '.cpp'] - -def getRoot(config): - if not config.parent: - return config - return getRoot(config.parent) - -root = getRoot(config) - +root = config.root targets = set(root.targets_to_build.split()) if ('X86' in targets) | ('AArch64' in targets) | ('ARM' in targets) | \ ('Mips' in targets) | ('PowerPC' in targets) | ('SystemZ' in targets): @@ -14,12 +6,21 @@ if ('X86' in targets) | ('AArch64' in targets) | ('ARM' in targets) | \ else: config.unsupported = True +# FIXME: autoconf and cmake produce different arch names. We should normalize +# them before getting here. if root.host_arch not in ['i386', 'x86', 'x86_64', - 'AArch64', 'ARM', 'Mips', 'PowerPC', 'SystemZ']: + 'AArch64', 'ARM', 'Mips', 'PowerPC', 'ppc64', 'SystemZ']: config.unsupported = True -if 'i386-apple-darwin' in root.target_triple: +if 'armv7' in root.host_arch: + config.unsupported = False + +if 'i386-apple-darwin' in root.target_triple: config.unsupported = True if 'powerpc' in root.target_triple and not 'powerpc64' in root.target_triple: config.unsupported = True + +# ExecutionEngine tests are not expected to pass in a cross-compilation setup. +if 'native' not in config.available_features: + config.unsupported = True diff --git a/test/ExecutionEngine/MCJIT/multi-module-a.ll b/test/ExecutionEngine/MCJIT/multi-module-a.ll new file mode 100644 index 0000000000000..8848ca6117f4b --- /dev/null +++ b/test/ExecutionEngine/MCJIT/multi-module-a.ll @@ -0,0 +1,9 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll %s > /dev/null + +declare i32 @FB() + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll b/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll new file mode 100644 index 0000000000000..66fafc924acd1 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll @@ -0,0 +1,35 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-eh-b.ll %s +; XFAIL: arm, cygwin, win32, mingw +declare i8* @__cxa_allocate_exception(i64) +declare void @__cxa_throw(i8*, i8*, i8*) +declare i32 @__gxx_personality_v0(...) +declare void @__cxa_end_catch() +declare i8* @__cxa_begin_catch(i8*) + +@_ZTIi = external constant i8* + +declare i32 @FB() + +define void @throwException() { + %exception = tail call i8* @__cxa_allocate_exception(i64 4) + call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) + unreachable +} + +define i32 @main() { +entry: + invoke void @throwException() + to label %try.cont unwind label %lpad + +lpad: + %p = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* bitcast (i8** @_ZTIi to i8*) + %e = extractvalue { i8*, i32 } %p, 0 + call i8* @__cxa_begin_catch(i8* %e) + call void @__cxa_end_catch() + br label %try.cont + +try.cont: + %r = call i32 @FB( ) + ret i32 %r +} diff --git a/test/ExecutionEngine/MCJIT/multi-module-sm-pic-a.ll b/test/ExecutionEngine/MCJIT/multi-module-sm-pic-a.ll new file mode 100644 index 0000000000000..f2fa59f4821fa --- /dev/null +++ b/test/ExecutionEngine/MCJIT/multi-module-sm-pic-a.ll @@ -0,0 +1,10 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -relocation-model=pic -code-model=small %s > /dev/null +; XFAIL: mips, i686, i386, arm + +declare i32 @FB() + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/remote/Inputs/cross-module-b.ll b/test/ExecutionEngine/MCJIT/remote/Inputs/cross-module-b.ll new file mode 100644 index 0000000000000..687011741103c --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/Inputs/cross-module-b.ll @@ -0,0 +1,7 @@ +declare i32 @FA() + +define i32 @FB() { + %r = call i32 @FA( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/remote/Inputs/multi-module-b.ll b/test/ExecutionEngine/MCJIT/remote/Inputs/multi-module-b.ll new file mode 100644 index 0000000000000..103b601e7f088 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/Inputs/multi-module-b.ll @@ -0,0 +1,7 @@ +declare i32 @FC() + +define i32 @FB() { + %r = call i32 @FC( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/remote/Inputs/multi-module-c.ll b/test/ExecutionEngine/MCJIT/remote/Inputs/multi-module-c.ll new file mode 100644 index 0000000000000..b39306be9e3be --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/Inputs/multi-module-c.ll @@ -0,0 +1,4 @@ +define i32 @FC() { + ret i32 0 +} + diff --git a/test/ExecutionEngine/MCJIT/remote/cross-module-a.ll b/test/ExecutionEngine/MCJIT/remote/cross-module-a.ll new file mode 100644 index 0000000000000..094d362262c5c --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/cross-module-a.ll @@ -0,0 +1,13 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/cross-module-b.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null + +declare i32 @FB() + +define i32 @FA() { + ret i32 0 +} + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/remote/cross-module-sm-pic-a.ll b/test/ExecutionEngine/MCJIT/remote/cross-module-sm-pic-a.ll new file mode 100644 index 0000000000000..bdaa9a045c8f4 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/cross-module-sm-pic-a.ll @@ -0,0 +1,14 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/cross-module-b.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target -relocation-model=pic -code-model=small %s > /dev/null +; XFAIL: mips, i686, i386, arm + +declare i32 @FB() + +define i32 @FA() { + ret i32 0 +} + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/remote/lit.local.cfg b/test/ExecutionEngine/MCJIT/remote/lit.local.cfg new file mode 100644 index 0000000000000..6b192ae44be70 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/lit.local.cfg @@ -0,0 +1,3 @@ +if 'armv4' in config.root.target_triple or \ + 'armv5' in config.root.target_triple: + config.unsupported = True diff --git a/test/ExecutionEngine/MCJIT/remote/multi-module-a.ll b/test/ExecutionEngine/MCJIT/remote/multi-module-a.ll new file mode 100644 index 0000000000000..91d0387376ca6 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/multi-module-a.ll @@ -0,0 +1,9 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null + +declare i32 @FB() + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/remote/multi-module-sm-pic-a.ll b/test/ExecutionEngine/MCJIT/remote/multi-module-sm-pic-a.ll new file mode 100644 index 0000000000000..73228e458f044 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/multi-module-sm-pic-a.ll @@ -0,0 +1,10 @@ +; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target -relocation-model=pic -code-model=small %s > /dev/null +; XFAIL: mips, i686, i386, arm + +declare i32 @FB() + +define i32 @main() { + %r = call i32 @FB( ) ; <i32> [#uses=1] + ret i32 %r +} + diff --git a/test/ExecutionEngine/MCJIT/simpletest-remote.ll b/test/ExecutionEngine/MCJIT/remote/simpletest-remote.ll index 9ceaf545c5e60..d10a4117a0dda 100644 --- a/test/ExecutionEngine/MCJIT/simpletest-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/simpletest-remote.ll @@ -1,5 +1,4 @@ -; RUN: %lli_mcjit -remote-mcjit %s > /dev/null -; XFAIL: arm, mips +; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null define i32 @bar() { ret i32 0 @@ -9,4 +8,3 @@ define i32 @main() { %r = call i32 @bar( ) ; <i32> [#uses=1] ret i32 %r } - diff --git a/test/ExecutionEngine/MCJIT/stubs-remote.ll b/test/ExecutionEngine/MCJIT/remote/stubs-remote.ll index 15cb5d037efc6..97932bc389ac1 100644 --- a/test/ExecutionEngine/MCJIT/stubs-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/stubs-remote.ll @@ -1,5 +1,6 @@ -; RUN: %lli_mcjit -remote-mcjit -disable-lazy-compilation=false %s -; XFAIL: arm, mips +; RUN: %lli_mcjit -remote-mcjit -disable-lazy-compilation=false -mcjit-remote-process=lli-child-target %s +; XFAIL: * +; This test should fail until remote symbol resolution is supported. define i32 @main() nounwind { entry: diff --git a/test/ExecutionEngine/MCJIT/remote/stubs-sm-pic.ll b/test/ExecutionEngine/MCJIT/remote/stubs-sm-pic.ll new file mode 100644 index 0000000000000..88faf21adb1b7 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/stubs-sm-pic.ll @@ -0,0 +1,37 @@ +; RUN: %lli_mcjit -remote-mcjit -disable-lazy-compilation=false -relocation-model=pic -code-model=small %s +; XFAIL: * +; This function should fail until remote symbol resolution is supported. + +define i32 @main() nounwind { +entry: + call void @lazily_compiled_address_is_consistent() + ret i32 0 +} + +; Test PR3043: @test should have the same address before and after +; it's JIT-compiled. +@funcPtr = common global i1 ()* null, align 4 +@lcaic_failure = internal constant [46 x i8] c"@lazily_compiled_address_is_consistent failed\00" + +define void @lazily_compiled_address_is_consistent() nounwind { +entry: + store i1 ()* @test, i1 ()** @funcPtr + %pass = tail call i1 @test() ; <i32> [#uses=1] + br i1 %pass, label %pass_block, label %fail_block +pass_block: + ret void +fail_block: + call i32 @puts(i8* getelementptr([46 x i8]* @lcaic_failure, i32 0, i32 0)) + call void @exit(i32 1) + unreachable +} + +define i1 @test() nounwind { +entry: + %tmp = load i1 ()** @funcPtr + %eq = icmp eq i1 ()* %tmp, @test + ret i1 %eq +} + +declare i32 @puts(i8*) noreturn +declare void @exit(i32) noreturn diff --git a/test/ExecutionEngine/MCJIT/test-common-symbols-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-common-symbols-remote.ll index 3b8ee9dd1cce0..63280895a9a3f 100644 --- a/test/ExecutionEngine/MCJIT/test-common-symbols-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-common-symbols-remote.ll @@ -1,5 +1,4 @@ -; RUN: %lli_mcjit -remote-mcjit -O0 -disable-lazy-compilation=false %s -; XFAIL: arm, mips +; RUN: %lli_mcjit -remote-mcjit -O0 -disable-lazy-compilation=false -mcjit-remote-process=lli-child-target %s ; The intention of this test is to verify that symbols mapped to COMMON in ELF ; work as expected. @@ -9,14 +8,14 @@ ; int zero_int; ; double zero_double; ; int zero_arr[10]; -; +; ; int main() ; { ; zero_arr[zero_int + 5] = 40; -; +; ; if (zero_double < 1.0) ; zero_arr[zero_int + 2] = 70; -; +; ; for (int i = 1; i < 10; ++i) { ; zero_arr[i] = zero_arr[i - 1] + zero_arr[i]; ; } diff --git a/test/ExecutionEngine/MCJIT/test-data-align-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-data-align-remote.ll index 9daf1684de816..6b2b97bc2d7e4 100644 --- a/test/ExecutionEngine/MCJIT/test-data-align-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-data-align-remote.ll @@ -1,5 +1,4 @@ -; RUN: %lli_mcjit -remote-mcjit -O0 %s -; XFAIL: armv7, mips +; RUN: %lli_mcjit -remote-mcjit -O0 -mcjit-remote-process=lli-child-target %s ; Check that a variable is always aligned as specified. diff --git a/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-fp-no-external-funcs-remote.ll index 847d2253a0edb..a8a93a8dc3bf3 100644 --- a/test/ExecutionEngine/MCJIT/test-fp-no-external-funcs-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-fp-no-external-funcs-remote.ll @@ -1,5 +1,4 @@ -; RUN: %lli_mcjit -remote-mcjit %s > /dev/null -; XFAIL: arm, mips +; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null define double @test(double* %DP, double %Arg) { %D = load double* %DP ; <double> [#uses=1] @@ -19,4 +18,3 @@ define i32 @main() { call double @test( double* %X, double 2.000000e+00 ) ; <double>:1 [#uses=0] ret i32 0 } - diff --git a/test/ExecutionEngine/MCJIT/test-global-init-nonzero-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-remote.ll index b8d94b50cfe28..4181fb08842c9 100644 --- a/test/ExecutionEngine/MCJIT/test-global-init-nonzero-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-remote.ll @@ -1,5 +1,4 @@ -; RUN: %lli_mcjit -remote-mcjit %s > /dev/null -; XFAIL: arm, mips +; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null @count = global i32 1, align 4 diff --git a/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-sm-pic.ll b/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-sm-pic.ll new file mode 100644 index 0000000000000..29ab24b39336c --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/test-global-init-nonzero-sm-pic.ll @@ -0,0 +1,35 @@ +; RUN: %lli_mcjit -remote-mcjit -relocation-model=pic -code-model=small %s > /dev/null +; XFAIL: mips, aarch64, arm, i686, i386 + +@count = global i32 1, align 4 + +define i32 @main() nounwind uwtable { +entry: + %retval = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 0, i32* %retval + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 49 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* @count, align 4 + %inc = add nsw i32 %1, 1 + store i32 %inc, i32* @count, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %2 = load i32* %i, align 4 + %inc1 = add nsw i32 %2, 1 + store i32 %inc1, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %3 = load i32* @count, align 4 + %sub = sub nsw i32 %3, 50 + ret i32 %sub +} diff --git a/test/ExecutionEngine/MCJIT/test-ptr-reloc-remote.ll b/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-remote.ll index f2c2cd6199f77..8b562972b5d18 100644 --- a/test/ExecutionEngine/MCJIT/test-ptr-reloc-remote.ll +++ b/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-remote.ll @@ -1,5 +1,4 @@ -; RUN: %lli_mcjit -remote-mcjit -O0 %s -; XFAIL: arm, mips +; RUN: %lli_mcjit -remote-mcjit -O0 -mcjit-remote-process=lli-child-target %s @.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1 @ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4 @@ -14,4 +13,3 @@ entry: %. = zext i1 %cmp to i32 ret i32 %. } - diff --git a/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-sm-pic.ll b/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-sm-pic.ll new file mode 100644 index 0000000000000..bad026fe7d4d2 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/remote/test-ptr-reloc-sm-pic.ll @@ -0,0 +1,17 @@ +; RUN: %lli_mcjit -remote-mcjit -O0 -relocation-model=pic -code-model=small %s +; XFAIL: mips, aarch64, arm, i686, i386 + +@.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1 +@ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4 +@.str1 = private unnamed_addr constant [6 x i8] c"data2\00", align 1 +@ptr2 = global i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0), align 4 + +define i32 @main(i32 %argc, i8** nocapture %argv) nounwind readonly { +entry: + %0 = load i8** @ptr, align 4 + %1 = load i8** @ptr2, align 4 + %cmp = icmp eq i8* %0, %1 + %. = zext i1 %cmp to i32 + ret i32 %. +} + diff --git a/test/ExecutionEngine/MCJIT/stubs-sm-pic.ll b/test/ExecutionEngine/MCJIT/stubs-sm-pic.ll new file mode 100644 index 0000000000000..9e214f5d47530 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/stubs-sm-pic.ll @@ -0,0 +1,36 @@ +; RUN: %lli_mcjit -disable-lazy-compilation=false -relocation-model=pic -code-model=small %s +; XFAIL: mips, i686, i386, aarch64, arm + +define i32 @main() nounwind { +entry: + call void @lazily_compiled_address_is_consistent() + ret i32 0 +} + +; Test PR3043: @test should have the same address before and after +; it's JIT-compiled. +@funcPtr = common global i1 ()* null, align 4 +@lcaic_failure = internal constant [46 x i8] c"@lazily_compiled_address_is_consistent failed\00" + +define void @lazily_compiled_address_is_consistent() nounwind { +entry: + store i1 ()* @test, i1 ()** @funcPtr + %pass = tail call i1 @test() ; <i32> [#uses=1] + br i1 %pass, label %pass_block, label %fail_block +pass_block: + ret void +fail_block: + call i32 @puts(i8* getelementptr([46 x i8]* @lcaic_failure, i32 0, i32 0)) + call void @exit(i32 1) + unreachable +} + +define i1 @test() nounwind { +entry: + %tmp = load i1 ()** @funcPtr + %eq = icmp eq i1 ()* %tmp, @test + ret i1 %eq +} + +declare i32 @puts(i8*) noreturn +declare void @exit(i32) noreturn diff --git a/test/ExecutionEngine/MCJIT/test-global-init-nonzero-sm-pic.ll b/test/ExecutionEngine/MCJIT/test-global-init-nonzero-sm-pic.ll new file mode 100644 index 0000000000000..eb031f2e4f457 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-global-init-nonzero-sm-pic.ll @@ -0,0 +1,35 @@ +; RUN: %lli_mcjit -relocation-model=pic -code-model=small %s > /dev/null +; XFAIL: mips, aarch64, arm, i686, i386 + +@count = global i32 1, align 4 + +define i32 @main() nounwind uwtable { +entry: + %retval = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 0, i32* %retval + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %0 = load i32* %i, align 4 + %cmp = icmp slt i32 %0, 49 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %1 = load i32* @count, align 4 + %inc = add nsw i32 %1, 1 + store i32 %inc, i32* @count, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %2 = load i32* %i, align 4 + %inc1 = add nsw i32 %2, 1 + store i32 %inc1, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + %3 = load i32* @count, align 4 + %sub = sub nsw i32 %3, 50 + ret i32 %sub +} diff --git a/test/ExecutionEngine/MCJIT/test-ptr-reloc-sm-pic.ll b/test/ExecutionEngine/MCJIT/test-ptr-reloc-sm-pic.ll new file mode 100644 index 0000000000000..9e067422e3120 --- /dev/null +++ b/test/ExecutionEngine/MCJIT/test-ptr-reloc-sm-pic.ll @@ -0,0 +1,17 @@ +; RUN: %lli_mcjit -O0 -relocation-model=pic -code-model=small %s +; XFAIL: mips, aarch64, arm, i686, i386 + +@.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1 +@ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4 +@.str1 = private unnamed_addr constant [6 x i8] c"data2\00", align 1 +@ptr2 = global i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0), align 4 + +define i32 @main(i32 %argc, i8** nocapture %argv) nounwind readonly { +entry: + %0 = load i8** @ptr, align 4 + %1 = load i8** @ptr2, align 4 + %cmp = icmp eq i8* %0, %1 + %. = zext i1 %cmp to i32 + ret i32 %. +} + diff --git a/test/ExecutionEngine/RuntimeDyld/Inputs/arm_secdiff_reloc.o b/test/ExecutionEngine/RuntimeDyld/Inputs/arm_secdiff_reloc.o Binary files differnew file mode 100644 index 0000000000000..5392266cf560c --- /dev/null +++ b/test/ExecutionEngine/RuntimeDyld/Inputs/arm_secdiff_reloc.o diff --git a/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test b/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test new file mode 100644 index 0000000000000..92e4dd793ccbe --- /dev/null +++ b/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test @@ -0,0 +1 @@ +RUN: llvm-rtdyld -printline %p/Inputs/arm_secdiff_reloc.o diff --git a/test/ExecutionEngine/fma3-jit.ll b/test/ExecutionEngine/fma3-jit.ll new file mode 100644 index 0000000000000..25eaa65a538b3 --- /dev/null +++ b/test/ExecutionEngine/fma3-jit.ll @@ -0,0 +1,18 @@ +; RUN: %lli %s | FileCheck %s +; REQUIRES: fma3 +; CHECK: 12.000000 + +@msg_double = internal global [4 x i8] c"%f\0A\00" + +declare i32 @printf(i8*, ...) + +define i32 @main() { + %fma = tail call double @llvm.fma.f64(double 3.0, double 3.0, double 3.0) nounwind readnone + + %ptr1 = getelementptr [4 x i8]* @msg_double, i32 0, i32 0 + call i32 (i8*,...)* @printf(i8* %ptr1, double %fma) + + ret i32 0 +} + +declare double @llvm.fma.f64(double, double, double) nounwind readnone diff --git a/test/ExecutionEngine/lit.local.cfg b/test/ExecutionEngine/lit.local.cfg index b6945adf015aa..28c56ad9c5c24 100644 --- a/test/ExecutionEngine/lit.local.cfg +++ b/test/ExecutionEngine/lit.local.cfg @@ -1,14 +1,9 @@ -config.suffixes = ['.ll', '.c', '.cpp'] - -def getRoot(config): - if not config.parent: - return config - return getRoot(config.parent) - -root = getRoot(config) +if config.root.host_arch in ['PowerPC', 'AArch64', 'SystemZ']: + config.unsupported = True -if root.host_arch in ['PowerPC', 'AArch64', 'SystemZ']: +if 'hexagon' in config.root.target_triple: config.unsupported = True -if 'hexagon' in root.target_triple: +# ExecutionEngine tests are not expected to pass in a cross-compilation setup. +if 'native' not in config.available_features: config.unsupported = True diff --git a/test/ExecutionEngine/mov64zext32.ll b/test/ExecutionEngine/mov64zext32.ll new file mode 100644 index 0000000000000..f38c21a5698f9 --- /dev/null +++ b/test/ExecutionEngine/mov64zext32.ll @@ -0,0 +1,18 @@ +; RUN: %lli %s > /dev/null +; XFAIL: arm + +define i64 @foo() { + ret i64 42 +} + +define i32 @main() { + %val = call i64 @foo() + %is42 = icmp eq i64 %val, 42 + br i1 %is42, label %good, label %bad + +good: + ret i32 0 + +bad: + ret i32 1 +} diff --git a/test/ExecutionEngine/test-interp-vec-cast.ll b/test/ExecutionEngine/test-interp-vec-cast.ll new file mode 100644 index 0000000000000..3f9f66640fa12 --- /dev/null +++ b/test/ExecutionEngine/test-interp-vec-cast.ll @@ -0,0 +1,146 @@ +; RUN: %lli -force-interpreter=true %s > /dev/null + +define i32 @main() { + zext <2 x i1> <i1 true,i1 true> to <2 x i8> + zext <3 x i1> <i1 true,i1 true,i1 true> to <3 x i8> + zext <2 x i1> <i1 true,i1 true> to <2 x i16> + zext <3 x i1> <i1 true,i1 true,i1 true> to <3 x i16> + zext <2 x i1> <i1 true,i1 true> to <2 x i32> + zext <3 x i1> <i1 true,i1 true,i1 true> to <3 x i32> + zext <2 x i1> <i1 true,i1 true> to <2 x i64> + zext <3 x i1> <i1 true,i1 true,i1 true> to <3 x i64> + zext <3 x i8> <i8 4, i8 4, i8 4> to <3 x i16> + zext <2 x i8> <i8 -4, i8 -4> to <2 x i16> + zext <3 x i8> <i8 4, i8 4, i8 4> to <3 x i32> + zext <2 x i8> <i8 -4, i8 -4> to <2 x i32> + zext <3 x i8> <i8 4, i8 4, i8 4> to <3 x i64> + zext <2 x i8> <i8 -4, i8 -4> to <2 x i64> + zext <3 x i16> <i16 4, i16 4, i16 4> to <3 x i32> + zext <2 x i16> <i16 -4, i16 -4> to <2 x i32> + zext <3 x i16> <i16 4, i16 4, i16 4> to <3 x i64> + zext <2 x i16> <i16 -4, i16 -4> to <2 x i64> + zext <3 x i32> <i32 4, i32 4, i32 4> to <3 x i64> + zext <2 x i32> <i32 -4, i32 -4> to <2 x i64> + + + sext <2 x i1> <i1 true,i1 true> to <2 x i8> + sext <3 x i1> <i1 true,i1 false,i1 true> to <3 x i8> + sext <2 x i1> <i1 true,i1 true> to <2 x i16> + sext <3 x i1> <i1 true,i1 false,i1 true> to <3 x i16> + sext <2 x i1> <i1 true,i1 true> to <2 x i32> + sext <3 x i1> <i1 true,i1 false,i1 true> to <3 x i32> + sext <2 x i1> <i1 true,i1 true> to <2 x i64> + sext <3 x i1> <i1 true,i1 false,i1 true> to <3 x i64> + sext <3 x i8> <i8 -4, i8 0, i8 4> to <3 x i16> + sext <2 x i8> <i8 -4, i8 4> to <2 x i16> + sext <3 x i8> <i8 -4, i8 0, i8 4> to <3 x i32> + sext <2 x i8> <i8 -4, i8 4> to <2 x i32> + sext <3 x i8> <i8 -4, i8 0, i8 4> to <3 x i64> + sext <2 x i8> <i8 -4, i8 4> to <2 x i64> + sext <3 x i16> <i16 -4, i16 0, i16 4> to <3 x i32> + sext <2 x i16> <i16 -4, i16 4> to <2 x i32> + sext <3 x i16> <i16 -4, i16 0, i16 4> to <3 x i64> + sext <2 x i16> <i16 -4, i16 4> to <2 x i64> + sext <3 x i32> <i32 -4, i32 0, i32 4> to <3 x i64> + sext <2 x i32> <i32 -4, i32 4> to <2 x i64> + + + uitofp <3 x i1> <i1 true,i1 false,i1 true> to <3 x float> + uitofp <2 x i1> <i1 true,i1 true> to <2 x double> + uitofp <3 x i8> <i8 -4,i8 0,i8 4> to <3 x float> + uitofp <2 x i8> <i8 -4,i8 4> to <2 x double> + uitofp <3 x i16> <i16 -4,i16 0,i16 4> to <3 x float> + uitofp <2 x i16> <i16 -4,i16 4> to <2 x double> + uitofp <3 x i32> <i32 -4,i32 0,i32 4> to <3 x float> + uitofp <2 x i32> <i32 -4,i32 4> to <2 x double> + uitofp <3 x i64> <i64 -4,i64 0,i64 4> to <3 x float> + uitofp <2 x i64> <i64 -4,i64 4> to <2 x double> + + + sitofp <3 x i1> <i1 true,i1 false,i1 true> to <3 x float> + sitofp <2 x i1> <i1 true,i1 true> to <2 x double> + sitofp <3 x i8> <i8 -4,i8 0,i8 4> to <3 x float> + sitofp <2 x i8> <i8 -4,i8 4> to <2 x double> + sitofp <3 x i16> <i16 -4,i16 0,i16 4> to <3 x float> + sitofp <2 x i16> <i16 -4,i16 4> to <2 x double> + sitofp <3 x i32> <i32 -4,i32 0,i32 4> to <3 x float> + sitofp <2 x i32> <i32 -4,i32 4> to <2 x double> + sitofp <3 x i64> <i64 -4,i64 0,i64 4> to <3 x float> + sitofp <2 x i64> <i64 -4,i64 4> to <2 x double> + + trunc <2 x i16> <i16 -6, i16 6> to <2 x i8> + trunc <3 x i16> <i16 -6, i16 6, i16 0> to <3 x i8> + trunc <2 x i32> <i32 -6, i32 6> to <2 x i8> + trunc <3 x i32> <i32 -6, i32 6, i32 0> to <3 x i8> + trunc <2 x i32> <i32 -6, i32 6> to <2 x i16> + trunc <3 x i32> <i32 -6, i32 6, i32 0> to <3 x i16> + trunc <2 x i64> <i64 -6, i64 6> to <2 x i8> + trunc <3 x i64> <i64 -6, i64 6, i64 0> to <3 x i8> + trunc <2 x i64> <i64 -6, i64 6> to <2 x i16> + trunc <3 x i64> <i64 -6, i64 6, i64 0> to <3 x i16> + trunc <2 x i64> <i64 -6, i64 6> to <2 x i32> + trunc <3 x i64> <i64 -6, i64 6, i64 0> to <3 x i32> + + + fpext <2 x float> < float 0.000000e+00, float 1.0> to <2 x double> + fpext <3 x float> < float 0.000000e+00, float -1.0, float 1.0> to <3 x double> + + fptosi <2 x double> < double 0.000000e+00, double 1.0> to <2 x i8> + fptosi <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i8> + fptosi <2 x double> < double 0.000000e+00, double 1.0> to <2 x i16> + fptosi <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i16> + fptosi <2 x double> < double 0.000000e+00, double 1.0> to <2 x i32> + fptosi <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i32> + fptosi <2 x double> < double 0.000000e+00, double 1.0> to <2 x i64> + fptosi <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i64> + + fptoui <2 x double> < double 0.000000e+00, double 1.0> to <2 x i8> + fptoui <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i8> + fptoui <2 x double> < double 0.000000e+00, double 1.0> to <2 x i16> + fptoui <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i16> + fptoui <2 x double> < double 0.000000e+00, double 1.0> to <2 x i32> + fptoui <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i32> + fptoui <2 x double> < double 0.000000e+00, double 1.0> to <2 x i64> + fptoui <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x i64> + + fptrunc <2 x double> < double 0.000000e+00, double 1.0> to <2 x float> + fptrunc <3 x double> < double 0.000000e+00, double 1.0, double -1.0> to <3 x float> + + bitcast <8 x i8> <i8 0, i8 -1, i8 2, i8 -3, i8 4, i8 -5, i8 6, i8 -7> to <4 x i16> + bitcast <8 x i8> <i8 0, i8 -1, i8 2, i8 -3, i8 4, i8 -5, i8 6, i8 -7> to <2 x i32> + bitcast <8 x i8> <i8 0, i8 -1, i8 2, i8 -3, i8 4, i8 -5, i8 6, i8 -7> to i64 + bitcast <8 x i8> <i8 0, i8 -1, i8 2, i8 -3, i8 4, i8 -5, i8 6, i8 -7> to <2 x float> + bitcast <8 x i8> <i8 0, i8 -1, i8 2, i8 -3, i8 4, i8 -5, i8 6, i8 -7> to double + + bitcast <4 x i16> <i16 0, i16 -1, i16 2, i16 -3> to <8 x i8> + bitcast <4 x i16> <i16 0, i16 -1, i16 2, i16 -3> to <2 x i32> + bitcast <4 x i16> <i16 0, i16 -1, i16 2, i16 -3> to i64 + bitcast <4 x i16> <i16 0, i16 -1, i16 2, i16 -3> to <2 x float> + bitcast <4 x i16> <i16 0, i16 -1, i16 2, i16 -3> to double + + bitcast <2 x i32> <i32 1, i32 -1> to <8 x i8> + bitcast <2 x i32> <i32 1, i32 -1> to <4 x i16> + bitcast <2 x i32> <i32 1, i32 -1> to i64 + bitcast <2 x i32> <i32 1, i32 -1> to <2 x float> + bitcast <2 x i32> <i32 1, i32 -1> to double + + bitcast i64 1 to <8 x i8> + bitcast i64 1 to <4 x i16> + bitcast i64 1 to <2 x i32> + bitcast i64 1 to <2 x float> + bitcast i64 1 to double + + bitcast <2 x float> <float 1.0, float -1.0> to <8 x i8> + bitcast <2 x float> <float 1.0, float -1.0> to <4 x i16> + bitcast <2 x float> <float 1.0, float -1.0> to i64 + bitcast <2 x float> <float 1.0, float -1.0> to <2 x i32> + bitcast <2 x float> <float 1.0, float -1.0> to double + + bitcast double 1.0 to <8 x i8> + bitcast double 1.0 to <4 x i16> + bitcast double 1.0 to <2 x i32> + bitcast double 1.0 to <2 x float> + bitcast double 1.0 to i64 + + ret i32 0 +} diff --git a/test/ExecutionEngine/test-interp-vec-insertelement.ll b/test/ExecutionEngine/test-interp-vec-insertelement.ll new file mode 100644 index 0000000000000..814b90533d0cf --- /dev/null +++ b/test/ExecutionEngine/test-interp-vec-insertelement.ll @@ -0,0 +1,41 @@ + ; RUN: %lli -force-interpreter=true %s > /dev/null + +define i32 @main() { + %v0 = insertelement <2 x i8> zeroinitializer, i8 1, i32 1 + %v1 = insertelement <3 x i8> zeroinitializer, i8 2, i32 2 + %v2 = insertelement <4 x i8> zeroinitializer, i8 3, i32 3 + %v3 = insertelement <8 x i8> zeroinitializer, i8 4, i32 4 + %v4 = insertelement <16 x i8> zeroinitializer, i8 5, i32 7 + + %v5 = insertelement <2 x i16> zeroinitializer, i16 1, i32 1 + %v6 = insertelement <3 x i16> zeroinitializer, i16 2, i32 2 + %v7 = insertelement <4 x i16> zeroinitializer, i16 3, i32 3 + %v8 = insertelement <8 x i16> zeroinitializer, i16 4, i32 4 + %v9 = insertelement <16 x i16> zeroinitializer, i16 5, i32 7 + + %v10 = insertelement <2 x i32> zeroinitializer, i32 1, i32 1 + %v11 = insertelement <3 x i32> zeroinitializer, i32 2, i32 2 + %v12 = insertelement <4 x i32> zeroinitializer, i32 3, i32 3 + %v13 = insertelement <8 x i32> zeroinitializer, i32 4, i32 4 + %v14 = insertelement <16 x i32> zeroinitializer, i32 5, i32 7 + + %v15 = insertelement <2 x i64> zeroinitializer, i64 1, i32 1 + %v16 = insertelement <3 x i64> zeroinitializer, i64 2, i32 2 + %v17 = insertelement <4 x i64> zeroinitializer, i64 3, i32 3 + %v18 = insertelement <8 x i64> zeroinitializer, i64 4, i32 4 + %v19 = insertelement <16 x i64> zeroinitializer, i64 5, i32 7 + + %v20 = insertelement <2 x float> zeroinitializer, float 1.0, i32 1 + %v21 = insertelement <3 x float> zeroinitializer, float 2.0, i32 2 + %v22 = insertelement <4 x float> zeroinitializer, float 3.0, i32 3 + %v23 = insertelement <8 x float> zeroinitializer, float 4.0, i32 4 + %v24 = insertelement <16 x float> zeroinitializer, float 5.0, i32 7 + + %v25 = insertelement <2 x double> zeroinitializer, double 1.0, i32 1 + %v26 = insertelement <3 x double> zeroinitializer, double 2.0, i32 2 + %v27 = insertelement <4 x double> zeroinitializer, double 3.0, i32 3 + %v28 = insertelement <8 x double> zeroinitializer, double 4.0, i32 4 + %v29 = insertelement <16 x double> zeroinitializer, double 5.0, i32 7 + + ret i32 0 +} diff --git a/test/ExecutionEngine/test-interp-vec-insertextractvalue.ll b/test/ExecutionEngine/test-interp-vec-insertextractvalue.ll new file mode 100644 index 0000000000000..09fbf6abc3fd7 --- /dev/null +++ b/test/ExecutionEngine/test-interp-vec-insertextractvalue.ll @@ -0,0 +1,21 @@ + ; RUN: %lli -force-interpreter=true %s > /dev/null + +define i32 @main() { + + %s1 = insertvalue { i32, { float, double} } undef, i32 9, 0 + %s2 = insertvalue { i32, { float, double} } %s1, float 3.0, 1, 0 + %s3 = insertvalue { i32, { float, double} } %s2, double 5.0, 1, 1 + + %s4 = extractvalue { i32, { float, double} } %s3, 1 + + %a1 = extractvalue { i32, { float, double} } %s3, 0 + + %a2 = extractvalue { i32, { float, double} } %s3, 1, 0 + %a3 = extractvalue { i32, { float, double} } %s3, 1, 1 + %a4 = extractvalue { float, double} %s4, 0 + %a5 = extractvalue { float, double} %s4, 1 + + %aa = fpext float %a4 to double + + ret i32 0 +} diff --git a/test/ExecutionEngine/test-interp-vec-loadstore.ll b/test/ExecutionEngine/test-interp-vec-loadstore.ll index e5007114c0708..665a135d6bc9b 100644 --- a/test/ExecutionEngine/test-interp-vec-loadstore.ll +++ b/test/ExecutionEngine/test-interp-vec-loadstore.ll @@ -1,22 +1,11 @@ ; RUN: %lli -force-interpreter=true %s | FileCheck %s -; XFAIL: mips -; CHECK: 1 -; CHECK: 2 -; CHECK: 3 -; CHECK: 4 -; CHECK: 5.{{[0]+}}e+{{[0]+}} -; CHECK: 6.{{[0]+}}e+{{[0]+}} -; CHECK: 7.{{[0]+}}e+{{[0]+}} -; CHECK: 8.{{[0]+}}e+{{[0]+}} -; CHECK: 9.{{[0]+}}e+{{[0]+}} -; CHECK: 1.{{[0]+}}e+{{[0]+}}1 -; CHECK: 1.1{{[0]+}}e+{{[0]+}}1 -; CHECK: 1.2{{[0]+}}e+{{[0]+}}1 - -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32" - -@format_i32 = internal global [4 x i8] c"%d\0A\00" -@format_float = internal global [4 x i8] c"%e\0A\00" +; CHECK: int test passed +; CHECK: double test passed +; CHECK: float test passed + +@msg_int = internal global [17 x i8] c"int test passed\0A\00" +@msg_double = internal global [20 x i8] c"double test passed\0A\00" +@msg_float = internal global [19 x i8] c"float test passed\0A\00" declare i32 @printf(i8*, ...) @@ -24,62 +13,157 @@ define i32 @main() { %a = alloca <4 x i32>, align 16 %b = alloca <4 x double>, align 16 %c = alloca <4 x float>, align 16 - + %pint_0 = alloca i32 + %pint_1 = alloca i32 + %pint_2 = alloca i32 + %pint_3 = alloca i32 + %pdouble_0 = alloca double + %pdouble_1 = alloca double + %pdouble_2 = alloca double + %pdouble_3 = alloca double + %pfloat_0 = alloca float + %pfloat_1 = alloca float + %pfloat_2 = alloca float + %pfloat_3 = alloca float + + ; store constants 1,2,3,4 as vector store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %a, align 16 + ; store constants 1,2,3,4 as scalars + store i32 1, i32* %pint_0 + store i32 2, i32* %pint_1 + store i32 3, i32* %pint_2 + store i32 4, i32* %pint_3 + + ; load stored scalars + %val_int0 = load i32* %pint_0 + %val_int1 = load i32* %pint_1 + %val_int2 = load i32* %pint_2 + %val_int3 = load i32* %pint_3 + ; load stored vector %val0 = load <4 x i32> *%a, align 16 + ; extract integers from the loaded vector %res_i32_0 = extractelement <4 x i32> %val0, i32 0 %res_i32_1 = extractelement <4 x i32> %val0, i32 1 %res_i32_2 = extractelement <4 x i32> %val0, i32 2 %res_i32_3 = extractelement <4 x i32> %val0, i32 3 - - %ptr0 = getelementptr [4 x i8]* @format_i32, i32 0, i32 0 - call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_0) - call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_1) - call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_2) - call i32 (i8*,...)* @printf(i8* %ptr0, i32 %res_i32_3) + ; compare extracted data with stored constants + %test_result_int_0 = icmp eq i32 %res_i32_0, %val_int0 + %test_result_int_1 = icmp eq i32 %res_i32_1, %val_int1 + %test_result_int_2 = icmp eq i32 %res_i32_2, %val_int2 + %test_result_int_3 = icmp eq i32 %res_i32_3, %val_int3 + + %test_result_int_4 = icmp eq i32 %res_i32_0, %val_int3 + %test_result_int_5 = icmp eq i32 %res_i32_1, %val_int2 + %test_result_int_6 = icmp eq i32 %res_i32_2, %val_int1 + %test_result_int_7 = icmp eq i32 %res_i32_3, %val_int0 + + ; it should be TRUE + %A_i = or i1 %test_result_int_0, %test_result_int_4 + %B_i = or i1 %test_result_int_1, %test_result_int_5 + %C_i = or i1 %test_result_int_2, %test_result_int_6 + %D_i = or i1 %test_result_int_3, %test_result_int_7 + %E_i = and i1 %A_i, %B_i + %F_i = and i1 %C_i, %D_i + %res_i = and i1 %E_i, %F_i + + ; if TRUE print message + br i1 %res_i, label %Print_int, label %Double +Print_int: + %ptr0 = getelementptr [17 x i8]* @msg_int, i32 0, i32 0 + call i32 (i8*,...)* @printf(i8* %ptr0) + br label %Double +Double: store <4 x double> <double 5.0, double 6.0, double 7.0, double 8.0>, <4 x double>* %b, align 16 + ; store constants as scalars + store double 5.0, double* %pdouble_0 + store double 6.0, double* %pdouble_1 + store double 7.0, double* %pdouble_2 + store double 8.0, double* %pdouble_3 + ; load stored vector %val1 = load <4 x double> *%b, align 16 + ; load stored scalars + %val_double0 = load double* %pdouble_0 + %val_double1 = load double* %pdouble_1 + %val_double2 = load double* %pdouble_2 + %val_double3 = load double* %pdouble_3 %res_double_0 = extractelement <4 x double> %val1, i32 0 %res_double_1 = extractelement <4 x double> %val1, i32 1 %res_double_2 = extractelement <4 x double> %val1, i32 2 %res_double_3 = extractelement <4 x double> %val1, i32 3 - - %ptr1 = getelementptr [4 x i8]* @format_float, i32 0, i32 0 - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_0) - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_1) - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_2) - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_double_3) + %test_result_double_0 = fcmp oeq double %res_double_0, %val_double0 + %test_result_double_1 = fcmp oeq double %res_double_1, %val_double1 + %test_result_double_2 = fcmp oeq double %res_double_2, %val_double2 + %test_result_double_3 = fcmp oeq double %res_double_3, %val_double3 + + %test_result_double_4 = fcmp oeq double %res_double_0, %val_double3 + %test_result_double_5 = fcmp oeq double %res_double_1, %val_double2 + %test_result_double_6 = fcmp oeq double %res_double_2, %val_double1 + %test_result_double_7 = fcmp oeq double %res_double_3, %val_double0 + + %A_double = or i1 %test_result_double_0, %test_result_double_4 + %B_double = or i1 %test_result_double_1, %test_result_double_5 + %C_double = or i1 %test_result_double_2, %test_result_double_6 + %D_double = or i1 %test_result_double_3, %test_result_double_7 + %E_double = and i1 %A_double, %B_double + %F_double = and i1 %C_double, %D_double + %res_double = and i1 %E_double, %F_double + br i1 %res_double, label %Print_double, label %Float +Print_double: + %ptr1 = getelementptr [20 x i8]* @msg_double, i32 0, i32 0 + call i32 (i8*,...)* @printf(i8* %ptr1) + br label %Float +Float: store <4 x float> <float 9.0, float 10.0, float 11.0, float 12.0>, <4 x float>* %c, align 16 - + + store float 9.0, float* %pfloat_0 + store float 10.0, float* %pfloat_1 + store float 11.0, float* %pfloat_2 + store float 12.0, float* %pfloat_3 + + ; load stored vector %val2 = load <4 x float> *%c, align 16 - - %ptr2 = getelementptr [4 x i8]* @format_float, i32 0, i32 0 + ; load stored scalars + %val_float0 = load float* %pfloat_0 + %val_float1 = load float* %pfloat_1 + %val_float2 = load float* %pfloat_2 + %val_float3 = load float* %pfloat_3 + + %res_float_0 = extractelement <4 x float> %val2, i32 0 + %res_float_1 = extractelement <4 x float> %val2, i32 1 + %res_float_2 = extractelement <4 x float> %val2, i32 2 + %res_float_3 = extractelement <4 x float> %val2, i32 3 + + %test_result_float_0 = fcmp oeq float %res_float_0, %val_float0 + %test_result_float_1 = fcmp oeq float %res_float_1, %val_float1 + %test_result_float_2 = fcmp oeq float %res_float_2, %val_float2 + %test_result_float_3 = fcmp oeq float %res_float_3, %val_float3 + + %test_result_float_4 = fcmp oeq float %res_float_0, %val_float3 + %test_result_float_5 = fcmp oeq float %res_float_1, %val_float2 + %test_result_float_6 = fcmp oeq float %res_float_2, %val_float1 + %test_result_float_7 = fcmp oeq float %res_float_3, %val_float0 + + %A_float = or i1 %test_result_float_0, %test_result_float_4 + %B_float = or i1 %test_result_float_1, %test_result_float_5 + %C_float = or i1 %test_result_float_2, %test_result_float_6 + %D_float = or i1 %test_result_float_3, %test_result_float_7 + %E_float = and i1 %A_float, %B_float + %F_float = and i1 %C_float, %D_float + %res_float = and i1 %E_float, %F_float + + br i1 %res_float, label %Print_float, label %Exit +Print_float: + %ptr2 = getelementptr [19 x i8]* @msg_float, i32 0, i32 0 + call i32 (i8*,...)* @printf(i8* %ptr2) + br label %Exit +Exit: - ; by some reason printf doesn't print float correctly, so - ; floats are casted to doubles and are printed as doubles - - %res_serv_0 = extractelement <4 x float> %val2, i32 0 - %res_float_0 = fpext float %res_serv_0 to double - %res_serv_1 = extractelement <4 x float> %val2, i32 1 - %res_float_1 = fpext float %res_serv_1 to double - %res_serv_2 = extractelement <4 x float> %val2, i32 2 - %res_float_2 = fpext float %res_serv_2 to double - %res_serv_3 = extractelement <4 x float> %val2, i32 3 - %res_float_3 = fpext float %res_serv_3 to double - - - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_0) - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_1) - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_2) - call i32 (i8*,...)* @printf(i8* %ptr1, double %res_float_3) - - ret i32 0 } diff --git a/test/ExecutionEngine/test-interp-vec-select.ll b/test/ExecutionEngine/test-interp-vec-select.ll new file mode 100644 index 0000000000000..ce086e408dd43 --- /dev/null +++ b/test/ExecutionEngine/test-interp-vec-select.ll @@ -0,0 +1,118 @@ +; RUN: %lli -force-interpreter=true %s > /dev/null + +define i32 @main() { + + ; Vector values + %a2_i8 = add <2 x i8> zeroinitializer, <i8 0, i8 1> + %a3_i8 = add <3 x i8> zeroinitializer, <i8 0, i8 1, i8 2> + %a4_i8 = add <4 x i8> zeroinitializer, <i8 0, i8 1, i8 2, i8 3> + %a8_i8 = add <8 x i8> zeroinitializer, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7> + %a16_i8 = add <16 x i8> zeroinitializer, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15> + + %a2_i16 = add <2 x i16> zeroinitializer, <i16 0, i16 1> + %a3_i16 = add <3 x i16> zeroinitializer, <i16 0, i16 1, i16 2> + %a4_i16 = add <4 x i16> zeroinitializer, <i16 0, i16 1, i16 2, i16 3> + %a8_i16 = add <8 x i16> zeroinitializer, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7> + %a16_i16 = add <16 x i16> zeroinitializer, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15> + + %a2_i32 = add <2 x i32> zeroinitializer, <i32 0, i32 1> + %a3_i32 = add <3 x i32> zeroinitializer, <i32 0, i32 1, i32 2> + %a4_i32 = add <4 x i32> zeroinitializer, <i32 0, i32 1, i32 2, i32 3> + %a8_i32 = add <8 x i32> zeroinitializer, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> + %a16_i32 = add <16 x i32> zeroinitializer, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> + + %a2_i64 = add <2 x i64> zeroinitializer, <i64 0, i64 1> + %a3_i64 = add <3 x i64> zeroinitializer, <i64 0, i64 1, i64 2> + %a4_i64 = add <4 x i64> zeroinitializer, <i64 0, i64 1, i64 2, i64 3> + %a8_i64 = add <8 x i64> zeroinitializer, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> + %a16_i64 = add <16 x i64> zeroinitializer, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15> + + %a2_float = fadd <2 x float> zeroinitializer, <float 0.0, float 1.0> + %a3_float = fadd <3 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0> + %a4_float = fadd <4 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0, float 3.0> + %a8_float = fadd <8 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0, float 3.0, float 4.0, float 5.0, float 6.0, float 7.0> + %a16_float = fadd <16 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0, float 3.0, float 4.0, float 5.0, float 6.0, float 7.0, float 8.0, float 9.0, float 10.0, float 11.0, float 12.0, float 13.0, float 14.0, float 15.0> + + %a2_double = fadd <2 x double> zeroinitializer, <double 0.0, double 1.0> + %a3_double = fadd <3 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0> + %a4_double = fadd <4 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0, double 3.0> + %a8_double = fadd <8 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0, double 7.0> + %a16_double = fadd <16 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0, double 7.0, double 8.0, double 9.0, double 10.0, double 11.0, double 12.0, double 13.0, double 14.0, double 15.0> + + %b2_i8 = sub <2 x i8> zeroinitializer, %a2_i8 + %b3_i8 = sub <3 x i8> zeroinitializer, %a3_i8 + %b4_i8 = sub <4 x i8> zeroinitializer, %a4_i8 + %b8_i8 = sub <8 x i8> zeroinitializer, %a8_i8 + %b16_i8 = sub <16 x i8> zeroinitializer, %a16_i8 + + %b2_i16 = sub <2 x i16> zeroinitializer, %a2_i16 + %b3_i16 = sub <3 x i16> zeroinitializer, %a3_i16 + %b4_i16 = sub <4 x i16> zeroinitializer, %a4_i16 + %b8_i16 = sub <8 x i16> zeroinitializer, %a8_i16 + %b16_i16 = sub <16 x i16> zeroinitializer, %a16_i16 + + %b2_i32 = sub <2 x i32> zeroinitializer, %a2_i32 + %b3_i32 = sub <3 x i32> zeroinitializer, %a3_i32 + %b4_i32 = sub <4 x i32> zeroinitializer, %a4_i32 + %b8_i32 = sub <8 x i32> zeroinitializer, %a8_i32 + %b16_i32 = sub <16 x i32> zeroinitializer, %a16_i32 + + %b2_i64 = sub <2 x i64> zeroinitializer, %a2_i64 + %b3_i64 = sub <3 x i64> zeroinitializer, %a3_i64 + %b4_i64 = sub <4 x i64> zeroinitializer, %a4_i64 + %b8_i64 = sub <8 x i64> zeroinitializer, %a8_i64 + %b16_i64 = sub <16 x i64> zeroinitializer, %a16_i64 + + %b2_float = fsub <2 x float> zeroinitializer, %a2_float + %b3_float = fsub <3 x float> zeroinitializer, %a3_float + %b4_float = fsub <4 x float> zeroinitializer, %a4_float + %b8_float = fsub <8 x float> zeroinitializer, %a8_float + %b16_float = fsub <16 x float> zeroinitializer, %a16_float + + %b2_double = fsub <2 x double> zeroinitializer, %a2_double + %b3_double = fsub <3 x double> zeroinitializer, %a3_double + %b4_double = fsub <4 x double> zeroinitializer, %a4_double + %b8_double = fsub <8 x double> zeroinitializer, %a8_double + %b16_double = fsub <16 x double> zeroinitializer, %a16_double + + + + %v0 = select <2 x i1> <i1 true, i1 false>, <2 x i8> %a2_i8, <2 x i8> %b2_i8 + %v1 = select <3 x i1> <i1 true, i1 false, i1 true>, <3 x i8> %a3_i8, <3 x i8> %b3_i8 + %v2 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i8> %a4_i8, <4 x i8> %b4_i8 + %v3 = select <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x i8> %a8_i8, <8 x i8> %b8_i8 + %v4 = select <16 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <16 x i8> %a16_i8, <16 x i8> %b16_i8 + + %v5 = select <2 x i1> <i1 true, i1 false>, <2 x i16> %a2_i16, <2 x i16> %b2_i16 + %v6 = select <3 x i1> <i1 true, i1 false, i1 true>, <3 x i16> %a3_i16, <3 x i16> %b3_i16 + %v7 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i16> %a4_i16, <4 x i16> %b4_i16 + %v8 = select <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x i16> %a8_i16, <8 x i16> %b8_i16 + %v9 = select <16 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <16 x i16> %a16_i16, <16 x i16> %b16_i16 + + %v10 = select <2 x i1> <i1 true, i1 false>, <2 x i32> %a2_i32, <2 x i32> %b2_i32 + %v11 = select <3 x i1> <i1 true, i1 false, i1 true>, <3 x i32> %a3_i32, <3 x i32> %b3_i32 + %v12 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> %a4_i32, <4 x i32> %b4_i32 + %v13 = select <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x i32> %a8_i32, <8 x i32> %b8_i32 + %v14 = select <16 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <16 x i32> %a16_i32, <16 x i32> %b16_i32 + + %v15 = select <2 x i1> <i1 true, i1 false>, <2 x i64> %a2_i64, <2 x i64> %b2_i64 + %v16 = select <3 x i1> <i1 true, i1 false, i1 true>, <3 x i64> %a3_i64, <3 x i64> %b3_i64 + %v17 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i64> %a4_i64, <4 x i64> %b4_i64 + %v18 = select <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x i64> %a8_i64, <8 x i64> %b8_i64 + %v19 = select <16 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <16 x i64> %a16_i64, <16 x i64> %b16_i64 + + %v20 = select <2 x i1> <i1 true, i1 false>, <2 x float> %a2_float, <2 x float> %b2_float + %v21 = select <3 x i1> <i1 true, i1 false, i1 true>, <3 x float> %a3_float, <3 x float> %b3_float + %v22 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x float> %a4_float, <4 x float> %b4_float + %v23 = select <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x float> %a8_float, <8 x float> %b8_float + %v24 = select <16 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <16 x float> %a16_float, <16 x float> %b16_float + + %v25 = select <2 x i1> <i1 true, i1 false>, <2 x double> %a2_double, <2 x double> %b2_double + %v26 = select <3 x i1> <i1 true, i1 false, i1 true>, <3 x double> %a3_double, <3 x double> %b3_double + %v27 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %a4_double, <4 x double> %b4_double + %v28 = select <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x double> %a8_double, <8 x double> %b8_double + %v29 = select <16 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <16 x double> %a16_double, <16 x double> %b16_double + + + ret i32 0 +} diff --git a/test/ExecutionEngine/test-interp-vec-shift.ll b/test/ExecutionEngine/test-interp-vec-shift.ll new file mode 100644 index 0000000000000..3aa4f4e54f39f --- /dev/null +++ b/test/ExecutionEngine/test-interp-vec-shift.ll @@ -0,0 +1,32 @@ +; RUN: %lli -force-interpreter=true %s > /dev/null + +define i32 @main() { + %shamt = add <2 x i8> <i8 0, i8 0>, <i8 1, i8 2> + %shift.upgrd.1 = zext <2 x i8> %shamt to <2 x i32> + %t1.s = shl <2 x i32> <i32 1, i32 2>, %shift.upgrd.1 + %t2.s = shl <2 x i32> <i32 1, i32 2>, <i32 3, i32 4> + %shift.upgrd.2 = zext <2 x i8> %shamt to <2 x i32> + %t1 = shl <2 x i32> <i32 1, i32 2>, %shift.upgrd.2 + %t2 = shl <2 x i32> <i32 1, i32 0>, <i32 5, i32 6> + %t2.s.upgrd.3 = shl <2 x i64> <i64 1, i64 2>, <i64 3, i64 4> + %t2.upgrd.4 = shl <2 x i64> <i64 1, i64 2>, <i64 6, i64 7> + %shift.upgrd.5 = zext <2 x i8> %shamt to <2 x i32> + %tr1.s = ashr <2 x i32> <i32 1, i32 2>, %shift.upgrd.5 + %tr2.s = ashr <2 x i32> <i32 1, i32 2>, <i32 4, i32 5> + %shift.upgrd.6 = zext <2 x i8> %shamt to <2 x i32> + %tr1 = lshr <2 x i32> <i32 1, i32 2>, %shift.upgrd.6 + %tr2 = lshr <2 x i32> <i32 1, i32 2>, <i32 5, i32 6> + %tr1.l = ashr <2 x i64> <i64 1, i64 2>, <i64 4, i64 5> + %shift.upgrd.7 = zext <2 x i8> %shamt to <2 x i64> + %tr2.l = ashr <2 x i64> <i64 1, i64 2>, %shift.upgrd.7 + %tr3.l = shl <2 x i64> <i64 1, i64 2>, <i64 4, i64 5> + %shift.upgrd.8 = zext <2 x i8> %shamt to <2 x i64> + %tr4.l = shl <2 x i64> <i64 1, i64 2>, %shift.upgrd.8 + %tr1.u = lshr <2 x i64> <i64 1, i64 2>, <i64 5, i64 6> + %shift.upgrd.9 = zext <2 x i8> %shamt to <2 x i64> + %tr2.u = lshr <2 x i64> <i64 1, i64 2>, %shift.upgrd.9 + %tr3.u = shl <2 x i64> <i64 1, i64 2>, <i64 5, i64 6> + %shift.upgrd.10 = zext <2 x i8> %shamt to <2 x i64> + %tr4.u = shl <2 x i64> <i64 1, i64 2>, %shift.upgrd.10 + ret i32 0 +} diff --git a/test/ExecutionEngine/test-interp-vec-shuffle.ll b/test/ExecutionEngine/test-interp-vec-shuffle.ll new file mode 100644 index 0000000000000..e55fa99e3bb19 --- /dev/null +++ b/test/ExecutionEngine/test-interp-vec-shuffle.ll @@ -0,0 +1,81 @@ +; RUN: %lli -force-interpreter=true %s > /dev/null + +define i32 @main() { + + ; Vector values + %a2_i8 = add <2 x i8> zeroinitializer, <i8 0, i8 1> + %a3_i8 = add <3 x i8> zeroinitializer, <i8 0, i8 1, i8 2> + %a4_i8 = add <4 x i8> zeroinitializer, <i8 0, i8 1, i8 2, i8 3> + %a8_i8 = add <8 x i8> zeroinitializer, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7> + %a16_i8 = add <16 x i8> zeroinitializer, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15> + + %a2_i16 = add <2 x i16> zeroinitializer, <i16 0, i16 1> + %a3_i16 = add <3 x i16> zeroinitializer, <i16 0, i16 1, i16 2> + %a4_i16 = add <4 x i16> zeroinitializer, <i16 0, i16 1, i16 2, i16 3> + %a8_i16 = add <8 x i16> zeroinitializer, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7> + %a16_i16 = add <16 x i16> zeroinitializer, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15> + + %a2_i32 = add <2 x i32> zeroinitializer, <i32 0, i32 1> + %a3_i32 = add <3 x i32> zeroinitializer, <i32 0, i32 1, i32 2> + %a4_i32 = add <4 x i32> zeroinitializer, <i32 0, i32 1, i32 2, i32 3> + %a8_i32 = add <8 x i32> zeroinitializer, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> + %a16_i32 = add <16 x i32> zeroinitializer, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> + + %a2_i64 = add <2 x i64> zeroinitializer, <i64 0, i64 1> + %a3_i64 = add <3 x i64> zeroinitializer, <i64 0, i64 1, i64 2> + %a4_i64 = add <4 x i64> zeroinitializer, <i64 0, i64 1, i64 2, i64 3> + %a8_i64 = add <8 x i64> zeroinitializer, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7> + %a16_i64 = add <16 x i64> zeroinitializer, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15> + + %a2_float = fadd <2 x float> zeroinitializer, <float 0.0, float 1.0> + %a3_float = fadd <3 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0> + %a4_float = fadd <4 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0, float 3.0> + %a8_float = fadd <8 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0, float 3.0, float 4.0, float 5.0, float 6.0, float 7.0> + %a16_float = fadd <16 x float> zeroinitializer, <float 0.0, float 1.0, float 2.0, float 3.0, float 4.0, float 5.0, float 6.0, float 7.0, float 8.0, float 9.0, float 10.0, float 11.0, float 12.0, float 13.0, float 14.0, float 15.0> + + %a2_double = fadd <2 x double> zeroinitializer, <double 0.0, double 1.0> + %a3_double = fadd <3 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0> + %a4_double = fadd <4 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0, double 3.0> + %a8_double = fadd <8 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0, double 7.0> + %a16_double = fadd <16 x double> zeroinitializer, <double 0.0, double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0, double 7.0, double 8.0, double 9.0, double 10.0, double 11.0, double 12.0, double 13.0, double 14.0, double 15.0> + + + %v0 = shufflevector <2 x i8> %a2_i8, <2 x i8>undef, <2 x i32> <i32 1, i32 0> + %v1 = shufflevector <3 x i8> %a3_i8, <3 x i8>undef, <3 x i32> <i32 2, i32 1, i32 0> + %v2 = shufflevector <4 x i8> %a4_i8, <4 x i8>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + %v3 = shufflevector <8 x i8> %a8_i8, <8 x i8>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + %v4 = shufflevector <16 x i8> %a16_i8, <16 x i8>undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + %v5 = shufflevector <2 x i16> %a2_i16, <2 x i16>undef, <2 x i32> <i32 1, i32 0> + %v6 = shufflevector <3 x i16> %a3_i16, <3 x i16>undef, <3 x i32> <i32 2, i32 1, i32 0> + %v7 = shufflevector <4 x i16> %a4_i16, <4 x i16>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + %v8 = shufflevector <8 x i16> %a8_i16, <8 x i16>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + %v9 = shufflevector <16 x i16> %a16_i16, <16 x i16>undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + %v10 = shufflevector <2 x i32> %a2_i32, <2 x i32>undef, <2 x i32> <i32 1, i32 0> + %v11 = shufflevector <3 x i32> %a3_i32, <3 x i32>undef, <3 x i32> <i32 2, i32 1, i32 0> + %v12 = shufflevector <4 x i32> %a4_i32, <4 x i32>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + %v13 = shufflevector <8 x i32> %a8_i32, <8 x i32>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + %v14 = shufflevector <16 x i32> %a16_i32, <16 x i32>undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + %v15 = shufflevector <2 x i64> %a2_i64, <2 x i64>undef, <2 x i32> <i32 1, i32 0> + %v16 = shufflevector <3 x i64> %a3_i64, <3 x i64>undef, <3 x i32> <i32 2, i32 1, i32 0> + %v17 = shufflevector <4 x i64> %a4_i64, <4 x i64>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + %v18 = shufflevector <8 x i64> %a8_i64, <8 x i64>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + %v19 = shufflevector <16 x i64> %a16_i64, <16 x i64>undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + %v20 = shufflevector <2 x float> %a2_float, <2 x float>undef, <2 x i32> <i32 1, i32 0> + %v21 = shufflevector <3 x float> %a3_float, <3 x float>undef, <3 x i32> <i32 2, i32 1, i32 0> + %v22 = shufflevector <4 x float> %a4_float, <4 x float>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + %v23 = shufflevector <8 x float> %a8_float, <8 x float>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + %v24 = shufflevector <16 x float> %a16_float, <16 x float>undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + %v25 = shufflevector <2 x double> %a2_double, <2 x double>undef, <2 x i32> <i32 1, i32 0> + %v26 = shufflevector <3 x double> %a3_double, <3 x double>undef, <3 x i32> <i32 2, i32 1, i32 0> + %v27 = shufflevector <4 x double> %a4_double, <4 x double>undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> + %v28 = shufflevector <8 x double> %a8_double, <8 x double>undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + %v29 = shufflevector <16 x double> %a16_double, <16 x double>undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> + + ret i32 0 +} + |