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
1111target 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
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:
5252for.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
5757found:
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+
90115declare void @init_mem (ptr , i64 );
0 commit comments