xref: /llvm-project/llvm/test/Transforms/LoopVectorize/version-stride-with-integer-casts.ll (revision f48884ded884d982a7fd13394b0e93e6588f4143)
1c49b74a4SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2c49b74a4SFlorian Hahn; RUN: opt -passes=loop-vectorize -force-vector-width=4 -S %s | FileCheck %s
3c49b74a4SFlorian Hahn
4c49b74a4SFlorian Hahntarget datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
5c49b74a4SFlorian Hahn
6c49b74a4SFlorian Hahndefine void @test_versioned_with_sext_use(i32 %offset, ptr %dst) {
7c49b74a4SFlorian Hahn; CHECK-LABEL: define void @test_versioned_with_sext_use(
8c49b74a4SFlorian Hahn; CHECK-SAME: i32 [[OFFSET:%.*]], ptr [[DST:%.*]]) {
9c49b74a4SFlorian Hahn; CHECK-NEXT:  entry:
10c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_EXT:%.*]] = sext i32 [[OFFSET]] to i64
11c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_HEADER:%.*]]
12c49b74a4SFlorian Hahn; CHECK:       outer.header.loopexit:
13c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_2_NEXT:%.*]], [[INNER_LOOP:%.*]] ], [ [[IND_END:%.*]], [[MIDDLE_BLOCK:%.*]] ]
14c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_HEADER]]
15c49b74a4SFlorian Hahn; CHECK:       outer.header:
16c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_1:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_2_NEXT_LCSSA]], [[OUTER_HEADER_LOOPEXIT:%.*]] ]
17c49b74a4SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = call i1 @cond()
18c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[C]], label [[INNER_LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]
19c49b74a4SFlorian Hahn; CHECK:       inner.loop.preheader:
20c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
21c49b74a4SFlorian Hahn; CHECK:       vector.scevcheck:
22c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IDENT_CHECK:%.*]] = icmp ne i32 [[OFFSET]], 1
23c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
24c49b74a4SFlorian Hahn; CHECK:       vector.ph:
25c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = mul i64 200, [[OFFSET_EXT]]
26c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IND_END]] = add i64 [[IV_1]], [[TMP0]]
27c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
28c49b74a4SFlorian Hahn; CHECK:       vector.body:
29c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
30c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[INDEX]], [[OFFSET_EXT]]
31c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i64 [[IV_1]], [[TMP1]]
32c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 0, [[OFFSET_EXT]]
33c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[OFFSET_IDX]], [[TMP2]]
34c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP3]]
35c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i32, ptr [[TMP4]], i32 0
36c49b74a4SFlorian Hahn; CHECK-NEXT:    store <4 x i32> zeroinitializer, ptr [[TMP5]], align 8
37c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
38c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 200
39c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
40c49b74a4SFlorian Hahn; CHECK:       middle.block:
41c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[OUTER_HEADER_LOOPEXIT]], label [[SCALAR_PH]]
42c49b74a4SFlorian Hahn; CHECK:       scalar.ph:
434ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[IV_1]], [[VECTOR_SCEVCHECK]] ], [ [[IV_1]], [[INNER_LOOP_PREHEADER]] ]
444ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 200, [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[INNER_LOOP_PREHEADER]] ]
45c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[INNER_LOOP]]
46c49b74a4SFlorian Hahn; CHECK:       inner.loop:
47c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2:%.*]] = phi i64 [ [[IV_2_NEXT]], [[INNER_LOOP]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
48c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3:%.*]] = phi i32 [ [[IV_3_NEXT:%.*]], [[INNER_LOOP]] ], [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ]
49c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[DST]], i64 [[IV_2]]
50c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[GEP]], align 8
51c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_NEXT]] = add i64 [[IV_2]], [[OFFSET_EXT]]
52c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3_NEXT]] = add i32 [[IV_3]], 1
53c49b74a4SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_3]], 200
54c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[OUTER_HEADER_LOOPEXIT]], label [[INNER_LOOP]], !llvm.loop [[LOOP3:![0-9]+]]
55c49b74a4SFlorian Hahn; CHECK:       exit:
56c49b74a4SFlorian Hahn; CHECK-NEXT:    ret void
57c49b74a4SFlorian Hahn;
58c49b74a4SFlorian Hahnentry:
59c49b74a4SFlorian Hahn  %offset.ext = sext i32 %offset to i64
60c49b74a4SFlorian Hahn  br label %outer.header
61c49b74a4SFlorian Hahn
62c49b74a4SFlorian Hahnouter.header:
63c49b74a4SFlorian Hahn  %iv.1 = phi i64 [ 0, %entry ], [ %iv.2.next, %inner.loop ]
64c49b74a4SFlorian Hahn  %c = call i1 @cond()
65c49b74a4SFlorian Hahn  br i1 %c, label %inner.loop, label %exit
66c49b74a4SFlorian Hahn
67c49b74a4SFlorian Hahninner.loop:
68c49b74a4SFlorian Hahn  %iv.2 = phi i64 [ %iv.1, %outer.header ], [ %iv.2.next, %inner.loop ]
69c49b74a4SFlorian Hahn  %iv.3 = phi i32 [ 0, %outer.header ], [ %iv.3.next, %inner.loop ]
70c49b74a4SFlorian Hahn  %gep = getelementptr i32, ptr %dst, i64 %iv.2
71c49b74a4SFlorian Hahn  store i32 0, ptr %gep, align 8
72c49b74a4SFlorian Hahn  %iv.2.next = add i64 %iv.2, %offset.ext
73c49b74a4SFlorian Hahn  %iv.3.next = add i32 %iv.3, 1
74c49b74a4SFlorian Hahn  %ec = icmp eq i32 %iv.3, 200
75c49b74a4SFlorian Hahn  br i1 %ec, label %outer.header, label %inner.loop
76c49b74a4SFlorian Hahn
77c49b74a4SFlorian Hahnexit:
78c49b74a4SFlorian Hahn  ret void
79c49b74a4SFlorian Hahn}
80c49b74a4SFlorian Hahn
81c49b74a4SFlorian Hahndefine void @test_versioned_with_zext_use(i32 %offset, ptr %dst) {
82c49b74a4SFlorian Hahn; CHECK-LABEL: define void @test_versioned_with_zext_use(
83c49b74a4SFlorian Hahn; CHECK-SAME: i32 [[OFFSET:%.*]], ptr [[DST:%.*]]) {
84c49b74a4SFlorian Hahn; CHECK-NEXT:  entry:
85c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_EXT:%.*]] = zext i32 [[OFFSET]] to i64
86c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_HEADER:%.*]]
87c49b74a4SFlorian Hahn; CHECK:       outer.header.loopexit:
88c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_2_NEXT:%.*]], [[INNER_LOOP:%.*]] ], [ [[IND_END:%.*]], [[MIDDLE_BLOCK:%.*]] ]
89c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_HEADER]]
90c49b74a4SFlorian Hahn; CHECK:       outer.header:
91c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_1:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_2_NEXT_LCSSA]], [[OUTER_HEADER_LOOPEXIT:%.*]] ]
92c49b74a4SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = call i1 @cond()
93c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[C]], label [[INNER_LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]
94c49b74a4SFlorian Hahn; CHECK:       inner.loop.preheader:
95c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
96c49b74a4SFlorian Hahn; CHECK:       vector.scevcheck:
97c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IDENT_CHECK:%.*]] = icmp ne i32 [[OFFSET]], 1
98c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
99c49b74a4SFlorian Hahn; CHECK:       vector.ph:
100c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = mul i64 200, [[OFFSET_EXT]]
101c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IND_END]] = add i64 [[IV_1]], [[TMP0]]
102c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
103c49b74a4SFlorian Hahn; CHECK:       vector.body:
104c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
105c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[INDEX]], [[OFFSET_EXT]]
106c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i64 [[IV_1]], [[TMP1]]
107c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 0, [[OFFSET_EXT]]
108c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[OFFSET_IDX]], [[TMP2]]
109c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr i32, ptr [[DST]], i64 [[TMP3]]
110c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i32, ptr [[TMP4]], i32 0
111c49b74a4SFlorian Hahn; CHECK-NEXT:    store <4 x i32> zeroinitializer, ptr [[TMP5]], align 8
112c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
113c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 200
114c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[TMP7]], label [[MIDDLE_BLOCK]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
115c49b74a4SFlorian Hahn; CHECK:       middle.block:
116c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[OUTER_HEADER_LOOPEXIT]], label [[SCALAR_PH]]
117c49b74a4SFlorian Hahn; CHECK:       scalar.ph:
1184ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[IV_1]], [[VECTOR_SCEVCHECK]] ], [ [[IV_1]], [[INNER_LOOP_PREHEADER]] ]
1194ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 200, [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[INNER_LOOP_PREHEADER]] ]
120c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[INNER_LOOP]]
121c49b74a4SFlorian Hahn; CHECK:       inner.loop:
122c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2:%.*]] = phi i64 [ [[IV_2_NEXT]], [[INNER_LOOP]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
123c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3:%.*]] = phi i32 [ [[IV_3_NEXT:%.*]], [[INNER_LOOP]] ], [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ]
124c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[DST]], i64 [[IV_2]]
125c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[GEP]], align 8
126c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_NEXT]] = add i64 [[IV_2]], [[OFFSET_EXT]]
127c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3_NEXT]] = add i32 [[IV_3]], 1
128c49b74a4SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_3]], 200
129c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[OUTER_HEADER_LOOPEXIT]], label [[INNER_LOOP]], !llvm.loop [[LOOP5:![0-9]+]]
130c49b74a4SFlorian Hahn; CHECK:       exit:
131c49b74a4SFlorian Hahn; CHECK-NEXT:    ret void
132c49b74a4SFlorian Hahn;
133c49b74a4SFlorian Hahnentry:
134c49b74a4SFlorian Hahn  %offset.ext = zext i32 %offset to i64
135c49b74a4SFlorian Hahn  br label %outer.header
136c49b74a4SFlorian Hahn
137c49b74a4SFlorian Hahnouter.header:
138c49b74a4SFlorian Hahn  %iv.1 = phi i64 [ 0, %entry ], [ %iv.2.next, %inner.loop ]
139c49b74a4SFlorian Hahn  %c = call i1 @cond()
140c49b74a4SFlorian Hahn  br i1 %c, label %inner.loop, label %exit
141c49b74a4SFlorian Hahn
142c49b74a4SFlorian Hahninner.loop:
143c49b74a4SFlorian Hahn  %iv.2 = phi i64 [ %iv.1, %outer.header ], [ %iv.2.next, %inner.loop ]
144c49b74a4SFlorian Hahn  %iv.3 = phi i32 [ 0, %outer.header ], [ %iv.3.next, %inner.loop ]
145c49b74a4SFlorian Hahn  %gep = getelementptr i32, ptr %dst, i64 %iv.2
146c49b74a4SFlorian Hahn  store i32 0, ptr %gep, align 8
147c49b74a4SFlorian Hahn  %iv.2.next = add i64 %iv.2, %offset.ext
148c49b74a4SFlorian Hahn  %iv.3.next = add i32 %iv.3, 1
149c49b74a4SFlorian Hahn  %ec = icmp eq i32 %iv.3, 200
150c49b74a4SFlorian Hahn  br i1 %ec, label %outer.header, label %inner.loop
151c49b74a4SFlorian Hahn
152c49b74a4SFlorian Hahnexit:
153c49b74a4SFlorian Hahn  ret void
154c49b74a4SFlorian Hahn}
155c49b74a4SFlorian Hahn
156c49b74a4SFlorian Hahndefine void @versioned_sext_use_in_gep(i32 %scale, ptr %dst, i64 %scale.2) {
157c49b74a4SFlorian Hahn; CHECK-LABEL: define void @versioned_sext_use_in_gep(
158c49b74a4SFlorian Hahn; CHECK-SAME: i32 [[SCALE:%.*]], ptr [[DST:%.*]], i64 [[SCALE_2:%.*]]) {
159c49b74a4SFlorian Hahn; CHECK-NEXT:  entry:
160c49b74a4SFlorian Hahn; CHECK-NEXT:    [[SCALE_EXT:%.*]] = sext i32 [[SCALE]] to i64
161c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
162c49b74a4SFlorian Hahn; CHECK:       vector.scevcheck:
163c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IDENT_CHECK:%.*]] = icmp ne i32 [[SCALE]], 1
164c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
165c49b74a4SFlorian Hahn; CHECK:       vector.ph:
166a861ed41SFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr i8, ptr [[DST]], i64 [[SCALE_2]]
167a861ed41SFlorian Hahn; CHECK-NEXT:    [[TMP81:%.*]] = getelementptr i8, ptr [[DST]], i64 [[SCALE_2]]
168a861ed41SFlorian Hahn; CHECK-NEXT:    [[TMP82:%.*]] = getelementptr i8, ptr [[DST]], i64 [[SCALE_2]]
169a861ed41SFlorian Hahn; CHECK-NEXT:    [[TMP83:%.*]] = getelementptr i8, ptr [[DST]], i64 [[SCALE_2]]
170c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
171c49b74a4SFlorian Hahn; CHECK:       vector.body:
172c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
1739ee8e38cSFlorian Hahn; CHECK-NEXT:    [[TMP10:%.*]] = add i64 [[INDEX]], 0
1749ee8e38cSFlorian Hahn; CHECK-NEXT:    [[TMP12:%.*]] = add i64 [[INDEX]], 1
1759ee8e38cSFlorian Hahn; CHECK-NEXT:    [[TMP14:%.*]] = add i64 [[INDEX]], 2
1769ee8e38cSFlorian Hahn; CHECK-NEXT:    [[TMP16:%.*]] = add i64 [[INDEX]], 3
177c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP10]]
178c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP12]]
179c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP14]]
180c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP16]]
1819ee8e38cSFlorian Hahn; CHECK-NEXT:    store ptr [[TMP8]], ptr [[TMP11]], align 8
1824eb98384SFlorian Hahn; CHECK-NEXT:    store ptr [[TMP8]], ptr [[TMP13]], align 8
1834eb98384SFlorian Hahn; CHECK-NEXT:    store ptr [[TMP8]], ptr [[TMP15]], align 8
1844eb98384SFlorian Hahn; CHECK-NEXT:    store ptr [[TMP8]], ptr [[TMP17]], align 8
185c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
186c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 256
187c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
188c49b74a4SFlorian Hahn; CHECK:       middle.block:
189c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
190c49b74a4SFlorian Hahn; CHECK:       scalar.ph:
1914ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 256, [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[ENTRY:%.*]] ]
192c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
193c49b74a4SFlorian Hahn; CHECK:       loop:
194c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
195c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_MUL:%.*]] = mul i64 [[IV]], [[SCALE_EXT]]
196c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i8, ptr [[DST]], i64 [[IV_MUL]]
197c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
198c49b74a4SFlorian Hahn; CHECK-NEXT:    [[SCALE_MUL:%.*]] = mul i64 [[SCALE_EXT]], [[SCALE_2]]
199c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr i8, ptr [[DST]], i64 [[SCALE_MUL]]
200c49b74a4SFlorian Hahn; CHECK-NEXT:    store ptr [[GEP_2]], ptr [[GEP_1]], align 8
201c49b74a4SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 256
202c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]
203c49b74a4SFlorian Hahn; CHECK:       exit:
204c49b74a4SFlorian Hahn; CHECK-NEXT:    ret void
205c49b74a4SFlorian Hahn;
206c49b74a4SFlorian Hahnentry:
207c49b74a4SFlorian Hahn  %scale.ext = sext i32 %scale to i64
208c49b74a4SFlorian Hahn  br label %loop
209c49b74a4SFlorian Hahn
210c49b74a4SFlorian Hahnloop:
211c49b74a4SFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
212c49b74a4SFlorian Hahn  %iv.mul  = mul i64 %iv, %scale.ext
213c49b74a4SFlorian Hahn  %gep.1 = getelementptr i8, ptr %dst, i64 %iv.mul
214c49b74a4SFlorian Hahn  %iv.next = add i64 %iv, 1
215c49b74a4SFlorian Hahn  %scale.mul = mul i64 %scale.ext, %scale.2
216c49b74a4SFlorian Hahn  %gep.2 = getelementptr i8, ptr %dst, i64 %scale.mul
217c49b74a4SFlorian Hahn  store ptr %gep.2, ptr %gep.1, align 8
218c49b74a4SFlorian Hahn  %ec = icmp eq i64 %iv.next, 256
219c49b74a4SFlorian Hahn  br i1 %ec, label %exit, label %loop
220c49b74a4SFlorian Hahn
221c49b74a4SFlorian Hahnexit:
222c49b74a4SFlorian Hahn  ret void
223c49b74a4SFlorian Hahn}
224c49b74a4SFlorian Hahn
225c49b74a4SFlorian Hahndeclare i1 @cond()
226c49b74a4SFlorian Hahn
227c49b74a4SFlorian Hahndefine void @test_versioned_with_different_uses(i32 %offset, ptr noalias %dst.1, ptr %dst.2) {
228c49b74a4SFlorian Hahn; CHECK-LABEL: define void @test_versioned_with_different_uses(
229c49b74a4SFlorian Hahn; CHECK-SAME: i32 [[OFFSET:%.*]], ptr noalias [[DST_1:%.*]], ptr [[DST_2:%.*]]) {
230c49b74a4SFlorian Hahn; CHECK-NEXT:  entry:
231c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_EXT:%.*]] = zext i32 [[OFFSET]] to i64
232c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_HEADER:%.*]]
233c49b74a4SFlorian Hahn; CHECK:       outer.header.loopexit:
234c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_2_NEXT:%.*]], [[INNER_LOOP:%.*]] ], [ [[IND_END:%.*]], [[MIDDLE_BLOCK:%.*]] ]
235c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[OUTER_HEADER]]
236c49b74a4SFlorian Hahn; CHECK:       outer.header:
237c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_1:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_2_NEXT_LCSSA]], [[OUTER_HEADER_LOOPEXIT:%.*]] ]
238c49b74a4SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = call i1 @cond()
239c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[C]], label [[INNER_LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]
240c49b74a4SFlorian Hahn; CHECK:       inner.loop.preheader:
241c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
242c49b74a4SFlorian Hahn; CHECK:       vector.scevcheck:
243c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IDENT_CHECK:%.*]] = icmp ne i32 [[OFFSET]], 1
244c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
245c49b74a4SFlorian Hahn; CHECK:       vector.ph:
246c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = mul i64 200, [[OFFSET_EXT]]
247c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IND_END]] = add i64 [[IV_1]], [[TMP0]]
248c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
249c49b74a4SFlorian Hahn; CHECK:       vector.body:
250c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
251c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 [[INDEX]], [[OFFSET_EXT]]
252c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = add i64 [[IV_1]], [[TMP1]]
253c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 0, [[OFFSET_EXT]]
254c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[OFFSET_IDX]], [[TMP2]]
255c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_IDX2:%.*]] = trunc i64 [[INDEX]] to i32
256c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = add i32 [[OFFSET_IDX2]], 0
257c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = add i32 [[OFFSET_IDX2]], 1
258c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = add i32 [[OFFSET_IDX2]], 2
259c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[OFFSET_IDX2]], 3
260c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP4]]
261c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP5]]
262c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP6]]
263c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP11:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP7]]
264c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP8]], align 8
265c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP9]], align 8
266c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP10]], align 8
267c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP11]], align 8
268c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr i32, ptr [[DST_2]], i64 [[TMP3]]
269c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr i32, ptr [[TMP12]], i32 0
270c49b74a4SFlorian Hahn; CHECK-NEXT:    store <4 x i32> zeroinitializer, ptr [[TMP13]], align 8
271c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
272c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT]], 200
273c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[TMP15]], label [[MIDDLE_BLOCK]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
274c49b74a4SFlorian Hahn; CHECK:       middle.block:
275c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[OUTER_HEADER_LOOPEXIT]], label [[SCALAR_PH]]
276c49b74a4SFlorian Hahn; CHECK:       scalar.ph:
2774ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[IV_1]], [[VECTOR_SCEVCHECK]] ], [ [[IV_1]], [[INNER_LOOP_PREHEADER]] ]
2784ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 200, [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[INNER_LOOP_PREHEADER]] ]
279c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[INNER_LOOP]]
280c49b74a4SFlorian Hahn; CHECK:       inner.loop:
281c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2:%.*]] = phi i64 [ [[IV_2_NEXT]], [[INNER_LOOP]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
282c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3:%.*]] = phi i32 [ [[IV_3_NEXT:%.*]], [[INNER_LOOP]] ], [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ]
283c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_MUL:%.*]] = mul i32 [[IV_3]], [[OFFSET]]
284c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP_MUL:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[IV_MUL]]
285c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[GEP_MUL]], align 8
286c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[DST_2]], i64 [[IV_2]]
287c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[GEP]], align 8
288c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_NEXT]] = add i64 [[IV_2]], [[OFFSET_EXT]]
289c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3_NEXT]] = add i32 [[IV_3]], 1
290c49b74a4SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_3]], 200
291c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[OUTER_HEADER_LOOPEXIT]], label [[INNER_LOOP]], !llvm.loop [[LOOP9:![0-9]+]]
292c49b74a4SFlorian Hahn; CHECK:       exit:
293c49b74a4SFlorian Hahn; CHECK-NEXT:    ret void
294c49b74a4SFlorian Hahn;
295c49b74a4SFlorian Hahnentry:
296c49b74a4SFlorian Hahn  %offset.ext = zext i32 %offset to i64
297c49b74a4SFlorian Hahn  br label %outer.header
298c49b74a4SFlorian Hahn
299c49b74a4SFlorian Hahnouter.header:
300c49b74a4SFlorian Hahn  %iv.1 = phi i64 [ 0, %entry ], [ %iv.2.next, %inner.loop ]
301c49b74a4SFlorian Hahn  %c = call i1 @cond()
302c49b74a4SFlorian Hahn  br i1 %c, label %inner.loop, label %exit
303c49b74a4SFlorian Hahn
304c49b74a4SFlorian Hahninner.loop:
305c49b74a4SFlorian Hahn  %iv.2 = phi i64 [ %iv.1, %outer.header ], [ %iv.2.next, %inner.loop ]
306c49b74a4SFlorian Hahn  %iv.3 = phi i32 [ 0, %outer.header ], [ %iv.3.next, %inner.loop ]
307c49b74a4SFlorian Hahn  %iv.mul  = mul i32 %iv.3, %offset
308c49b74a4SFlorian Hahn  %gep.mul = getelementptr i8, ptr %dst.1, i32 %iv.mul
309c49b74a4SFlorian Hahn  store i32 0, ptr %gep.mul, align 8
310c49b74a4SFlorian Hahn  %gep = getelementptr i32, ptr %dst.2, i64 %iv.2
311c49b74a4SFlorian Hahn  store i32 0, ptr %gep, align 8
312c49b74a4SFlorian Hahn  %iv.2.next = add i64 %iv.2, %offset.ext
313c49b74a4SFlorian Hahn  %iv.3.next = add i32 %iv.3, 1
314c49b74a4SFlorian Hahn  %ec = icmp eq i32 %iv.3, 200
315c49b74a4SFlorian Hahn  br i1 %ec, label %outer.header, label %inner.loop
316c49b74a4SFlorian Hahn
317c49b74a4SFlorian Hahnexit:
318c49b74a4SFlorian Hahn  ret void
319c49b74a4SFlorian Hahn}
320c49b74a4SFlorian Hahn
321c49b74a4SFlorian Hahndefine void @test_versioned_with_non_ex_use(i32 %offset, ptr noalias %dst.1, ptr %dst.2) {
322c49b74a4SFlorian Hahn; CHECK-LABEL: define void @test_versioned_with_non_ex_use(
323c49b74a4SFlorian Hahn; CHECK-SAME: i32 [[OFFSET:%.*]], ptr noalias [[DST_1:%.*]], ptr [[DST_2:%.*]]) {
324c49b74a4SFlorian Hahn; CHECK-NEXT:  entry:
325c49b74a4SFlorian Hahn; CHECK-NEXT:    [[OFFSET_EXT:%.*]] = zext i32 [[OFFSET]] to i64
326c49b74a4SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[OFFSET]], 3
327c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
328c49b74a4SFlorian Hahn; CHECK:       vector.scevcheck:
329c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = sub i32 -3, [[OFFSET]]
330c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[ADD]], 0
331c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 [[ADD]]
332c49b74a4SFlorian Hahn; CHECK-NEXT:    [[MUL:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[TMP2]], i32 200)
333c49b74a4SFlorian Hahn; CHECK-NEXT:    [[MUL_RESULT:%.*]] = extractvalue { i32, i1 } [[MUL]], 0
334c49b74a4SFlorian Hahn; CHECK-NEXT:    [[MUL_OVERFLOW:%.*]] = extractvalue { i32, i1 } [[MUL]], 1
335c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP3:%.*]] = sub i32 0, [[MUL_RESULT]]
336c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt i32 [[MUL_RESULT]], 0
337c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = icmp sgt i32 [[TMP3]], 0
338c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = select i1 [[TMP1]], i1 [[TMP5]], i1 [[TMP4]]
339c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = or i1 [[TMP6]], [[MUL_OVERFLOW]]
340c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IDENT_CHECK:%.*]] = icmp ne i32 [[OFFSET]], 1
341c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = or i1 [[TMP7]], [[IDENT_CHECK]]
342c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[TMP8]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
343c49b74a4SFlorian Hahn; CHECK:       vector.ph:
344c49b74a4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[ADD]], i64 0
345c49b74a4SFlorian Hahn; CHECK-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
346c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
347c49b74a4SFlorian Hahn; CHECK:       vector.body:
348c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
349c49b74a4SFlorian Hahn; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
350c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP9:%.*]] = add i64 [[INDEX]], 0
351c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP10:%.*]] = mul <4 x i32> [[VEC_IND]], [[BROADCAST_SPLAT]]
352c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <4 x i32> [[TMP10]], i32 0
353c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP11]]
354c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <4 x i32> [[TMP10]], i32 1
355c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP13]]
356c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP15:%.*]] = extractelement <4 x i32> [[TMP10]], i32 2
357c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP15]]
358c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP17:%.*]] = extractelement <4 x i32> [[TMP10]], i32 3
359c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[TMP17]]
360c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP12]], align 8
361c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP14]], align 8
362c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP16]], align 8
363c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[TMP18]], align 8
3649ee8e38cSFlorian Hahn; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr i32, ptr [[DST_2]], i64 [[TMP9]]
365c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP21:%.*]] = getelementptr i32, ptr [[TMP20]], i32 0
366c49b74a4SFlorian Hahn; CHECK-NEXT:    store <4 x i32> zeroinitializer, ptr [[TMP21]], align 8
367c49b74a4SFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
36838fffa63SPaul Walker; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 4)
369c49b74a4SFlorian Hahn; CHECK-NEXT:    [[TMP22:%.*]] = icmp eq i64 [[INDEX_NEXT]], 200
370c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[TMP22]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
371c49b74a4SFlorian Hahn; CHECK:       middle.block:
372c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]]
373c49b74a4SFlorian Hahn; CHECK:       scalar.ph:
3744ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 200, [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[ENTRY:%.*]] ]
3754ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 200, [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[ENTRY]] ]
376c49b74a4SFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
377c49b74a4SFlorian Hahn; CHECK:       loop:
378c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_2_NEXT:%.*]], [[LOOP]] ]
379c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3:%.*]] = phi i32 [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[IV_3_NEXT:%.*]], [[LOOP]] ]
380c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_MUL:%.*]] = mul i32 [[IV_3]], [[ADD]]
381c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP_MUL:%.*]] = getelementptr i8, ptr [[DST_1]], i32 [[IV_MUL]]
382c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[GEP_MUL]], align 8
383c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_MUL:%.*]] = mul i64 [[IV_2]], [[OFFSET_EXT]]
384c49b74a4SFlorian Hahn; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[DST_2]], i64 [[IV_2_MUL]]
385c49b74a4SFlorian Hahn; CHECK-NEXT:    store i32 0, ptr [[GEP]], align 8
386c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_2_NEXT]] = add i64 [[IV_2]], 1
387c49b74a4SFlorian Hahn; CHECK-NEXT:    [[IV_3_NEXT]] = add i32 [[IV_3]], 1
388c49b74a4SFlorian Hahn; CHECK-NEXT:    [[EC:%.*]] = icmp eq i32 [[IV_3]], 200
389c49b74a4SFlorian Hahn; CHECK-NEXT:    br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP11:![0-9]+]]
390c49b74a4SFlorian Hahn; CHECK:       exit:
391c49b74a4SFlorian Hahn; CHECK-NEXT:    ret void
392c49b74a4SFlorian Hahn;
393c49b74a4SFlorian Hahnentry:
394c49b74a4SFlorian Hahn  %offset.ext = zext i32 %offset to i64
395c49b74a4SFlorian Hahn  %add = add i32 %offset, 3
396c49b74a4SFlorian Hahn  br label %loop
397c49b74a4SFlorian Hahn
398c49b74a4SFlorian Hahnloop:
399c49b74a4SFlorian Hahn  %iv.2 = phi i64 [ 0, %entry ], [ %iv.2.next, %loop ]
400c49b74a4SFlorian Hahn  %iv.3 = phi i32 [ 0, %entry ], [ %iv.3.next, %loop ]
401c49b74a4SFlorian Hahn  %iv.mul  = mul i32 %iv.3, %add
402c49b74a4SFlorian Hahn  %gep.mul = getelementptr i8, ptr %dst.1, i32 %iv.mul
403c49b74a4SFlorian Hahn  store i32 0, ptr %gep.mul, align 8
404c49b74a4SFlorian Hahn  %iv.2.mul  = mul i64 %iv.2, %offset.ext
405c49b74a4SFlorian Hahn  %gep = getelementptr i32, ptr %dst.2, i64 %iv.2.mul
406c49b74a4SFlorian Hahn  store i32 0, ptr %gep, align 8
407c49b74a4SFlorian Hahn  %iv.2.next = add i64 %iv.2, 1
408c49b74a4SFlorian Hahn  %iv.3.next = add i32 %iv.3, 1
409c49b74a4SFlorian Hahn  %ec = icmp eq i32 %iv.3, 200
410c49b74a4SFlorian Hahn  br i1 %ec, label %exit, label %loop
411c49b74a4SFlorian Hahn
412c49b74a4SFlorian Hahnexit:
413c49b74a4SFlorian Hahn  ret void
414c49b74a4SFlorian Hahn}
415c76ccf0fSFlorian Hahn
416c76ccf0fSFlorian Hahn; Test case to make sure that uses of versioned strides of type i1 are properly
417c76ccf0fSFlorian Hahn; extended. From https://github.com/llvm/llvm-project/issues/91369.
418c7496cebSFlorian Hahn; TODO: Better check (udiv i64 15, %g.64) after checking if %g == 1.
419c76ccf0fSFlorian Hahndefine void @zext_of_i1_stride(i1 %g, ptr %dst) mustprogress {
420c76ccf0fSFlorian Hahn; CHECK-LABEL: define void @zext_of_i1_stride(
421c76ccf0fSFlorian Hahn; CHECK-SAME: i1 [[G:%.*]], ptr [[DST:%.*]]) #[[ATTR0:[0-9]+]] {
422c76ccf0fSFlorian Hahn; CHECK-NEXT:  entry:
423c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[G_16:%.*]] = zext i1 [[G]] to i16
424c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[G_64:%.*]] = zext i1 [[G]] to i64
425c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = udiv i64 15, [[G_64]]
426c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = add nuw nsw i64 [[TMP0]], 1
427c7496cebSFlorian Hahn; CHECK-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
428c76ccf0fSFlorian Hahn; CHECK:       vector.scevcheck:
429c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IDENT_CHECK:%.*]] = icmp ne i1 [[G]], true
430c76ccf0fSFlorian Hahn; CHECK-NEXT:    br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
431c76ccf0fSFlorian Hahn; CHECK:       vector.ph:
432c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP1]], 4
433c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP1]], [[N_MOD_VF]]
434c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IND_END:%.*]] = mul i64 [[N_VEC]], [[G_64]]
435c76ccf0fSFlorian Hahn; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
436c76ccf0fSFlorian Hahn; CHECK:       vector.body:
437c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
438c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], [[G_64]]
439c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 0, [[G_64]]
440c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[OFFSET_IDX]], [[TMP2]]
441c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[TMP3]]
442c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i16, ptr [[TMP4]], i32 0
44338fffa63SPaul Walker; CHECK-NEXT:    store <4 x i16> splat (i16 1), ptr [[TMP5]], align 2
444c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
445c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
446c76ccf0fSFlorian Hahn; CHECK-NEXT:    br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]
447c76ccf0fSFlorian Hahn; CHECK:       middle.block:
448c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP1]], [[N_VEC]]
449c76ccf0fSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
450c76ccf0fSFlorian Hahn; CHECK:       scalar.ph:
4514ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[ENTRY:%.*]] ]
452c76ccf0fSFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
453c76ccf0fSFlorian Hahn; CHECK:       loop:
454c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
455c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[IV]]
456c76ccf0fSFlorian Hahn; CHECK-NEXT:    store i16 [[G_16]], ptr [[GEP]], align 2
457c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], [[G_64]]
458c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 16
459c76ccf0fSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP13:![0-9]+]]
460c76ccf0fSFlorian Hahn; CHECK:       exit:
461c76ccf0fSFlorian Hahn; CHECK-NEXT:    ret void
462c76ccf0fSFlorian Hahn;
463c76ccf0fSFlorian Hahnentry:
464c76ccf0fSFlorian Hahn  %g.16 = zext i1 %g to i16
465c76ccf0fSFlorian Hahn  %g.64 = zext i1 %g to i64
466c76ccf0fSFlorian Hahn  br label %loop
467c76ccf0fSFlorian Hahn
468c76ccf0fSFlorian Hahnloop:
469c76ccf0fSFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
470c76ccf0fSFlorian Hahn  %gep = getelementptr inbounds i16, ptr %dst, i64 %iv
471c76ccf0fSFlorian Hahn  store i16 %g.16, ptr %gep, align 2
472c76ccf0fSFlorian Hahn  %iv.next = add nuw nsw i64 %iv, %g.64
473c76ccf0fSFlorian Hahn  %cmp = icmp ult i64 %iv.next, 16
474c76ccf0fSFlorian Hahn  br i1 %cmp, label %loop, label %exit
475c76ccf0fSFlorian Hahn
476c76ccf0fSFlorian Hahnexit:
477c76ccf0fSFlorian Hahn  ret void
478c76ccf0fSFlorian Hahn}
479c76ccf0fSFlorian Hahn
480c76ccf0fSFlorian Hahn; Test case to make sure that uses of versioned strides of type i1 are properly
481c76ccf0fSFlorian Hahn; extended.
482c76ccf0fSFlorian Hahndefine void @sext_of_i1_stride(i1 %g, ptr %dst) mustprogress {
483c76ccf0fSFlorian Hahn; CHECK-LABEL: define void @sext_of_i1_stride(
484c76ccf0fSFlorian Hahn; CHECK-SAME: i1 [[G:%.*]], ptr [[DST:%.*]]) #[[ATTR0]] {
485c76ccf0fSFlorian Hahn; CHECK-NEXT:  entry:
486c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[G_16:%.*]] = sext i1 [[G]] to i16
487c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[G_64:%.*]] = sext i1 [[G]] to i64
488c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[UMAX:%.*]] = call i64 @llvm.umax.i64(i64 [[G_64]], i64 16)
489c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP0:%.*]] = add i64 [[UMAX]], -1
490c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = udiv i64 [[TMP0]], [[G_64]]
491c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP2:%.*]] = add nuw nsw i64 [[TMP1]], 1
492c7496cebSFlorian Hahn; CHECK-NEXT:    br i1 true, label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
493c76ccf0fSFlorian Hahn; CHECK:       vector.scevcheck:
494c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IDENT_CHECK:%.*]] = icmp ne i1 [[G]], true
495c76ccf0fSFlorian Hahn; CHECK-NEXT:    br i1 [[IDENT_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
496c76ccf0fSFlorian Hahn; CHECK:       vector.ph:
497c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP2]], 4
498c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP2]], [[N_MOD_VF]]
499c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IND_END:%.*]] = mul i64 [[N_VEC]], [[G_64]]
500c76ccf0fSFlorian Hahn; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
501c76ccf0fSFlorian Hahn; CHECK:       vector.body:
502*f48884deSFlorian Hahn; CHECK-NEXT:    [[TMP8:%.*]] = mul i64 0, [[G_64]]
503*f48884deSFlorian Hahn; CHECK-NEXT:    [[TMP4:%.*]] = add i64 0, [[TMP8]]
504c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[TMP4]]
505c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i16, ptr [[TMP5]], i32 0
506c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i16, ptr [[TMP6]], i32 -3
50738fffa63SPaul Walker; CHECK-NEXT:    store <4 x i16> splat (i16 -1), ptr [[TMP7]], align 2
508*f48884deSFlorian Hahn; CHECK-NEXT:    br label [[MIDDLE_BLOCK:%.*]]
509c76ccf0fSFlorian Hahn; CHECK:       middle.block:
510c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[N_VEC]]
511c76ccf0fSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]
512c76ccf0fSFlorian Hahn; CHECK:       scalar.ph:
5134ad0fdd1SFlorian Hahn; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[VECTOR_SCEVCHECK]] ], [ 0, [[ENTRY:%.*]] ]
514c76ccf0fSFlorian Hahn; CHECK-NEXT:    br label [[LOOP:%.*]]
515c76ccf0fSFlorian Hahn; CHECK:       loop:
516c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
517c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[IV]]
518c76ccf0fSFlorian Hahn; CHECK-NEXT:    store i16 [[G_16]], ptr [[GEP]], align 2
519c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], [[G_64]]
520c76ccf0fSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[IV_NEXT]], 16
521*f48884deSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP14:![0-9]+]]
522c76ccf0fSFlorian Hahn; CHECK:       exit:
523c76ccf0fSFlorian Hahn; CHECK-NEXT:    ret void
524c76ccf0fSFlorian Hahn;
525c76ccf0fSFlorian Hahnentry:
526c76ccf0fSFlorian Hahn  %g.16 = sext i1 %g to i16
527c76ccf0fSFlorian Hahn  %g.64 = sext i1 %g to i64
528c76ccf0fSFlorian Hahn  br label %loop
529c76ccf0fSFlorian Hahn
530c76ccf0fSFlorian Hahnloop:
531c76ccf0fSFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
532c76ccf0fSFlorian Hahn  %gep = getelementptr inbounds i16, ptr %dst, i64 %iv
533c76ccf0fSFlorian Hahn  store i16 %g.16, ptr %gep, align 2
534c76ccf0fSFlorian Hahn  %iv.next = add nuw nsw i64 %iv, %g.64
535c76ccf0fSFlorian Hahn  %cmp = icmp ult i64 %iv.next, 16
536c76ccf0fSFlorian Hahn  br i1 %cmp, label %loop, label %exit
537c76ccf0fSFlorian Hahn
538c76ccf0fSFlorian Hahnexit:
539c76ccf0fSFlorian Hahn  ret void
540c76ccf0fSFlorian Hahn}
541c76ccf0fSFlorian Hahn
542c76ccf0fSFlorian Hahn
543c49b74a4SFlorian Hahn;.
544c49b74a4SFlorian Hahn; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
545c49b74a4SFlorian Hahn; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
546c49b74a4SFlorian Hahn; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
547c49b74a4SFlorian Hahn; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]}
548c49b74a4SFlorian Hahn; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
549c49b74a4SFlorian Hahn; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META1]]}
550c49b74a4SFlorian Hahn; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]}
551c49b74a4SFlorian Hahn; CHECK: [[LOOP7]] = distinct !{[[LOOP7]], [[META1]]}
552c49b74a4SFlorian Hahn; CHECK: [[LOOP8]] = distinct !{[[LOOP8]], [[META1]], [[META2]]}
553c49b74a4SFlorian Hahn; CHECK: [[LOOP9]] = distinct !{[[LOOP9]], [[META1]]}
554c49b74a4SFlorian Hahn; CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META1]], [[META2]]}
555c49b74a4SFlorian Hahn; CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META1]]}
556c76ccf0fSFlorian Hahn; CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META1]], [[META2]]}
557c76ccf0fSFlorian Hahn; CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META1]]}
558*f48884deSFlorian Hahn; CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META1]]}
559c49b74a4SFlorian Hahn;.
560