Skip to content

Commit

Permalink
tests & fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander.nutz committed Feb 4, 2025
1 parent 9bf5a24 commit d0910f6
Show file tree
Hide file tree
Showing 32 changed files with 129 additions and 13 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ please do not currently change anything related to:
| 9. | lower mul/div pass. lowers {MUL, {U,S}DIV} that are not supported by backend | 100€ (~103$) | |
| 10. | add ops for more float math operations. add pass that lowers unsupported ones to libm calls | **200€** (~207$) | |
| 11. | loop (and if statement) invariant code movement pass | 50€ (~ 51$) | |
| 12. | loop unswitch pass: move if inside loop to outside if possible. | 25€ (~ 26$) | |

## current optimizations
- variable inlining
Expand Down
7 changes: 4 additions & 3 deletions cli/cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
#define lenof(x) (sizeof(x) / sizeof(x[0]))

static const char *const usages[] = {
"sfmt format an S-expression",
"vs2h convert vxcc IR (as S-expression) to a human-readable IR representation",
"vs2vs parse vxcc IR (as S-expression) and then emit it again (only useful for testing)",
"sfmt format an S-expression",
"vs2h convert vxcc IR (as S-expression) to a human-readable IR representation",
"vs2vs parse vxcc IR (as S-expression) and then emit it again (only useful for testing)",
"vs2asm optimize and codegen vxcc IR to assembly",
NULL,
};

