4
4
; We have 3 loops, two of them are vectorizable (with one being early-exit
5
5
; vectorized) and the third one is not.
6
6
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
10
10
11
11
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"
12
12
@@ -15,19 +15,19 @@ entry:
15
15
%cmp1 = icmp sle i64 %size , 0
16
16
%cmp21 = icmp sgt i64 0 , %size
17
17
%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
19
19
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
23
23
%0 = load float , ptr %arrayidx , align 4
24
24
%mul = fmul float %0 , %0
25
25
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
29
29
30
- for.end : ; preds = %entry, %for.body
30
+ exit : ; preds = %entry, %loop
31
31
ret void
32
32
}
33
33
38
38
call void @init_mem (ptr %p1 , i64 1024 )
39
39
call void @init_mem (ptr %p2 , i64 1024 )
40
40
%end.clamped = and i64 %end , 1023
41
- br label %for.body
41
+ br label %loop
42
42
43
- for.body :
43
+ loop :
44
44
%ind = phi i64 [ %ind.next , %for.inc ], [ 0 , %entry ]
45
45
%arrayidx1 = getelementptr inbounds i32 , ptr %p1 , i64 %ind
46
46
%0 = load i32 , ptr %arrayidx1 , align 4
@@ -52,7 +52,7 @@ for.body:
52
52
for.inc:
53
53
%ind.next = add i64 %ind , 1
54
54
%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
56
56
57
57
found:
58
58
ret i32 1
@@ -66,25 +66,50 @@ entry:
66
66
%cmp1 = icmp sle i64 %size , 0
67
67
%cmp21 = icmp sgt i64 0 , %size
68
68
%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
70
70
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
74
74
%arrayidx = getelementptr inbounds float , ptr %a , i64 %0
75
75
%1 = load float , ptr %arrayidx , align 4
76
- %2 = add nsw i64 %indvars.iv2 , 2
76
+ %2 = add nsw i64 %iv , 2
77
77
%arrayidx2 = getelementptr inbounds float , ptr %a , i64 %2
78
78
%3 = load float , ptr %arrayidx2 , align 4
79
79
%mul = fmul float %1 , %3
80
- %arrayidx4 = getelementptr inbounds float , ptr %a , i64 %indvars.iv2
80
+ %arrayidx4 = getelementptr inbounds float , ptr %a , i64 %iv
81
81
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
85
85
86
- for.end: ; preds = %entry, %for.body
86
+ exit:
87
87
ret void
88
88
}
89
89
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
+
90
115
declare void @init_mem (ptr , i64 );
0 commit comments