Skip to content

Commit 033b474

Browse files
committed
initial commit
0 parents  commit 033b474

10 files changed

+1383
-0
lines changed

.vscode/launch.json

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "(gdb) Launch",
9+
"type": "cppdbg",
10+
"request": "launch",
11+
"program": "/home/jumerckx/julia/build/debug/julia",
12+
"args": ["-g2", "--project=.", "${file}"],
13+
"stopAtEntry": false,
14+
"cwd": "${workspaceFolder}",
15+
"environment": [
16+
{"name":"ENABLE_GDBLISTENER", "value":"1"},
17+
],
18+
"externalConsole": false,
19+
"MIMode": "gdb",
20+
"miDebuggerPath": "gdb",
21+
"setupCommands": [
22+
{
23+
"description": "Enable pretty-printing for gdb",
24+
"text": "-enable-pretty-printing",
25+
"ignoreFailures": true
26+
}
27+
],
28+
"sourceFileMap": {
29+
"." : "/home/jumerckx/julia/src"
30+
}
31+
},
32+
]
33+
}

.vscode/settings.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"julia.executablePath": "/home/jumerckx/julia/build/release/julia",
3+
"workbench.colorCustomizations": {
4+
"activityBar.background": "#4B2211",
5+
"titleBar.activeBackground": "#683018",
6+
"titleBar.activeForeground": "#FEFBFA"
7+
},
8+
"files.associations": {
9+
"random": "cpp"
10+
}
11+
}

00_jlir_dialect.jl

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# using Preferences
2+
# set_preferences!(
3+
# MLIR.API.MLIR_jll,
4+
# "mlir_c_path" => "/home/jumerckx/julia/build/debug/standalone/lib/libStandaloneCAPITestLib.so",
5+
# )
6+
7+
using MLIR
8+
ctx = MLIR.API.mlirContextCreate()
9+
10+
function registerAllDialects!(ctx)
11+
registry = MLIR.API.mlirDialectRegistryCreate()
12+
MLIR.API.mlirRegisterAllDialects(registry)
13+
handle = MLIR.API.mlirGetDialectHandle__jlir__()
14+
MLIR.API.mlirDialectHandleRegisterDialect(handle, ctx)
15+
MLIR.API.mlirContextAppendDialectRegistry(ctx, registry)
16+
MLIR.API.mlirDialectRegistryDestroy(registry)
17+
18+
return nothing
19+
end
20+
21+
registerAllDialects!(ctx)
22+
23+
ir = """
24+
pdl.pattern : benefit(1) {
25+
%root = pdl.operation "test.op"
26+
pdl.rewrite %root {
27+
pdl.operation "test.success2"
28+
pdl.erase %root
29+
}
30+
}
31+
"""
32+
33+
mod = MLIR.API.mlirModuleCreateParse(ctx, ir)
34+
op = MLIR.API.mlirModuleGetOperation(mod)
35+
36+
MLIR.API.mlirOperationVerify(op)
37+
38+
ir = """
39+
module {
40+
func.func nested @"Tuple{typeof(Main.branches), Bool}"(%arg0: !jlir<"typeof(Main.branches)">, %arg1: !jlir.Bool) -> !jlir.Bool attributes {llvm.emit_c_interface} {
41+
"jlir.goto"()[^bb1] : () -> ()
42+
^bb1: // pred: ^bb0
43+
"jlir.gotoifnot"(%arg1)[^bb3, ^bb2] {operand_segment_sizes = dense<[1, 0, 0]> : vector<3xi32>} : (!jlir.Bool) -> ()
44+
^bb2: // pred: ^bb1
45+
%0 = "jlir.pi"(%arg1) : (!jlir.Bool) -> !jlir.Bool
46+
"jlir.return"(%0) : (!jlir.Bool) -> ()
47+
^bb3: // pred: ^bb1
48+
%1 = "jlir.constant"() {value = #jlir.true} : () -> !jlir.Bool
49+
"jlir.return"(%1) : (!jlir.Bool) -> ()
50+
}
51+
}
52+
"""
53+
54+
ir = """
55+
module {
56+
func.func nested @"Tuple{jlir.Function, Bool}"(%arg0: !jlir.Bool, %arg1: !jlir.Bool) -> !jlir.Bool attributes {llvm.emit_c_interface} {
57+
"jlir.goto"()[^bb1] : () -> ()
58+
^bb1: // pred: ^bb0
59+
"jlir.gotoifnot"(%arg1)[^bb3, ^bb2] {operand_segment_sizes = dense<[1, 0, 0]> : vector<3xi32>} : (!jlir.Bool) -> ()
60+
^bb2: // pred: ^bb1
61+
%0 = "jlir.pi"(%arg1) : (!jlir.Bool) -> !jlir.Bool
62+
"jlir.return"(%0) : (!jlir.Bool) -> ()
63+
^bb3: // pred: ^bb1
64+
%1 = "jlir.constant"() {value = #jlir.true} : () -> !jlir.Bool
65+
"jlir.return"(%1) : (!jlir.Bool) -> ()
66+
}
67+
}
68+
"""
69+
70+
mod = MLIR.API.mlirModuleCreateParse(ctx, ir)
71+
72+
function lowerModuleToLLVM(ctx, mod)
73+
pm = MLIR.API.mlirPassManagerCreate(ctx)
74+
op = "func.func"
75+
opm = MLIR.API.mlirPassManagerGetNestedUnder(pm, op)
76+
MLIR.API.mlirPassManagerAddOwnedPass(pm,
77+
MLIR.API.mlirCreateConversionConvertFuncToLLVM()
78+
)
79+
MLIR.API.mlirOpPassManagerAddOwnedPass(opm,
80+
MLIR.API.mlirCreateConversionConvertArithmeticToLLVM()
81+
)
82+
status = MLIR.API.mlirPassManagerRun(pm, mod)
83+
# undefined symbol: mlirLogicalResultIsFailure
84+
if status.value == 0
85+
error("Unexpected failure running pass failure")
86+
end
87+
MLIR.API.mlirPassManagerDestroy(pm)
88+
end
89+
90+
91+
lowerModuleToLLVM(ctx, mod)
92+
93+
using MLIR: IR
94+
95+
ctx = IR.Context()
96+
97+
IR.get_or_load_dialect!(ctx, "jlir") |> typeof
98+
99+
op = IR.create_operation("jlir.neg_int", IR.Location(ctx));
100+
101+
typeof(op)
102+
103+
op = IR.create_operation("jlir.pi", IR.Location(ctx), results=[typeof(pi)]);
104+
105+
op = IR.create_operation("jlir.checked_sadd_int", IR.Location(ctx), results=[typeof(Int)]);
106+
typeof(op)
107+
108+
109+
op = IR.create_operation("jlir.add_int", IR.Location(ctx));
110+
typeof(op)
111+
112+
113+
using MLIR: IR
114+
ctx = IR.Context()
115+
IR.get_or_load_dialect!(ctx, "jlir");
116+
117+
loc = IR.Location(ctx)
118+
119+
op1 = IR.create_operation("jlir.add_int", loc ); # OK
120+
op2 = IR.create_operation("jlir.add_int", loc, results = [Int] ); # OK
121+
op3 = IR.create_operation("jlir.add_int", loc, results = [String] ); # OK?
122+
op3 = IR.create_operation("jlir.add_int", loc, operands = [Int, Int] ); # crash
123+
124+
include("./Utils.jl")
125+
using .Utils
126+
127+
function pow(x::F, n::Integer) where {F}
128+
p = one(F)
129+
for _ in 1:n
130+
p *= x
131+
end
132+
p
133+
end
134+
135+
ir, ret = @code_ircode pow(2, 10)
136+
137+
println(@dot pow(2, 10))

