XFAIL test/CodeGen/Generic/MachineBranchProb.ll on Hexagon (PR23377)
[oota-llvm.git] / test / CodeGen / Mips / Fast-ISel / logopm.ll
1 ; RUN: llc -march=mipsel -relocation-model=pic -O0 -fast-isel -mips-fast-isel -fast-isel-abort=1 -mcpu=mips32r2 < %s | FileCheck %s
2 ; RUN: llc -march=mipsel -relocation-model=pic -O0 -fast-isel -mips-fast-isel -fast-isel-abort=1 -mcpu=mips32 < %s | FileCheck %s
3
4 @ub1 = common global i8 0, align 1
5 @ub2 = common global i8 0, align 1
6 @ub3 = common global i8 0, align 1
7 @uc1 = common global i8 0, align 1
8 @uc2 = common global i8 0, align 1
9 @uc3 = common global i8 0, align 1
10 @us1 = common global i16 0, align 2
11 @us2 = common global i16 0, align 2
12 @us3 = common global i16 0, align 2
13 @ub = common global i8 0, align 1
14 @uc = common global i8 0, align 1
15 @us = common global i16 0, align 2
16 @.str = private unnamed_addr constant [4 x i8] c"%i\0A\00", align 1
17 @ui = common global i32 0, align 4
18 @ui1 = common global i32 0, align 4
19 @ui2 = common global i32 0, align 4
20 @ui3 = common global i32 0, align 4
21
22 ; Function Attrs: noinline nounwind
23 define void @andUb() #0 {
24 entry:
25   %0 = load i8, i8* @ub1, align 1
26   %1 = load i8, i8* @ub2, align 1
27   %conv0 = trunc i8 %0 to i1
28   %conv1 = trunc i8 %1 to i1
29   %and0 = and i1 %conv1, %conv0
30   %conv3 = zext i1 %and0 to i8
31   store i8 %conv3, i8* @ub, align 1, !tbaa !2
32 ; CHECK-LABEL:  .ent    andUb
33 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
34 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
35 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
36 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
37 ; CHECK-DAG:    lw      $[[UB2_ADDR:[0-9]+]], %got(ub2)($[[REG_GP]])
38 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
39 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
40 ; CHECK-DAG:    lbu     $[[UB2:[0-9]+]], 0($[[UB2_ADDR]])
41 ; CHECK-DAG:    and     $[[RES1:[0-9]+]], $[[UB2]], $[[UB1]]
42 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
43 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
44   ret void
45 }
46
47 ; Function Attrs: noinline nounwind
48 define void @andUb0() #0 {
49 entry:
50   %0 = load i8, i8* @ub1, align 1, !tbaa !2
51   %conv = trunc i8 %0 to i1
52   %and = and i1 %conv, 0
53   %conv1 = zext i1 %and to i8
54   store i8 %conv1, i8* @ub, align 1, !tbaa !2
55 ; CHECK-LABEL:  .ent    andUb0
56 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
57 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
58 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
59 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
60 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
61 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
62 ; CHECK-DAG:    and     $[[RES1:[0-9]+]], $[[UB1]], $zero
63 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
64 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
65 ; CHECK:        .end    andUb0
66   ret void
67 }
68
69 ; Function Attrs: noinline nounwind
70 define void @andUb1() #0 {
71 ; clang uses i8 constants for booleans, so we test with an i8 1.
72 entry:
73   %x = load i8, i8* @ub1, align 1, !tbaa !2
74   %and = and i8 %x, 1
75   %conv = trunc i8 %and to i1
76   %conv1 = zext i1 %conv to i8
77   store i8 %conv1, i8* @ub, align 1, !tbaa !2
78 ; CHECK-LABEL:  .ent    andUb1
79 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
80 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
81 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
82 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
83 ; CHECK-DAG:    addiu   $[[CONST:[0-9]+]], $zero, 1
84 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
85 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
86 ; CHECK-DAG:    and     $[[RES1:[0-9]+]], $[[UB1]], $[[CONST]]
87 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
88 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
89 ; CHECK:        .end    andUb1
90   ret void
91 }
92
93 ; Function Attrs: noinline nounwind
94 define void @orUb() #0 {
95 entry:
96   %0 = load i8, i8* @ub1, align 1
97   %1 = load i8, i8* @ub2, align 1
98   %conv0 = trunc i8 %0 to i1
99   %conv1 = trunc i8 %1 to i1
100   %or0 = or i1 %conv1, %conv0
101   %conv3 = zext i1 %or0 to i8
102   store i8 %conv3, i8* @ub, align 1, !tbaa !2
103 ; CHECK-LABEL:  .ent    orUb
104 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
105 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
106 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
107 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
108 ; CHECK-DAG:    lw      $[[UB2_ADDR:[0-9]+]], %got(ub2)($[[REG_GP]])
109 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
110 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
111 ; CHECK-DAG:    lbu     $[[UB2:[0-9]+]], 0($[[UB2_ADDR]])
112 ; CHECK-DAG:    or      $[[RES1:[0-9]+]], $[[UB2]], $[[UB1]]
113 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
114 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
115   ret void
116 }
117
118 ; Function Attrs: noinline nounwind
119 define void @orUb0() #0 {
120 entry:
121   %0 = load i8, i8* @ub1, align 1, !tbaa !2
122   %conv = trunc i8 %0 to i1
123   %or = or i1 %conv, 0
124   %conv1 = zext i1 %or to i8
125   store i8 %conv1, i8* @ub, align 1, !tbaa !2
126 ; CHECK-LABEL:  .ent    orUb0
127 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
128 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
129 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
130 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
131 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
132 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
133 ; CHECK:        andi    $[[RES:[0-9]+]], $[[UB1]], 1
134 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
135 ; CHECK:        .end    orUb0
136   ret void
137 }
138
139 ; Function Attrs: noinline nounwind
140 define void @orUb1() #0 {
141 entry:
142   %x = load i8, i8* @ub1, align 1, !tbaa !2
143   %or = or i8 %x, 1
144   %conv = trunc i8 %or to i1
145   %conv1 = zext i1 %conv to i8
146   store i8 %conv1, i8* @ub, align 1, !tbaa !2
147 ; CHECK-LABEL:  .ent    orUb1
148 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
149 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
150 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
151 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
152 ; CHECK-DAG:    addiu   $[[CONST:[0-9]+]], $zero, 1
153 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
154 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
155 ; CHECK-DAG:    or      $[[RES1:[0-9]+]], $[[UB1]], $[[CONST]]
156 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
157 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
158 ; CHECK:        .end    orUb1
159   ret void
160 }
161
162 ; Function Attrs: noinline nounwind
163 define void @xorUb() #0 {
164 entry:
165   %0 = load i8, i8* @ub1, align 1
166   %1 = load i8, i8* @ub2, align 1
167   %conv0 = trunc i8 %0 to i1
168   %conv1 = trunc i8 %1 to i1
169   %xor0 = xor i1 %conv1, %conv0
170   %conv3 = zext i1 %xor0 to i8
171   store i8 %conv3, i8* @ub, align 1, !tbaa !2
172 ; CHECK-LABEL: .ent    xorUb
173 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
174 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
175 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
176 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
177 ; CHECK-DAG:    lw      $[[UB2_ADDR:[0-9]+]], %got(ub2)($[[REG_GP]])
178 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
179 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
180 ; CHECK-DAG:    lbu     $[[UB2:[0-9]+]], 0($[[UB2_ADDR]])
181 ; CHECK-DAG:    xor     $[[RES1:[0-9]+]], $[[UB2]], $[[UB1]]
182 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
183 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
184   ret void
185 }
186
187 ; Function Attrs: noinline nounwind
188 define void @xorUb0() #0 {
189 entry:
190   %0 = load i8, i8* @ub1, align 1, !tbaa !2
191   %conv = trunc i8 %0 to i1
192   %xor = xor i1 %conv, 0
193   %conv1 = zext i1 %xor to i8
194   store i8 %conv1, i8* @ub, align 1, !tbaa !2
195 ; CHECK-LABEL:  .ent    xorUb0
196 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
197 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
198 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
199 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
200 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
201 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
202 ; CHECK-DAG:    xor     $[[RES1:[0-9]+]], $[[UB1]], $zero
203 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
204 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
205 ; CHECK:        .end    xorUb0
206   ret void
207 }
208
209 ; Function Attrs: noinline nounwind
210 define void @xorUb1() #0 {
211 entry:
212   %x = load i8, i8* @ub1, align 1, !tbaa !2
213   %xor = xor i8 1, %x
214   %conv = trunc i8 %xor to i1
215   %conv1 = zext i1 %conv to i8
216   store i8 %conv1, i8* @ub, align 1, !tbaa !2
217 ; CHECK-LABEL:  .ent    xorUb1
218 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
219 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
220 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
221 ; CHECK-DAG:    lw      $[[UB_ADDR:[0-9]+]], %got(ub)($[[REG_GP]])
222 ; CHECK-DAG:    addiu   $[[CONST:[0-9]+]], $zero, 1
223 ; CHECK-DAG:    lw      $[[UB1_ADDR:[0-9]+]], %got(ub1)($[[REG_GP]])
224 ; CHECK-DAG:    lbu     $[[UB1:[0-9]+]], 0($[[UB1_ADDR]])
225 ; CHECK-DAG:    xor     $[[RES1:[0-9]+]], $[[UB1]], $[[CONST]]
226 ; CHECK:        andi    $[[RES:[0-9]+]], $[[RES1]], 1
227 ; CHECK:        sb      $[[RES]], 0($[[UB_ADDR]])
228 ; CHECK:        .end    xorUb1
229   ret void
230 }
231
232 ; Function Attrs: noinline nounwind
233 define void @andUc() #0 {
234 entry:
235   %0 = load i8, i8* @uc1, align 1, !tbaa !2
236   %1 = load i8, i8* @uc2, align 1, !tbaa !2
237   %and3 = and i8 %1, %0
238   store i8 %and3, i8* @uc, align 1, !tbaa !2
239 ; CHECK-LABEL:  .ent    andUc
240 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
241 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
242 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
243 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
244 ; CHECK-DAG:    lw      $[[UC2_ADDR:[0-9]+]], %got(uc2)($[[REG_GP]])
245 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
246 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
247 ; CHECK-DAG:    lbu     $[[UC2:[0-9]+]], 0($[[UC2_ADDR]])
248 ; CHECK-DAG:    and     $[[RES:[0-9]+]], $[[UC2]], $[[UB1]]
249 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
250   ret void
251 }
252
253 ; Function Attrs: noinline nounwind
254 define void @andUc0() #0 {
255 entry:
256   %0 = load i8, i8* @uc1, align 1, !tbaa !2
257   %and = and i8 %0, 67
258   store i8 %and, i8* @uc, align 1, !tbaa !2
259 ; CHECK-LABEL:  .ent    andUc0
260 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
261 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
262 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
263 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
264 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
265 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
266 ; CHECK-DAG:    addiu   $[[CONST_67:[0-9]+]], $zero, 67
267 ; CHECK-DAG:    and     $[[RES:[0-9]+]], $[[UC1]], $[[CONST_67]]
268 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
269 ; CHECK:        .end    andUc0
270   ret void
271 }
272
273 ; Function Attrs: noinline nounwind
274 define void @andUc1() #0 {
275 entry:
276   %0 = load i8, i8* @uc1, align 1, !tbaa !2
277   %and = and i8 %0, 167
278   store i8 %and, i8* @uc, align 1, !tbaa !2
279 ; CHECK-LABEL:  .ent    andUc1
280 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
281 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
282 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
283 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
284 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
285 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
286 ; CHECK-DAG:    addiu   $[[CONST_Neg89:[0-9]+]], $zero, -89
287 ; CHECK-DAG:    and     $[[RES:[0-9]+]], $[[UC1]], $[[CONST_Neg89]]
288 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
289 ; CHECK:        .end    andUc1
290   ret void
291 }
292
293 ; Function Attrs: noinline nounwind
294 define void @orUc() #0 {
295 entry:
296   %0 = load i8, i8* @uc1, align 1, !tbaa !2
297   %1 = load i8, i8* @uc2, align 1, !tbaa !2
298   %or3 = or i8 %1, %0
299   store i8 %or3, i8* @uc, align 1, !tbaa !2
300 ; CHECK-LABEL:  .ent    orUc
301 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
302 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
303 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
304 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
305 ; CHECK-DAG:    lw      $[[UC2_ADDR:[0-9]+]], %got(uc2)($[[REG_GP]])
306 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
307 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
308 ; CHECK-DAG:    lbu     $[[UC2:[0-9]+]], 0($[[UC2_ADDR]])
309 ; CHECK-DAG:    or      $[[RES:[0-9]+]], $[[UC2]], $[[UC1]]
310 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
311 ; CHECK:        .end    orUc
312   ret void
313 }
314
315 ; Function Attrs: noinline nounwind
316 define void @orUc0() #0 {
317 entry:
318   %0 = load i8, i8* @uc1, align 1, !tbaa !2
319    %or = or i8 %0, 69
320   store i8 %or, i8* @uc, align 1, !tbaa !2
321 ; CHECK-LABEL:  .ent    orUc0
322 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
323 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
324 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
325 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
326 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
327 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
328 ; CHECK-DAG:    addiu   $[[CONST_69:[0-9]+]], $zero, 69
329 ; CHECK-DAG:    or      $[[RES:[0-9]+]], $[[UC1]], $[[CONST_69]]
330 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
331 ; CHECK:        .end    orUc0
332   ret void
333 }
334
335 ; Function Attrs: noinline nounwind
336 define void @orUc1() #0 {
337 entry:
338   %0 = load i8, i8* @uc1, align 1, !tbaa !2
339   %or = or i8 %0, 238
340   store i8 %or, i8* @uc, align 1, !tbaa !2
341 ; CHECK-LABEL:  .ent    orUc1
342 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
343 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
344 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
345 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
346 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
347 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
348 ; CHECK-DAG:    addiu   $[[CONST_neg18:[0-9]+]], $zero, -18
349 ; CHECK-DAG:    or      $[[RES:[0-9]+]], $[[UC1]], $[[CONST_neg18]]
350 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
351 ; CHECK:        .end    orUc1
352   ret void
353 }
354
355 ; Function Attrs: noinline nounwind
356 define void @xorUc() #0 {
357 entry:
358   %0 = load i8, i8* @uc1, align 1, !tbaa !2
359   %1 = load i8, i8* @uc2, align 1, !tbaa !2
360   %xor3 = xor i8 %1, %0
361   store i8 %xor3, i8* @uc, align 1, !tbaa !2
362 ; CHECK-LABEL: .ent    xorUc
363 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
364 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
365 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
366 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
367 ; CHECK-DAG:    lw      $[[UC2_ADDR:[0-9]+]], %got(uc2)($[[REG_GP]])
368 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
369 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
370 ; CHECK-DAG:    lbu     $[[UC2:[0-9]+]], 0($[[UC2_ADDR]])
371 ; CHECK-DAG:    xor     $[[RES:[0-9]+]], $[[UC2]], $[[UC1]]
372 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
373 ; CHECK:        .end    xorUc
374   ret void
375 }
376
377 ; Function Attrs: noinline nounwind
378 define void @xorUc0() #0 {
379 entry:
380   %0 = load i8, i8* @uc1, align 1, !tbaa !2
381   %xor = xor i8 %0, 23
382   store i8 %xor, i8* @uc, align 1, !tbaa !2
383 ; CHECK-LABEL:  .ent    xorUc0
384 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
385 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
386 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
387 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
388 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
389 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
390 ; CHECK-DAG:    addiu   $[[CONST_23:[0-9]+]], $zero, 23
391 ; CHECK-DAG:    xor     $[[RES:[0-9]+]], $[[UC1]], $[[CONST_23]]
392 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
393 ; CHECK:        .end    xorUc0
394   ret void
395 }
396
397 ; Function Attrs: noinline nounwind
398 define void @xorUc1() #0 {
399 entry:
400   %0 = load i8, i8* @uc1, align 1, !tbaa !2
401   %xor = xor i8 %0, 120
402   store i8 %xor, i8* @uc, align 1, !tbaa !2
403 ; CHECK-LABEL:  .ent    xorUc1
404 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
405 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
406 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
407 ; CHECK-DAG:    lw      $[[UC_ADDR:[0-9]+]], %got(uc)($[[REG_GP]])
408 ; CHECK-DAG:    lw      $[[UC1_ADDR:[0-9]+]], %got(uc1)($[[REG_GP]])
409 ; CHECK-DAG:    lbu     $[[UC1:[0-9]+]], 0($[[UC1_ADDR]])
410 ; CHECK-DAG:    addiu   $[[CONST_120:[0-9]+]], $zero, 120
411 ; CHECK-DAG:    xor     $[[RES:[0-9]+]], $[[UC1]], $[[CONST_120]]
412 ; CHECK:        sb      $[[RES]], 0($[[UC_ADDR]])
413 ; CHECK:        .end    xorUc1
414   ret void
415 }
416
417 ; Function Attrs: noinline nounwind
418 define void @andUs() #0 {
419 entry:
420   %0 = load i16, i16* @us1, align 2, !tbaa !5
421   %1 = load i16, i16* @us2, align 2, !tbaa !5
422   %and3 = and i16 %1, %0
423   store i16 %and3, i16* @us, align 2, !tbaa !5
424 ; CHECK-LABEL:  .ent    andUs
425 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
426 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
427 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
428 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
429 ; CHECK-DAG:    lw      $[[US2_ADDR:[0-9]+]], %got(us2)($[[REG_GP]])
430 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
431 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
432 ; CHECK-DAG:    lhu     $[[US2:[0-9]+]], 0($[[US2_ADDR]])
433 ; CHECK-DAG:    and     $[[RES:[0-9]+]], $[[US2]], $[[UB1]]
434 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
435 ; CHECK:        .end andUs
436   ret void
437 }
438
439 ; Function Attrs: noinline nounwind
440 define void @andUs0() #0 {
441 entry:
442   %0 = load i16, i16* @us1, align 2, !tbaa !5
443   %and = and i16 %0, 4660
444   store i16 %and, i16* @us, align 2, !tbaa !5
445 ; CHECK-LABEL: .ent    andUs0
446 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
447 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
448 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
449 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
450 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
451 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
452 ; CHECK-DAG:    addiu   $[[CONST_4660:[0-9]+]], $zero, 4660
453 ; CHECK-DAG:    and     $[[RES:[0-9]+]], $[[US1]], $[[CONST_4660]]
454 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
455 ; CHECK:        .end    andUs0
456   ret void
457 }
458
459 ; Function Attrs: noinline nounwind
460 define void @andUs1() #0 {
461 entry:
462   %0 = load i16, i16* @us1, align 2, !tbaa !5
463   %and = and i16 %0, 61351
464   store i16 %and, i16* @us, align 2, !tbaa !5
465 ; CHECK-LABEL:  .ent    andUs1
466 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
467 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
468 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
469 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
470 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
471 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
472 ; CHECK-DAG:    addiu   $[[CONST_Neg4185:[0-9]+]], $zero, -4185
473 ; CHECK-DAG:    and     $[[RES:[0-9]+]], $[[US1]], $[[CONST_Neg4185]]
474 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
475 ; CHECK:        .end    andUs1
476   ret void
477 }
478
479 ; Function Attrs: noinline nounwind
480 define void @orUs() #0 {
481 entry:
482   %0 = load i16, i16* @us1, align 2, !tbaa !5
483   %1 = load i16, i16* @us2, align 2, !tbaa !5
484   %or3 = or i16 %1, %0
485   store i16 %or3, i16* @us, align 2, !tbaa !5
486 ; CHECK-LABEL:  .ent    orUs
487 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
488 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
489 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
490 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
491 ; CHECK-DAG:    lw      $[[US2_ADDR:[0-9]+]], %got(us2)($[[REG_GP]])
492 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
493 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
494 ; CHECK-DAG:    lhu     $[[US2:[0-9]+]], 0($[[US2_ADDR]])
495 ; CHECK-DAG:    or      $[[RES:[0-9]+]], $[[US2]], $[[US1]]
496 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
497 ; CHECK:        .end    orUs
498   ret void
499 }
500
501 ; Function Attrs: noinline nounwind
502 define void @orUs0() #0 {
503 entry:
504   %0 = load i16, i16* @us1, align 2, !tbaa !5
505   %or = or i16 %0, 17666
506   store i16 %or, i16* @us, align 2, !tbaa !5
507   ret void
508 }
509
510 ; Function Attrs: noinline nounwind
511 define void @orUs1() #0 {
512 entry:
513   %0 = load i16, i16* @us1, align 2, !tbaa !5
514   %or = or i16 %0, 60945
515   store i16 %or, i16* @us, align 2, !tbaa !5
516 ; CHECK-LABEL:  .ent    orUs1
517 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
518 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
519 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
520 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
521 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
522 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
523 ; CHECK-DAG:    addiu   $[[CONST_neg4591:[0-9]+]], $zero, -4591
524 ; CHECK-DAG:    or      $[[RES:[0-9]+]], $[[US1]], $[[CONST_neg4591]]
525 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
526 ; CHECK:        .end    orUs1
527   ret void
528 }
529
530 ; Function Attrs: noinline nounwind
531 define void @xorUs() #0 {
532 entry:
533   %0 = load i16, i16* @us1, align 2, !tbaa !5
534   %1 = load i16, i16* @us2, align 2, !tbaa !5
535   %xor3 = xor i16 %1, %0
536   store i16 %xor3, i16* @us, align 2, !tbaa !5
537 ; CHECK-LABEL:  .ent    xorUs
538 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
539 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
540 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
541 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
542 ; CHECK-DAG:    lw      $[[US2_ADDR:[0-9]+]], %got(us2)($[[REG_GP]])
543 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
544 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
545 ; CHECK-DAG:    lhu     $[[US2:[0-9]+]], 0($[[US2_ADDR]])
546 ; CHECK-DAG:    xor     $[[RES:[0-9]+]], $[[US2]], $[[US1]]
547 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
548 ; CHECK:        .end    xorUs
549   ret void
550 }
551
552 ; Function Attrs: noinline nounwind
553 define void @xorUs0() #0 {
554 entry:
555   %0 = load i16, i16* @us1, align 2, !tbaa !5
556   %xor = xor i16 %0, 6062
557   store i16 %xor, i16* @us, align 2, !tbaa !5
558 ; CHECK-LABEL:  .ent    xorUs0
559 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
560 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
561 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
562 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
563 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
564 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
565 ; CHECK-DAG:    addiu   $[[CONST_6062:[0-9]+]], $zero, 6062
566 ; CHECK-DAG:    xor     $[[RES:[0-9]+]], $[[US1]], $[[CONST_6062]]
567 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
568 ; CHECK:        .end    xorUs0
569
570   ret void
571 }
572
573 ; Function Attrs: noinline nounwind
574 define void @xorUs1() #0 {
575 entry:
576   %0 = load i16, i16* @us1, align 2, !tbaa !5
577   %xor = xor i16 %0, 60024
578   store i16 %xor, i16* @us, align 2, !tbaa !5
579 ; CHECK-LABEL:  .ent    xorUs1
580 ; CHECK:        lui     $[[REG_GPa:[0-9]+]], %hi(_gp_disp)
581 ; CHECK:        addiu   $[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
582 ; CHECK:        addu    $[[REG_GP:[0-9]+]], $[[REG_GPb]], $25
583 ; CHECK-DAG:    lw      $[[US_ADDR:[0-9]+]], %got(us)($[[REG_GP]])
584 ; CHECK-DAG:    lw      $[[US1_ADDR:[0-9]+]], %got(us1)($[[REG_GP]])
585 ; CHECK-DAG:    lhu     $[[US1:[0-9]+]], 0($[[US1_ADDR]])
586 ; CHECK-DAG:    addiu   $[[CONST_Neg5512:[0-9]+]], $zero, -5512
587 ; CHECK-DAG:    xor     $[[RES:[0-9]+]], $[[US1]], $[[CONST_Neg5512]]
588 ; CHECK:        sh      $[[RES]], 0($[[US_ADDR]])
589 ; CHECK:        .end    xorUs1
590   ret void
591 }
592
593 attributes #0 = { noinline nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
594 attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
595 attributes #2 = { nounwind }
596
597 !llvm.module.flags = !{!0}
598 !llvm.ident = !{!1}
599
600 !0 = !{i32 1, !"PIC Level", i32 2}
601 !1 = !{!"clang version 3.7.0 (trunk)"}
602 !2 = !{!3, !3, i64 0}
603 !3 = !{!"omnipotent char", !4, i64 0}
604 !4 = !{!"Simple C/C++ TBAA"}
605 !5 = !{!6, !6, i64 0}
606 !6 = !{!"short", !3, i64 0}