From c6089808492748bcb322a48fe2d6574c6a2f0172 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Fri, 31 May 2024 16:13:57 +0530 Subject: [PATCH 1/8] Add feature and test: `alloc`, `load` and `store` instructions --- src/backend/brilisp.scm | 23 ++++++++++++++++----- src/backend/llvm.py | 30 +++++++++++++++++++++++++--- src/backend/tests/brilisp/alloc.out | 1 + src/backend/tests/brilisp/alloc.sexp | 11 ++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 src/backend/tests/brilisp/alloc.out create mode 100644 src/backend/tests/brilisp/alloc.sexp diff --git a/src/backend/brilisp.scm b/src/backend/brilisp.scm index 8bcb3cf..645c7ae 100644 --- a/src/backend/brilisp.scm +++ b/src/backend/brilisp.scm @@ -39,7 +39,12 @@ (instrs . ,(map-vec gen-instr instrs))))) (define (gen-arg arg) - `((name . ,(first arg)) (type . ,(second arg)))) + `((name . ,(first arg)) (type . ,(gen-type (second arg))))) + +(define (gen-type type) + (if (list? type) + `((,(first type) . ,(second type))) + type)) (define (gen-instr instr) (define (const? instr) @@ -50,20 +55,20 @@ (let ((to (second instr)) (from (third instr))) `((op . const) - (type . ,(second to)) + (type . ,(gen-type (second to))) (dest . ,(first to)) (value . ,(second from))))) (define (value? instr) (and (eq? (first instr) 'set) (memq (first (third instr)) - '(add mul sub div eq lt gt le ge not and or)))) + '(add mul sub div eq lt gt le ge not and or alloc load)))) (define (gen-value-instr instr) (let ((to (second instr)) (from (third instr))) `((op . ,(first from)) - (type . ,(second to)) + (type . ,(gen-type (second to))) (dest . ,(first to)) (args . ,(list->vector (rest from)))))) @@ -81,7 +86,7 @@ (let ((to (second instr)) (from (third instr))) `((op . call) - (type . ,(second to)) + (type . ,(gen-type (second to))) (dest . ,(first to)) (funcs . ,(vector (second from))) (args . ,(list->vector (rest (rest from))))))) @@ -113,6 +118,13 @@ (define (gen-nop-instr instr) `((op . nop))) + (define (store? instr) + (eq? (first instr) 'store)) + + (define (gen-store-instr instr) + `((op . store) + (args . ,(list->vector (rest instr))))) + (cond ((const? instr) (gen-const-instr instr)) ((value? instr) (gen-value-instr instr)) @@ -122,6 +134,7 @@ ((label? instr) (gen-label-instr instr)) ((br? instr) (gen-br-instr instr)) ((nop? instr) (gen-nop-instr instr)) + ((store? instr) (gen-store-instr instr)) (else (error "unknown instruction: " instr)))) (bril (rest (read))) diff --git a/src/backend/llvm.py b/src/backend/llvm.py index cb94734..4e3cc83 100644 --- a/src/backend/llvm.py +++ b/src/backend/llvm.py @@ -4,8 +4,6 @@ References: 1. https://github.com/eliben/pykaleidoscope/ 2. https://llvm.org/docs/tutorial/ - -Assumes BRIL is in SSA form """ import sys @@ -47,7 +45,12 @@ def generate(self, bril_prog): self.gen_function(fn) def gen_type(self, type): - if type == "int": + if isinstance (type, dict): + if 'ptr' in type: + return self.gen_type(type['ptr']) + else: + raise CodegenError (f"Unknown type {type}") + elif type == "int": return ir.IntType(32) elif type == "void": return ir.VoidType() @@ -158,6 +161,21 @@ def gen_comp(instr): ), ) + def gen_alloc(instr): + pointee_type = self.gen_type(instr.type) + self.declare_var(pointee_type.as_pointer(), instr.dest) + self.gen_symbol_store(instr.dest, self.builder.alloca(pointee_type, size=self.gen_var(instr.args[0]))) + + def gen_store(instr): + ptr = self.gen_symbol_load(instr.args[0]) + self.builder.store(self.gen_var(instr.args[1]), ptr) + + def gen_load(instr): + self.declare_var(self.gen_type(instr.type), instr.dest) + ptr = self.gen_symbol_load(instr.args[0]) + self.gen_symbol_store( + instr.dest, self.builder.load(ptr)) + for instr in instrs: if "label" in instr: gen_label(instr) @@ -175,6 +193,12 @@ def gen_comp(instr): gen_ret(instr) elif instr.op == "const": gen_const(instr) + elif instr.op == "alloc": + gen_alloc(instr) + elif instr.op == "store": + gen_store(instr) + elif instr.op == "load": + gen_load(instr) elif instr.op in value_ops: gen_value(instr) elif instr.op in cmp_ops: diff --git a/src/backend/tests/brilisp/alloc.out b/src/backend/tests/brilisp/alloc.out new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/src/backend/tests/brilisp/alloc.out @@ -0,0 +1 @@ +3 diff --git a/src/backend/tests/brilisp/alloc.sexp b/src/backend/tests/brilisp/alloc.sexp new file mode 100644 index 0000000..4aea578 --- /dev/null +++ b/src/backend/tests/brilisp/alloc.sexp @@ -0,0 +1,11 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((main void)) + (set (s int) (const 5)) + (set (p1 (ptr int)) (alloc s)) + (set (three int) (const 3)) + (store p1 three) + (set (val int) (load p1)) + (set (tmp int) (call print val)) + (ret))) From 7e638b609a24100c737c153fabb385fb677bc0d7 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Sat, 1 Jun 2024 20:36:42 +0530 Subject: [PATCH 2/8] Add test: `ptr_call` --- src/backend/llvm.py | 8 ++++---- src/backend/tests/brilisp/ptr_call.out | 0 src/backend/tests/brilisp/ptr_call.sexp | 9 +++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 src/backend/tests/brilisp/ptr_call.out create mode 100644 src/backend/tests/brilisp/ptr_call.sexp diff --git a/src/backend/llvm.py b/src/backend/llvm.py index 4e3cc83..288d3eb 100644 --- a/src/backend/llvm.py +++ b/src/backend/llvm.py @@ -47,7 +47,7 @@ def generate(self, bril_prog): def gen_type(self, type): if isinstance (type, dict): if 'ptr' in type: - return self.gen_type(type['ptr']) + return self.gen_type(type['ptr']).as_pointer() else: raise CodegenError (f"Unknown type {type}") elif type == "int": @@ -162,9 +162,9 @@ def gen_comp(instr): ) def gen_alloc(instr): - pointee_type = self.gen_type(instr.type) - self.declare_var(pointee_type.as_pointer(), instr.dest) - self.gen_symbol_store(instr.dest, self.builder.alloca(pointee_type, size=self.gen_var(instr.args[0]))) + pointer_type = self.gen_type(instr.type) + self.declare_var(pointer_type, instr.dest) + self.gen_symbol_store(instr.dest, self.builder.alloca(pointer_type.pointee, size=self.gen_var(instr.args[0]))) def gen_store(instr): ptr = self.gen_symbol_load(instr.args[0]) diff --git a/src/backend/tests/brilisp/ptr_call.out b/src/backend/tests/brilisp/ptr_call.out new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/tests/brilisp/ptr_call.sexp b/src/backend/tests/brilisp/ptr_call.sexp new file mode 100644 index 0000000..5287ff6 --- /dev/null +++ b/src/backend/tests/brilisp/ptr_call.sexp @@ -0,0 +1,9 @@ +(brilisp + (bril-define ((funcA void) (p (ptr int))) + (ret)) + + (bril-define ((main void)) + (set (five int) (const 5)) + (set (x (ptr int)) (alloc five)) + (set (tmp void) (call funcA x)) + (ret))) From 0a0a2c93a339fa5e8ca99ba407068d38905fd1b1 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Sat, 1 Jun 2024 20:51:38 +0530 Subject: [PATCH 3/8] Add test: `ptr_ret` --- src/backend/brilisp.scm | 2 +- src/backend/llvm.py | 18 +++++++++++------- src/backend/tests/brilisp/ptr_ret.out | 0 src/backend/tests/brilisp/ptr_ret.sexp | 9 +++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 src/backend/tests/brilisp/ptr_ret.out create mode 100644 src/backend/tests/brilisp/ptr_ret.sexp diff --git a/src/backend/brilisp.scm b/src/backend/brilisp.scm index 645c7ae..59f4910 100644 --- a/src/backend/brilisp.scm +++ b/src/backend/brilisp.scm @@ -34,7 +34,7 @@ (args (rest header)) (instrs (rest (rest expr)))) `((name . ,name) - (type . ,type) + (type . ,(gen-type type)) (args . ,(map-vec gen-arg args)) (instrs . ,(map-vec gen-instr instrs))))) diff --git a/src/backend/llvm.py b/src/backend/llvm.py index 288d3eb..af44b81 100644 --- a/src/backend/llvm.py +++ b/src/backend/llvm.py @@ -45,11 +45,11 @@ def generate(self, bril_prog): self.gen_function(fn) def gen_type(self, type): - if isinstance (type, dict): - if 'ptr' in type: - return self.gen_type(type['ptr']).as_pointer() + if isinstance(type, dict): + if "ptr" in type: + return self.gen_type(type["ptr"]).as_pointer() else: - raise CodegenError (f"Unknown type {type}") + raise CodegenError(f"Unknown type {type}") elif type == "int": return ir.IntType(32) elif type == "void": @@ -164,7 +164,12 @@ def gen_comp(instr): def gen_alloc(instr): pointer_type = self.gen_type(instr.type) self.declare_var(pointer_type, instr.dest) - self.gen_symbol_store(instr.dest, self.builder.alloca(pointer_type.pointee, size=self.gen_var(instr.args[0]))) + self.gen_symbol_store( + instr.dest, + self.builder.alloca( + pointer_type.pointee, size=self.gen_var(instr.args[0]) + ), + ) def gen_store(instr): ptr = self.gen_symbol_load(instr.args[0]) @@ -173,8 +178,7 @@ def gen_store(instr): def gen_load(instr): self.declare_var(self.gen_type(instr.type), instr.dest) ptr = self.gen_symbol_load(instr.args[0]) - self.gen_symbol_store( - instr.dest, self.builder.load(ptr)) + self.gen_symbol_store(instr.dest, self.builder.load(ptr)) for instr in instrs: if "label" in instr: diff --git a/src/backend/tests/brilisp/ptr_ret.out b/src/backend/tests/brilisp/ptr_ret.out new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/tests/brilisp/ptr_ret.sexp b/src/backend/tests/brilisp/ptr_ret.sexp new file mode 100644 index 0000000..acc00ea --- /dev/null +++ b/src/backend/tests/brilisp/ptr_ret.sexp @@ -0,0 +1,9 @@ +(brilisp + (bril-define ((ident (ptr int)) (p (ptr int))) + (ret p)) + + (bril-define ((main void)) + (set (a int) (const 9)) + (set (b (ptr int)) (alloc a)) + (set (c (ptr int)) (call ident b)) + (ret))) From 7aca6637b04cccc87fb9875f514a803ca8e51c51 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Sun, 2 Jun 2024 06:03:07 +0530 Subject: [PATCH 4/8] Add tests: `access`, `access_many`, and instruction: `ptradd` --- src/backend/brilisp.scm | 2 +- src/backend/llvm.py | 12 ++++++++++++ src/backend/tests/brilisp/access.out | 1 + src/backend/tests/brilisp/access.sexp | 20 ++++++++++++++++++++ src/backend/tests/brilisp/access_many.out | 1 + src/backend/tests/brilisp/access_many.sexp | 21 +++++++++++++++++++++ 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/backend/tests/brilisp/access.out create mode 100644 src/backend/tests/brilisp/access.sexp create mode 100644 src/backend/tests/brilisp/access_many.out create mode 100644 src/backend/tests/brilisp/access_many.sexp diff --git a/src/backend/brilisp.scm b/src/backend/brilisp.scm index 59f4910..b0e45f3 100644 --- a/src/backend/brilisp.scm +++ b/src/backend/brilisp.scm @@ -62,7 +62,7 @@ (define (value? instr) (and (eq? (first instr) 'set) (memq (first (third instr)) - '(add mul sub div eq lt gt le ge not and or alloc load)))) + '(add mul sub div eq lt gt le ge not and or alloc load ptradd)))) (define (gen-value-instr instr) (let ((to (second instr)) diff --git a/src/backend/llvm.py b/src/backend/llvm.py index af44b81..636e3df 100644 --- a/src/backend/llvm.py +++ b/src/backend/llvm.py @@ -180,6 +180,16 @@ def gen_load(instr): ptr = self.gen_symbol_load(instr.args[0]) self.gen_symbol_store(instr.dest, self.builder.load(ptr)) + def gen_ptradd(inst): + self.declare_var(self.gen_type(instr.type), instr.dest) + self.gen_symbol_store( + instr.dest, + self.builder.gep( + self.gen_var(instr.args[0]), + [self.gen_var(arg) for arg in instr["args"][1:]], + ), + ) + for instr in instrs: if "label" in instr: gen_label(instr) @@ -203,6 +213,8 @@ def gen_load(instr): gen_store(instr) elif instr.op == "load": gen_load(instr) + elif instr.op == "ptradd": + gen_ptradd(instr) elif instr.op in value_ops: gen_value(instr) elif instr.op in cmp_ops: diff --git a/src/backend/tests/brilisp/access.out b/src/backend/tests/brilisp/access.out new file mode 100644 index 0000000..06e5182 --- /dev/null +++ b/src/backend/tests/brilisp/access.out @@ -0,0 +1 @@ +8989898 diff --git a/src/backend/tests/brilisp/access.sexp b/src/backend/tests/brilisp/access.sexp new file mode 100644 index 0000000..eeed8ea --- /dev/null +++ b/src/backend/tests/brilisp/access.sexp @@ -0,0 +1,20 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((main void)) + (set (inc int) (const 1)) + (set (v int) (const 4545454)) + (set (max int) (const 8989898)) + (set (p (ptr int)) (alloc v)) + (set (count int) (const 0)) + + (label lbl) + (set (count int) (add count inc)) + (store p v) + (set (val int) (load p)) + (set (loop bool) (ge count max)) + (br loop end lbl) + + (label end) + (set (tmp int) (call print count)) + (ret))) diff --git a/src/backend/tests/brilisp/access_many.out b/src/backend/tests/brilisp/access_many.out new file mode 100644 index 0000000..06e5182 --- /dev/null +++ b/src/backend/tests/brilisp/access_many.out @@ -0,0 +1 @@ +8989898 diff --git a/src/backend/tests/brilisp/access_many.sexp b/src/backend/tests/brilisp/access_many.sexp new file mode 100644 index 0000000..5ceb9e6 --- /dev/null +++ b/src/backend/tests/brilisp/access_many.sexp @@ -0,0 +1,21 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((main void)) + (set (inc int) (const 1)) + (set (v int) (const 4545454)) + (set (max int) (const 8989898)) + (set (arr (ptr int)) (alloc v)) + (set (count int) (const 0)) + + (label lbl) + (set (arr_i (ptr int)) (ptradd arr count)) + (set (count int) (add count inc)) + (store arr_i v) + (set (val int) (load arr_i)) + (set (loop bool) (ge count max)) + (br loop end lbl) + + (label end) + (set (tmp int) (call print count)) + (ret))) From 27f5a2379e6f40a0957becf47ed7348adf51b694 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Mon, 3 Jun 2024 10:41:56 +0530 Subject: [PATCH 5/8] Add tests: `alloc`, `access_ptr` Also fixed brilisp.scm to allow multi-dimensional pointers --- src/backend/brilisp.scm | 2 +- src/backend/tests/brilisp/access.sexp | 4 +-- src/backend/tests/brilisp/access_many.sexp | 4 +-- src/backend/tests/brilisp/access_ptr.out | 1 + src/backend/tests/brilisp/access_ptr.sexp | 22 ++++++++++++++++ src/backend/tests/brilisp/alloc.out | 2 +- src/backend/tests/brilisp/alloc.sexp | 30 ++++++++++++++++------ 7 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 src/backend/tests/brilisp/access_ptr.out create mode 100644 src/backend/tests/brilisp/access_ptr.sexp diff --git a/src/backend/brilisp.scm b/src/backend/brilisp.scm index b0e45f3..a564868 100644 --- a/src/backend/brilisp.scm +++ b/src/backend/brilisp.scm @@ -43,7 +43,7 @@ (define (gen-type type) (if (list? type) - `((,(first type) . ,(second type))) + `((,(first type) . ,(gen-type (second type)))) type)) (define (gen-instr instr) diff --git a/src/backend/tests/brilisp/access.sexp b/src/backend/tests/brilisp/access.sexp index eeed8ea..e003131 100644 --- a/src/backend/tests/brilisp/access.sexp +++ b/src/backend/tests/brilisp/access.sexp @@ -1,7 +1,7 @@ (brilisp (bril-define ((print int) (n int))) - (bril-define ((main void)) + (bril-define ((main int)) (set (inc int) (const 1)) (set (v int) (const 4545454)) (set (max int) (const 8989898)) @@ -17,4 +17,4 @@ (label end) (set (tmp int) (call print count)) - (ret))) + (ret tmp))) diff --git a/src/backend/tests/brilisp/access_many.sexp b/src/backend/tests/brilisp/access_many.sexp index 5ceb9e6..0527599 100644 --- a/src/backend/tests/brilisp/access_many.sexp +++ b/src/backend/tests/brilisp/access_many.sexp @@ -1,7 +1,7 @@ (brilisp (bril-define ((print int) (n int))) - (bril-define ((main void)) + (bril-define ((main int)) (set (inc int) (const 1)) (set (v int) (const 4545454)) (set (max int) (const 8989898)) @@ -18,4 +18,4 @@ (label end) (set (tmp int) (call print count)) - (ret))) + (ret tmp))) diff --git a/src/backend/tests/brilisp/access_ptr.out b/src/backend/tests/brilisp/access_ptr.out new file mode 100644 index 0000000..06e5182 --- /dev/null +++ b/src/backend/tests/brilisp/access_ptr.out @@ -0,0 +1 @@ +8989898 diff --git a/src/backend/tests/brilisp/access_ptr.sexp b/src/backend/tests/brilisp/access_ptr.sexp new file mode 100644 index 0000000..89d3528 --- /dev/null +++ b/src/backend/tests/brilisp/access_ptr.sexp @@ -0,0 +1,22 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((main int)) + (set (inc int) (const 1)) + (set (v int) (const 4545)) + (set (max int) (const 8989898)) + (set (p (ptr int)) (alloc v)) + (set (arr (ptr (ptr int))) (alloc v)) + (set (count int) (const 0)) + + (label lbl) + (set (arr_i (ptr (ptr int))) (ptradd arr count)) + (set (count int) (add count inc)) + (store arr p) + (set (val (ptr int)) (load arr_i)) + (set (loop bool) (ge count max)) + (br loop end lbl) + + (label end) + (set (tmp int) (call print count)) + (ret tmp))) diff --git a/src/backend/tests/brilisp/alloc.out b/src/backend/tests/brilisp/alloc.out index 00750ed..d00491f 100644 --- a/src/backend/tests/brilisp/alloc.out +++ b/src/backend/tests/brilisp/alloc.out @@ -1 +1 @@ -3 +1 diff --git a/src/backend/tests/brilisp/alloc.sexp b/src/backend/tests/brilisp/alloc.sexp index 4aea578..519f349 100644 --- a/src/backend/tests/brilisp/alloc.sexp +++ b/src/backend/tests/brilisp/alloc.sexp @@ -1,11 +1,25 @@ (brilisp (bril-define ((print int) (n int))) - (bril-define ((main void)) - (set (s int) (const 5)) - (set (p1 (ptr int)) (alloc s)) - (set (three int) (const 3)) - (store p1 three) - (set (val int) (load p1)) - (set (tmp int) (call print val)) - (ret))) + (bril-define ((print_bool int) (b bool)) + (set (T int) (const 1)) + (set (F int) (const 0)) + (br b print_true print_false) + (label print_true) + (set (tmp int) (call print T)) + (ret tmp) + (label print_false) + (set (tmp int) (call print F)) + (ret tmp)) + + (bril-define ((main int)) + (set (v int) (const 4)) + (set (o1 int) (const 1)) + (set (bp (ptr bool)) (alloc v)) + (set (bp2 (ptr bool)) (ptradd bp o1)) + (set (b bool) (const true)) + (store bp b) + (store bp2 b) + (set (b bool) (load bp2)) + (set (tmp int) (call print_bool b)) + (ret tmp))) From ae7c487d7a5ad012b6b84e0e7122fc684772ce43 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Mon, 3 Jun 2024 11:59:56 +0530 Subject: [PATCH 6/8] Add test: `fib` It works!! --- src/backend/tests/brilisp/fib.out | 1 + src/backend/tests/brilisp/fib.sexp | 37 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/backend/tests/brilisp/fib.out create mode 100644 src/backend/tests/brilisp/fib.sexp diff --git a/src/backend/tests/brilisp/fib.out b/src/backend/tests/brilisp/fib.out new file mode 100644 index 0000000..a787364 --- /dev/null +++ b/src/backend/tests/brilisp/fib.out @@ -0,0 +1 @@ +34 diff --git a/src/backend/tests/brilisp/fib.sexp b/src/backend/tests/brilisp/fib.sexp new file mode 100644 index 0000000..f71334c --- /dev/null +++ b/src/backend/tests/brilisp/fib.sexp @@ -0,0 +1,37 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((main int)) + (set (one int) (const 1)) + (set (i int) (const 2)) + (set (i_m_1 int) (const 1)) + (set (i_m_2 int) (const 0)) + (set (n int) (const 10)) + (set (seq (ptr int)) (alloc n)) + + (set (v int) (const 0)) + (store seq v) + (set (v int) (const 1)) + (set (p (ptr int)) (ptradd seq i_m_1)) + (store p v) + + (label calc_i) + (set (p_m_2 (ptr int)) (ptradd seq i_m_2)) + (set (p_m_1 (ptr int)) (ptradd seq i_m_1)) + (set (v_m_2 int) (load p_m_2)) + (set (v_m_1 int) (load p_m_1)) + (set (v int) (add v_m_1 v_m_2)) + (set (p (ptr int)) (ptradd seq i)) + (store p v) + (set (i_m_1 int) (add i_m_1 one)) + (set (i_m_2 int) (add i_m_2 one)) + (set (i int) (add i one)) + (set (loop bool) (le i n)) + (br loop calc_i out) + + (label out) + (set (i int) (sub n one)) + (set (p (ptr int)) (ptradd seq i)) + (set (v int) (load p)) + (set (tmp int) (call print v)) + (ret tmp))) From 70315a7c1a0dd13bdd640dafe747c44e6f760d78 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Mon, 3 Jun 2024 12:52:54 +0530 Subject: [PATCH 7/8] Add test: `mem_id` and instruction: `id` --- src/backend/brilisp.scm | 2 +- src/backend/llvm.py | 72 +++++++++++++++------------ src/backend/tests/brilisp/mem_id.out | 1 + src/backend/tests/brilisp/mem_id.sexp | 13 +++++ 4 files changed, 56 insertions(+), 32 deletions(-) create mode 100644 src/backend/tests/brilisp/mem_id.out create mode 100644 src/backend/tests/brilisp/mem_id.sexp diff --git a/src/backend/brilisp.scm b/src/backend/brilisp.scm index a564868..da1f9bb 100644 --- a/src/backend/brilisp.scm +++ b/src/backend/brilisp.scm @@ -62,7 +62,7 @@ (define (value? instr) (and (eq? (first instr) 'set) (memq (first (third instr)) - '(add mul sub div eq lt gt le ge not and or alloc load ptradd)))) + '(add mul sub div eq lt gt le ge not and or alloc load ptradd id)))) (define (gen-value-instr instr) (let ((to (second instr)) diff --git a/src/backend/llvm.py b/src/backend/llvm.py index 636e3df..5b73357 100644 --- a/src/backend/llvm.py +++ b/src/backend/llvm.py @@ -180,7 +180,7 @@ def gen_load(instr): ptr = self.gen_symbol_load(instr.args[0]) self.gen_symbol_store(instr.dest, self.builder.load(ptr)) - def gen_ptradd(inst): + def gen_ptradd(instr): self.declare_var(self.gen_type(instr.type), instr.dest) self.gen_symbol_store( instr.dest, @@ -190,37 +190,47 @@ def gen_ptradd(inst): ), ) + def gen_id(instr): + self.declare_var(self.gen_type(instr.type), instr.dest) + self.gen_symbol_store(instr.dest, self.gen_symbol_load(instr.args[0])) + for instr in instrs: - if "label" in instr: - gen_label(instr) - elif self.builder.block.is_terminated: - pass # Do not codegen for unreachable code - elif instr.op == "nop": - pass - elif instr.op == "jmp": - gen_jmp(instr) - elif instr.op == "br": - gen_br(instr) - elif instr.op == "call": - gen_call(instr) - elif instr.op == "ret": - gen_ret(instr) - elif instr.op == "const": - gen_const(instr) - elif instr.op == "alloc": - gen_alloc(instr) - elif instr.op == "store": - gen_store(instr) - elif instr.op == "load": - gen_load(instr) - elif instr.op == "ptradd": - gen_ptradd(instr) - elif instr.op in value_ops: - gen_value(instr) - elif instr.op in cmp_ops: - gen_comp(instr) - else: - raise CodegenError(f"Unknown op in the instruction: {dict(instr)}") + try: + if "label" in instr: + gen_label(instr) + elif self.builder.block.is_terminated: + pass # Do not codegen for unreachable code + elif instr.op == "nop": + pass + elif instr.op == "jmp": + gen_jmp(instr) + elif instr.op == "br": + gen_br(instr) + elif instr.op == "call": + gen_call(instr) + elif instr.op == "ret": + gen_ret(instr) + elif instr.op == "const": + gen_const(instr) + elif instr.op == "alloc": + gen_alloc(instr) + elif instr.op == "store": + gen_store(instr) + elif instr.op == "load": + gen_load(instr) + elif instr.op == "ptradd": + gen_ptradd(instr) + elif instr.op == "id": + gen_id(instr) + elif instr.op in value_ops: + gen_value(instr) + elif instr.op in cmp_ops: + gen_comp(instr) + else: + raise CodegenError(f"Unknown op in the instruction: {dict(instr)}") + except Exception as e: + print(f"Exception: {e}; in instruction {instr}:") + raise e def gen_function_prototype(self, fn): funcname = fn.name diff --git a/src/backend/tests/brilisp/mem_id.out b/src/backend/tests/brilisp/mem_id.out new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/src/backend/tests/brilisp/mem_id.out @@ -0,0 +1 @@ +7 diff --git a/src/backend/tests/brilisp/mem_id.sexp b/src/backend/tests/brilisp/mem_id.sexp new file mode 100644 index 0000000..8006aad --- /dev/null +++ b/src/backend/tests/brilisp/mem_id.sexp @@ -0,0 +1,13 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((main int)) + (set (v int) (const 1)) + (set (p (ptr int)) (alloc v)) + (set (v int) (const 7)) + (store p v) + + (set (p2 (ptr int)) (id p)) + (set (v int) (load p)) + (set (tmp int) (call print v)) + (ret tmp))) From f43772629c18dacfef8ac5d574744f0c82ef5001 Mon Sep 17 00:00:00 2001 From: Vedanth Padmaraman Date: Mon, 3 Jun 2024 16:04:36 +0530 Subject: [PATCH 8/8] Add tests: `arr_sum` and `transpose` --- src/backend/tests/brilisp/arr_sum.out | 1 + src/backend/tests/brilisp/arr_sum.sexp | 28 ++++++++ src/backend/tests/brilisp/transpose.out | 9 +++ src/backend/tests/brilisp/transpose.sexp | 85 ++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 src/backend/tests/brilisp/arr_sum.out create mode 100644 src/backend/tests/brilisp/arr_sum.sexp create mode 100644 src/backend/tests/brilisp/transpose.out create mode 100644 src/backend/tests/brilisp/transpose.sexp diff --git a/src/backend/tests/brilisp/arr_sum.out b/src/backend/tests/brilisp/arr_sum.out new file mode 100644 index 0000000..c3f407c --- /dev/null +++ b/src/backend/tests/brilisp/arr_sum.out @@ -0,0 +1 @@ +55 diff --git a/src/backend/tests/brilisp/arr_sum.sexp b/src/backend/tests/brilisp/arr_sum.sexp new file mode 100644 index 0000000..3271eb4 --- /dev/null +++ b/src/backend/tests/brilisp/arr_sum.sexp @@ -0,0 +1,28 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((main int)) + (set (len int) (const 10)) + (set (arr (ptr int)) (alloc len)) + (set (sum int) (const 0)) + (set (idx int) (const 0)) + (set (one int) (const 1)) + + (label init) + (set (arr_i (ptr int)) (ptradd arr idx)) + (set (idx int) (add idx one)) + (store arr_i idx) + (set (loop bool) (lt idx len)) + (br loop init calc) + + (label calc) + (set (idx int) (sub idx one)) + (set (arr_i (ptr int)) (ptradd arr idx)) + (set (v int) (load arr_i)) + (set (sum int) (add sum v)) + (set (loop bool) (ge idx one)) + (br loop calc out) + + (label out) + (set (tmp int) (call print sum)) + (ret tmp))) diff --git a/src/backend/tests/brilisp/transpose.out b/src/backend/tests/brilisp/transpose.out new file mode 100644 index 0000000..7d5c1b4 --- /dev/null +++ b/src/backend/tests/brilisp/transpose.out @@ -0,0 +1,9 @@ +0 +1 +2 +2 +3 +4 +4 +5 +6 diff --git a/src/backend/tests/brilisp/transpose.sexp b/src/backend/tests/brilisp/transpose.sexp new file mode 100644 index 0000000..fc910d9 --- /dev/null +++ b/src/backend/tests/brilisp/transpose.sexp @@ -0,0 +1,85 @@ +(brilisp + (bril-define ((print int) (n int))) + + (bril-define ((elem int) (i int) (j int)) + (set (two int) (const 2)) + (set (j int) (mul j two)) + (set (i int) (add i j)) + (ret i)) + + (bril-define ((arr_read int) (arr (ptr (ptr int))) (i int) (j int)) + (set (p (ptr (ptr int))) (ptradd arr i)) + (set (r (ptr int)) (load p)) + (set (p (ptr int)) (ptradd r j)) + (set (v int) (load p)) + (ret v)) + + (bril-define ((arr_write void) (arr (ptr (ptr int))) (i int) (j int) (v int)) + (set (p (ptr (ptr int))) (ptradd arr i)) + (set (r (ptr int)) (load p)) + (set (p (ptr int)) (ptradd r j)) + (store p v) + (ret)) + + (bril-define ((main void)) + (set (one int) (const 1)) + (set (three int) (const 3)) + (set (arr (ptr (ptr int))) (alloc three)) + (set (i int) (const 0)) + (set (j int) (const 0)) + + (label init_row) + (set (p (ptr (ptr int))) (ptradd arr i)) + (set (r (ptr int)) (alloc three)) + (store p r) + (label init_col) + (set (v int) (call elem i j)) + (set (tmp void) (call arr_write arr i j v)) + (set (j int) (add j one)) + (set (j_loop bool) (lt j three)) + (br j_loop init_col cont1) + (label cont1) + (set (j int) (const 0)) + (set (i int) (add i one)) + (set (i_loop bool) (lt i three)) + (br i_loop init_row cont2) + + (label cont2) + (set (i int) (const 0)) + (set (j int) (const 0)) + + (label calc_row) + (set (j int) (add i one)) + (label calc_col) + (set (vij int) (call arr_read arr i j)) + (set (vji int) (call arr_read arr j i)) + (set (tmp void) (call arr_write arr i j vji)) + (set (tmp void) (call arr_write arr j i vij)) + (set (j int) (add j one)) + (set (j_loop bool) (le j three)) + (br j_loop calc_col cont3) + (label cont3) + (set (j int) (const 0)) + (set (i int) (add i one)) + (set (i_loop bool) (le i three)) + (br i_loop calc_row cont4) + + (label cont4) + (set (i int) (const 0)) + (set (j int) (const 0)) + + (label out_row) + (label out_col) + (set (v int) (call arr_read arr i j)) + (set (tmp int) (call print v)) + (set (j int) (add j one)) + (set (j_loop bool) (lt j three)) + (br j_loop out_col cont5) + (label cont5) + (set (j int) (const 0)) + (set (i int) (add i one)) + (set (i_loop bool) (lt i three)) + (br i_loop out_row cont6) + + (label cont6) + (ret)))