|
3 | 3 |
|
4 | 4 | ; Make sure that opaque pointer intrinsic remangling upgrade works.
|
5 | 5 |
|
| 6 | +%int8x16x2_t = type { <16 x i8>, <16 x i8> } |
| 7 | + |
6 | 8 | declare i32* @fake_personality_function()
|
7 | 9 | declare void @func()
|
8 | 10 |
|
@@ -43,5 +45,22 @@ define i8* @test_ptr_annotation(i8* %p) {
|
43 | 45 | ret i8* %p2
|
44 | 46 | }
|
45 | 47 |
|
| 48 | + |
| 49 | +define void @test_struct_return(%int8x16x2_t* %res.p, i8* %a) { |
| 50 | +; CHECK-LABEL: @test_struct_return( |
| 51 | +; CHECK-NEXT: [[TMP1:%.*]] = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr [[A:%.*]]) |
| 52 | +; CHECK-NEXT: [[TMP2:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 0 |
| 53 | +; CHECK-NEXT: [[TMP3:%.*]] = insertvalue [[INT8X16X2_T:%.*]] poison, <16 x i8> [[TMP2]], 0 |
| 54 | +; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { <16 x i8>, <16 x i8> } [[TMP1]], 1 |
| 55 | +; CHECK-NEXT: [[TMP5:%.*]] = insertvalue [[INT8X16X2_T]] [[TMP3]], <16 x i8> [[TMP4]], 1 |
| 56 | +; CHECK-NEXT: store [[INT8X16X2_T]] [[TMP5]], ptr [[RES_P:%.*]], align 16 |
| 57 | +; CHECK-NEXT: ret void |
| 58 | +; |
| 59 | + %res = call %int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0i8(i8* %a) |
| 60 | + store %int8x16x2_t %res, %int8x16x2_t* %res.p |
| 61 | + ret void |
| 62 | +} |
| 63 | + |
46 | 64 | declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
|
47 | 65 | declare i8* @llvm.ptr.annotation.p0i8(i8*, i8*, i8*, i32, i8*)
|
| 66 | +declare %int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0i8(i8*) |
0 commit comments