1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2
- ; RUN: opt -opaque-pointers=0 - S -scalable-vectorization=on -force-target-supports-scalable-vectors=true -passes=loop-vectorize -force-vector-width=2 -force-vector-interleave=1 < %s | FileCheck %s
2
+ ; RUN: opt -S -scalable-vectorization=on -force-target-supports-scalable-vectors=true -passes=loop-vectorize -force-vector-width=2 -force-vector-interleave=1 < %s | FileCheck %s
3
3
4
4
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
5
5
6
6
; Make sure we can vectorize loops which contain lifetime markers.
7
7
8
- define void @test (i32 * %d ) {
8
+ define void @test (ptr %d ) {
9
9
; CHECK-LABEL: define void @test
10
- ; CHECK-SAME: (i32* [[D:%.*]]) {
10
+ ; CHECK-SAME: (ptr [[D:%.*]]) {
11
11
; CHECK-NEXT: entry:
12
12
; CHECK-NEXT: [[ARR:%.*]] = alloca [1024 x i32], align 16
13
- ; CHECK-NEXT: [[TMP0:%.*]] = bitcast [1024 x i32]* [[ARR]] to i8*
14
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4096, i8* [[TMP0]])
15
- ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vscale.i64()
16
- ; CHECK-NEXT: [[TMP2:%.*]] = mul i64 [[TMP1]], 2
17
- ; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 128, [[TMP2]]
13
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4096, ptr [[ARR]])
14
+ ; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
15
+ ; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[TMP0]], 2
16
+ ; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 128, [[TMP1]]
18
17
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
19
18
; CHECK: vector.ph:
20
- ; CHECK-NEXT: [[TMP3 :%.*]] = call i64 @llvm.vscale.i64()
21
- ; CHECK-NEXT: [[TMP4 :%.*]] = mul i64 [[TMP3 ]], 2
22
- ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 128, [[TMP4 ]]
19
+ ; CHECK-NEXT: [[TMP2 :%.*]] = call i64 @llvm.vscale.i64()
20
+ ; CHECK-NEXT: [[TMP3 :%.*]] = mul i64 [[TMP2 ]], 2
21
+ ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 128, [[TMP3 ]]
23
22
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 128, [[N_MOD_VF]]
24
23
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
25
24
; CHECK: vector.body:
26
25
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
27
- ; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[INDEX]], 0
28
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 4096, i8* [[TMP0]])
29
- ; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[D]], i64 [[TMP5]]
30
- ; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, i32* [[TMP6]], i32 0
31
- ; CHECK-NEXT: [[TMP8:%.*]] = bitcast i32* [[TMP7]] to <vscale x 2 x i32>*
32
- ; CHECK-NEXT: store <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 100, i64 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer), <vscale x 2 x i32>* [[TMP8]], align 8
33
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4096, i8* [[TMP0]])
34
- ; CHECK-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()
35
- ; CHECK-NEXT: [[TMP10:%.*]] = mul i64 [[TMP9]], 2
36
- ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP10]]
37
- ; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
38
- ; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
26
+ ; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0
27
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4096, ptr [[ARR]])
28
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[TMP4]]
29
+ ; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i32 0
30
+ ; CHECK-NEXT: store <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 100, i64 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer), ptr [[TMP6]], align 8
31
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4096, ptr [[ARR]])
32
+ ; CHECK-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()
33
+ ; CHECK-NEXT: [[TMP8:%.*]] = mul i64 [[TMP7]], 2
34
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP8]]
35
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
36
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
39
37
; CHECK: middle.block:
40
38
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 128, [[N_VEC]]
41
39
; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]]
@@ -44,46 +42,45 @@ define void @test(i32 *%d) {
44
42
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
45
43
; CHECK: for.body:
46
44
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
47
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8 (i64 4096, i8* [[TMP0 ]])
48
- ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[D]], i64 [[INDVARS_IV]]
49
- ; CHECK-NEXT: [[TMP12 :%.*]] = load i32, i32* [[ARRAYIDX]], align 8
50
- ; CHECK-NEXT: store i32 100, i32* [[ARRAYIDX]], align 8
51
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8 (i64 4096, i8* [[TMP0 ]])
45
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0 (i64 4096, ptr [[ARR ]])
46
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[INDVARS_IV]]
47
+ ; CHECK-NEXT: [[TMP10 :%.*]] = load i32, ptr [[ARRAYIDX]], align 8
48
+ ; CHECK-NEXT: store i32 100, ptr [[ARRAYIDX]], align 8
49
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0 (i64 4096, ptr [[ARR ]])
52
50
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1
53
51
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
54
52
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], 128
55
53
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END]], !llvm.loop [[LOOP3:![0-9]+]]
56
54
; CHECK: for.end:
57
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8 (i64 4096, i8* [[TMP0 ]])
55
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0 (i64 4096, ptr [[ARR ]])
58
56
; CHECK-NEXT: ret void
59
57
;
60
58
61
59
entry:
62
60
%arr = alloca [1024 x i32 ], align 16
63
- %0 = bitcast [1024 x i32 ]* %arr to i8*
64
- call void @llvm.lifetime.start.p0i8 (i64 4096 , i8* %0 ) #1
61
+ call void @llvm.lifetime.start.p0 (i64 4096 , ptr %arr ) #1
65
62
br label %for.body
66
63
67
64
for.body:
68
65
%indvars.iv = phi i64 [ 0 , %entry ], [ %indvars.iv.next , %for.body ]
69
- call void @llvm.lifetime.end.p0i8 (i64 4096 , i8* %0 ) #1
70
- %arrayidx = getelementptr inbounds i32 , i32* %d , i64 %indvars.iv
71
- %1 = load i32 , i32* %arrayidx , align 8
72
- store i32 100 , i32* %arrayidx , align 8
73
- call void @llvm.lifetime.start.p0i8 (i64 4096 , i8* %0 ) #1
66
+ call void @llvm.lifetime.end.p0 (i64 4096 , ptr %arr ) #1
67
+ %arrayidx = getelementptr inbounds i32 , ptr %d , i64 %indvars.iv
68
+ %0 = load i32 , ptr %arrayidx , align 8
69
+ store i32 100 , ptr %arrayidx , align 8
70
+ call void @llvm.lifetime.start.p0 (i64 4096 , ptr %arr ) #1
74
71
%indvars.iv.next = add i64 %indvars.iv , 1
75
72
%lftr.wideiv = trunc i64 %indvars.iv.next to i32
76
73
%exitcond = icmp ne i32 %lftr.wideiv , 128
77
74
br i1 %exitcond , label %for.body , label %for.end , !llvm.loop !0
78
75
79
76
for.end:
80
- call void @llvm.lifetime.end.p0i8 (i64 4096 , i8* %0 ) #1
77
+ call void @llvm.lifetime.end.p0 (i64 4096 , ptr %arr ) #1
81
78
ret void
82
79
}
83
80
84
- define void @testloopvariant (i32 * %d ) {
81
+ define void @testloopvariant (ptr %d ) {
85
82
; CHECK-LABEL: define void @testloopvariant
86
- ; CHECK-SAME: (i32* [[D:%.*]]) {
83
+ ; CHECK-SAME: (ptr [[D:%.*]]) {
87
84
; CHECK-NEXT: entry:
88
85
; CHECK-NEXT: [[ARR:%.*]] = alloca [1024 x i32], align 16
89
86
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
@@ -95,25 +92,20 @@ define void @testloopvariant(i32 *%d) {
95
92
; CHECK-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 2
96
93
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 128, [[TMP3]]
97
94
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 128, [[N_MOD_VF]]
98
- ; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 2 x [1024 x i32]*> poison, [1024 x i32]* [[ARR]], i64 0
99
- ; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 2 x [1024 x i32]*> [[BROADCAST_SPLATINSERT]], <vscale x 2 x [1024 x i32]*> poison, <vscale x 2 x i32> zeroinitializer
100
95
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
101
96
; CHECK: vector.body:
102
97
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
103
98
; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[INDEX]], 0
104
- ; CHECK-NEXT: [[TMP5:%.*]] = bitcast <vscale x 2 x [1024 x i32]*> [[BROADCAST_SPLAT]] to <vscale x 2 x i8*>
105
- ; CHECK-NEXT: [[TMP6:%.*]] = extractelement <vscale x 2 x i8*> [[TMP5]], i32 0
106
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 4096, i8* [[TMP6]])
107
- ; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, i32* [[D]], i64 [[TMP4]]
108
- ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, i32* [[TMP7]], i32 0
109
- ; CHECK-NEXT: [[TMP9:%.*]] = bitcast i32* [[TMP8]] to <vscale x 2 x i32>*
110
- ; CHECK-NEXT: store <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 100, i64 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer), <vscale x 2 x i32>* [[TMP9]], align 8
111
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4096, i8* [[TMP6]])
112
- ; CHECK-NEXT: [[TMP10:%.*]] = call i64 @llvm.vscale.i64()
113
- ; CHECK-NEXT: [[TMP11:%.*]] = mul i64 [[TMP10]], 2
114
- ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP11]]
115
- ; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
116
- ; CHECK-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
99
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4096, ptr [[ARR]])
100
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[TMP4]]
101
+ ; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i32 0
102
+ ; CHECK-NEXT: store <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 100, i64 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer), ptr [[TMP6]], align 8
103
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4096, ptr [[ARR]])
104
+ ; CHECK-NEXT: [[TMP7:%.*]] = call i64 @llvm.vscale.i64()
105
+ ; CHECK-NEXT: [[TMP8:%.*]] = mul i64 [[TMP7]], 2
106
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP8]]
107
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
108
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
117
109
; CHECK: middle.block:
118
110
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 128, [[N_VEC]]
119
111
; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]]
@@ -122,13 +114,12 @@ define void @testloopvariant(i32 *%d) {
122
114
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
123
115
; CHECK: for.body:
124
116
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
125
- ; CHECK-NEXT: [[TMP13:%.*]] = getelementptr [1024 x i32], [1024 x i32]* [[ARR]], i32 0, i64 [[INDVARS_IV]]
126
- ; CHECK-NEXT: [[TMP14:%.*]] = bitcast [1024 x i32]* [[ARR]] to i8*
127
- ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 4096, i8* [[TMP14]])
128
- ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[D]], i64 [[INDVARS_IV]]
129
- ; CHECK-NEXT: [[TMP15:%.*]] = load i32, i32* [[ARRAYIDX]], align 8
130
- ; CHECK-NEXT: store i32 100, i32* [[ARRAYIDX]], align 8
131
- ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4096, i8* [[TMP14]])
117
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr [1024 x i32], ptr [[ARR]], i32 0, i64 [[INDVARS_IV]]
118
+ ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4096, ptr [[ARR]])
119
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[D]], i64 [[INDVARS_IV]]
120
+ ; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX]], align 8
121
+ ; CHECK-NEXT: store i32 100, ptr [[ARRAYIDX]], align 8
122
+ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4096, ptr [[ARR]])
132
123
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1
133
124
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
134
125
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], 128
@@ -142,13 +133,12 @@ entry:
142
133
143
134
for.body:
144
135
%indvars.iv = phi i64 [ 0 , %entry ], [ %indvars.iv.next , %for.body ]
145
- %0 = getelementptr [1024 x i32 ], [1024 x i32 ]* %arr , i32 0 , i64 %indvars.iv
146
- %1 = bitcast [1024 x i32 ]* %arr to i8*
147
- call void @llvm.lifetime.end.p0i8 (i64 4096 , i8* %1 ) #1
148
- %arrayidx = getelementptr inbounds i32 , i32* %d , i64 %indvars.iv
149
- %2 = load i32 , i32* %arrayidx , align 8
150
- store i32 100 , i32* %arrayidx , align 8
151
- call void @llvm.lifetime.start.p0i8 (i64 4096 , i8* %1 ) #1
136
+ %0 = getelementptr [1024 x i32 ], ptr %arr , i32 0 , i64 %indvars.iv
137
+ call void @llvm.lifetime.end.p0 (i64 4096 , ptr %arr ) #1
138
+ %arrayidx = getelementptr inbounds i32 , ptr %d , i64 %indvars.iv
139
+ %1 = load i32 , ptr %arrayidx , align 8
140
+ store i32 100 , ptr %arrayidx , align 8
141
+ call void @llvm.lifetime.start.p0 (i64 4096 , ptr %arr ) #1
152
142
%indvars.iv.next = add i64 %indvars.iv , 1
153
143
%lftr.wideiv = trunc i64 %indvars.iv.next to i32
154
144
%exitcond = icmp ne i32 %lftr.wideiv , 128
@@ -158,9 +148,9 @@ for.end:
158
148
ret void
159
149
}
160
150
161
- declare void @llvm.lifetime.start.p0i8 (i64 , i8* nocapture ) #1
151
+ declare void @llvm.lifetime.start.p0 (i64 , ptr nocapture ) #1
162
152
163
- declare void @llvm.lifetime.end.p0i8 (i64 , i8* nocapture ) #1
153
+ declare void @llvm.lifetime.end.p0 (i64 , ptr nocapture ) #1
164
154
165
155
!0 = distinct !{!0 , !1 }
166
156
!1 = !{!"llvm.loop.vectorize.scalable.enable" , i1 true }
0 commit comments