Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Unified Diff: tests_lit/reader_tests/nacl-other-intrinsics.ll

Issue 577353003: Add call instructions to Subzero's bitcode reader. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix remaining issues raised. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tests_lit/reader_tests/nacl-fake-intrinsic.ll ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests_lit/reader_tests/nacl-other-intrinsics.ll
diff --git a/tests_lit/reader_tests/nacl-other-intrinsics.ll b/tests_lit/reader_tests/nacl-other-intrinsics.ll
new file mode 100644
index 0000000000000000000000000000000000000000..a1ab0315a71d06b1a774859280701bf3628ee7c8
--- /dev/null
+++ b/tests_lit/reader_tests/nacl-other-intrinsics.ll
@@ -0,0 +1,345 @@
+; This tests parsing NaCl intrinsics not related to atomic operations.
+
+; RUN: llvm-as < %s | pnacl-freeze -allow-local-symbol-tables \
+; RUN: | %llvm2ice -notranslate -verbose=inst -build-on-read \
+; RUN: -allow-pnacl-reader-error-recovery \
+; RUN: -allow-local-symbol-tables \
+; RUN: | FileCheck %s
+
+declare i8* @llvm.nacl.read.tp()
+declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1)
+declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1)
+declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1)
+declare void @llvm.nacl.longjmp(i8*, i32)
+declare i32 @llvm.nacl.setjmp(i8*)
+declare float @llvm.sqrt.f32(float)
+declare double @llvm.sqrt.f64(double)
+declare void @llvm.trap()
+declare i16 @llvm.bswap.i16(i16)
+declare i32 @llvm.bswap.i32(i32)
+declare i64 @llvm.bswap.i64(i64)
+declare i32 @llvm.ctlz.i32(i32, i1)
+declare i64 @llvm.ctlz.i64(i64, i1)
+declare i32 @llvm.cttz.i32(i32, i1)
+declare i64 @llvm.cttz.i64(i64, i1)
+declare i32 @llvm.ctpop.i32(i32)
+declare i64 @llvm.ctpop.i64(i64)
+declare i8* @llvm.stacksave()
+declare void @llvm.stackrestore(i8*)
+
+define i32 @test_nacl_read_tp() {
+entry:
+ %ptr = call i8* @llvm.nacl.read.tp()
+ %__1 = ptrtoint i8* %ptr to i32
+ ret i32 %__1
+}
+
+; CHECK: define i32 @test_nacl_read_tp() {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %ptr = call i32 @llvm.nacl.read.tp()
+; CHECK-NEXT: ret i32 %ptr
+; CHECK-NEXT: }
+
+define void @test_memcpy(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
+entry:
+ %dst = inttoptr i32 %iptr_dst to i8*
+ %src = inttoptr i32 %iptr_src to i8*
+ call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
+ i32 %len, i32 1, i1 false)
+ ret void
+}
+
+; CHECK-NEXT: define void @test_memcpy(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i32 %iptr_dst, i32 %iptr_src, i32 %len, i32 1, i1 false)
+; CHECK-NEXT: ret void
+; CHECK-NEXT: }
+
+define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
+entry:
+ %dst = inttoptr i32 %iptr_dst to i8*
+ %src = inttoptr i32 %iptr_src to i8*
+ call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src,
+ i32 %len, i32 1, i1 false)
+ ret void
+}
+
+; CHECK-NEXT: define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i32(i32 %iptr_dst, i32 %iptr_src, i32 %len, i32 1, i1 false)
+; CHECK-NEXT: ret void
+; CHECK-NEXT: }
+
+define void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) {
+entry:
+ %val = trunc i32 %wide_val to i8
+ %dst = inttoptr i32 %iptr_dst to i8*
+ call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val,
+ i32 %len, i32 1, i1 false)
+ ret void
+}
+
+; CHECK-NEXT: define void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %val = trunc i32 %wide_val to i8
+; CHECK-NEXT: call void @llvm.memset.p0i8.i32(i32 %iptr_dst, i8 %val, i32 %len, i32 1, i1 false)
+; CHECK-NEXT: ret void
+; CHECK-NEXT: }
+
+define i32 @test_setjmplongjmp(i32 %iptr_env) {
+entry:
+ %env = inttoptr i32 %iptr_env to i8*
+ %i = call i32 @llvm.nacl.setjmp(i8* %env)
+ %r1 = icmp eq i32 %i, 0
+ br i1 %r1, label %Zero, label %NonZero
+Zero:
+ ; Redundant inttoptr, to make --pnacl cast-eliding/re-insertion happy.
+ %env2 = inttoptr i32 %iptr_env to i8*
+ call void @llvm.nacl.longjmp(i8* %env2, i32 1)
+ ret i32 0
+NonZero:
+ ret i32 1
+}
+
+; CHECK-NEXT: define i32 @test_setjmplongjmp(i32 %iptr_env) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %i = call i32 @llvm.nacl.setjmp(i32 %iptr_env)
+; CHECK-NEXT: %r1 = icmp eq i32 %i, 0
+; CHECK-NEXT: br i1 %r1, label %Zero, label %NonZero
+; CHECK-NEXT: Zero:
+; CHECK-NEXT: call void @llvm.nacl.longjmp(i32 %iptr_env, i32 1)
+; CHECK-NEXT: ret i32 0
+; CHECK-NEXT: NonZero:
+; CHECK-NEXT: ret i32 1
+; CHECK-NEXT: }
+
+define float @test_sqrt_float(float %x, i32 %iptr) {
+entry:
+ %r = call float @llvm.sqrt.f32(float %x)
+ %r2 = call float @llvm.sqrt.f32(float %r)
+ %r3 = call float @llvm.sqrt.f32(float -0.0)
+ %r4 = fadd float %r2, %r3
+ ret float %r4
+}
+
+; CHECK-NEXT: define float @test_sqrt_float(float %x, i32 %iptr) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call float @llvm.sqrt.f32(float %x)
+; CHECK-NEXT: %r2 = call float @llvm.sqrt.f32(float %r)
+; CHECK-NEXT: %r3 = call float @llvm.sqrt.f32(float -0.000000e+00)
+; CHECK-NEXT: %r4 = fadd float %r2, %r3
+; CHECK-NEXT: ret float %r4
+; CHECK-NEXT: }
+
+define double @test_sqrt_double(double %x, i32 %iptr) {
+entry:
+ %r = call double @llvm.sqrt.f64(double %x)
+ %r2 = call double @llvm.sqrt.f64(double %r)
+ %r3 = call double @llvm.sqrt.f64(double -0.0)
+ %r4 = fadd double %r2, %r3
+ ret double %r4
+}
+
+; CHECK-NEXT: define double @test_sqrt_double(double %x, i32 %iptr) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call double @llvm.sqrt.f64(double %x)
+; CHECK-NEXT: %r2 = call double @llvm.sqrt.f64(double %r)
+; CHECK-NEXT: %r3 = call double @llvm.sqrt.f64(double -0.000000e+00)
+; CHECK-NEXT: %r4 = fadd double %r2, %r3
+; CHECK-NEXT: ret double %r4
+; CHECK-NEXT: }
+
+define i32 @test_trap(i32 %br) {
+entry:
+ %r1 = icmp eq i32 %br, 0
+ br i1 %r1, label %Zero, label %NonZero
+Zero:
+ call void @llvm.trap()
+ unreachable
+NonZero:
+ ret i32 1
+}
+
+; CHECK-NEXT: define i32 @test_trap(i32 %br) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r1 = icmp eq i32 %br, 0
+; CHECK-NEXT: br i1 %r1, label %Zero, label %NonZero
+; CHECK-NEXT: Zero:
+; CHECK-NEXT: call void @llvm.trap()
+; CHECK-NEXT: unreachable
+; CHECK-NEXT: NonZero:
+; CHECK-NEXT: ret i32 1
+; CHECK-NEXT: }
+
+define i32 @test_bswap_16(i32 %x) {
+entry:
+ %x_trunc = trunc i32 %x to i16
+ %r = call i16 @llvm.bswap.i16(i16 %x_trunc)
+ %r_zext = zext i16 %r to i32
+ ret i32 %r_zext
+}
+
+; CHECK-NEXT: define i32 @test_bswap_16(i32 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %x_trunc = trunc i32 %x to i16
+; CHECK-NEXT: %r = call i16 @llvm.bswap.i16(i16 %x_trunc)
+; CHECK-NEXT: %r_zext = zext i16 %r to i32
+; CHECK-NEXT: ret i32 %r_zext
+; CHECK-NEXT: }
+
+define i32 @test_bswap_32(i32 %x) {
+entry:
+ %r = call i32 @llvm.bswap.i32(i32 %x)
+ ret i32 %r
+}
+
+; CHECK-NEXT: define i32 @test_bswap_32(i32 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i32 @llvm.bswap.i32(i32 %x)
+; CHECK-NEXT: ret i32 %r
+; CHECK-NEXT: }
+
+define i64 @test_bswap_64(i64 %x) {
+entry:
+ %r = call i64 @llvm.bswap.i64(i64 %x)
+ ret i64 %r
+}
+
+; CHECK-NEXT: define i64 @test_bswap_64(i64 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i64 @llvm.bswap.i64(i64 %x)
+; CHECK-NEXT: ret i64 %r
+; CHECK-NEXT: }
+
+define i32 @test_ctlz_32(i32 %x) {
+entry:
+ %r = call i32 @llvm.ctlz.i32(i32 %x, i1 false)
+ ret i32 %r
+}
+
+; CHECK-NEXT: define i32 @test_ctlz_32(i32 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i32 @llvm.ctlz.i32(i32 %x, i1 false)
+; CHECK-NEXT: ret i32 %r
+; CHECK-NEXT: }
+
+define i64 @test_ctlz_64(i64 %x) {
+entry:
+ %r = call i64 @llvm.ctlz.i64(i64 %x, i1 false)
+ ret i64 %r
+}
+
+; CHECK-NEXT: define i64 @test_ctlz_64(i64 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i64 @llvm.ctlz.i64(i64 %x, i1 false)
+; CHECK-NEXT: ret i64 %r
+; CHECK-NEXT: }
+
+define i32 @test_cttz_32(i32 %x) {
+entry:
+ %r = call i32 @llvm.cttz.i32(i32 %x, i1 false)
+ ret i32 %r
+}
+
+; CHECK-NEXT: define i32 @test_cttz_32(i32 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i32 @llvm.cttz.i32(i32 %x, i1 false)
+; CHECK-NEXT: ret i32 %r
+; CHECK-NEXT: }
+
+define i64 @test_cttz_64(i64 %x) {
+entry:
+ %r = call i64 @llvm.cttz.i64(i64 %x, i1 false)
+ ret i64 %r
+}
+
+; CHECK-NEXT: define i64 @test_cttz_64(i64 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i64 @llvm.cttz.i64(i64 %x, i1 false)
+; CHECK-NEXT: ret i64 %r
+; CHECK-NEXT: }
+
+define i32 @test_popcount_32(i32 %x) {
+entry:
+ %r = call i32 @llvm.ctpop.i32(i32 %x)
+ ret i32 %r
+}
+
+; CHECK-NEXT: define i32 @test_popcount_32(i32 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i32 @llvm.ctpop.i32(i32 %x)
+; CHECK-NEXT: ret i32 %r
+; CHECK-NEXT: }
+
+define i64 @test_popcount_64(i64 %x) {
+entry:
+ %r = call i64 @llvm.ctpop.i64(i64 %x)
+ ret i64 %r
+}
+
+; CHECK-NEXT: define i64 @test_popcount_64(i64 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %r = call i64 @llvm.ctpop.i64(i64 %x)
+; CHECK-NEXT: ret i64 %r
+; CHECK-NEXT: }
+
+define void @test_stacksave_noalloca() {
+entry:
+ %sp = call i8* @llvm.stacksave()
+ call void @llvm.stackrestore(i8* %sp)
+ ret void
+}
+
+; CHECK-NEXT: define void @test_stacksave_noalloca() {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %sp = call i32 @llvm.stacksave()
+; CHECK-NEXT: call void @llvm.stackrestore(i32 %sp)
+; CHECK-NEXT: ret void
+; CHECK-NEXT: }
+
+declare i32 @foo(i32 %x)
+
+define void @test_stacksave_multiple(i32 %x) {
+entry:
+ %x_4 = mul i32 %x, 4
+ %sp1 = call i8* @llvm.stacksave()
+ %tmp1 = alloca i8, i32 %x_4, align 4
+
+ %sp2 = call i8* @llvm.stacksave()
+ %tmp2 = alloca i8, i32 %x_4, align 4
+
+ %y = call i32 @foo(i32 %x)
+
+ %sp3 = call i8* @llvm.stacksave()
+ %tmp3 = alloca i8, i32 %x_4, align 4
+
+ %__9 = bitcast i8* %tmp1 to i32*
+ store i32 %y, i32* %__9, align 1
+
+ %__10 = bitcast i8* %tmp2 to i32*
+ store i32 %x, i32* %__10, align 1
+
+ %__11 = bitcast i8* %tmp3 to i32*
+ store i32 %x, i32* %__11, align 1
+
+ call void @llvm.stackrestore(i8* %sp1)
+ ret void
+}
+
+; CHECK-NEXT: define void @test_stacksave_multiple(i32 %x) {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: %x_4 = mul i32 %x, 4
+; CHECK-NEXT: %sp1 = call i32 @llvm.stacksave()
+; CHECK-NEXT: %tmp1 = alloca i8, i32 %x_4, align 4
+; CHECK-NEXT: %sp2 = call i32 @llvm.stacksave()
+; CHECK-NEXT: %tmp2 = alloca i8, i32 %x_4, align 4
+; CHECK-NEXT: %y = call i32 @foo(i32 %x)
+; CHECK-NEXT: %sp3 = call i32 @llvm.stacksave()
+; CHECK-NEXT: %tmp3 = alloca i8, i32 %x_4, align 4
+; CHECK-NEXT: store i32 %y, i32* %tmp1, align 1
+; CHECK-NEXT: store i32 %x, i32* %tmp2, align 1
+; CHECK-NEXT: store i32 %x, i32* %tmp3, align 1
+; CHECK-NEXT: call void @llvm.stackrestore(i32 %sp1)
+; CHECK-NEXT: ret void
+; CHECK-NEXT: }
+
« no previous file with comments | « tests_lit/reader_tests/nacl-fake-intrinsic.ll ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698