Skip to content

Commit 5179f17

Browse files
committed
Remove code duplication
1 parent ccf02ee commit 5179f17

File tree

1 file changed

+63
-123
lines changed

1 file changed

+63
-123
lines changed

src/FindFirstFunctions.jl

Lines changed: 63 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,130 +1,70 @@
11
module FindFirstFunctions
22

3+
const USE_PTR = VERSION >= v"1.12.0-DEV.255"
4+
const FFE_IR = """
5+
declare i8 @llvm.cttz.i8(i8, i1);
6+
define i64 @entry(i64 %0, $(USE_PTR ? "ptr" : "i64") %1, i64 %2) #0 {
7+
top:
8+
$(USE_PTR ? "" : "%ivars = inttoptr i64 %1 to i64*")
9+
%btmp = insertelement <8 x i64> undef, i64 %0, i64 0
10+
%var = shufflevector <8 x i64> %btmp, <8 x i64> undef, <8 x i32> zeroinitializer
11+
%lenm7 = add nsw i64 %2, -7
12+
%dosimditer = icmp ugt i64 %2, 7
13+
br i1 %dosimditer, label %L9.lr.ph, label %L32
14+
15+
L9.lr.ph:
16+
%len8 = and i64 %2, 9223372036854775800
17+
br label %L9
18+
19+
L9:
20+
%i = phi i64 [ 0, %L9.lr.ph ], [ %vinc, %L30 ]
21+
%ivarsi = getelementptr inbounds i64, $(USE_PTR ? "ptr %1" : "i64* %ivars"), i64 %i
22+
$(USE_PTR ? "" : "%vpvi = bitcast i64* %ivarsi to <8 x i64>*")
23+
%v = load <8 x i64>, $(USE_PTR ? "ptr %ivarsi" : "<8 x i64> * %vpvi"), align 8
24+
%m = icmp eq <8 x i64> %v, %var
25+
%mu = bitcast <8 x i1> %m to i8
26+
%matchnotfound = icmp eq i8 %mu, 0
27+
br i1 %matchnotfound, label %L30, label %L17
28+
29+
L17:
30+
%tz8 = call i8 @llvm.cttz.i8(i8 %mu, i1 true)
31+
%tz64 = zext i8 %tz8 to i64
32+
%vis = add nuw i64 %i, %tz64
33+
br label %common.ret
34+
35+
common.ret:
36+
%retval = phi i64 [ %vis, %L17 ], [ -1, %L32 ], [ %si, %L51 ], [ -1, %L67 ]
37+
ret i64 %retval
38+
39+
L30:
40+
%vinc = add nuw nsw i64 %i, 8
41+
%continue = icmp slt i64 %vinc, %lenm7
42+
br i1 %continue, label %L9, label %L32
43+
44+
L32:
45+
%cumi = phi i64 [ 0, %top ], [ %len8, %L30 ]
46+
%done = icmp eq i64 %cumi, %2
47+
br i1 %done, label %common.ret, label %L51
48+
49+
L51:
50+
%si = phi i64 [ %inc, %L67 ], [ %cumi, %L32 ]
51+
%spi = getelementptr inbounds i64, $(USE_PTR ? "ptr %1" : "i64* %ivars"), i64 %si
52+
%svi = load i64, $(USE_PTR ? "ptr" : "i64*") %spi, align 8
53+
%match = icmp eq i64 %svi, %0
54+
br i1 %match, label %common.ret, label %L67
55+
56+
L67:
57+
%inc = add i64 %si, 1
58+
%dobreak = icmp eq i64 %inc, %2
59+
br i1 %dobreak, label %common.ret, label %L51
60+
61+
}
62+
attributes #0 = { alwaysinline }
63+
"""
64+
365
function _findfirstequal(vpivot::Int64, ptr::Ptr{Int64}, len::Int64)
4-
# https://github.com/JuliaLang/julia/pull/53687
5-
mod_ir = if VERSION >= v"1.12.0-DEV.225"
6-
# Julia 1.12+ version with actual pointer types
7-
"""
8-
declare i8 @llvm.cttz.i8(i8, i1);
9-
define i64 @entry(i64 %0, ptr %1, i64 %2) #0 {
10-
top:
11-
%btmp = insertelement <8 x i64> undef, i64 %0, i64 0
12-
%var = shufflevector <8 x i64> %btmp, <8 x i64> undef, <8 x i32> zeroinitializer
13-
%lenm7 = add nsw i64 %2, -7
14-
%dosimditer = icmp ugt i64 %2, 7
15-
br i1 %dosimditer, label %L9.lr.ph, label %L32
16-
17-
L9.lr.ph:
18-
%len8 = and i64 %2, 9223372036854775800
19-
br label %L9
20-
21-
L9:
22-
%i = phi i64 [ 0, %L9.lr.ph ], [ %vinc, %L30 ]
23-
%vpvi = getelementptr inbounds i64, ptr %1, i64 %i
24-
%v = load <8 x i64>, ptr %vpvi, align 8
25-
%m = icmp eq <8 x i64> %v, %var
26-
%mu = bitcast <8 x i1> %m to i8
27-
%matchnotfound = icmp eq i8 %mu, 0
28-
br i1 %matchnotfound, label %L30, label %L17
29-
30-
L17:
31-
%tz8 = call i8 @llvm.cttz.i8(i8 %mu, i1 true)
32-
%tz64 = zext i8 %tz8 to i64
33-
%vis = add nuw i64 %i, %tz64
34-
br label %common.ret
35-
36-
common.ret:
37-
%retval = phi i64 [ %vis, %L17 ], [ -1, %L32 ], [ %si, %L51 ], [ -1, %L67 ]
38-
ret i64 %retval
39-
40-
L30:
41-
%vinc = add nuw nsw i64 %i, 8
42-
%continue = icmp slt i64 %vinc, %lenm7
43-
br i1 %continue, label %L9, label %L32
44-
45-
L32:
46-
%cumi = phi i64 [ 0, %top ], [ %len8, %L30 ]
47-
%done = icmp eq i64 %cumi, %2
48-
br i1 %done, label %common.ret, label %L51
49-
50-
L51:
51-
%si = phi i64 [ %inc, %L67 ], [ %cumi, %L32 ]
52-
%spi = getelementptr inbounds i64, ptr %1, i64 %si
53-
%svi = load i64, ptr %spi, align 8
54-
%match = icmp eq i64 %svi, %0
55-
br i1 %match, label %common.ret, label %L67
56-
57-
L67:
58-
%inc = add i64 %si, 1
59-
%dobreak = icmp eq i64 %inc, %2
60-
br i1 %dobreak, label %common.ret, label %L51
61-
62-
}
63-
attributes #0 = { alwaysinline }
64-
"""
65-
else
66-
"""
67-
declare i8 @llvm.cttz.i8(i8, i1);
68-
define i64 @entry(i64 %0, i64 %1, i64 %2) #0 {
69-
top:
70-
%ivars = inttoptr i64 %1 to i64*
71-
%btmp = insertelement <8 x i64> undef, i64 %0, i64 0
72-
%var = shufflevector <8 x i64> %btmp, <8 x i64> undef, <8 x i32> zeroinitializer
73-
%lenm7 = add nsw i64 %2, -7
74-
%dosimditer = icmp ugt i64 %2, 7
75-
br i1 %dosimditer, label %L9.lr.ph, label %L32
76-
77-
L9.lr.ph:
78-
%len8 = and i64 %2, 9223372036854775800
79-
br label %L9
80-
81-
L9:
82-
%i = phi i64 [ 0, %L9.lr.ph ], [ %vinc, %L30 ]
83-
%ivarsi = getelementptr inbounds i64, i64* %ivars, i64 %i
84-
%vpvi = bitcast i64* %ivarsi to <8 x i64>*
85-
%v = load <8 x i64>, <8 x i64>* %vpvi, align 8
86-
%m = icmp eq <8 x i64> %v, %var
87-
%mu = bitcast <8 x i1> %m to i8
88-
%matchnotfound = icmp eq i8 %mu, 0
89-
br i1 %matchnotfound, label %L30, label %L17
90-
91-
L17:
92-
%tz8 = call i8 @llvm.cttz.i8(i8 %mu, i1 true)
93-
%tz64 = zext i8 %tz8 to i64
94-
%vis = add nuw i64 %i, %tz64
95-
br label %common.ret
96-
97-
common.ret:
98-
%retval = phi i64 [ %vis, %L17 ], [ -1, %L32 ], [ %si, %L51 ], [ -1, %L67 ]
99-
ret i64 %retval
100-
101-
L30:
102-
%vinc = add nuw nsw i64 %i, 8
103-
%continue = icmp slt i64 %vinc, %lenm7
104-
br i1 %continue, label %L9, label %L32
105-
106-
L32:
107-
%cumi = phi i64 [ 0, %top ], [ %len8, %L30 ]
108-
%done = icmp eq i64 %cumi, %2
109-
br i1 %done, label %common.ret, label %L51
110-
111-
L51:
112-
%si = phi i64 [ %inc, %L67 ], [ %cumi, %L32 ]
113-
%spi = getelementptr inbounds i64, i64* %ivars, i64 %si
114-
%svi = load i64, i64* %spi, align 8
115-
%match = icmp eq i64 %svi, %0
116-
br i1 %match, label %common.ret, label %L67
117-
118-
L67:
119-
%inc = add i64 %si, 1
120-
%dobreak = icmp eq i64 %inc, %2
121-
br i1 %dobreak, label %common.ret, label %L51
122-
}
123-
attributes #0 = { alwaysinline }
124-
"""
125-
end
12666
Base.llvmcall(
127-
(mod_ir, "entry"),
67+
(FFE_IR, "entry"),
12868
Int64,
12969
Tuple{Int64, Ptr{Int64}, Int64},
13070
vpivot,

0 commit comments

Comments
 (0)