1 ; Test 32-bit byteswaps from memory to registers.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -combiner-alias-analysis \
4 ; RUN: -combiner-global-alias-analysis | FileCheck %s
6 declare i32 @llvm.bswap.i32(i32 %a)
8 ; Check LRV with no displacement.
9 define i32 @f1(i32 *%src) {
11 ; CHECK: lrv %r2, 0(%r2)
14 %swapped = call i32 @llvm.bswap.i32(i32 %a)
18 ; Check the high end of the aligned LRV range.
19 define i32 @f2(i32 *%src) {
21 ; CHECK: lrv %r2, 524284(%r2)
23 %ptr = getelementptr i32 *%src, i64 131071
25 %swapped = call i32 @llvm.bswap.i32(i32 %a)
29 ; Check the next word up, which needs separate address logic.
30 ; Other sequences besides this one would be OK.
31 define i32 @f3(i32 *%src) {
33 ; CHECK: agfi %r2, 524288
34 ; CHECK: lrv %r2, 0(%r2)
36 %ptr = getelementptr i32 *%src, i64 131072
38 %swapped = call i32 @llvm.bswap.i32(i32 %a)
42 ; Check the high end of the negative aligned LRV range.
43 define i32 @f4(i32 *%src) {
45 ; CHECK: lrv %r2, -4(%r2)
47 %ptr = getelementptr i32 *%src, i64 -1
49 %swapped = call i32 @llvm.bswap.i32(i32 %a)
53 ; Check the low end of the LRV range.
54 define i32 @f5(i32 *%src) {
56 ; CHECK: lrv %r2, -524288(%r2)
58 %ptr = getelementptr i32 *%src, i64 -131072
60 %swapped = call i32 @llvm.bswap.i32(i32 %a)
64 ; Check the next word down, which needs separate address logic.
65 ; Other sequences besides this one would be OK.
66 define i32 @f6(i32 *%src) {
68 ; CHECK: agfi %r2, -524292
69 ; CHECK: lrv %r2, 0(%r2)
71 %ptr = getelementptr i32 *%src, i64 -131073
73 %swapped = call i32 @llvm.bswap.i32(i32 %a)
77 ; Check that LRV allows an index.
78 define i32 @f7(i64 %src, i64 %index) {
80 ; CHECK: lrv %r2, 524287({{%r3,%r2|%r2,%r3}})
82 %add1 = add i64 %src, %index
83 %add2 = add i64 %add1, 524287
84 %ptr = inttoptr i64 %add2 to i32 *
86 %swapped = call i32 @llvm.bswap.i32(i32 %a)
90 ; Check that volatile accesses do not use LRV, which might access the
91 ; storage multple times.
92 define i32 @f8(i32 *%src) {
94 ; CHECK: l [[REG:%r[0-5]]], 0(%r2)
95 ; CHECK: lrvr %r2, [[REG]]
97 %a = load volatile i32 *%src
98 %swapped = call i32 @llvm.bswap.i32(i32 %a)
102 ; Test a case where we spill the source of at least one LRVR. We want
103 ; to use LRV if possible.
104 define void @f9(i32 *%ptr) {
106 ; CHECK: lrv {{%r[0-9]+}}, 16{{[04]}}(%r15)
108 %val0 = load volatile i32 *%ptr
109 %val1 = load volatile i32 *%ptr
110 %val2 = load volatile i32 *%ptr
111 %val3 = load volatile i32 *%ptr
112 %val4 = load volatile i32 *%ptr
113 %val5 = load volatile i32 *%ptr
114 %val6 = load volatile i32 *%ptr
115 %val7 = load volatile i32 *%ptr
116 %val8 = load volatile i32 *%ptr
117 %val9 = load volatile i32 *%ptr
118 %val10 = load volatile i32 *%ptr
119 %val11 = load volatile i32 *%ptr
120 %val12 = load volatile i32 *%ptr
121 %val13 = load volatile i32 *%ptr
122 %val14 = load volatile i32 *%ptr
123 %val15 = load volatile i32 *%ptr
125 %swapped0 = call i32 @llvm.bswap.i32(i32 %val0)
126 %swapped1 = call i32 @llvm.bswap.i32(i32 %val1)
127 %swapped2 = call i32 @llvm.bswap.i32(i32 %val2)
128 %swapped3 = call i32 @llvm.bswap.i32(i32 %val3)
129 %swapped4 = call i32 @llvm.bswap.i32(i32 %val4)
130 %swapped5 = call i32 @llvm.bswap.i32(i32 %val5)
131 %swapped6 = call i32 @llvm.bswap.i32(i32 %val6)
132 %swapped7 = call i32 @llvm.bswap.i32(i32 %val7)
133 %swapped8 = call i32 @llvm.bswap.i32(i32 %val8)
134 %swapped9 = call i32 @llvm.bswap.i32(i32 %val9)
135 %swapped10 = call i32 @llvm.bswap.i32(i32 %val10)
136 %swapped11 = call i32 @llvm.bswap.i32(i32 %val11)
137 %swapped12 = call i32 @llvm.bswap.i32(i32 %val12)
138 %swapped13 = call i32 @llvm.bswap.i32(i32 %val13)
139 %swapped14 = call i32 @llvm.bswap.i32(i32 %val14)
140 %swapped15 = call i32 @llvm.bswap.i32(i32 %val15)
142 store volatile i32 %val0, i32 *%ptr
143 store volatile i32 %val1, i32 *%ptr
144 store volatile i32 %val2, i32 *%ptr
145 store volatile i32 %val3, i32 *%ptr
146 store volatile i32 %val4, i32 *%ptr
147 store volatile i32 %val5, i32 *%ptr
148 store volatile i32 %val6, i32 *%ptr
149 store volatile i32 %val7, i32 *%ptr
150 store volatile i32 %val8, i32 *%ptr
151 store volatile i32 %val9, i32 *%ptr
152 store volatile i32 %val10, i32 *%ptr
153 store volatile i32 %val11, i32 *%ptr
154 store volatile i32 %val12, i32 *%ptr
155 store volatile i32 %val13, i32 *%ptr
156 store volatile i32 %val14, i32 *%ptr
157 store volatile i32 %val15, i32 *%ptr
159 store volatile i32 %swapped0, i32 *%ptr
160 store volatile i32 %swapped1, i32 *%ptr
161 store volatile i32 %swapped2, i32 *%ptr
162 store volatile i32 %swapped3, i32 *%ptr
163 store volatile i32 %swapped4, i32 *%ptr
164 store volatile i32 %swapped5, i32 *%ptr
165 store volatile i32 %swapped6, i32 *%ptr
166 store volatile i32 %swapped7, i32 *%ptr
167 store volatile i32 %swapped8, i32 *%ptr
168 store volatile i32 %swapped9, i32 *%ptr
169 store volatile i32 %swapped10, i32 *%ptr
170 store volatile i32 %swapped11, i32 *%ptr
171 store volatile i32 %swapped12, i32 *%ptr
172 store volatile i32 %swapped13, i32 *%ptr
173 store volatile i32 %swapped14, i32 *%ptr
174 store volatile i32 %swapped15, i32 *%ptr