OLD | NEW |
(Empty) | |
| 1 ; Test the store instruction. |
| 2 |
| 3 ; RUN: llvm-as < %s | pnacl-freeze | pnacl-bccompress --remove-abbreviations \ |
| 4 ; RUN: | not pnacl-bcdis | FileCheck %s |
| 5 |
| 6 ; Test valid stores. |
| 7 define void @GoodTests(i32 %p0) { |
| 8 |
| 9 ; CHECK: {{.*}}| 1: <65535, 11, 2> | constants { // BlockI
D = 11 |
| 10 ; CHECK-NEXT: {{.*}}| 3: <1, 1> | i32: |
| 11 ; CHECK-NEXT: {{.*}}| 3: <4, 6> | %c0 = i32 3; |
| 12 ; CHECK-NEXT: {{.*}}| 3: <1, 10> | <4 x i32>: |
| 13 ; CHECK-NEXT: {{.*}}| 3: <3> | %c1 = <4 x i32> un
def; |
| 14 ; CHECK-NEXT: {{.*}}| 3: <1, 9> | <8 x i16>: |
| 15 ; CHECK-NEXT: {{.*}}| 3: <3> | %c2 = <8 x i16> un
def; |
| 16 ; CHECK-NEXT: {{.*}}| 3: <1, 8> | <16 x i8>: |
| 17 ; CHECK-NEXT: {{.*}}| 3: <3> | %c3 = <16 x i8> un
def; |
| 18 ; CHECK-NEXT: {{.*}}| 3: <1, 7> | i64: |
| 19 ; CHECK-NEXT: {{.*}}| 3: <4, 8> | %c4 = i64 4; |
| 20 ; CHECK-NEXT: {{.*}}| 3: <1, 4> | i8: |
| 21 ; CHECK-NEXT: {{.*}}| 3: <4, 4> | %c5 = i8 2; |
| 22 ; CHECK-NEXT: {{.*}}| 3: <1, 5> | i16: |
| 23 ; CHECK-NEXT: {{.*}}| 3: <4, 4> | %c6 = i16 2; |
| 24 ; CHECK-NEXT: {{.*}}| 3: <1, 3> | double: |
| 25 ; CHECK-NEXT: {{.*}}| 3: <6, | %c7 = double 2; |
| 26 ; CHECK-NEXT: | 4611686018427387904> | |
| 27 ; CHECK-NEXT: {{.*}}| 3: <6, | %c8 = double 1; |
| 28 ; CHECK-NEXT: | 4607182418800017408> | |
| 29 ; CHECK-NEXT: {{.*}}| 3: <1, 2> | float: |
| 30 ; CHECK-NEXT: {{.*}}| 3: <6, 1073741824> | %c9 = float 2; |
| 31 ; CHECK-NEXT: {{.*}}| 3: <6, 1065353216> | %c10 = float 1; |
| 32 ; CHECK-NEXT: {{.*}}| 3: <1, 11> | <4 x float>: |
| 33 ; CHECK-NEXT: {{.*}}| 3: <3> | %c11 = <4 x float>
undef; |
| 34 ; CHECK-NEXT: {{.*}}| 0: <65534> | } |
| 35 ; CHECK-NEXT: | | %b0: |
| 36 |
| 37 %ai8 = inttoptr i32 %p0 to i8* |
| 38 store i8 2, i8* %ai8, align 1 |
| 39 |
| 40 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 7, 1> | store i8 %c5, i8* %p0,
align 1; |
| 41 |
| 42 %ai16 = inttoptr i32 %p0 to i16* |
| 43 store i16 2, i16* %ai16, align 1 |
| 44 |
| 45 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 6, 1> | store i16 %c6, i16* %p
0, align 1; |
| 46 |
| 47 %ai32 = inttoptr i32 %p0 to i32* |
| 48 store i32 3, i32* %ai32, align 1 |
| 49 |
| 50 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 12, 1> | store i32 %c0, i32* %p
0, align 1; |
| 51 |
| 52 %ai64 = inttoptr i32 %p0 to i64* |
| 53 store i64 4, i64* %ai64, align 1 |
| 54 |
| 55 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 8, 1> | store i64 %c4, i64* %p
0, align 1; |
| 56 |
| 57 %af = inttoptr i32 %p0 to float* |
| 58 store float 1.0, float* %af, align 1 |
| 59 store float 2.0, float* %af, align 4 |
| 60 |
| 61 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 2, 1> | store float %c10, floa
t* %p0, |
| 62 ; CHECK-NEXT: | | align 1; |
| 63 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 3, 3> | store float %c9, float
* %p0, |
| 64 ; CHECK-NEXT: | | align 4; |
| 65 |
| 66 %ad = inttoptr i32 %p0 to double* |
| 67 store double 1.0, double* %ad, align 1 |
| 68 store double 2.0, double* %ad, align 8 |
| 69 |
| 70 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 4, 1> | store double %c8, doub
le* %p0, |
| 71 ; CHECK-NEXT: | | align 1; |
| 72 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 5, 4> | store double %c7, doub
le* %p0, |
| 73 ; CHECK-NEXT: | | align 8; |
| 74 |
| 75 %av16_i8 = inttoptr i32 %p0 to <16 x i8>* |
| 76 store <16 x i8> undef, <16 x i8>* %av16_i8, align 1 |
| 77 |
| 78 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 9, 1> | store <16 x i8> %c3, |
| 79 ; CHECK-NEXT: | | <16 x i8>* %p0, al
ign 1; |
| 80 |
| 81 %av8_i16 = inttoptr i32 %p0 to <8 x i16>* |
| 82 store <8 x i16> undef, <8 x i16>* %av8_i16, align 2 |
| 83 |
| 84 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 10, 2> | store <8 x i16> %c2, |
| 85 ; CHECK-NEXT: | | <8 x i16>* %p0, al
ign 2; |
| 86 |
| 87 %av4_i32 = inttoptr i32 %p0 to <4 x i32>* |
| 88 store <4 x i32> undef, <4 x i32>* %av4_i32, align 4 |
| 89 |
| 90 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 11, 3> | store <4 x i32> %c1, |
| 91 ; CHECK-NEXT: | | <4 x i32>* %p0, al
ign 4; |
| 92 |
| 93 %av4_f = inttoptr i32 %p0 to <4 x float>* |
| 94 store <4 x float> undef, <4 x float>* %av4_f, align 4 |
| 95 ; CHECK-NEXT: {{.*}}| 3: <24, 13, 1, 3> | store <4 x float> %c11
, |
| 96 ; CHECK-NEXT: | | <4 x float>* %p0,
align 4; |
| 97 |
| 98 ret void |
| 99 |
| 100 ; CHECK-NEXT: {{.*}}| 3: <10> | ret void; |
| 101 |
| 102 } |
| 103 |
| 104 |
| 105 ; Test invalid stores. |
| 106 define void @BadTests(i32 %p0) { |
| 107 |
| 108 ; CHECK: {{.*}}| 1: <65535, 11, 2> | constants { // BlockI
D = 11 |
| 109 ; CHECK-NEXT: {{.*}}| 3: <1, 1> | i32: |
| 110 ; CHECK-NEXT: {{.*}}| 3: <4, 6> | %c0 = i32 3; |
| 111 ; CHECK-NEXT: {{.*}}| 3: <1, 15> | <16 x i1>: |
| 112 ; CHECK-NEXT: {{.*}}| 3: <3> | %c1 = <16 x i1> un
def; |
| 113 ; CHECK-NEXT: {{.*}}| 3: <1, 14> | <8 x i1>: |
| 114 ; CHECK-NEXT: {{.*}}| 3: <3> | %c2 = <8 x i1> und
ef; |
| 115 ; CHECK-NEXT: {{.*}}| 3: <1, 4> | i8: |
| 116 ; CHECK-NEXT: {{.*}}| 3: <4, 2> | %c3 = i8 1; |
| 117 ; CHECK-NEXT: {{.*}}| 3: <1, 5> | i16: |
| 118 ; CHECK-NEXT: {{.*}}| 3: <4, 4> | %c4 = i16 2; |
| 119 ; CHECK-NEXT: {{.*}}| 3: <1, 6> | i1: |
| 120 ; CHECK-NEXT: {{.*}}| 3: <4, 0> | %c5 = i1 0; |
| 121 ; CHECK-NEXT: {{.*}}| 3: <1, 7> | i64: |
| 122 ; CHECK-NEXT: {{.*}}| 3: <4, 8> | %c6 = i64 4; |
| 123 ; CHECK-NEXT: {{.*}}| 3: <1, 8> | <16 x i8>: |
| 124 ; CHECK-NEXT: {{.*}}| 3: <3> | %c7 = <16 x i8> un
def; |
| 125 ; CHECK-NEXT: {{.*}}| 3: <1, 9> | <8 x i16>: |
| 126 ; CHECK-NEXT: {{.*}}| 3: <3> | %c8 = <8 x i16> un
def; |
| 127 ; CHECK-NEXT: {{.*}}| 3: <1, 10> | <4 x i32>: |
| 128 ; CHECK-NEXT: {{.*}}| 3: <3> | %c9 = <4 x i32> un
def; |
| 129 ; CHECK-NEXT: {{.*}}| 3: <1, 13> | <4 x i1>: |
| 130 ; CHECK-NEXT: {{.*}}| 3: <3> | %c10 = <4 x i1> un
def; |
| 131 ; CHECK-NEXT: {{.*}}| 3: <1, 11> | <4 x float>: |
| 132 ; CHECK-NEXT: {{.*}}| 3: <3> | %c11 = <4 x float>
undef; |
| 133 ; CHECK-NEXT: {{.*}}| 3: <1, 3> | double: |
| 134 ; CHECK-NEXT: {{.*}}| 3: <6, | %c12 = double 2; |
| 135 ; CHECK-NEXT: | 4611686018427387904> | |
| 136 ; CHECK-NEXT: {{.*}}| 3: <1, 2> | float: |
| 137 ; CHECK-NEXT: {{.*}}| 3: <6, 1065353216> | %c13 = float 1; |
| 138 ; CHECK-NEXT: {{.*}}| 0: <65534> | } |
| 139 ; CHECK-NEXT: | | %b0: |
| 140 |
| 141 %ai1 = inttoptr i32 %p0 to i1* |
| 142 store i1 0, i1* %ai1 |
| 143 |
| 144 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 9, 0> | store i1 %c5, i1* %p0,
align 0; |
| 145 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for i1. Expects: 1 |
| 146 |
| 147 %ai8 = inttoptr i32 %p0 to i8* |
| 148 store i8 1, i8* %ai8 |
| 149 |
| 150 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 11, 0> | store i8 %c3, i8* %p0
, align 0; |
| 151 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for i8. Expects: 1 |
| 152 |
| 153 %ai16 = inttoptr i32 %p0 to i16* |
| 154 store i16 2, i16* %ai16 |
| 155 |
| 156 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 10, 0> | store i16 %c4, i16* %p
0, align 0; |
| 157 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for i16. Expects: 1 |
| 158 |
| 159 %ai32 = inttoptr i32 %p0 to i32* |
| 160 store i32 3, i32* %ai32 |
| 161 |
| 162 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 14, 0> | store i32 %c0, i32* %p0
, align 0; |
| 163 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for i32. Expects: 1 |
| 164 |
| 165 %ai64 = inttoptr i32 %p0 to i64* |
| 166 store i64 4, i64* %ai64 |
| 167 |
| 168 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 8, 0> | store i64 %c6, i64* %p
0, align 0; |
| 169 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for i64. Expects: 1 |
| 170 |
| 171 %af = inttoptr i32 %p0 to float* |
| 172 store float 1.0, float* %af |
| 173 |
| 174 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 1, 0> | store float %c13, floa
t* %p0, |
| 175 ; CHECK-NEXT: | | align 0; |
| 176 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for float. Expects: 1 or 4 |
| 177 |
| 178 %ad = inttoptr i32 %p0 to double* |
| 179 store double 2.0, double* %ad, align 4 |
| 180 |
| 181 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 2, 3> | store double %c12, dou
ble* %p0, |
| 182 ; CHECK-NEXT: | | align 4; |
| 183 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for double. Expects: 1 or 8 |
| 184 |
| 185 %av16_i8 = inttoptr i32 %p0 to <16 x i8>* |
| 186 store <16 x i8> undef, <16 x i8>* %av16_i8, align 4 |
| 187 |
| 188 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 7, 3> | store <16 x i8> %c7, |
| 189 ; CHECK-NEXT: | | <16 x i8>* %p0, al
ign 4; |
| 190 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for <16 x i8>. Expects: 1 |
| 191 |
| 192 %av8_i16 = inttoptr i32 %p0 to <8 x i16>* |
| 193 store <8 x i16> undef, <8 x i16>* %av8_i16, align 1 |
| 194 |
| 195 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 6, 1> | store <8 x i16> %c8, |
| 196 ; CHECK-NEXT: | | <8 x i16>* %p0, al
ign 1; |
| 197 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for <8 x i16>. Expects: 2 |
| 198 |
| 199 %av4_i32 = inttoptr i32 %p0 to <4 x i32>* |
| 200 store <4 x i32> undef, <4 x i32>* %av4_i32, align 1 |
| 201 |
| 202 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 5, 1> | store <4 x i32> %c9, |
| 203 ; CHECK-NEXT: | | <4 x i32>* %p0, al
ign 1; |
| 204 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for <4 x i32>. Expects: 4 |
| 205 |
| 206 %av4_f = inttoptr i32 %p0 to <4 x float>* |
| 207 store <4 x float> undef, <4 x float>* %av4_f, align 1 |
| 208 |
| 209 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 3, 1> | store <4 x float> %c11
, |
| 210 ; CHECK-NEXT: | | <4 x float>* %p0,
align 1; |
| 211 ; CHECK-NEXT:Error({{.*}}): store: Illegal alignment for <4 x float>. Expects: 4 |
| 212 |
| 213 ; Note: vectors of form <N x i1> can't be stored because no alignment |
| 214 ; value is valid. |
| 215 |
| 216 %av4_i1 = inttoptr i32 %p0 to <4 x i1>* |
| 217 store <4 x i1> undef, <4 x i1>* %av4_i1, align 1 |
| 218 |
| 219 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 4, 1> | store <4 x i1> %c10, <
4 x i1>* %p0, |
| 220 ; CHECK-NEXT: | | align 1; |
| 221 ; CHECK-NEXT:Error({{.*}}): store: Not allowed for type: <4 x i1> |
| 222 |
| 223 %av8_i1 = inttoptr i32 %p0 to <8 x i1>* |
| 224 store <8 x i1> undef, <8 x i1>* %av8_i1, align 1 |
| 225 |
| 226 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 12, 1> | store <8 x i1> %c2, <8
x i1>* %p0, |
| 227 ; CHECK-NEXT: | | align 1; |
| 228 ; CHECK-NEXT:Error({{.*}}): store: Not allowed for type: <8 x i1> |
| 229 |
| 230 %av16_i1 = inttoptr i32 %p0 to <16 x i1>* |
| 231 store <16 x i1> undef, <16 x i1>* %av16_i1, align 1 |
| 232 |
| 233 ; CHECK-NEXT: {{.*}}| 3: <24, 15, 13, 1> | store <16 x i1> %c1, |
| 234 ; CHECK-NEXT: | | <16 x i1>* %p0, al
ign 1; |
| 235 ; CHECK-NEXT:Error({{.*}}): store: Not allowed for type: <16 x i1> |
| 236 |
| 237 ret void |
| 238 |
| 239 ; CHECK-NEXT: {{.*}}| 3: <10> | ret void; |
| 240 |
| 241 } |
| 242 |
OLD | NEW |