OLD | NEW |
1 ; RUN: not pnacl-abicheck < %s | FileCheck %s | 1 ; RUN: not pnacl-abicheck < %s | FileCheck %s |
2 | 2 |
3 ; Test the "align" attributes that are allowed on load and store | 3 ; Test the "align" attributes that are allowed on load and store |
4 ; instructions. | 4 ; instructions. |
5 | 5 |
6 | 6 |
7 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) | 7 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
8 declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) | 8 declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
9 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) | 9 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) |
10 | 10 |
11 | 11 |
12 define internal void @allowed_cases(i32 %ptr, float %f, double %d) { | 12 define internal void @allowed_cases(i32 %ptr, float %f, double %d) { |
13 %ptr.i32 = inttoptr i32 %ptr to i32* | 13 %ptr.i32 = inttoptr i32 %ptr to i32* |
14 load i32* %ptr.i32, align 1 | 14 load i32, i32* %ptr.i32, align 1 |
15 store i32 123, i32* %ptr.i32, align 1 | 15 store i32 123, i32* %ptr.i32, align 1 |
16 | 16 |
17 %ptr.float = inttoptr i32 %ptr to float* | 17 %ptr.float = inttoptr i32 %ptr to float* |
18 load float* %ptr.float, align 1 | 18 load float, float* %ptr.float, align 1 |
19 load float* %ptr.float, align 4 | 19 load float, float* %ptr.float, align 4 |
20 store float %f, float* %ptr.float, align 1 | 20 store float %f, float* %ptr.float, align 1 |
21 store float %f, float* %ptr.float, align 4 | 21 store float %f, float* %ptr.float, align 4 |
22 | 22 |
23 %ptr.double = inttoptr i32 %ptr to double* | 23 %ptr.double = inttoptr i32 %ptr to double* |
24 load double* %ptr.double, align 1 | 24 load double, double* %ptr.double, align 1 |
25 load double* %ptr.double, align 8 | 25 load double, double* %ptr.double, align 8 |
26 store double %d, double* %ptr.double, align 1 | 26 store double %d, double* %ptr.double, align 1 |
27 store double %d, double* %ptr.double, align 8 | 27 store double %d, double* %ptr.double, align 8 |
28 | 28 |
29 ; memcpy() et el take an alignment parameter, which is allowed to be 1. | 29 ; memcpy() et el take an alignment parameter, which is allowed to be 1. |
30 %ptr.p = inttoptr i32 %ptr to i8* | 30 %ptr.p = inttoptr i32 %ptr to i8* |
31 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr.p, i8* %ptr.p, | 31 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr.p, i8* %ptr.p, |
32 i32 10, i32 1, i1 false) | 32 i32 10, i32 1, i1 false) |
33 call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr.p, i8* %ptr.p, | 33 call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr.p, i8* %ptr.p, |
34 i32 10, i32 1, i1 false) | 34 i32 10, i32 1, i1 false) |
35 call void @llvm.memset.p0i8.i32(i8* %ptr.p, i8 99, | 35 call void @llvm.memset.p0i8.i32(i8* %ptr.p, i8 99, |
36 i32 10, i32 1, i1 false) | 36 i32 10, i32 1, i1 false) |
37 | 37 |
38 ret void | 38 ret void |
39 } | 39 } |
40 ; CHECK-NOT: disallowed | 40 ; CHECK-NOT: disallowed |
41 | 41 |
42 | 42 |
43 define internal void @rejected_cases(i32 %ptr, float %f, double %d, i32 %align)
{ | 43 define internal void @rejected_cases(i32 %ptr, float %f, double %d, i32 %align)
{ |
44 %ptr.i32 = inttoptr i32 %ptr to i32* | 44 %ptr.i32 = inttoptr i32 %ptr to i32* |
45 load i32* %ptr.i32, align 4 | 45 load i32, i32* %ptr.i32, align 4 |
46 store i32 123, i32* %ptr.i32, align 4 | 46 store i32 123, i32* %ptr.i32, align 4 |
47 ; CHECK: disallowed: bad alignment: {{.*}} load i32{{.*}} align 4 | 47 ; CHECK: disallowed: bad alignment: {{.*}} load i32{{.*}} align 4 |
48 ; CHECK-NEXT: disallowed: bad alignment: store i32{{.*}} align 4 | 48 ; CHECK-NEXT: disallowed: bad alignment: store i32{{.*}} align 4 |
49 | 49 |
50 ; Unusual, not-very-useful alignments are rejected. | 50 ; Unusual, not-very-useful alignments are rejected. |
51 %ptr.float = inttoptr i32 %ptr to float* | 51 %ptr.float = inttoptr i32 %ptr to float* |
52 load float* %ptr.float, align 2 | 52 load float, float* %ptr.float, align 2 |
53 load float* %ptr.float, align 8 | 53 load float, float* %ptr.float, align 8 |
54 store float %f, float* %ptr.float, align 2 | 54 store float %f, float* %ptr.float, align 2 |
55 store float %f, float* %ptr.float, align 8 | 55 store float %f, float* %ptr.float, align 8 |
56 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load float{{.*}} align 2 | 56 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load float{{.*}} align 2 |
57 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load float{{.*}} align 8 | 57 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load float{{.*}} align 8 |
58 ; CHECK-NEXT: disallowed: bad alignment: store float{{.*}} align 2 | 58 ; CHECK-NEXT: disallowed: bad alignment: store float{{.*}} align 2 |
59 ; CHECK-NEXT: disallowed: bad alignment: store float{{.*}} align 8 | 59 ; CHECK-NEXT: disallowed: bad alignment: store float{{.*}} align 8 |
60 | 60 |
61 %ptr.double = inttoptr i32 %ptr to double* | 61 %ptr.double = inttoptr i32 %ptr to double* |
62 load double* %ptr.double, align 2 | 62 load double, double* %ptr.double, align 2 |
63 load double* %ptr.double, align 4 | 63 load double, double* %ptr.double, align 4 |
64 store double %d, double* %ptr.double, align 2 | 64 store double %d, double* %ptr.double, align 2 |
65 store double %d, double* %ptr.double, align 4 | 65 store double %d, double* %ptr.double, align 4 |
66 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load double{{.*}} align 2 | 66 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load double{{.*}} align 2 |
67 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load double{{.*}} align 4 | 67 ; CHECK-NEXT: disallowed: bad alignment: {{.*}} load double{{.*}} align 4 |
68 ; CHECK-NEXT: disallowed: bad alignment: store double{{.*}} align 2 | 68 ; CHECK-NEXT: disallowed: bad alignment: store double{{.*}} align 2 |
69 ; CHECK-NEXT: disallowed: bad alignment: store double{{.*}} align 4 | 69 ; CHECK-NEXT: disallowed: bad alignment: store double{{.*}} align 4 |
70 | 70 |
71 ; Non-pessimistic alignments for memcpy() et al are rejected. | 71 ; Non-pessimistic alignments for memcpy() et al are rejected. |
72 %ptr.p = inttoptr i32 %ptr to i8* | 72 %ptr.p = inttoptr i32 %ptr to i8* |
73 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr.p, i8* %ptr.p, | 73 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr.p, i8* %ptr.p, |
(...skipping 20 matching lines...) Expand all Loading... |
94 | 94 |
95 ret void | 95 ret void |
96 } | 96 } |
97 ; CHECK-NOT: disallowed | 97 ; CHECK-NOT: disallowed |
98 | 98 |
99 | 99 |
100 ; This stops the verifier from complaining about the lack of an entry point. | 100 ; This stops the verifier from complaining about the lack of an entry point. |
101 define void @_start(i32 %arg) { | 101 define void @_start(i32 %arg) { |
102 ret void | 102 ret void |
103 } | 103 } |
OLD | NEW |