01_CAPI_operation.jl

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
include("./Utils.jl")
2+
3+
using MLIR
4+
using MLIR: IR, API, API.mlir_c
5+
using .Utils
6+
7+
f(x, y) = 2*(x+y)
8+
ir, ret = @code_ircode f(2, 3)
9+
10+
11+
function registerAllDialects!(ctx)
12+
registry = MLIR.API.mlirDialectRegistryCreate()
13+
MLIR.API.mlirRegisterAllDialects(registry)
14+
handle = MLIR.API.mlirGetDialectHandle__jlir__()
15+
API.mlirDialectHandleInsertDialect(handle, registry)
16+
MLIR.API.mlirContextAppendDialectRegistry(ctx, registry)
17+
# MLIR.API.mlirDialectRegistryDestroy(registry)
18+
19+
MLIR.API.mlirContextLoadAllAvailableDialects(ctx)
20+
return registry
21+
end
22+
23+
ctx = API.mlirContextCreate()
24+
registry = registerAllDialects!(ctx)
25+
26+
state = Ref(API.mlirOperationStateGet("func.func", API.mlirLocationUnknownGet(ctx)))
27+
28+
function API.MlirType(ctx::API.MlirContext, t)
29+
return @ccall mlir_c.brutus_get_jlirtype(ctx::API.MlirContext, t::Any)::API.MlirType
30+
end
31+
32+
argtypes = let
33+
argtypes = getfield(ir, :argtypes)
34+
API.MlirType.(Ref(ctx), argtypes)
35+
end
36+
37+
reg = API.mlirRegionCreate()
38+
entry_block = API.mlirBlockCreate(length(argtypes), argtypes, [API.mlirLocationUnknownGet(ctx) for _ in enumerate(argtypes)])
39+
40+
API.mlirRegionAppendOwnedBlock(reg, entry_block)
41+
API.mlirOperationStateAddOwnedRegions(state, 1, [reg])
42+
43+
push!(block::API.MlirBlock, type::API.MlirType, loc::API.MlirLocation) =
44+
API.mlirBlockAddArgument(block, type, loc)
45+
46+
input_types = API.mlirBlockGetArgument.(Ref(entry_block), eachindex(argtypes) .- 1)
47+
48+
API.mlirBlockGetNumArguments(entry_block)
49+
50+
push!(block::API.MlirBlock, op::API.MlirOperation) =
51+
API.mlirBlockAppendOwnedOperation(block, op)
52+
53+
add_op = IR.create_operation("jlir.add_int", API.mlirLocationUnknownGet(ctx); operands=[API.mlirBlockGetArgument(entry_block, 1), API.mlirBlockGetArgument(entry_block, 2)]) # "jlir.add_int"(<<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>) : (!jlir.Int64, !jlir.Int64) -> !jlir.Int64
54+
55+
named_val_attr = let
56+
val_attr = @ccall mlir_c.brutus_get_jlirattr(ctx::API.MlirContext, 2::Any)::API.MlirAttribute
57+
API.mlirNamedAttributeGet(API.mlirIdentifierGet(ctx, "value"), val_attr)
58+
end
59+
60+
constant_op = IR.create_operation("jlir.constant", API.mlirLocationUnknownGet(ctx); attributes=[named_val_attr], results=[API.MlirType(ctx, Int)]) # "jlir.constant"() {value = #jlir<2>} : () -> !jlir.Int64
61+
62+
mul_op = IR.create_operation("jlir.mul_int", API.mlirLocationUnknownGet(ctx); operands=[API.mlirOperationGetResult(constant_op, 0), API.mlirOperationGetResult(add_op, 0)])
63+
64+
ret_op = IR.create_operation("func.return", API.mlirLocationUnknownGet(ctx); operands=[API.mlirBlockGetArgument(entry_block, 2)], result_inference = false)
65+
66+
push!(entry_block, add_op)
67+
push!(entry_block, constant_op)
68+
push!(entry_block, mul_op)
69+
push!(entry_block, ret_op)
70+
71+
named_type_attr = let
72+
function_type = API.mlirFunctionTypeGet(
73+
ctx,
74+
length(input_types), API.mlirValueGetType.(input_types),
75+
1, [API.MlirType(ctx, ret)])
76+
77+
type_attr = API.mlirTypeAttrGet(function_type)
78+
79+
API.mlirNamedAttributeGet(API.mlirIdentifierGet(ctx, "function_type"), type_attr)
80+
end
81+
82+
named_symbol_name_attr = let
83+
name = "f"
84+
85+
symbol_name_attr = API.mlirStringAttrGet(ctx, name)
86+
87+
API.mlirNamedAttributeGet(API.mlirIdentifierGet(ctx, "sym_name"), symbol_name_attr)
88+
end
89+
90+
named_viz_attr = let
91+
viz_attr = API.mlirStringAttrGet(ctx, "nested")
92+
93+
API.mlirNamedAttributeGet(API.mlirIdentifierGet(ctx, "sym_visibility"), viz_attr)
94+
end
95+
96+
named_unit_attr = let
97+
unit_attr = API.mlirUnitAttrGet(ctx)
98+
99+
API.mlirNamedAttributeGet(API.mlirIdentifierGet(ctx, "llvm.emit_c_interface"), unit_attr)
100+
end
101+
102+
function push!(state::Base.RefValue{MLIR.API.MlirOperationState}, attr::IR.MlirNamedAttribute)
103+
API.mlirOperationStateAddAttributes(state, 1, Ref(attr))
104+
end
105+
106+
push!(state, named_type_attr)
107+
push!(state, named_symbol_name_attr)
108+
push!(state, named_viz_attr)
109+
push!(state, named_unit_attr)
110+
111+
op = API.mlirOperationCreate(state)
112+
113+
API.mlirOperationVerify(op)
114+
115+
function print_callback(str::API.MlirStringRef, userdata)
116+
data = unsafe_wrap(Array, Base.convert(Ptr{Cchar}, str.data), str.length; own=false)
117+
write(userdata isa Base.RefValue ? userdata[] : userdata, data)
118+
return Cvoid()
119+
end
120+
121+
function Base.show(io::IO, operation::API.MlirOperation)
122+
c_print_callback = @cfunction(print_callback, Cvoid, (API.MlirStringRef, Any))
123+
ref = Ref(io)
124+
flags = API.mlirOpPrintingFlagsCreate()
125+
get(io, :debug, false) && API.mlirOpPrintingFlagsEnableDebugInfo(flags, true, true)
126+
API.mlirOperationPrintWithFlags(operation, flags, c_print_callback, ref)
127+
println(io)
128+
end
129+
130+
@show op

LocalPreferences.toml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[MLIR_jll]
2+
mlir_c_path = "/home/jumerckx/brutus/build/lib/libStandaloneCAPITestLib.so"
3+
# mlir_c_path = "/home/jumerckx/julia/build/debug/standalone/lib/libStandaloneCAPITestLib.so"

MLIR.jl

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 4c3f0cbb8740d9296abae934757822724f4933b9

0 commit comments

Comments
 (0)