Expand Down
7 changes: 5 additions & 2 deletions ir/builder.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,11 @@ void vx_IrBlock_addIn(vx_IrBlock *block,
void vx_IrBlock_putVar(vx_IrBlock *root, vx_IrVar var, vx_IrOp *decl) {
assert(root->is_root);
if (var >= root->as_root.vars_len) {
root->as_root.vars = realloc(root->as_root.vars, sizeof(*root->as_root.vars) * (var + 1));
root->as_root.vars_len = var + 1;
void* new = calloc(var + 1, sizeof(*root->as_root.vars));
memcpy(new, root->as_root.vars, sizeof(*root->as_root.vars) * root->as_root.vars_len);
free(root->as_root.vars);
root->as_root.vars = new;
root->as_root.vars_len = var + 1;
}
memset(&root->as_root.vars[var], 0, sizeof(*root->as_root.vars));
root->as_root.vars[var].decl = decl;
Expand Down
13 changes: 7 additions & 6 deletions ir/ir.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,8 @@ vx_IrVar vx_IrBlock_newVar(vx_IrBlock *block, vx_IrOp *decl) {
assert(block != NULL);
vx_IrBlock *root = (vx_IrBlock *) vx_IrBlock_root(block);
assert(root != NULL);
root->as_root.vars = realloc(root->as_root.vars, (root->as_root.vars_len + 1) * sizeof(*root->as_root.vars));
assert(root->as_root.vars);
vx_IrVar new = root->as_root.vars_len ++;
memset(&root->as_root.vars[new], 0, sizeof(*root->as_root.vars));
root->as_root.vars[new].decl = decl;
vx_IrVar new = root->as_root.vars_len;
vx_IrBlock_putVar(root, new, decl);
return new;
}

Expand Down Expand Up @@ -402,10 +399,14 @@ int vx_CU_compile(vx_CU * cu,

vx_CIrBlock_fix(cu, block); // TODO: why...
vx_CIrBlock_normalize(cu, block);
vx_CIrBlock_mksa_states(cu, block);
vx_IrBlock_dump(block, stdout, 0);
vx_CIrBlock_mksa_states(cu, block);
vx_IrBlock_dump(block, stdout, 0);
vx_CIrBlock_mksa_final(cu, block);
vx_IrBlock_dump(block, stdout, 0);
vx_CIrBlock_fix(cu, block); // TODO: why...

vx_IrBlock_dump(block, stdout, 0);
if (vx_ir_verify(cu, block) != 0)
return 1;
});
Expand Down
1 change: 1 addition & 0 deletions ir/passes.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ void vx_llir_prep_lower(vx_CU* cu, vx_IrBlock *block) {

void vx_CIrBlock_fix(vx_CU* cu, vx_IrBlock* block) {
vx_IrBlock* root = vx_IrBlock_root(block);
assert(root);

for (size_t i = 0; i < block->ins_len; i ++)
vx_IrBlock_putVar(root, block->ins[i].var, NULL);
Expand Down
4 changes: 2 additions & 2 deletions ir/transform/single_assign.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ void vx_CIrBlock_mksa_final(vx_CU* cu, vx_IrBlock *block)
*var = new;

vx_IrOp *oldstart = block->first;
block->first = op->next;
vx_IrBlock_renameVar(block, old, new, VX_RENAME_VAR_OUTPUTS);
block->first = op->next;
vx_IrBlock_renameVar(block, old, new, VX_RENAME_VAR_OUTPUTS);
block->first = oldstart;
}
}
Expand Down
3 changes: 3 additions & 0 deletions s-expr/ir_serial.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <time.h>
#include "../ir/ir.h"
#include "../ir/passes.h"
#include "sexpr.h"

vx_IrVar vx_IrVar_parseS(vx_CU* cu, struct SNode* nd)
Expand Down Expand Up @@ -206,6 +207,8 @@ void vx_CUBlock_parseS(vx_CU* cu, struct SNode* s)
inner = inner->next;

vx_IrBlock* block = vx_IrBlock_parseS(cu, inner);
vx_IrBlock_makeRoot(block, 0);
vx_CIrBlock_fix(cu, block);

char const* name = snode_expect(snode_kv_get_expect(attribs, "name"), S_STRING)->value;
block->name = name;
Expand Down
4 changes: 4 additions & 0 deletions tests/addfirst4.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fn int addfirst4(int* z) @export
{
return z[0] + z[1] + z[2] + z[3];
}
1 change: 1 addition & 0 deletions tests/addfirst4.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int" simple ((float 0) (size 4) (align 4)))) (type ("int*" simple ((float 0) (size 8) (align 64)))) (type ("long" simple ((float 0) (size 8) (align 8)))) (cu-block (((name "addfirst4") (export 1)) (block ((args (("int*" 1))) (ops (((outs (("int" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs (("long" 2))) (name "imm") (params (("val" (int 0)))) (args ())) ((outs (("int*" 3))) (name "mul") (params (("a" (var 2)) ("b" (int 4)))) (args ())) ((outs (("int*" 4))) (name "add") (params (("a" (var 1)) ("b" (var 3)))) (args ())) ((outs (("int" 5))) (name "load") (params (("addr" (var 4)))) (args ())) ((outs (("long" 6))) (name "imm") (params (("val" (int 1)))) (args ())) ((outs (("int*" 7))) (name "mul") (params (("a" (var 6)) ("b" (int 4)))) (args ())) ((outs (("int*" 8))) (name "add") (params (("a" (var 1)) ("b" (var 7)))) (args ())) ((outs (("int" 9))) (name "load") (params (("addr" (var 8)))) (args ())) ((outs (("int" 10))) (name "add") (params (("a" (var 9)) ("b" (var 5)))) (args ())) ((outs (("long" 11))) (name "imm") (params (("val" (int 2)))) (args ())) ((outs (("int*" 12))) (name "mul") (params (("a" (var 11)) ("b" (int 4)))) (args ())) ((outs (("int*" 13))) (name "add") (params (("a" (var 1)) ("b" (var 12)))) (args ())) ((outs (("int" 14))) (name "load") (params (("addr" (var 13)))) (args ())) ((outs (("int" 15))) (name "add") (params (("a" (var 14)) ("b" (var 10)))) (args ())) ((outs (("long" 16))) (name "imm") (params (("val" (int 3)))) (args ())) ((outs (("int*" 17))) (name "mul") (params (("a" (var 16)) ("b" (int 4)))) (args ())) ((outs (("int*" 18))) (name "add") (params (("a" (var 1)) ("b" (var 17)))) (args ())) ((outs (("int" 19))) (name "load") (params (("addr" (var 18)))) (args ())) ((outs (("int" 20))) (name "add") (params (("a" (var 19)) ("b" (var 15)))) (args ())) ((outs ()) (name "ret") (params ()) (args ((var 20)))))) (rets (0)))))))
15 changes: 15 additions & 0 deletions tests/assignments.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
fn int assignments(int y) @export
{
int x = 0;
x += y;
x -= y;
x %= y;
x /= y;
x *= y;
x <<= y;
x >>= y;
x |= y;
x &= y;
return (int) x;
}

1 change: 1 addition & 0 deletions tests/assignments.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int" simple ((float 0) (size 4) (align 4)))) (cu-block (((name "assignments") (export 1)) (block ((args (("int" 1))) (ops (((outs (("int" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs (("int" 3))) (name "imm") (params (("val" (int 0)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 3)))) (args ())) ((outs (("int" 4))) (name "add") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 4)))) (args ())) ((outs (("int" 5))) (name "sub") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 5)))) (args ())) ((outs (("int" 6))) (name "mod") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 6)))) (args ())) ((outs (("int" 7))) (name "sdiv") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 7)))) (args ())) ((outs (("int" 8))) (name "mul") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 8)))) (args ())) ((outs (("int" 9))) (name "shl") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 9)))) (args ())) ((outs (("int" 10))) (name "ashr") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 10)))) (args ())) ((outs (("int" 11))) (name "or") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 11)))) (args ())) ((outs (("int" 12))) (name "bwand") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("int" 2))) (name "imm") (params (("val" (var 12)))) (args ())) ((outs ()) (name "ret") (params ()) (args ((var 2)))))) (rets (0)))))))
4 changes: 4 additions & 0 deletions tests/c3_to_ir.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
set -e
for f in *.c3; do
../../build/c3c* compile-only $f --use-stdlib=no --backend=vxcc --emit-asm > $f.s
done
4 changes: 4 additions & 0 deletions tests/cmp.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fn int cmp(int a, int b) @export
{
return (int) (a > 20 && a < b);
}
1 change: 1 addition & 0 deletions tests/cmp.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int" simple ((float 0) (size 4) (align 4)))) (type ("bool" simple ((float 0) (size 1) (align 1)))) (cu-block (((name "cmp") (export 1)) (block ((args (("int" 1) ("int" 2))) (ops (((outs (("int" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs (("int" 3))) (name "imm") (params (("val" (int 20)))) (args ())) ((outs (("bool" 4))) (name "sgt") (params (("a" (var 1)) ("b" (var 3)))) (args ())) ((outs (("bool" 5))) (name "slt") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs (("bool" 6))) (name "and") (params (("a" (var 5)) ("b" (var 4)))) (args ())) ((outs (("int" 7))) (name "sx") (params (("val" (var 6)))) (args ())) ((outs ()) (name "ret") (params ()) (args ((var 7)))))) (rets (0)))))))
12 changes: 12 additions & 0 deletions tests/coltwise_reduce_sum.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
fn void colwise_reduce_sum(int* dest, int* a, usz w, usz h) @export
{
for (usz col = 0; col < w; col ++)
{
int sum = 0;
for (usz row = 0; row < h; row ++)
{
sum += a[col * w + row];
}
dest[col] = sum;
}
}
1 change: 1 addition & 0 deletions tests/coltwise_reduce_sum.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int*" simple ((float 0) (size 8) (align 64)))) (type ("ulong" simple ((float 0) (size 8) (align 8)))) (type ("bool" simple ((float 0) (size 1) (align 1)))) (type ("int" simple ((float 0) (size 4) (align 4)))) (cu-block (((name "colwise_reduce_sum") (export 1)) (block ((args (("int*" 1) ("int*" 2) ("ulong" 3) ("ulong" 4))) (ops (((outs ()) (name "cfor") (params (("start" (block ((args ()) (ops (((outs (("ulong" 5))) (name "imm") (params (("val" (int 0)))) (args ())) ((outs (("ulong" 6))) (name "imm") (params (("val" (var 5)))) (args ())))) (rets ())))) ("cond" (block ((args ()) (ops (((outs (("bool" 7))) (name "ult") (params (("a" (var 6)) ("b" (var 3)))) (args ())))) (rets (7))))) ("endex" (block ((args ()) (ops (((outs (("ulong" 8))) (name "add") (params (("a" (var 6)) ("b" (int 1)))) (args ())) ((outs (("ulong" 6))) (name "imm") (params (("val" (var 8)))) (args ())))) (rets ())))) ("do" (block ((args ()) (ops (((outs (("int" 10))) (name "imm") (params (("val" (int 0)))) (args ())) ((outs (("int" 9))) (name "imm") (params (("val" (var 10)))) (args ())) ((outs ()) (name "cfor") (params (("start" (block ((args ()) (ops (((outs (("ulong" 11))) (name "imm") (params (("val" (int 0)))) (args ())) ((outs (("ulong" 12))) (name "imm") (params (("val" (var 11)))) (args ())))) (rets ())))) ("cond" (block ((args ()) (ops (((outs (("bool" 13))) (name "ult") (params (("a" (var 12)) ("b" (var 4)))) (args ())))) (rets (13))))) ("endex" (block ((args ()) (ops (((outs (("ulong" 14))) (name "add") (params (("a" (var 12)) ("b" (int 1)))) (args ())) ((outs (("ulong" 12))) (name "imm") (params (("val" (var 14)))) (args ())))) (rets ())))) ("do" (block ((args ()) (ops (((outs (("ulong" 15))) (name "mul") (params (("a" (var 3)) ("b" (var 6)))) (args ())) ((outs (("ulong" 16))) (name "add") (params (("a" (var 12)) ("b" (var 15)))) (args ())) ((outs (("int*" 17))) (name "mul") (params (("a" (var 16)) ("b" (int 4)))) (args ())) ((outs (("int*" 18))) (name "add") (params (("a" (var 2)) ("b" (var 17)))) (args ())) ((outs (("int" 19))) (name "load") (params (("addr" (var 18)))) (args ())) ((outs (("int" 20))) (name "add") (params (("a" (var 19)) ("b" (var 9)))) (args ())) ((outs (("int" 9))) (name "imm") (params (("val" (var 20)))) (args ())))) (rets ())))))) (args ())) ((outs (("int*" 21))) (name "mul") (params (("a" (var 6)) ("b" (int 4)))) (args ())) ((outs (("int*" 22))) (name "add") (params (("a" (var 1)) ("b" (var 21)))) (args ())) ((outs (("int" 23))) (name "load") (params (("addr" (var 22)))) (args ())) ((outs (("int*" 24))) (name "mul") (params (("a" (var 6)) ("b" (int 4)))) (args ())) ((outs (("int*" 25))) (name "add") (params (("a" (var 1)) ("b" (var 24)))) (args ())) ((outs ()) (name "store") (params (("addr" (var 25)) ("val" (var 9)))) (args ())))) (rets ())))))) (args ())))) (rets ()))))))
7 changes: 7 additions & 0 deletions tests/eltwise_add.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fn void eltwise_add(int* o, int* a, int* b, usz len) @export
{
for (usz i = 0; i < len; i ++)
{
o[i] = a[i] + b[i];
}
}
1 change: 1 addition & 0 deletions tests/eltwise_add.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int*" simple ((float 0) (size 8) (align 64)))) (type ("ulong" simple ((float 0) (size 8) (align 8)))) (type ("bool" simple ((float 0) (size 1) (align 1)))) (type ("int" simple ((float 0) (size 4) (align 4)))) (cu-block (((name "eltwise_add") (export 1)) (block ((args (("int*" 1) ("int*" 2) ("int*" 3) ("ulong" 4))) (ops (((outs ()) (name "cfor") (params (("start" (block ((args ()) (ops (((outs (("ulong" 5))) (name "imm") (params (("val" (int 0)))) (args ())) ((outs (("ulong" 6))) (name "imm") (params (("val" (var 5)))) (args ())))) (rets ())))) ("cond" (block ((args ()) (ops (((outs (("bool" 7))) (name "ult") (params (("a" (var 6)) ("b" (var 4)))) (args ())))) (rets (7))))) ("endex" (block ((args ()) (ops (((outs (("ulong" 8))) (name "add") (params (("a" (var 6)) ("b" (int 1)))) (args ())) ((outs (("ulong" 6))) (name "imm") (params (("val" (var 8)))) (args ())))) (rets ())))) ("do" (block ((args ()) (ops (((outs (("int*" 9))) (name "mul") (params (("a" (var 6)) ("b" (int 4)))) (args ())) ((outs (("int*" 10))) (name "add") (params (("a" (var 1)) ("b" (var 9)))) (args ())) ((outs (("int" 11))) (name "load") (params (("addr" (var 10)))) (args ())) ((outs (("int*" 12))) (name "mul") (params (("a" (var 6)) ("b" (int 4)))) (args ())) ((outs (("int*" 13))) (name "add") (params (("a" (var 2)) ("b" (var 12)))) (args ())) ((outs (("int" 14))) (name "load") (params (("addr" (var 13)))) (args ())) ((outs (("int*" 15))) (name "mul") (params (("a" (var 6)) ("b" (int 4)))) (args ())) ((outs (("int*" 16))) (name "add") (params (("a" (var 3)) ("b" (var 15)))) (args ())) ((outs (("int" 17))) (name "load") (params (("addr" (var 16)))) (args ())) ((outs (("int" 18))) (name "add") (params (("a" (var 17)) ("b" (var 14)))) (args ())) ((outs (("int*" 19))) (name "mul") (params (("a" (var 6)) ("b" (int 4)))) (args ())) ((outs (("int*" 20))) (name "add") (params (("a" (var 1)) ("b" (var 19)))) (args ())) ((outs ()) (name "store") (params (("addr" (var 20)) ("val" (var 18)))) (args ())))) (rets ())))))) (args ())))) (rets ()))))))
10 changes: 10 additions & 0 deletions tests/max1.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
fn int max(int a, int b) @export
{
int res;
if (a > b) {
res = a;
} else {
res = b;
}
return res;
}
1 change: 1 addition & 0 deletions tests/max1.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int" simple ((float 0) (size 4) (align 4)))) (type ("bool" simple ((float 0) (size 1) (align 1)))) (cu-block (((name "max") (export 1)) (block ((args (("int" 1) ("int" 2))) (ops (((outs (("int" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs (("int" 3))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs ()) (name "if") (params (("cond" (var 4)) ("then" (block ((args ()) (ops (((outs (("int" 3))) (name "imm") (params (("val" (var 1)))) (args ())))) (rets ())))) ("else" (block ((args ()) (ops (((outs (("int" 3))) (name "imm") (params (("val" (var 2)))) (args ())))) (rets ())))))) (args ())) ((outs (("bool" 4))) (name "sgt") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs ()) (name "ret") (params ()) (args ((var 3)))))) (rets (0)))))))
9 changes: 9 additions & 0 deletions tests/max2.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
fn int max2(int a, int b) @export
{
if (a > b) {
return a;
}
else {
return b;
}
}
1 change: 1 addition & 0 deletions tests/max2.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int" simple ((float 0) (size 4) (align 4)))) (type ("bool" simple ((float 0) (size 1) (align 1)))) (cu-block (((name "max2") (export 1)) (block ((args (("int" 1) ("int" 2))) (ops (((outs (("int" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs ()) (name "if") (params (("cond" (var 3)) ("then" (block ((args ()) (ops (((outs ()) (name "ret") (params ()) (args ((var 1)))))) (rets ())))) ("else" (block ((args ()) (ops (((outs ()) (name "ret") (params ()) (args ((var 2)))))) (rets ())))))) (args ())) ((outs (("bool" 3))) (name "sgt") (params (("a" (var 1)) ("b" (var 2)))) (args ())))) (rets (0)))))))
7 changes: 7 additions & 0 deletions tests/max3.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fn int max3(int a, int b) @export
{
if (a > b) {
return a;
}
return b;
}
1 change: 1 addition & 0 deletions tests/max3.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int" simple ((float 0) (size 4) (align 4)))) (type ("bool" simple ((float 0) (size 1) (align 1)))) (cu-block (((name "max3") (export 1)) (block ((args (("int" 1) ("int" 2))) (ops (((outs (("int" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs ()) (name "if") (params (("cond" (var 3)) ("then" (block ((args ()) (ops (((outs ()) (name "ret") (params ()) (args ((var 1)))))) (rets ())))) ("else" (block ((args ()) (ops ()) (rets ())))))) (args ())) ((outs (("bool" 3))) (name "sgt") (params (("a" (var 1)) ("b" (var 2)))) (args ())) ((outs ()) (name "ret") (params ()) (args ((var 2)))))) (rets (0)))))))
4 changes: 4 additions & 0 deletions tests/place1.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fn usz test(int a, int b) @export
{
return ((usz) (&a)) + b;
}
1 change: 1 addition & 0 deletions tests/place1.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("ulong" simple ((float 0) (size 8) (align 8)))) (type ("int" simple ((float 0) (size 4) (align 4)))) (type ("long" simple ((float 0) (size 8) (align 8)))) (type ("int*" simple ((float 0) (size 8) (align 64)))) (cu-block (((name "test") (export 1)) (block ((args (("int" 1) ("int" 2))) (ops (((outs (("ulong" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs (("int*" 3))) (name "place") (params (("var" (var 1)))) (args ())) ((outs (("long" 4))) (name "bitcast") (params (("val" (var 3)))) (args ())) ((outs (("long" 5))) (name "sx") (params (("val" (var 2)))) (args ())) ((outs (("long" 6))) (name "add") (params (("a" (var 5)) ("b" (var 4)))) (args ())) ((outs (("ulong" 7))) (name "bitcast") (params (("val" (var 6)))) (args ())) ((outs ()) (name "ret") (params ()) (args ((var 7)))))) (rets (0)))))))
4 changes: 4 additions & 0 deletions tests/ptr.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fn int ptrtest(int* z) @export
{
return z[2];
}
1 change: 1 addition & 0 deletions tests/ptr.c3.s
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
("amd64:cmov" (opt ((max_total_cmov_inline_cost 4) (consteval_iterations 6) (loop_simplify 1) (if_eval 1))) (type ("int" simple ((float 0) (size 4) (align 4)))) (type ("int*" simple ((float 0) (size 8) (align 64)))) (type ("long" simple ((float 0) (size 8) (align 8)))) (cu-block (((name "ptrtest") (export 1)) (block ((args (("int*" 1))) (ops (((outs (("int" 0))) (name "imm") (params (("val" (uninit)))) (args ())) ((outs (("long" 2))) (name "imm") (params (("val" (int 2)))) (args ())) ((outs (("int*" 3))) (name "mul") (params (("a" (var 2)) ("b" (int 4)))) (args ())) ((outs (("int*" 4))) (name "add") (params (("a" (var 1)) ("b" (var 3)))) (args ())) ((outs (("int" 5))) (name "load") (params (("addr" (var 4)))) (args ())) ((outs ()) (name "ret") (params ()) (args ((var 5)))))) (rets (0)))))))
Loading

0 comments on commit d0910f6

Please sign in to comment.