blob: 9bf4e00bedf025f5e23e3a17acb52e4832c1f9d8 [file] [log] [blame]
Richard Sandifordb86a8342013-06-27 09:27:40 +00001; Test f32 conditional stores that are presented as selects.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5declare void @foo(float *)
6
7; Test with the loaded value first.
8define void @f1(float *%ptr, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +00009; CHECK-LABEL: f1:
Richard Sandifordb86a8342013-06-27 09:27:40 +000010; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000011; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000012; CHECK-NOT: %r2
13; CHECK: ste %f0, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000014; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000015 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000016 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000017 %res = select i1 %cond, float %orig, float %alt
18 store float %res, float *%ptr
19 ret void
20}
21
22; ...and with the loaded value second
23define void @f2(float *%ptr, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000024; CHECK-LABEL: f2:
Richard Sandifordb86a8342013-06-27 09:27:40 +000025; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000026; CHECK: bher %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000027; CHECK-NOT: %r2
28; CHECK: ste %f0, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000029; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +000030 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000031 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000032 %res = select i1 %cond, float %alt, float %orig
33 store float %res, float *%ptr
34 ret void
35}
36
37; Check the high end of the aligned STE range.
38define void @f3(float *%base, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000039; CHECK-LABEL: f3:
Richard Sandifordb86a8342013-06-27 09:27:40 +000040; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000041; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000042; CHECK-NOT: %r2
43; CHECK: ste %f0, 4092(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000044; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000045 %ptr = getelementptr float, float *%base, i64 1023
Richard Sandiford93183ee2013-09-18 09:56:40 +000046 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000047 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000048 %res = select i1 %cond, float %orig, float %alt
49 store float %res, float *%ptr
50 ret void
51}
52
53; Check the next word up, which should use STEY instead of STE.
54define void @f4(float *%base, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000055; CHECK-LABEL: f4:
Richard Sandifordb86a8342013-06-27 09:27:40 +000056; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000057; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000058; CHECK-NOT: %r2
59; CHECK: stey %f0, 4096(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000060; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000061 %ptr = getelementptr float, float *%base, i64 1024
Richard Sandiford93183ee2013-09-18 09:56:40 +000062 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000063 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000064 %res = select i1 %cond, float %orig, float %alt
65 store float %res, float *%ptr
66 ret void
67}
68
69; Check the high end of the aligned STEY range.
70define void @f5(float *%base, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000071; CHECK-LABEL: f5:
Richard Sandifordb86a8342013-06-27 09:27:40 +000072; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000073; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000074; CHECK-NOT: %r2
75; CHECK: stey %f0, 524284(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000076; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000077 %ptr = getelementptr float, float *%base, i64 131071
Richard Sandiford93183ee2013-09-18 09:56:40 +000078 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000079 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000080 %res = select i1 %cond, float %orig, float %alt
81 store float %res, float *%ptr
82 ret void
83}
84
85; Check the next word up, which needs separate address logic.
86; Other sequences besides this one would be OK.
87define void @f6(float *%base, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +000088; CHECK-LABEL: f6:
Richard Sandifordb86a8342013-06-27 09:27:40 +000089; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000090; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +000091; CHECK-NOT: %r2
92; CHECK: agfi %r2, 524288
93; CHECK: ste %f0, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +000094; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000095 %ptr = getelementptr float, float *%base, i64 131072
Richard Sandiford93183ee2013-09-18 09:56:40 +000096 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000097 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +000098 %res = select i1 %cond, float %orig, float %alt
99 store float %res, float *%ptr
100 ret void
101}
102
103; Check the low end of the STEY range.
104define void @f7(float *%base, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000105; CHECK-LABEL: f7:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000106; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000107; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000108; CHECK-NOT: %r2
109; CHECK: stey %f0, -524288(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000110; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000111 %ptr = getelementptr float, float *%base, i64 -131072
Richard Sandiford93183ee2013-09-18 09:56:40 +0000112 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000113 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000114 %res = select i1 %cond, float %orig, float %alt
115 store float %res, float *%ptr
116 ret void
117}
118
119; Check the next word down, which needs separate address logic.
120; Other sequences besides this one would be OK.
121define void @f8(float *%base, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000122; CHECK-LABEL: f8:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000123; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000124; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000125; CHECK-NOT: %r2
126; CHECK: agfi %r2, -524292
127; CHECK: ste %f0, 0(%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000128; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000129 %ptr = getelementptr float, float *%base, i64 -131073
Richard Sandiford93183ee2013-09-18 09:56:40 +0000130 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000131 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000132 %res = select i1 %cond, float %orig, float %alt
133 store float %res, float *%ptr
134 ret void
135}
136
137; Check that STEY allows an index.
138define void @f9(i64 %base, i64 %index, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000139; CHECK-LABEL: f9:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000140; CHECK-NOT: %r2
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000141; CHECK: blr %r14
Richard Sandifordb86a8342013-06-27 09:27:40 +0000142; CHECK-NOT: %r2
143; CHECK: stey %f0, 4096(%r3,%r2)
Richard Sandifordb86a8342013-06-27 09:27:40 +0000144; CHECK: br %r14
145 %add1 = add i64 %base, %index
146 %add2 = add i64 %add1, 4096
147 %ptr = inttoptr i64 %add2 to float *
Richard Sandiford93183ee2013-09-18 09:56:40 +0000148 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000149 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000150 %res = select i1 %cond, float %orig, float %alt
151 store float %res, float *%ptr
152 ret void
153}
154
155; Check that volatile loads are not matched.
156define void @f10(float *%ptr, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000157; CHECK-LABEL: f10:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000158; CHECK: le {{%f[0-5]}}, 0(%r2)
Kyle Buttefe56fe2017-01-11 19:55:19 +0000159; CHECK: {{jl|jnl}} [[LABEL:[^ ]*]]
Richard Sandifordb86a8342013-06-27 09:27:40 +0000160; CHECK: [[LABEL]]:
161; CHECK: ste {{%f[0-5]}}, 0(%r2)
162; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000163 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000164 %orig = load volatile float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000165 %res = select i1 %cond, float %orig, float %alt
166 store float %res, float *%ptr
167 ret void
168}
169
170; ...likewise stores. In this case we should have a conditional load into %f0.
171define void @f11(float *%ptr, float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000172; CHECK-LABEL: f11:
Richard Sandiford3d768e32013-07-31 12:30:20 +0000173; CHECK: jhe [[LABEL:[^ ]*]]
Richard Sandifordb86a8342013-06-27 09:27:40 +0000174; CHECK: le %f0, 0(%r2)
175; CHECK: [[LABEL]]:
176; CHECK: ste %f0, 0(%r2)
177; CHECK: br %r14
Richard Sandiford93183ee2013-09-18 09:56:40 +0000178 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000179 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000180 %res = select i1 %cond, float %orig, float %alt
181 store volatile float %res, float *%ptr
182 ret void
183}
184
185; Try a frame index base.
186define void @f12(float %alt, i32 %limit) {
Stephen Lind24ab202013-07-14 06:24:09 +0000187; CHECK-LABEL: f12:
Richard Sandifordb86a8342013-06-27 09:27:40 +0000188; CHECK: brasl %r14, foo@PLT
189; CHECK-NOT: %r15
190; CHECK: jl [[LABEL:[^ ]*]]
191; CHECK-NOT: %r15
192; CHECK: ste {{%f[0-9]+}}, {{[0-9]+}}(%r15)
193; CHECK: [[LABEL]]:
194; CHECK: brasl %r14, foo@PLT
195; CHECK: br %r14
196 %ptr = alloca float
197 call void @foo(float *%ptr)
Richard Sandiford93183ee2013-09-18 09:56:40 +0000198 %cond = icmp ult i32 %limit, 420
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000199 %orig = load float, float *%ptr
Richard Sandifordb86a8342013-06-27 09:27:40 +0000200 %res = select i1 %cond, float %orig, float %alt
201 store float %res, float *%ptr
202 call void @foo(float *%ptr)
203 ret void
204}