|
3 | 3 |
|
4 | 4 | target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
|
5 | 5 |
|
| 6 | +declare i32 @llvm.bitreverse.i32(i32) |
| 7 | +declare <2 x i8> @llvm.bitreverse.v2i8(<2 x i8>) |
| 8 | +declare void @use_i32(i32) |
| 9 | + |
6 | 10 | ;pairwise reverse
|
7 | 11 | ;template <typename T>
|
8 | 12 | ;T reverse(T v) {
|
@@ -314,3 +318,38 @@ define i4 @shuf_4bits_extra_use(<4 x i1> %x) {
|
314 | 318 | %cast = bitcast <4 x i1> %bitreverse to i4
|
315 | 319 | ret i4 %cast
|
316 | 320 | }
|
| 321 | + |
| 322 | +define i32 @rev_i1(i1 %x) { |
| 323 | +; CHECK-LABEL: @rev_i1( |
| 324 | +; CHECK-NEXT: [[Z:%.*]] = zext i1 [[X:%.*]] to i32 |
| 325 | +; CHECK-NEXT: call void @use_i32(i32 [[Z]]) |
| 326 | +; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[Z]]) |
| 327 | +; CHECK-NEXT: ret i32 [[R]] |
| 328 | +; |
| 329 | + %z = zext i1 %x to i32 |
| 330 | + call void @use_i32(i32 %z) |
| 331 | + %r = call i32 @llvm.bitreverse.i32(i32 %z) |
| 332 | + ret i32 %r |
| 333 | +} |
| 334 | + |
| 335 | +define <2 x i8> @rev_v2i1(<2 x i1> %x) { |
| 336 | +; CHECK-LABEL: @rev_v2i1( |
| 337 | +; CHECK-NEXT: [[Z:%.*]] = zext <2 x i1> [[X:%.*]] to <2 x i8> |
| 338 | +; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> [[Z]]) |
| 339 | +; CHECK-NEXT: ret <2 x i8> [[R]] |
| 340 | +; |
| 341 | + %z = zext <2 x i1> %x to <2 x i8> |
| 342 | + %r = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %z) |
| 343 | + ret <2 x i8> %r |
| 344 | +} |
| 345 | + |
| 346 | +define i32 @rev_i2(i2 %x) { |
| 347 | +; CHECK-LABEL: @rev_i2( |
| 348 | +; CHECK-NEXT: [[Z:%.*]] = zext i2 [[X:%.*]] to i32 |
| 349 | +; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[Z]]) |
| 350 | +; CHECK-NEXT: ret i32 [[R]] |
| 351 | +; |
| 352 | + %z = zext i2 %x to i32 |
| 353 | + %r = call i32 @llvm.bitreverse.i32(i32 %z) |
| 354 | + ret i32 %r |
| 355 | +} |
0 commit comments