Skip to content

Commit aa8d5dd

Browse files
authored
Merge pull request #138 from maleadt/tb/passes_wrappers
Add high-level wrappers for the Julia passes.
2 parents a2233a8 + bec80b6 commit aa8d5dd

File tree

5 files changed

+69
-1
lines changed

5 files changed

+69
-1
lines changed

src/core/instructions.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,9 @@ called_value(inst::Instruction) = Value(API.LLVMGetCalledValue(ref(inst)))
142142

143143
## terminators
144144

145-
export isconditional, condition, condition!, default_dest
145+
export isterminator, isconditional, condition, condition!, default_dest
146+
147+
isterminator(inst::Instruction) = LLVM.API.LLVMIsATerminatorInst(LLVM.ref(inst)) != C_NULL
146148

147149
isconditional(br::Instruction) = convert(Core.Bool, API.LLVMIsConditional(ref(br)))
148150

src/interop.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
module Interop
22

33
using ..LLVM
4+
import ..LLVM: API, ref
45

56

67
const jlctx = Ref{LLVM.Context}()
78

89
include("interop/base.jl")
910
include("interop/asmcall.jl")
11+
include("interop/passes.jl")
1012

1113
end

src/interop/passes.jl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export alloc_opt!, barrier_noop!, gc_invariant_verifier!, lower_exc_handlers!,
2+
combine_mul_add!, multi_versioning!, propagate_julia_addrsp!, lower_ptls!,
3+
lower_simdloop!, late_lower_gc_frame!
4+
5+
alloc_opt!(pm::PassManager) =
6+
API.LLVMAddAllocOptPass(ref(pm))
7+
8+
barrier_noop!(pm::PassManager) =
9+
API.LLVMAddBarrierNoopPass(ref(pm))
10+
11+
gc_invariant_verifier!(pm::PassManager, strong::Bool=false) =
12+
API.LLVMAddGCInvariantVerifierPass(ref(pm), convert(Bool, strong))
13+
14+
lower_exc_handlers!(pm::PassManager) =
15+
API.LLVMAddLowerExcHandlersPass(ref(pm))
16+
17+
combine_mul_add!(pm::PassManager) =
18+
API.LLVMAddCombineMulAddPass(ref(pm))
19+
20+
multi_versioning!(pm::PassManager) =
21+
API.LLVMAddMultiVersioningPass(ref(pm))
22+
23+
propagate_julia_addrsp!(pm::PassManager) =
24+
API.LLVMAddPropagateJuliaAddrspaces(ref(pm))
25+
26+
lower_ptls!(pm::PassManager, imaging_mode::Bool=false) =
27+
API.LLVMAddLowerPTLSPass(ref(pm), convert(Bool, imaging_mode))
28+
29+
lower_simdloop!(pm::PassManager) =
30+
API.LLVMAddLowerSimdLoopPass(ref(pm))
31+
32+
late_lower_gc_frame!(pm::PassManager) =
33+
API.LLVMAddLateLowerGCFramePass(ref(pm))

test/core.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ LLVM.Module("SomeModule", ctx) do mod
235235

236236
valueinst1 = add!(builder, parameters(fn)[1],
237237
ConstantInt(Int32(1), ctx))
238+
@test !isterminator(valueinst1)
238239

239240
userinst = add!(builder, valueinst1,
240241
ConstantInt(Int32(1), ctx))
@@ -868,6 +869,7 @@ LLVM.Module("SomeModule", ctx) do mod
868869

869870
# terminators
870871

872+
@test isterminator(brinst)
871873
@test isconditional(brinst)
872874
@test condition(brinst) == parameters(fn)[1]
873875
condition!(brinst, parameters(fn)[2])

test/interop.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,33 @@ d1(a) = @asmcall("bswap \$0", "=r,r", Int32, Tuple{Int32}, a)
8585

8686
end
8787

88+
89+
if VERSION >= v"1.2.0-DEV.531"
90+
@testset "passes" begin
91+
92+
93+
Context() do ctx
94+
LLVM.Module("SomeModule", ctx) do mod
95+
ModulePassManager() do pm
96+
97+
alloc_opt!(pm)
98+
barrier_noop!(pm)
99+
gc_invariant_verifier!(pm)
100+
gc_invariant_verifier!(pm, true)
101+
lower_exc_handlers!(pm)
102+
combine_mul_add!(pm)
103+
multi_versioning!(pm)
104+
propagate_julia_addrsp!(pm)
105+
lower_ptls!(pm)
106+
lower_ptls!(pm, true)
107+
lower_simdloop!(pm)
108+
late_lower_gc_frame!(pm)
109+
110+
end
111+
end
112+
end
113+
114+
end
115+
end
116+
88117
end

0 commit comments

Comments
 (0)