blob: 5cb024d8b4e8c8f9fa4a55d3b685f0821dbf53c0 [file] [log] [blame]
Richard Sandifordf834ea12013-10-31 12:14:17 +00001; Test 16-bit conditional stores that are presented as selects. The volatile
2; tests require z10, which use a branch instead of a LOCR.
Richard Sandifordb86a8342013-06-27 09:27:40 +00003;
Richard Sandifordf834ea12013-10-31 12:14:17 +00004; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
Richard Sandifordb86a8342013-06-27 09:27:40 +00005
6declare void @foo(i16 *)
7
8; Test the simple case, with the loaded value first.
9define void @f1(i16 *%ptr, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000010; CHECK-LABEL: f1:
Richard Sandifordb86a8342013-06-27 09:27:40 +000011; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000012; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000013; CHECK-NOT: %r2
14; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000015; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000016 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +000017 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000018 %res = select i1 %cond, i16 %orig, i16 %alt
19 store i16 %res, i16 *%ptr
20 ret void
21}
22
23; ...and with the loaded value second
24define void @f2(i16 *%ptr, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000025; CHECK-LABEL: f2:
Richard Sandifordb86a8342013-06-27 09:27:40 +000026; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000027; CHECK: bher %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000028; CHECK-NOT: %r2
29; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000030; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000031 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +000032 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000033 %res = select i1 %cond, i16 %alt, i16 %orig
34 store i16 %res, i16 *%ptr
35 ret void
36}
37
38; Test cases where the value is explicitly sign-extended to 32 bits, with the
39; loaded value first.
40define void @f3(i16 *%ptr, i32 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000041; CHECK-LABEL: f3:
Richard Sandifordb86a8342013-06-27 09:27:40 +000042; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000043; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000044; CHECK-NOT: %r2
45; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000046; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000047 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +000048 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000049 %ext = sext i16 %orig to i32
50 %res = select i1 %cond, i32 %ext, i32 %alt
51 %trunc = trunc i32 %res to i16
52 store i16 %trunc, i16 *%ptr
53 ret void
54}
55
56; ...and with the loaded value second
57define void @f4(i16 *%ptr, i32 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000058; CHECK-LABEL: f4:
Richard Sandifordb86a8342013-06-27 09:27:40 +000059; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000060; CHECK: bher %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000061; CHECK-NOT: %r2
62; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000063; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000064 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +000065 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000066 %ext = sext i16 %orig to i32
67 %res = select i1 %cond, i32 %alt, i32 %ext
68 %trunc = trunc i32 %res to i16
69 store i16 %trunc, i16 *%ptr
70 ret void
71}
72
73; Test cases where the value is explicitly zero-extended to 32 bits, with the
74; loaded value first.
75define void @f5(i16 *%ptr, i32 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000076; CHECK-LABEL: f5:
Richard Sandifordb86a8342013-06-27 09:27:40 +000077; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000078; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000079; CHECK-NOT: %r2
80; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000081; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000082 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +000083 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000084 %ext = zext i16 %orig to i32
85 %res = select i1 %cond, i32 %ext, i32 %alt
86 %trunc = trunc i32 %res to i16
87 store i16 %trunc, i16 *%ptr
88 ret void
89}
90
91; ...and with the loaded value second
92define void @f6(i16 *%ptr, i32 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000093; CHECK-LABEL: f6:
Richard Sandifordb86a8342013-06-27 09:27:40 +000094; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000095; CHECK: bher %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000096; CHECK-NOT: %r2
97; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000098; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000099 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000100 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000101 %ext = zext i16 %orig to i32
102 %res = select i1 %cond, i32 %alt, i32 %ext
103 %trunc = trunc i32 %res to i16
104 store i16 %trunc, i16 *%ptr
105 ret void
106}
107
108; Test cases where the value is explicitly sign-extended to 64 bits, with the
109; loaded value first.
110define void @f7(i16 *%ptr, i64 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000111; CHECK-LABEL: f7:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000112; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000113; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000114; CHECK-NOT: %r2
115; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000116; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000117 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000118 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000119 %ext = sext i16 %orig to i64
120 %res = select i1 %cond, i64 %ext, i64 %alt
121 %trunc = trunc i64 %res to i16
122 store i16 %trunc, i16 *%ptr
123 ret void
124}
125
126; ...and with the loaded value second
127define void @f8(i16 *%ptr, i64 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000128; CHECK-LABEL: f8:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000129; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000130; CHECK: bher %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000131; CHECK-NOT: %r2
132; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000133; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000134 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000135 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000136 %ext = sext i16 %orig to i64
137 %res = select i1 %cond, i64 %alt, i64 %ext
138 %trunc = trunc i64 %res to i16
139 store i16 %trunc, i16 *%ptr
140 ret void
141}
142
143; Test cases where the value is explicitly zero-extended to 64 bits, with the
144; loaded value first.
145define void @f9(i16 *%ptr, i64 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000146; CHECK-LABEL: f9:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000147; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000148; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000149; CHECK-NOT: %r2
150; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000151; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000152 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000153 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000154 %ext = zext i16 %orig to i64
155 %res = select i1 %cond, i64 %ext, i64 %alt
156 %trunc = trunc i64 %res to i16
157 store i16 %trunc, i16 *%ptr
158 ret void
159}
160
161; ...and with the loaded value second
162define void @f10(i16 *%ptr, i64 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000163; CHECK-LABEL: f10:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000164; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000165; CHECK: bher %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000166; CHECK-NOT: %r2
167; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000168; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000169 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000170 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000171 %ext = zext i16 %orig to i64
172 %res = select i1 %cond, i64 %alt, i64 %ext
173 %trunc = trunc i64 %res to i16
174 store i16 %trunc, i16 *%ptr
175 ret void
176}
177
178; Check the high end of the aligned STH range.
179define void @f11(i16 *%base, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000180; CHECK-LABEL: f11:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000181; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000182; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000183; CHECK-NOT: %r2
184; CHECK: sth %r3, 4094(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000185; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000186 %ptr = getelementptr i16, i16 *%base, i64 2047
Richard Sandiford93183ee2013-09-18 09:56:40 +0000187 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000188 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000189 %res = select i1 %cond, i16 %orig, i16 %alt
190 store i16 %res, i16 *%ptr
191 ret void
192}
193
194; Check the next halfword up, which should use STHY instead of STH.
195define void @f12(i16 *%base, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000196; CHECK-LABEL: f12:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000197; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000198; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000199; CHECK-NOT: %r2
200; CHECK: sthy %r3, 4096(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000201; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000202 %ptr = getelementptr i16, i16 *%base, i64 2048
Richard Sandiford93183ee2013-09-18 09:56:40 +0000203 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000204 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000205 %res = select i1 %cond, i16 %orig, i16 %alt
206 store i16 %res, i16 *%ptr
207 ret void
208}
209
210; Check the high end of the aligned STHY range.
211define void @f13(i16 *%base, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000212; CHECK-LABEL: f13:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000213; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000214; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000215; CHECK-NOT: %r2
216; CHECK: sthy %r3, 524286(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000217; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000218 %ptr = getelementptr i16, i16 *%base, i64 262143
Richard Sandiford93183ee2013-09-18 09:56:40 +0000219 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000220 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000221 %res = select i1 %cond, i16 %orig, i16 %alt
222 store i16 %res, i16 *%ptr
223 ret void
224}
225
226; Check the next halfword up, which needs separate address logic.
227; Other sequences besides this one would be OK.
228define void @f14(i16 *%base, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000229; CHECK-LABEL: f14:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000230; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000231; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000232; CHECK-NOT: %r2
233; CHECK: agfi %r2, 524288
234; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000235; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000236 %ptr = getelementptr i16, i16 *%base, i64 262144
Richard Sandiford93183ee2013-09-18 09:56:40 +0000237 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000238 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000239 %res = select i1 %cond, i16 %orig, i16 %alt
240 store i16 %res, i16 *%ptr
241 ret void
242}
243
244; Check the low end of the STHY range.
245define void @f15(i16 *%base, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000246; CHECK-LABEL: f15:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000247; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000248; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000249; CHECK-NOT: %r2
250; CHECK: sthy %r3, -524288(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000251; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000252 %ptr = getelementptr i16, i16 *%base, i64 -262144
Richard Sandiford93183ee2013-09-18 09:56:40 +0000253 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000254 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000255 %res = select i1 %cond, i16 %orig, i16 %alt
256 store i16 %res, i16 *%ptr
257 ret void
258}
259
260; Check the next halfword down, which needs separate address logic.
261; Other sequences besides this one would be OK.
262define void @f16(i16 *%base, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000263; CHECK-LABEL: f16:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000264; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000265; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000266; CHECK-NOT: %r2
267; CHECK: agfi %r2, -524290
268; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000269; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000270 %ptr = getelementptr i16, i16 *%base, i64 -262145
Richard Sandiford93183ee2013-09-18 09:56:40 +0000271 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000272 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000273 %res = select i1 %cond, i16 %orig, i16 %alt
274 store i16 %res, i16 *%ptr
275 ret void
276}
277
278; Check that STHY allows an index.
279define void @f17(i64 %base, i64 %index, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000280; CHECK-LABEL: f17:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000281; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000282; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000283; CHECK-NOT: %r2
284; CHECK: sthy %r4, 4096(%r3,%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000285; CHECK: br %r14
286 %add1 = add i64 %base, %index
287 %add2 = add i64 %add1, 4096
288 %ptr = inttoptr i64 %add2 to i16 *
Richard Sandiford93183ee2013-09-18 09:56:40 +0000289 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000290 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000291 %res = select i1 %cond, i16 %orig, i16 %alt
292 store i16 %res, i16 *%ptr
293 ret void
294}
295
296; Check that volatile loads are not matched.
297define void @f18(i16 *%ptr, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000298; CHECK-LABEL: f18:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000299; CHECK: lh {{%r[0-5]}}, 0(%r2)
300; CHECK: {{jl|jnl}} [[LABEL:[^ ]*]]
301; CHECK: [[LABEL]]:
302; CHECK: sth {{%r[0-5]}}, 0(%r2)
303; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000304 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000305 %orig = load volatile i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000306 %res = select i1 %cond, i16 %orig, i16 %alt
307 store i16 %res, i16 *%ptr
308 ret void
309}
310
311; ...likewise stores. In this case we should have a conditional load into %r3.
312define void @f19(i16 *%ptr, i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000313; CHECK-LABEL: f19:
Richard Sandiford3d768e32013-07-31 12:30:20 +0000314; CHECK: jhe [[LABEL:[^ ]*]]
Richard Sandifordb86a8342013-06-27 09:27:40 +0000315; CHECK: lh %r3, 0(%r2)
316; CHECK: [[LABEL]]:
317; CHECK: sth %r3, 0(%r2)
318; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000319 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000320 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000321 %res = select i1 %cond, i16 %orig, i16 %alt
322 store volatile i16 %res, i16 *%ptr
323 ret void
324}
325
326; Check that atomic loads are not matched. The transformation is OK for
327; the "unordered" case tested here, but since we don't try to handle atomic
328; operations at all in this context, it seems better to assert that than
329; to restrict the test to a stronger ordering.
330define void @f20(i16 *%ptr, i16 %alt, i32 %limit) {
331; FIXME: should use a normal load instead of CS.
Stephen Lind24ab202013-07-14 06:24:09 +0000332; CHECK-LABEL: f20:
Richard Sandifordbef3d7a2013-12-10 10:49:34 +0000333; CHECK: lh {{%r[0-9]+}}, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000334; CHECK: {{jl|jnl}} [[LABEL:[^ ]*]]
335; CHECK: [[LABEL]]:
Richard Sandifordbef3d7a2013-12-10 10:49:34 +0000336; CHECK: sth {{%r[0-9]+}}, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000337; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000338 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000339 %orig = load atomic i16 , i16 *%ptr unordered, align 2
Richard Sandifordb86a8342013-06-27 09:27:40 +0000340 %res = select i1 %cond, i16 %orig, i16 %alt
341 store i16 %res, i16 *%ptr
342 ret void
343}
344
345; ...likewise stores.
346define void @f21(i16 *%ptr, i16 %alt, i32 %limit) {
347; FIXME: should use a normal store instead of CS.
Stephen Lind24ab202013-07-14 06:24:09 +0000348; CHECK-LABEL: f21:
Richard Sandiford3d768e32013-07-31 12:30:20 +0000349; CHECK: jhe [[LABEL:[^ ]*]]
Richard Sandifordb86a8342013-06-27 09:27:40 +0000350; CHECK: lh %r3, 0(%r2)
351; CHECK: [[LABEL]]:
Richard Sandifordbef3d7a2013-12-10 10:49:34 +0000352; CHECK: sth %r3, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000353; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000354 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000355 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000356 %res = select i1 %cond, i16 %orig, i16 %alt
357 store atomic i16 %res, i16 *%ptr unordered, align 2
358 ret void
359}
360
361; Try a frame index base.
362define void @f22(i16 %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000363; CHECK-LABEL: f22:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000364; CHECK: brasl %r14, foo@PLT
365; CHECK-NOT: %r15
366; CHECK: jl [[LABEL:[^ ]*]]
367; CHECK-NOT: %r15
368; CHECK: sth {{%r[0-9]+}}, {{[0-9]+}}(%r15)
369; CHECK: [[LABEL]]:
370; CHECK: brasl %r14, foo@PLT
371; CHECK: br %r14
372 %ptr = alloca i16
373 call void @foo(i16 *%ptr)
Richard Sandiford93183ee2013-09-18 09:56:40 +0000374 %cond = icmp ult i32 %limit, 420
David Blaikiea79ac142015-02-27 21:17:42 +0000375 %orig = load i16 , i16 *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000376 %res = select i1 %cond, i16 %orig, i16 %alt
377 store i16 %res, i16 *%ptr
378 call void @foo(i16 *%ptr)
379 ret void
380}