[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / iv-select-cmp-no-wrap.ll
blob20710db19ba90346f4a0d3d1bc6ee0ceb0ceb500
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:
7 entry:
8   br label %for.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
24   ret i64 %cond
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:
31 entry:
32   br label %for.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
48   ret i64 %cond
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:
55 entry:
56   br label %for.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
72   ret i64 %cond
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:
79 entry:
80   br label %for.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
91   %inc = add i64 %iv, 1
92   %exitcond.not = icmp eq i64 %inc, %n
93   br i1 %exitcond.not, label %exit, label %for.body
95 exit:                                             ; preds = %for.body
96   ret i64 %cond