[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / SROA / scalable-vectors.ll
blob3014c77e393c05026feab708d20f900edb78cd6f
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -sroa -S | FileCheck %s
3 ; RUN: opt < %s -passes=sroa -S | FileCheck %s
5 ; This test checks that SROA runs mem2reg on scalable vectors.
7 define <vscale x 16 x i1> @alloca_nxv16i1(<vscale x 16 x i1> %pg) {
8 ; CHECK-LABEL: @alloca_nxv16i1(
9 ; CHECK-NEXT:    ret <vscale x 16 x i1> [[PG:%.*]]
11   %pg.addr = alloca <vscale x 16 x i1>
12   store <vscale x 16 x i1> %pg, <vscale x 16 x i1>* %pg.addr
13   %1 = load <vscale x 16 x i1>, <vscale x 16 x i1>* %pg.addr
14   ret <vscale x 16 x i1> %1
17 define <vscale x 16 x i8> @alloca_nxv16i8(<vscale x 16 x i8> %vec) {
18 ; CHECK-LABEL: @alloca_nxv16i8(
19 ; CHECK-NEXT:    ret <vscale x 16 x i8> [[VEC:%.*]]
21   %vec.addr = alloca <vscale x 16 x i8>
22   store <vscale x 16 x i8> %vec, <vscale x 16 x i8>* %vec.addr
23   %1 = load <vscale x 16 x i8>, <vscale x 16 x i8>* %vec.addr
24   ret <vscale x 16 x i8> %1
27 ; Test scalable alloca that can't be promoted. Mem2Reg only considers
28 ; non-volatile loads and stores for promotion.
29 define <vscale x 16 x i8> @unpromotable_alloca(<vscale x 16 x i8> %vec) {
30 ; CHECK-LABEL: @unpromotable_alloca(
31 ; CHECK-NEXT:    [[VEC_ADDR:%.*]] = alloca <vscale x 16 x i8>, align 16
32 ; CHECK-NEXT:    store volatile <vscale x 16 x i8> [[VEC:%.*]], <vscale x 16 x i8>* [[VEC_ADDR]], align 16
33 ; CHECK-NEXT:    [[TMP1:%.*]] = load volatile <vscale x 16 x i8>, <vscale x 16 x i8>* [[VEC_ADDR]], align 16
34 ; CHECK-NEXT:    ret <vscale x 16 x i8> [[TMP1]]
36   %vec.addr = alloca <vscale x 16 x i8>
37   store volatile <vscale x 16 x i8> %vec, <vscale x 16 x i8>* %vec.addr
38   %1 = load volatile <vscale x 16 x i8>, <vscale x 16 x i8>* %vec.addr
39   ret <vscale x 16 x i8> %1
42 ; Test we bail out when using an alloca of a fixed-length vector (VLS) that was
43 ; bitcasted to a scalable vector.
44 define <vscale x 4 x i32> @cast_alloca_to_svint32_t(<vscale x 4 x i32> %type.coerce) {
45 ; CHECK-LABEL: @cast_alloca_to_svint32_t(
46 ; CHECK-NEXT:    [[TYPE:%.*]] = alloca <16 x i32>, align 64
47 ; CHECK-NEXT:    [[TYPE_ADDR:%.*]] = alloca <16 x i32>, align 64
48 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <16 x i32>* [[TYPE]] to <vscale x 4 x i32>*
49 ; CHECK-NEXT:    store <vscale x 4 x i32> [[TYPE_COERCE:%.*]], <vscale x 4 x i32>* [[TMP1]], align 16
50 ; CHECK-NEXT:    [[TYPE1:%.*]] = load <16 x i32>, <16 x i32>* [[TYPE]], align 64
51 ; CHECK-NEXT:    store <16 x i32> [[TYPE1]], <16 x i32>* [[TYPE_ADDR]], align 64
52 ; CHECK-NEXT:    [[TMP2:%.*]] = load <16 x i32>, <16 x i32>* [[TYPE_ADDR]], align 64
53 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i32>* [[TYPE_ADDR]] to <vscale x 4 x i32>*
54 ; CHECK-NEXT:    [[TMP4:%.*]] = load <vscale x 4 x i32>, <vscale x 4 x i32>* [[TMP3]], align 16
55 ; CHECK-NEXT:    ret <vscale x 4 x i32> [[TMP4]]
57   %type = alloca <16 x i32>
58   %type.addr = alloca <16 x i32>
59   %1 = bitcast <16 x i32>* %type to <vscale x 4 x i32>*
60   store <vscale x 4 x i32> %type.coerce, <vscale x 4 x i32>* %1
61   %type1 = load <16 x i32>, <16 x i32>* %type
62   store <16 x i32> %type1, <16 x i32>* %type.addr
63   %2 = load <16 x i32>, <16 x i32>* %type.addr
64   %3 = bitcast <16 x i32>* %type.addr to <vscale x 4 x i32>*
65   %4 = load <vscale x 4 x i32>, <vscale x 4 x i32>* %3
66   ret <vscale x 4 x i32> %4
69 ; When casting from VLA to VLS via memory check we bail out when producing a
70 ; GEP where the element type is a scalable vector.
71 define <vscale x 4 x i32> @cast_alloca_from_svint32_t() {
72 ; CHECK-LABEL: @cast_alloca_from_svint32_t(
73 ; CHECK-NEXT:    [[RETVAL_COERCE:%.*]] = alloca <vscale x 4 x i32>, align 16
74 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <vscale x 4 x i32>* [[RETVAL_COERCE]] to i8*
75 ; CHECK-NEXT:    [[RETVAL_0__SROA_CAST:%.*]] = bitcast i8* [[TMP1]] to <16 x i32>*
76 ; CHECK-NEXT:    store <16 x i32> undef, <16 x i32>* [[RETVAL_0__SROA_CAST]], align 16
77 ; CHECK-NEXT:    [[TMP2:%.*]] = load <vscale x 4 x i32>, <vscale x 4 x i32>* [[RETVAL_COERCE]], align 16
78 ; CHECK-NEXT:    ret <vscale x 4 x i32> [[TMP2]]
80   %retval = alloca <16 x i32>
81   %retval.coerce = alloca <vscale x 4 x i32>
82   %1 = bitcast <vscale x 4 x i32>* %retval.coerce to i8*
83   %2 = bitcast <16 x i32>* %retval to i8*
84   call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %1, i8* align 16 %2, i64 64, i1 false)
85   %3 = load <vscale x 4 x i32>, <vscale x 4 x i32>* %retval.coerce
86   ret <vscale x 4 x i32> %3
89 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind