| Index: tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll
|
| diff --git a/tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll b/tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll
|
| index 60652dcd2edd3d6aefcfd380b7c2de29f42652b1..3e2f9e05803b21aaf074c46ea20e5d1ca5d777fa 100644
|
| --- a/tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll
|
| +++ b/tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll
|
| @@ -1,25 +1,34 @@
|
| ; This tests the NaCl intrinsics not related to atomic operations.
|
|
|
| -; RUN: %llvm2ice -O2 --verbose none -sandbox %s | FileCheck %s
|
| -; RUN: %llvm2ice -Om1 --verbose none -sandbox %s | FileCheck %s
|
| +; TODO(jvoung): fix extra "CALLTARGETS" run. The llvm-objdump symbolizer
|
| +; doesn't know how to symbolize non-section-local functions.
|
| +; The newer LLVM 3.6 one does work, but watch out for other bugs.
|
| +
|
| +; RUN: %llvm2ice -O2 --verbose none %s \
|
| +; RUN: | FileCheck --check-prefix=CALLTARGETS %s
|
| +; RUN: %llvm2ice -O2 --verbose none -sandbox %s \
|
| +; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \
|
| +; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s
|
| +; RUN: %llvm2ice -Om1 --verbose none -sandbox %s \
|
| +; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \
|
| +; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s
|
|
|
| ; Do another run w/ O2 and a different check-prefix (otherwise O2 and Om1
|
| ; share the same "CHECK" prefix). This separate run helps check that
|
| ; some code is optimized out.
|
| ; RUN: %llvm2ice -O2 --verbose none -sandbox %s \
|
| -; RUN: | FileCheck %s --check-prefix=CHECKO2REM
|
| +; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \
|
| +; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \
|
| +; RUN: | FileCheck --check-prefix=CHECKO2REM %s
|
|
|
| ; Do O2 runs without -sandbox to make sure llvm.nacl.read.tp gets
|
| ; lowered to __nacl_read_tp instead of gs:[0x0].
|
| +; We also know that because it's O2, it'll have the O2REM optimizations.
|
| ; RUN: %llvm2ice -O2 --verbose none %s \
|
| -; RUN: | FileCheck --check-prefix=CHECKO2UNSANDBOXED %s
|
| -; RUN: %llvm2ice -O2 --verbose none %s \
|
| -; RUN: | FileCheck --check-prefix=CHECKO2UNSANDBOXEDREM %s
|
| +; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \
|
| +; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \
|
| +; RUN: | FileCheck --check-prefix=CHECKO2UNSANDBOXEDREM %s
|
|
|
| -; RUN: %llvm2ice -O2 --verbose none %s \
|
| -; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj
|
| -; RUN: %llvm2ice -Om1 --verbose none %s \
|
| -; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj
|
| ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s
|
| ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s
|
| ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \
|
| @@ -56,10 +65,10 @@ entry:
|
| ; CHECK: mov e{{.*}}, dword ptr gs:[0]
|
| ; CHECKO2REM-LABEL: test_nacl_read_tp
|
| ; CHECKO2REM: mov e{{.*}}, dword ptr gs:[0]
|
| -; CHECKO2UNSANDBOXED-LABEL: test_nacl_read_tp
|
| -; CHECKO2UNSANDBOXED: call __nacl_read_tp
|
| ; CHECKO2UNSANDBOXEDREM-LABEL: test_nacl_read_tp
|
| -; CHECKO2UNSANDBOXEDREM: call __nacl_read_tp
|
| +; CHECKO2UNSANDBOXEDREM: call -4
|
| +; CALLTARGETS-LABEL: test_nacl_read_tp
|
| +; CALLTARGETS: call __nacl_read_tp
|
|
|
| define i32 @test_nacl_read_tp_more_addressing() {
|
| entry:
|
| @@ -81,12 +90,12 @@ entry:
|
| ; CHECKO2REM-LABEL: test_nacl_read_tp_more_addressing
|
| ; CHECKO2REM: mov e{{.*}}, dword ptr gs:[0]
|
| ; CHECKO2REM: mov e{{.*}}, dword ptr gs:[0]
|
| -; CHECKO2UNSANDBOXED-LABEL: test_nacl_read_tp_more_addressing
|
| -; CHECKO2UNSANDBOXED: call __nacl_read_tp
|
| -; CHECKO2UNSANDBOXED: call __nacl_read_tp
|
| ; CHECKO2UNSANDBOXEDREM-LABEL: test_nacl_read_tp_more_addressing
|
| -; CHECKO2UNSANDBOXEDREM: call __nacl_read_tp
|
| -; CHECKO2UNSANDBOXEDREM: call __nacl_read_tp
|
| +; CHECKO2UNSANDBOXEDREM: call -4
|
| +; CHECKO2UNSANDBOXEDREM: call -4
|
| +; CALLTARGETS-LABEL: test_nacl_read_tp_more_addressing
|
| +; CALLTARGETS: call __nacl_read_tp
|
| +; CALLTARGETS: call __nacl_read_tp
|
|
|
| define i32 @test_nacl_read_tp_dead(i32 %a) {
|
| entry:
|
| @@ -99,7 +108,9 @@ entry:
|
| ; CHECKO2REM-LABEL: test_nacl_read_tp_dead
|
| ; CHECKO2REM-NOT: mov e{{.*}}, dword ptr gs:[0]
|
| ; CHECKO2UNSANDBOXEDREM-LABEL: test_nacl_read_tp_dead
|
| -; CHECKO2UNSANDBOXEDREM-NOT: call __nacl_read_tp
|
| +; CHECKO2UNSANDBOXEDREM-NOT: call -4
|
| +; CALLTARGETS-LABEL: test_nacl_read_tp_dead
|
| +; CALLTARGETS-NOT: call __nacl_read_tp
|
|
|
| define void @test_memcpy(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
|
| entry:
|
| @@ -110,7 +121,9 @@ entry:
|
| ret void
|
| }
|
| ; CHECK-LABEL: test_memcpy
|
| -; CHECK: call memcpy
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_memcpy
|
| +; CALLTARGETS: call memcpy
|
| ; CHECKO2REM-LABEL: test_memcpy
|
| ; CHECKO2UNSANDBOXEDREM-LABEL: test_memcpy
|
|
|
| @@ -125,7 +138,9 @@ entry:
|
| ret void
|
| }
|
| ; CHECK-LABEL: test_memcpy_const_len_align
|
| -; CHECK: call memcpy
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_memcpy_const_len_align
|
| +; CALLTARGETS: call memcpy
|
|
|
| define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
|
| entry:
|
| @@ -136,7 +151,9 @@ entry:
|
| ret void
|
| }
|
| ; CHECK-LABEL: test_memmove
|
| -; CHECK: call memmove
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_memmove
|
| +; CALLTARGETS: call memmove
|
|
|
| define void @test_memmove_const_len_align(i32 %iptr_dst, i32 %iptr_src) {
|
| entry:
|
| @@ -147,7 +164,9 @@ entry:
|
| ret void
|
| }
|
| ; CHECK-LABEL: test_memmove_const_len_align
|
| -; CHECK: call memmove
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_memmove_const_len_align
|
| +; CALLTARGETS: call memmove
|
|
|
| define void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) {
|
| entry:
|
| @@ -159,7 +178,9 @@ entry:
|
| }
|
| ; CHECK-LABEL: test_memset
|
| ; CHECK: movzx
|
| -; CHECK: call memset
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_memset
|
| +; CALLTARGETS: call memset
|
|
|
| define void @test_memset_const_len_align(i32 %iptr_dst, i32 %wide_val) {
|
| entry:
|
| @@ -171,7 +192,9 @@ entry:
|
| }
|
| ; CHECK-LABEL: test_memset_const_len_align
|
| ; CHECK: movzx
|
| -; CHECK: call memset
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_memset_const_len_align
|
| +; CALLTARGETS: call memset
|
|
|
| define void @test_memset_const_val(i32 %iptr_dst, i32 %len) {
|
| entry:
|
| @@ -182,7 +205,10 @@ entry:
|
| ; CHECK-LABEL: test_memset_const_val
|
| ; Make sure the argument is legalized (can't movzx reg, 0).
|
| ; CHECK: movzx {{.*}}, {{[^0]}}
|
| -; CHECK: call memset
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_memset_const_val
|
| +; CALLTARGETS: call memset
|
| +
|
|
|
| define i32 @test_setjmplongjmp(i32 %iptr_env) {
|
| entry:
|
| @@ -199,11 +225,14 @@ NonZero:
|
| ret i32 1
|
| }
|
| ; CHECK-LABEL: test_setjmplongjmp
|
| -; CHECK: call setjmp
|
| -; CHECK: call longjmp
|
| +; CHECK: call -4
|
| +; CHECK: call -4
|
| ; CHECKO2REM-LABEL: test_setjmplongjmp
|
| -; CHECKO2REM: call setjmp
|
| -; CHECKO2REM: call longjmp
|
| +; CHECKO2REM: call -4
|
| +; CHECKO2REM: call -4
|
| +; CALLTARGETS-LABEL: test_setjmplongjmp
|
| +; CALLTARGETS: call setjmp
|
| +; CALLTARGETS: call longjmp
|
|
|
| define i32 @test_setjmp_unused(i32 %iptr_env, i32 %i_other) {
|
| entry:
|
| @@ -214,7 +243,9 @@ entry:
|
| ; Don't consider setjmp side-effect free, so it's not eliminated if
|
| ; result unused.
|
| ; CHECKO2REM-LABEL: test_setjmp_unused
|
| -; CHECKO2REM: call setjmp
|
| +; CHECKO2REM: call -4
|
| +; CALLTARGETS-LABEL: test_setjmp_unused
|
| +; CALLTARGETS: call setjmp
|
|
|
| define float @test_sqrt_float(float %x, i32 %iptr) {
|
| entry:
|
| @@ -222,20 +253,22 @@ entry:
|
| %r2 = call float @llvm.sqrt.f32(float %r)
|
| %r3 = call float @llvm.sqrt.f32(float -0.0)
|
| %r4 = fadd float %r2, %r3
|
| - br label %next
|
| -
|
| -next:
|
| - %__6 = inttoptr i32 %iptr to float*
|
| - %y = load float* %__6, align 4
|
| - %r5 = call float @llvm.sqrt.f32(float %y)
|
| - %r6 = fadd float %r4, %r5
|
| - ret float %r6
|
| + ret float %r4
|
| }
|
| ; CHECK-LABEL: test_sqrt_float
|
| ; CHECK: sqrtss xmm{{.*}}
|
| ; CHECK: sqrtss xmm{{.*}}
|
| ; CHECK: sqrtss xmm{{.*}}, dword ptr
|
| -; CHECK-LABEL: .L{{.*}}next
|
| +
|
| +define float @test_sqrt_float_mergeable_load(float %x, i32 %iptr) {
|
| +entry:
|
| + %__2 = inttoptr i32 %iptr to float*
|
| + %y = load float* %__2, align 4
|
| + %r5 = call float @llvm.sqrt.f32(float %y)
|
| + %r6 = fadd float %x, %r5
|
| + ret float %r6
|
| +}
|
| +; CHECK-LABEL: test_sqrt_float_mergeable_load
|
| ; We could fold the load and the sqrt into one operation, but the
|
| ; current folding only handles load + arithmetic op. The sqrt inst
|
| ; is considered an intrinsic call and not an arithmetic op.
|
| @@ -247,20 +280,22 @@ entry:
|
| %r2 = call double @llvm.sqrt.f64(double %r)
|
| %r3 = call double @llvm.sqrt.f64(double -0.0)
|
| %r4 = fadd double %r2, %r3
|
| - br label %next
|
| -
|
| -next:
|
| - %__6 = inttoptr i32 %iptr to double*
|
| - %y = load double* %__6, align 8
|
| - %r5 = call double @llvm.sqrt.f64(double %y)
|
| - %r6 = fadd double %r4, %r5
|
| - ret double %r6
|
| + ret double %r4
|
| }
|
| ; CHECK-LABEL: test_sqrt_double
|
| ; CHECK: sqrtsd xmm{{.*}}
|
| ; CHECK: sqrtsd xmm{{.*}}
|
| ; CHECK: sqrtsd xmm{{.*}}, qword ptr
|
| -; CHECK-LABEL: .L{{.*}}next
|
| +
|
| +define double @test_sqrt_double_mergeable_load(double %x, i32 %iptr) {
|
| +entry:
|
| + %__2 = inttoptr i32 %iptr to double*
|
| + %y = load double* %__2, align 8
|
| + %r5 = call double @llvm.sqrt.f64(double %y)
|
| + %r6 = fadd double %x, %r5
|
| + ret double %r6
|
| +}
|
| +; CHECK-LABEL: test_sqrt_double_mergeable_load
|
| ; CHECK: sqrtsd xmm{{.*}}
|
|
|
| define float @test_sqrt_ignored(float %x, double %y) {
|
| @@ -414,7 +449,9 @@ entry:
|
| ret i32 %r
|
| }
|
| ; CHECK-LABEL: test_popcount_32
|
| -; CHECK: call __popcountsi2
|
| +; CHECK: call -4
|
| +; CALLTARGETS-LABEL: test_popcount_32
|
| +; CALLTARGETS: call __popcountsi2
|
|
|
| define i64 @test_popcount_64(i64 %x) {
|
| entry:
|
| @@ -422,10 +459,13 @@ entry:
|
| ret i64 %r
|
| }
|
| ; CHECK-LABEL: test_popcount_64
|
| -; CHECK: call __popcountdi2
|
| +; CHECK: call -4
|
| ; __popcountdi2 only returns a 32-bit result, so clear the upper bits of
|
| ; the return value just in case.
|
| ; CHECK: mov {{.*}}, 0
|
| +; CALLTARGETS-LABEL: test_popcount_64
|
| +; CALLTARGETS: call __popcountdi2
|
| +
|
|
|
| define i32 @test_popcount_64_ret_i32(i64 %x) {
|
| entry:
|
| @@ -435,8 +475,10 @@ entry:
|
| }
|
| ; If there is a trunc, then the mov {{.*}}, 0 is dead and gets optimized out.
|
| ; CHECKO2REM-LABEL: test_popcount_64_ret_i32
|
| -; CHECKO2REM: call __popcountdi2
|
| +; CHECKO2REM: call -4
|
| ; CHECKO2REM-NOT: mov {{.*}}, 0
|
| +; CALLTARGETS-LABEL: test_popcount_64_ret_i32
|
| +; CALLTARGETS: call __popcountdi2
|
|
|
| define void @test_stacksave_noalloca() {
|
| entry:
|
|
|