1 ; RUN: opt -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -S < %s | FileCheck %s --check-prefix=CHECK
3 define i64 @select_icmp_nuw_nsw(ptr %a, ptr %b, i64 %ii, i64 %n) {
4 ; CHECK-LABEL: define i64 @select_icmp_nuw_nsw
5 ; CHECK-NOT: vector.body:
10 for.body: ; preds = %entry, %for.body
11 %iv = phi i64 [ %inc, %for.body ], [ 0, %entry ]
12 %rdx = phi i64 [ %cond, %for.body ], [ %ii, %entry ]
13 %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
14 %0 = load i64, ptr %arrayidx, align 8
15 %arrayidx1 = getelementptr inbounds i64, ptr %b, i64 %iv
16 %1 = load i64, ptr %arrayidx1, align 8
17 %cmp2 = icmp sgt i64 %0, %1
18 %cond = select i1 %cmp2, i64 %iv, i64 %rdx
19 %inc = add nuw nsw i64 %iv, 1
20 %exitcond.not = icmp eq i64 %inc, %n
21 br i1 %exitcond.not, label %exit, label %for.body
23 exit: ; preds = %for.body
27 define i64 @select_icmp_nsw(ptr %a, ptr %b, i64 %ii, i64 %n) {
28 ; CHECK-LABEL: define i64 @select_icmp_nsw
29 ; CHECK-NOT: vector.body:
34 for.body: ; preds = %entry, %for.body
35 %iv = phi i64 [ %inc, %for.body ], [ 0, %entry ]
36 %rdx = phi i64 [ %cond, %for.body ], [ %ii, %entry ]
37 %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
38 %0 = load i64, ptr %arrayidx, align 8
39 %arrayidx1 = getelementptr inbounds i64, ptr %b, i64 %iv
40 %1 = load i64, ptr %arrayidx1, align 8
41 %cmp2 = icmp sgt i64 %0, %1
42 %cond = select i1 %cmp2, i64 %iv, i64 %rdx
43 %inc = add nsw i64 %iv, 1
44 %exitcond.not = icmp eq i64 %inc, %n
45 br i1 %exitcond.not, label %exit, label %for.body
47 exit: ; preds = %for.body
51 define i64 @select_icmp_nuw(ptr %a, ptr %b, i64 %ii, i64 %n) {
52 ; CHECK-LABEL: define i64 @select_icmp_nuw
53 ; CHECK-NOT: vector.body:
58 for.body: ; preds = %entry, %for.body
59 %iv = phi i64 [ %inc, %for.body ], [ 0, %entry ]
60 %rdx = phi i64 [ %cond, %for.body ], [ %ii, %entry ]
61 %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
62 %0 = load i64, ptr %arrayidx, align 8
63 %arrayidx1 = getelementptr inbounds i64, ptr %b, i64 %iv
64 %1 = load i64, ptr %arrayidx1, align 8
65 %cmp2 = icmp sgt i64 %0, %1
66 %cond = select i1 %cmp2, i64 %iv, i64 %rdx
67 %inc = add nuw i64 %iv, 1
68 %exitcond.not = icmp eq i64 %inc, %n
69 br i1 %exitcond.not, label %exit, label %for.body
71 exit: ; preds = %for.body
75 define i64 @select_icmp_noflag(ptr %a, ptr %b, i64 %ii, i64 %n) {
76 ; CHECK-LABEL: define i64 @select_icmp_noflag
77 ; CHECK-NOT: vector.body:
82 for.body: ; preds = %entry, %for.body
83 %iv = phi i64 [ %inc, %for.body ], [ 0, %entry ]
84 %rdx = phi i64 [ %cond, %for.body ], [ %ii, %entry ]
85 %arrayidx = getelementptr inbounds i64, ptr %a, i64 %iv
86 %0 = load i64, ptr %arrayidx, align 8
87 %arrayidx1 = getelementptr inbounds i64, ptr %b, i64 %iv
88 %1 = load i64, ptr %arrayidx1, align 8
89 %cmp2 = icmp sgt i64 %0, %1
90 %cond = select i1 %cmp2, i64 %iv, i64 %rdx
92 %exitcond.not = icmp eq i64 %inc, %n
93 br i1 %exitcond.not, label %exit, label %for.body
95 exit: ; preds = %for.body