Skip to content

Convert ptr to llvm

convert_ptr_to_llvm

ConvertStoreOp dataclass

Bases: RewritePattern

Source code in xdsl/transforms/convert_ptr_to_llvm.py
17
18
19
20
21
22
23
24
25
26
27
28
29
@dataclass
class ConvertStoreOp(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.StoreOp, rewriter: PatternRewriter, /):
        rewriter.replace_op(
            op,
            (
                cast_op := builtin.UnrealizedConversionCastOp.get(
                    (op.addr,), (llvm.LLVMPointerType(),)
                ),
                llvm.StoreOp(op.value, cast_op.results[0]),
            ),
        )

__init__() -> None

match_and_rewrite(op: ptr.StoreOp, rewriter: PatternRewriter)

Source code in xdsl/transforms/convert_ptr_to_llvm.py
19
20
21
22
23
24
25
26
27
28
29
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.StoreOp, rewriter: PatternRewriter, /):
    rewriter.replace_op(
        op,
        (
            cast_op := builtin.UnrealizedConversionCastOp.get(
                (op.addr,), (llvm.LLVMPointerType(),)
            ),
            llvm.StoreOp(op.value, cast_op.results[0]),
        ),
    )

ConvertLoadOp dataclass

Bases: RewritePattern

Source code in xdsl/transforms/convert_ptr_to_llvm.py
32
33
34
35
36
37
38
39
40
41
42
43
44
@dataclass
class ConvertLoadOp(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.LoadOp, rewriter: PatternRewriter, /):
        rewriter.replace_op(
            op,
            (
                cast_op := builtin.UnrealizedConversionCastOp.get(
                    [op.addr], [llvm.LLVMPointerType()]
                ),
                llvm.LoadOp(cast_op.results[0], op.res.type),
            ),
        )

__init__() -> None

match_and_rewrite(op: ptr.LoadOp, rewriter: PatternRewriter)

Source code in xdsl/transforms/convert_ptr_to_llvm.py
34
35
36
37
38
39
40
41
42
43
44
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.LoadOp, rewriter: PatternRewriter, /):
    rewriter.replace_op(
        op,
        (
            cast_op := builtin.UnrealizedConversionCastOp.get(
                [op.addr], [llvm.LLVMPointerType()]
            ),
            llvm.LoadOp(cast_op.results[0], op.res.type),
        ),
    )

ConvertPtrAddOp dataclass

Bases: RewritePattern

Source code in xdsl/transforms/convert_ptr_to_llvm.py
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@dataclass
class ConvertPtrAddOp(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.PtrAddOp, rewriter: PatternRewriter, /):
        rewriter.replace_op(
            op,
            (
                cast_addr_op := builtin.UnrealizedConversionCastOp.get(
                    [op.addr],
                    [llvm.LLVMPointerType()],
                ),
                # offset (index) -> offset (int)
                offest_to_int_op := arith.IndexCastOp(op.offset, builtin.i64),
                # ptr -> int
                ptr_to_int_op := llvm.PtrToIntOp(
                    cast_addr_op.results[0],
                    builtin.i64,
                ),
                # int + arg
                add_op := arith.AddiOp(
                    ptr_to_int_op.results[0], offest_to_int_op.result
                ),
                # int -> ptr
                llvm.IntToPtrOp(add_op.result),
            ),
        )

__init__() -> None

match_and_rewrite(op: ptr.PtrAddOp, rewriter: PatternRewriter)

Source code in xdsl/transforms/convert_ptr_to_llvm.py
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.PtrAddOp, rewriter: PatternRewriter, /):
    rewriter.replace_op(
        op,
        (
            cast_addr_op := builtin.UnrealizedConversionCastOp.get(
                [op.addr],
                [llvm.LLVMPointerType()],
            ),
            # offset (index) -> offset (int)
            offest_to_int_op := arith.IndexCastOp(op.offset, builtin.i64),
            # ptr -> int
            ptr_to_int_op := llvm.PtrToIntOp(
                cast_addr_op.results[0],
                builtin.i64,
            ),
            # int + arg
            add_op := arith.AddiOp(
                ptr_to_int_op.results[0], offest_to_int_op.result
            ),
            # int -> ptr
            llvm.IntToPtrOp(add_op.result),
        ),
    )

ConvertToPtrOp

Bases: RewritePattern

Source code in xdsl/transforms/convert_ptr_to_llvm.py
75
76
77
78
class ConvertToPtrOp(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.ToPtrOp, rewriter: PatternRewriter, /):
        rewriter.replace_op(op, (), op.operands)

match_and_rewrite(op: ptr.ToPtrOp, rewriter: PatternRewriter)

Source code in xdsl/transforms/convert_ptr_to_llvm.py
76
77
78
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.ToPtrOp, rewriter: PatternRewriter, /):
    rewriter.replace_op(op, (), op.operands)

ConvertFromPtrOp

Bases: RewritePattern

Source code in xdsl/transforms/convert_ptr_to_llvm.py
81
82
83
84
class ConvertFromPtrOp(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.FromPtrOp, rewriter: PatternRewriter, /):
        rewriter.replace_op(op, (), op.operands)

match_and_rewrite(op: ptr.FromPtrOp, rewriter: PatternRewriter)

Source code in xdsl/transforms/convert_ptr_to_llvm.py
82
83
84
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.FromPtrOp, rewriter: PatternRewriter, /):
    rewriter.replace_op(op, (), op.operands)

RewritePtrTypes dataclass

Bases: TypeConversionPattern

Replaces ptr_dxdsl.ptr with llvm.ptr.

Source code in xdsl/transforms/convert_ptr_to_llvm.py
87
88
89
90
91
92
93
94
class RewritePtrTypes(TypeConversionPattern):
    """
    Replaces `ptr_dxdsl.ptr` with `llvm.ptr`.
    """

    @attr_type_rewrite_pattern
    def convert_type(self, typ: ptr.PtrType):
        return llvm.LLVMPointerType()

convert_type(typ: ptr.PtrType)

Source code in xdsl/transforms/convert_ptr_to_llvm.py
92
93
94
@attr_type_rewrite_pattern
def convert_type(self, typ: ptr.PtrType):
    return llvm.LLVMPointerType()

ConvertPtrToLLVMPass dataclass

Bases: ModulePass

Source code in xdsl/transforms/convert_ptr_to_llvm.py
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
class ConvertPtrToLLVMPass(ModulePass):
    name = "convert-ptr-to-llvm"

    def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
        PatternRewriteWalker(
            GreedyRewritePatternApplier(
                [
                    ConvertStoreOp(),
                    ConvertLoadOp(),
                    ConvertPtrAddOp(),
                    ConvertToPtrOp(),
                    ConvertFromPtrOp(),
                    RewritePtrTypes(recursive=True),
                ]
            )
        ).rewrite_module(op)

name = 'convert-ptr-to-llvm' class-attribute instance-attribute

apply(ctx: Context, op: builtin.ModuleOp) -> None

Source code in xdsl/transforms/convert_ptr_to_llvm.py
100
101
102
103
104
105
106
107
108
109
110
111
112
def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
    PatternRewriteWalker(
        GreedyRewritePatternApplier(
            [
                ConvertStoreOp(),
                ConvertLoadOp(),
                ConvertPtrAddOp(),
                ConvertToPtrOp(),
                ConvertFromPtrOp(),
                RewritePtrTypes(recursive=True),
            ]
        )
    ).rewrite_module(op)