1; RUN: opt < %s  -loop-vectorize -force-vector-interleave=1 -force-target-supports-scalable-vectors=true -dce -instcombine -S -scalable-vectorization=on | FileCheck %s
2; RUN: opt < %s  -loop-vectorize -force-vector-interleave=1 -force-target-supports-scalable-vectors=true -dce -instcombine -S -scalable-vectorization=preferred | FileCheck %s
3
4target 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
6; CHECK-LABEL: @test1(
7; CHECK: store <8 x i32>
8; CHECK: ret void
9define void @test1(i32* nocapture %a, i32 %n) #0 {
10entry:
11  %cmp4 = icmp sgt i32 %n, 0
12  br i1 %cmp4, label %for.body, label %for.end
13
14for.body:                                         ; preds = %entry, %for.body
15  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
16  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
17  store i32 42, i32* %arrayidx, align 4
18  %indvars.iv.next = add i64 %indvars.iv, 1
19  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
20  %exitcond = icmp eq i32 %lftr.wideiv, %n
21  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !0
22
23for.end:                                          ; preds = %for.body, %entry
24  ret void
25}
26
27; CHECK-LABEL: @test2(
28; CHECK: store <vscale x 8 x i32>
29; CHECK: ret void
30define void @test2(i32* nocapture %a, i32 %n) #0 {
31entry:
32  %cmp4 = icmp sgt i32 %n, 0
33  br i1 %cmp4, label %for.body, label %for.end
34
35for.body:                                         ; preds = %entry, %for.body
36  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
37  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
38  store i32 42, i32* %arrayidx, align 4
39  %indvars.iv.next = add i64 %indvars.iv, 1
40  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
41  %exitcond = icmp eq i32 %lftr.wideiv, %n
42  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !2
43
44for.end:                                          ; preds = %for.body, %entry
45  ret void
46}
47
48; CHECK-LABEL: @test3(
49; CHECK: store <8 x i32>
50; CHECK: ret void
51define void @test3(i32* nocapture %a, i32 %n) #0 {
52entry:
53  %cmp4 = icmp sgt i32 %n, 0
54  br i1 %cmp4, label %for.body, label %for.end
55
56for.body:                                         ; preds = %entry, %for.body
57  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
58  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
59  store i32 42, i32* %arrayidx, align 4
60  %indvars.iv.next = add i64 %indvars.iv, 1
61  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
62  %exitcond = icmp eq i32 %lftr.wideiv, %n
63  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4
64
65for.end:                                          ; preds = %for.body, %entry
66  ret void
67}
68
69; Test that when only the width property is specified, and not the scalable.enable flag,
70; that the hint defaults to 'scalable.enable = false'.
71
72; CHECK-LABEL: @test4(
73; CHECK: store <8 x i32>
74; CHECK: ret void
75define void @test4(i32* nocapture %a, i32 %n) #0 {
76entry:
77  %cmp4 = icmp sgt i32 %n, 0
78  br i1 %cmp4, label %for.body, label %for.end
79
80for.body:                                         ; preds = %entry, %for.body
81  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
82  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
83  store i32 42, i32* %arrayidx, align 4
84  %indvars.iv.next = add i64 %indvars.iv, 1
85  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
86  %exitcond = icmp eq i32 %lftr.wideiv, %n
87  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !6
88
89for.end:                                          ; preds = %for.body, %entry
90  ret void
91}
92
93attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
94
95!0 = !{!0, !1, !5}
96!1 = !{!"llvm.loop.vectorize.width", i32 8}
97!2 = !{!2, !1, !3}
98!3 = !{!"llvm.loop.vectorize.scalable.enable", i32 1}
99!4 = !{!4, !1, !5}
100!5 = !{!"llvm.loop.vectorize.scalable.enable", i32 0}
101!6 = !{!6, !7}
102!7 = !{!"llvm.loop.vectorize.width", i32 8}
103