Skip to content

Commit d204fdc

Browse files
committed
[LV] Add countable multi-exit test to vec.stats.ll
Currently the multi-exit loops with all countable exits are considered vectorized with early exit, while that terminology is used for loops we performed early-exit vectorization, instead of requring a scalar epilogue.
1 parent 23bcc23 commit d204fdc

File tree

1 file changed

+49
-24
lines changed

1 file changed

+49
-24
lines changed

llvm/test/Transforms/LoopVectorize/vect.stats.ll

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
; We have 3 loops, two of them are vectorizable (with one being early-exit
55
; vectorized) and the third one is not.
66

7-
; CHECK: 3 loop-vectorize - Number of loops analyzed for vectorization
8-
; CHECK: 1 loop-vectorize - Number of early exit loops vectorized
9-
; CHECK: 2 loop-vectorize - Number of loops vectorized
7+
; CHECK: 4 loop-vectorize - Number of loops analyzed for vectorization
8+
; CHECK: 2 loop-vectorize - Number of early exit loops vectorized
9+
; CHECK: 3 loop-vectorize - Number of loops vectorized
1010

1111
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"
1212

@@ -15,19 +15,19 @@ entry:
1515
%cmp1 = icmp sle i64 %size, 0
1616
%cmp21 = icmp sgt i64 0, %size
1717
%or.cond = or i1 %cmp1, %cmp21
18-
br i1 %or.cond, label %for.end, label %for.body
18+
br i1 %or.cond, label %exit, label %loop
1919

20-
for.body: ; preds = %entry, %for.body
21-
%indvars.iv2 = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
22-
%arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv2
20+
loop:
21+
%iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
22+
%arrayidx = getelementptr inbounds float, ptr %a, i64 %iv
2323
%0 = load float, ptr %arrayidx, align 4
2424
%mul = fmul float %0, %0
2525
store float %mul, ptr %arrayidx, align 4
26-
%indvars.iv.next = add nuw nsw i64 %indvars.iv2, 1
27-
%cmp2 = icmp sgt i64 %indvars.iv.next, %size
28-
br i1 %cmp2, label %for.end, label %for.body
26+
%iv.next = add nuw nsw i64 %iv, 1
27+
%cmp2 = icmp sgt i64 %iv.next, %size
28+
br i1 %cmp2, label %exit, label %loop
2929

30-
for.end: ; preds = %entry, %for.body
30+
exit: ; preds = %entry, %loop
3131
ret void
3232
}
3333

@@ -38,9 +38,9 @@ entry:
3838
call void @init_mem(ptr %p1, i64 1024)
3939
call void @init_mem(ptr %p2, i64 1024)
4040
%end.clamped = and i64 %end, 1023
41-
br label %for.body
41+
br label %loop
4242

43-
for.body:
43+
loop:
4444
%ind = phi i64 [ %ind.next, %for.inc ], [ 0, %entry ]
4545
%arrayidx1 = getelementptr inbounds i32, ptr %p1, i64 %ind
4646
%0 = load i32, ptr %arrayidx1, align 4
@@ -52,7 +52,7 @@ for.body:
5252
for.inc:
5353
%ind.next = add i64 %ind, 1
5454
%cmp = icmp ult i64 %ind.next, %end.clamped
55-
br i1 %cmp, label %for.body, label %exit
55+
br i1 %cmp, label %loop, label %exit
5656

5757
found:
5858
ret i32 1
@@ -66,25 +66,50 @@ entry:
6666
%cmp1 = icmp sle i64 %size, 0
6767
%cmp21 = icmp sgt i64 0, %size
6868
%or.cond = or i1 %cmp1, %cmp21
69-
br i1 %or.cond, label %for.end, label %for.body
69+
br i1 %or.cond, label %exit, label %loop
7070

71-
for.body: ; preds = %entry, %for.body
72-
%indvars.iv2 = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
73-
%0 = add nsw i64 %indvars.iv2, -5
71+
loop:
72+
%iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
73+
%0 = add nsw i64 %iv, -5
7474
%arrayidx = getelementptr inbounds float, ptr %a, i64 %0
7575
%1 = load float, ptr %arrayidx, align 4
76-
%2 = add nsw i64 %indvars.iv2, 2
76+
%2 = add nsw i64 %iv, 2
7777
%arrayidx2 = getelementptr inbounds float, ptr %a, i64 %2
7878
%3 = load float, ptr %arrayidx2, align 4
7979
%mul = fmul float %1, %3
80-
%arrayidx4 = getelementptr inbounds float, ptr %a, i64 %indvars.iv2
80+
%arrayidx4 = getelementptr inbounds float, ptr %a, i64 %iv
8181
store float %mul, ptr %arrayidx4, align 4
82-
%indvars.iv.next = add nuw nsw i64 %indvars.iv2, 1
83-
%cmp2 = icmp sgt i64 %indvars.iv.next, %size
84-
br i1 %cmp2, label %for.end, label %for.body
82+
%iv.next = add nuw nsw i64 %iv, 1
83+
%cmp2 = icmp sgt i64 %iv.next, %size
84+
br i1 %cmp2, label %exit, label %loop
8585

86-
for.end: ; preds = %entry, %for.body
86+
exit:
8787
ret void
8888
}
8989

90+
define i1 @multiple_countable_exits_multiple_exit_block(ptr %A, ptr %B, i32 %N) {
91+
entry:
92+
br label %loop.header
93+
94+
loop.header:
95+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
96+
%cond.0 = icmp eq i32 %iv, %N
97+
br i1 %cond.0, label %exit.0, label %loop.latch
98+
99+
loop.latch:
100+
%A.gep = getelementptr inbounds i32, ptr %A, i32 %iv
101+
%lv = load i32, ptr %A.gep, align 4
102+
%B.gep = getelementptr inbounds i32, ptr %B, i32 %iv
103+
store i32 %lv, ptr %B.gep, align 4
104+
%iv.next = add nuw i32 %iv, 1
105+
%cond.1 = icmp ult i32 %iv.next, 1000
106+
br i1 %cond.1, label %loop.header, label %exit.1
107+
108+
exit.0:
109+
ret i1 false
110+
111+
exit.1:
112+
ret i1 true
113+
}
114+
90115
declare void @init_mem(ptr, i64);

0 commit comments

Comments
 (0)