Skip to content

Commit aa92ae5

Browse files
committed
[LoopVectorize] Regenerate test checks (NFC)
1 parent 2499bee commit aa92ae5

File tree

1 file changed

+106
-21
lines changed

1 file changed

+106
-21
lines changed

llvm/test/Transforms/LoopVectorize/scalable-lifetime.ll

Lines changed: 106 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,62 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
12
; 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
23

34
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"
45

56
; Make sure we can vectorize loops which contain lifetime markers.
67

78
define void @test(i32 *%d) {
8-
; CHECK-LABEL: @test(
9-
; CHECK: entry:
10-
; CHECK: [[ALLOCA:%.*]] = alloca [1024 x i32], align 16
11-
; CHECK-NEXT: [[BC:%.*]] = bitcast [1024 x i32]* [[ALLOCA]] to i8*
12-
; CHECK: vector.body:
13-
; CHECK: call void @llvm.lifetime.end.p0i8(i64 4096, i8* [[BC]])
14-
; CHECK: store <vscale x 2 x i32>
15-
; CHECK: call void @llvm.lifetime.start.p0i8(i64 4096, i8* [[BC]])
9+
; CHECK-LABEL: define void @test
10+
; CHECK-SAME: (i32* [[D:%.*]]) {
11+
; CHECK-NEXT: entry:
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]]
18+
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
19+
; 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]]
23+
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 128, [[N_MOD_VF]]
24+
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
25+
; CHECK: vector.body:
26+
; 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]+]]
39+
; CHECK: middle.block:
40+
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 128, [[N_VEC]]
41+
; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]]
42+
; CHECK: scalar.ph:
43+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
44+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
45+
; CHECK: for.body:
46+
; 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]])
52+
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1
53+
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
54+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], 128
55+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END]], !llvm.loop [[LOOP3:![0-9]+]]
56+
; CHECK: for.end:
57+
; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 4096, i8* [[TMP0]])
58+
; CHECK-NEXT: ret void
59+
;
1660

1761
entry:
1862
%arr = alloca [1024 x i32], align 16
@@ -37,20 +81,61 @@ for.end:
3781
ret void
3882
}
3983

40-
; CHECK-LABEL: @testloopvariant(
41-
; CHECK: entry:
42-
; CHECK: [[ALLOCA:%.*]] = alloca [1024 x i32], align 16
43-
; CHECK: vector.ph:
44-
; CHECK: [[TMP1:%.*]] = insertelement <vscale x 2 x [1024 x i32]*> poison, [1024 x i32]* %arr, i64 0
45-
; CHECK-NEXT: [[SPLAT_ALLOCA:%.*]] = shufflevector <vscale x 2 x [1024 x i32]*> [[TMP1]], <vscale x 2 x [1024 x i32]*> poison, <vscale x 2 x i32> zeroinitializer
46-
; CHECK: vector.body:
47-
; CHECK: [[BC_ALLOCA:%.*]] = bitcast <vscale x 2 x [1024 x i32]*> [[SPLAT_ALLOCA]] to <vscale x 2 x i8*>
48-
; CHECK-NEXT: [[ONE_LIFETIME:%.*]] = extractelement <vscale x 2 x i8*> [[BC_ALLOCA]], i32 0
49-
; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 4096, i8* [[ONE_LIFETIME]])
50-
; CHECK: store <vscale x 2 x i32>
51-
; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4096, i8* [[ONE_LIFETIME]])
52-
5384
define void @testloopvariant(i32 *%d) {
85+
; CHECK-LABEL: define void @testloopvariant
86+
; CHECK-SAME: (i32* [[D:%.*]]) {
87+
; CHECK-NEXT: entry:
88+
; CHECK-NEXT: [[ARR:%.*]] = alloca [1024 x i32], align 16
89+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
90+
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[TMP0]], 2
91+
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 128, [[TMP1]]
92+
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
93+
; CHECK: vector.ph:
94+
; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()
95+
; CHECK-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], 2
96+
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 128, [[TMP3]]
97+
; 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+
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
101+
; CHECK: vector.body:
102+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
103+
; 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]+]]
117+
; CHECK: middle.block:
118+
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 128, [[N_VEC]]
119+
; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_END:%.*]], label [[SCALAR_PH]]
120+
; CHECK: scalar.ph:
121+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
122+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
123+
; CHECK: for.body:
124+
; 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]])
132+
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1
133+
; CHECK-NEXT: [[LFTR_WIDEIV:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
134+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[LFTR_WIDEIV]], 128
135+
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_END]], !llvm.loop [[LOOP5:![0-9]+]]
136+
; CHECK: for.end:
137+
; CHECK-NEXT: ret void
138+
;
54139
entry:
55140
%arr = alloca [1024 x i32], align 16
56141
br label %for.body

0 commit comments

Comments
 (0)