From 4af5176d6377958a457da3e5f671ce21540fad70 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sun, 18 Aug 2024 20:48:27 +0300 Subject: add tests and fixes on top of 674438 --- .gitignore | 2 ++ Makefile | 4 +++ src/regalloc.c | 2 +- src/ssa.c | 8 +++++- tests/Makefile | 26 +++++++++++++++++++ tests/addr.qbt | 7 ------ tests/addr/addr.qbt | 7 ++++++ tests/addr/source.mk | 1 + tests/blit.qbt | 9 ------- tests/blit/blit.qbt | 9 +++++++ tests/blit/source.mk | 1 + tests/empty.qbt | 4 --- tests/empty/empty.qbt | 4 +++ tests/empty/source.mk | 1 + tests/hello_world.qbt | 18 -------------- tests/hello_world/hello_world.qbt | 18 ++++++++++++++ tests/hello_world/source.mk | 1 + tests/save.qbt | 11 -------- tests/save/save.qbt | 11 ++++++++ tests/save/source.mk | 1 + tests/scripts/gen-simple | 14 +++++++++++ tests/scripts/gen-simple-xfail | 29 ++++++++++++++++++++++ tests/scripts/makefile | 16 ++++++++++++ tests/simple_args.qbt | 19 -------------- tests/simple_args/simple_args.qbt | 19 ++++++++++++++ tests/simple_args/source.mk | 1 + tests/simple_external_putchar.qbt | 5 ---- .../simple_external_putchar.qbt | 5 ++++ tests/simple_external_putchar/source.mk | 1 + tests/simple_loop.qbt | 13 ---------- tests/simple_loop/simple_loop.qbt | 13 ++++++++++ tests/simple_loop/source.mk | 1 + tests/unreachable.qbt | 18 -------------- tests/unreachable/source.mk | 1 + tests/unreachable/unreachable.qbt | 18 ++++++++++++++ 35 files changed, 212 insertions(+), 106 deletions(-) create mode 100644 tests/Makefile delete mode 100644 tests/addr.qbt create mode 100644 tests/addr/addr.qbt create mode 100644 tests/addr/source.mk delete mode 100644 tests/blit.qbt create mode 100644 tests/blit/blit.qbt create mode 100644 tests/blit/source.mk delete mode 100644 tests/empty.qbt create mode 100644 tests/empty/empty.qbt create mode 100644 tests/empty/source.mk delete mode 100644 tests/hello_world.qbt create mode 100644 tests/hello_world/hello_world.qbt create mode 100644 tests/hello_world/source.mk delete mode 100644 tests/save.qbt create mode 100644 tests/save/save.qbt create mode 100644 tests/save/source.mk create mode 100755 tests/scripts/gen-simple create mode 100755 tests/scripts/gen-simple-xfail create mode 100644 tests/scripts/makefile delete mode 100644 tests/simple_args.qbt create mode 100644 tests/simple_args/simple_args.qbt create mode 100644 tests/simple_args/source.mk delete mode 100644 tests/simple_external_putchar.qbt create mode 100644 tests/simple_external_putchar/simple_external_putchar.qbt create mode 100644 tests/simple_external_putchar/source.mk delete mode 100644 tests/simple_loop.qbt create mode 100644 tests/simple_loop/simple_loop.qbt create mode 100644 tests/simple_loop/source.mk delete mode 100644 tests/unreachable.qbt create mode 100644 tests/unreachable/source.mk create mode 100644 tests/unreachable/unreachable.qbt diff --git a/.gitignore b/.gitignore index 68c0d5d..55f811c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ deps.mk +tests.mk docs/output +reports build gen qbt diff --git a/Makefile b/Makefile index d4247f1..3a81560 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,10 @@ all: setup analyze: setup CC='gcc -fanalyzer' SKIP_ANALYZER='-fno-analyzer' $(MAKE) CROSS_COMPILE= +.PHONY: check +check: all + $(MAKE) -C tests -k check + .PHONY: setup: @echo -n > deps.mk diff --git a/src/regalloc.c b/src/regalloc.c index 6265c6d..61a90b1 100644 --- a/src/regalloc.c +++ b/src/regalloc.c @@ -184,7 +184,7 @@ static void build_active_between(struct vec *active, struct vec *prev_active, st * the lifetimes vector */ if (prev_active) foreach_lifetime(li, *prev_active) { - struct lifetime l = lifetime_at(*lifetimes, li); + struct lifetime l = lifetime_at(*prev_active, li); if (l.end <= start) continue; diff --git a/src/ssa.c b/src/ssa.c index 7af342b..74ad59a 100644 --- a/src/ssa.c +++ b/src/ssa.c @@ -72,6 +72,9 @@ top: } b = vect_pop(struct blk *, stack); + if (done(b, visited)) + goto top; + if (return_blk(b)) { b->s1 = NULL; b->s2 = NULL; @@ -185,13 +188,16 @@ top: } b = vect_pop(struct blk *, stack); + if (done(b, visited)) + goto top; + if (!entered(b, visited)) { vec_append(&stack, &b); if (b->s1) vec_append(&stack, &b->s1); - if (b->s2) + if (b->s2 && b->s2 != b->s1) vec_append(&stack, &b->s2); enter(b); diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..1f37445 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,26 @@ +check: + $(MAKE) -f scripts/makefile check + +.DEFAULT: + $(MAKE) -f scripts/makefile $< + +SOURCES != echo */source.mk +DO != echo -n > tests.mk && rm -rf reports + +SIMPLE := +SIMPLE_XFAIL := + +include $(SOURCES) + +# pass through xargs to 'trick' it into expanding each SIMPLE_XFAIL into a +# separate argument for the script, as make would otherwise just split at each space +# this way we can pass spaces as arguments to the generator scripts, pretty neat +# huh? +DO != echo "$(SIMPLE)" | xargs ./scripts/gen-simple +DO != echo "$(SIMPLE_XFAIL)" | xargs ./scripts/gen-simple-xfail + +RM ?= rm + +.PHONY: clean +clean: + $(RM) -rf reports diff --git a/tests/addr.qbt b/tests/addr.qbt deleted file mode 100644 index efe149c..0000000 --- a/tests/addr.qbt +++ /dev/null @@ -1,7 +0,0 @@ -main () -{ - i27 r0 = 1; - i27 r1 = ^r0; - i27 r0 = r0 + r0; - => (r0); -} diff --git a/tests/addr/addr.qbt b/tests/addr/addr.qbt new file mode 100644 index 0000000..efe149c --- /dev/null +++ b/tests/addr/addr.qbt @@ -0,0 +1,7 @@ +main () +{ + i27 r0 = 1; + i27 r1 = ^r0; + i27 r0 = r0 + r0; + => (r0); +} diff --git a/tests/addr/source.mk b/tests/addr/source.mk new file mode 100644 index 0000000..bc4b83e --- /dev/null +++ b/tests/addr/source.mk @@ -0,0 +1 @@ +SIMPLE_XFAIL += addr,'unimplemented insn: ADDR' diff --git a/tests/blit.qbt b/tests/blit.qbt deleted file mode 100644 index b8fa0d3..0000000 --- a/tests/blit.qbt +++ /dev/null @@ -1,9 +0,0 @@ -main() -{ - /* alloc */ - i27 a = ^ 16; - i27 b = ^ 16; - /* blit */ - b <<* 16 a; - => (); -} diff --git a/tests/blit/blit.qbt b/tests/blit/blit.qbt new file mode 100644 index 0000000..b8fa0d3 --- /dev/null +++ b/tests/blit/blit.qbt @@ -0,0 +1,9 @@ +main() +{ + /* alloc */ + i27 a = ^ 16; + i27 b = ^ 16; + /* blit */ + b <<* 16 a; + => (); +} diff --git a/tests/blit/source.mk b/tests/blit/source.mk new file mode 100644 index 0000000..6bc4045 --- /dev/null +++ b/tests/blit/source.mk @@ -0,0 +1 @@ +SIMPLE_XFAIL += blit,'unimplemented insn: BLIT' diff --git a/tests/empty.qbt b/tests/empty.qbt deleted file mode 100644 index 9c63342..0000000 --- a/tests/empty.qbt +++ /dev/null @@ -1,4 +0,0 @@ -main() -{ - => (); -} diff --git a/tests/empty/empty.qbt b/tests/empty/empty.qbt new file mode 100644 index 0000000..9c63342 --- /dev/null +++ b/tests/empty/empty.qbt @@ -0,0 +1,4 @@ +main() +{ + => (); +} diff --git a/tests/empty/source.mk b/tests/empty/source.mk new file mode 100644 index 0000000..ee6c598 --- /dev/null +++ b/tests/empty/source.mk @@ -0,0 +1 @@ +SIMPLE += empty diff --git a/tests/hello_world.qbt b/tests/hello_world.qbt deleted file mode 100644 index 8419208..0000000 --- a/tests/hello_world.qbt +++ /dev/null @@ -1,18 +0,0 @@ -main() -{ - &_putchar ('H') => (); - &_putchar ('e') => (); - &_putchar ('l') => (); - &_putchar ('l') => (); - &_putchar ('o') => (); - &_putchar (',') => (); - &_putchar (' ') => (); - &_putchar ('W') => (); - &_putchar ('o') => (); - &_putchar ('r') => (); - &_putchar ('l') => (); - &_putchar ('d') => (); - &_putchar ('!') => (); - &_putchar ('\n') => (); - => (); -} diff --git a/tests/hello_world/hello_world.qbt b/tests/hello_world/hello_world.qbt new file mode 100644 index 0000000..8419208 --- /dev/null +++ b/tests/hello_world/hello_world.qbt @@ -0,0 +1,18 @@ +main() +{ + &_putchar ('H') => (); + &_putchar ('e') => (); + &_putchar ('l') => (); + &_putchar ('l') => (); + &_putchar ('o') => (); + &_putchar (',') => (); + &_putchar (' ') => (); + &_putchar ('W') => (); + &_putchar ('o') => (); + &_putchar ('r') => (); + &_putchar ('l') => (); + &_putchar ('d') => (); + &_putchar ('!') => (); + &_putchar ('\n') => (); + => (); +} diff --git a/tests/hello_world/source.mk b/tests/hello_world/source.mk new file mode 100644 index 0000000..be3b9ae --- /dev/null +++ b/tests/hello_world/source.mk @@ -0,0 +1 @@ +SIMPLE += hello_world diff --git a/tests/save.qbt b/tests/save.qbt deleted file mode 100644 index 71b7bb6..0000000 --- a/tests/save.qbt +++ /dev/null @@ -1,11 +0,0 @@ -main() -{ - i27 r0 = 20; - i27 r1 = 30; - i27 r2 = 50; - &_putchar (i9 'H') => (r4); - i27 r0 = r0 + r1; - i27 r0 = r0 + r2; - &_putchar (i9 'e') => (r5); - => (r0); -} diff --git a/tests/save/save.qbt b/tests/save/save.qbt new file mode 100644 index 0000000..725d10b --- /dev/null +++ b/tests/save/save.qbt @@ -0,0 +1,11 @@ +main() +{ + i27 r0 = 20; + i27 r1 = 30; + i27 r2 = 50; + &_putchar ('H') => (r4); + i27 r0 = r0 + r1; + i27 r0 = r0 + r2; + &_putchar ('e') => (r5); + => (r0); +} diff --git a/tests/save/source.mk b/tests/save/source.mk new file mode 100644 index 0000000..60a2498 --- /dev/null +++ b/tests/save/source.mk @@ -0,0 +1 @@ +SIMPLE += save diff --git a/tests/scripts/gen-simple b/tests/scripts/gen-simple new file mode 100755 index 0000000..b8ddd9f --- /dev/null +++ b/tests/scripts/gen-simple @@ -0,0 +1,14 @@ +#!/bin/sh + +mkdir -p $(for d in "${@}"; do echo "$d"; done | uniq | sed "s|^|reports/|") + +for s in "${@}" +do + echo ".PHONY: $s" >> tests.mk + echo "$s:" >> tests.mk + echo " @../qbt $s/$s.qbt > reports/$s/log 2>&1 \\" >> tests.mk + echo " && echo OK > reports/$s/OK \\" >> tests.mk + echo " || echo ERR > reports/$s/OK" >> tests.mk +done + +echo "TESTS += " "${@}" >> tests.mk diff --git a/tests/scripts/gen-simple-xfail b/tests/scripts/gen-simple-xfail new file mode 100755 index 0000000..41c272a --- /dev/null +++ b/tests/scripts/gen-simple-xfail @@ -0,0 +1,29 @@ +#!/bin/sh + +mkdir -p $(for d in "${@}"; do echo "$d"; done \ + | sed "s|,.*||" | uniq | sed "s|^|reports/|") + +for s in "${@}" +do + NAME=${s%%,*} + EMSG=${s#${NAME},} + echo ".PHONY: $NAME" >> tests.mk + echo "$NAME:" >> tests.mk + echo " @../qbt $NAME/$NAME.qbt > reports/$NAME/log 2>&1 \\" >> tests.mk + echo " && echo 'Wrong retval' > reports/$NAME/OK \\" >> tests.mk + echo " || :" >> tests.mk + echo " @grep '$EMSG' reports/$NAME/log > /dev/null; \\" >> tests.mk + echo " [ \$\$? -eq 0 ] \\" >> tests.mk + echo " && echo OK > reports/$NAME/OK \\" >> tests.mk + echo " || echo EMSG > reports/$NAME/OK" >> tests.mk +done + +echo -n "TESTS +=" >> tests.mk +for s in "${@}" +do + NAME=${s%%,*} + echo -n " $NAME" >> tests.mk +done + +# append newline +echo "" >> tests.mk diff --git a/tests/scripts/makefile b/tests/scripts/makefile new file mode 100644 index 0000000..a85d373 --- /dev/null +++ b/tests/scripts/makefile @@ -0,0 +1,16 @@ +.PHONY: all +all: check + +TESTS := +include tests.mk + +.PHONY: check +check: $(TESTS) + @cd reports; for d in * ; do \ + if [ ! -f "$$d/OK" ]; then \ + echo "BROKEN: $$d" ; \ + elif [ "$$(tail -n1 $$d/OK)" != "OK" ]; then \ + echo "FAIL: $$d" ; \ + fi \ + done + @echo "Done." diff --git a/tests/simple_args.qbt b/tests/simple_args.qbt deleted file mode 100644 index 5dcb3d8..0000000 --- a/tests/simple_args.qbt +++ /dev/null @@ -1,19 +0,0 @@ -do_stuff (i27 a0, i27 a1) -{ - i27 r0 = a0 + a1; - i27 r1 = a0 - a1; - => (r0, r1); -} - -/* this is a function of some kind */ -main (i27 a0, i27 a1) -{ - i27 r0 = a0 + a1; - /* r0 is reassigned */ - &do_stuff (r0, 29) => (r0, r1); - r0 < r1 -> somewhere_else; - => (r1); - - somewhere_else: - => (r0); -} diff --git a/tests/simple_args/simple_args.qbt b/tests/simple_args/simple_args.qbt new file mode 100644 index 0000000..5dcb3d8 --- /dev/null +++ b/tests/simple_args/simple_args.qbt @@ -0,0 +1,19 @@ +do_stuff (i27 a0, i27 a1) +{ + i27 r0 = a0 + a1; + i27 r1 = a0 - a1; + => (r0, r1); +} + +/* this is a function of some kind */ +main (i27 a0, i27 a1) +{ + i27 r0 = a0 + a1; + /* r0 is reassigned */ + &do_stuff (r0, 29) => (r0, r1); + r0 < r1 -> somewhere_else; + => (r1); + + somewhere_else: + => (r0); +} diff --git a/tests/simple_args/source.mk b/tests/simple_args/source.mk new file mode 100644 index 0000000..9422cb3 --- /dev/null +++ b/tests/simple_args/source.mk @@ -0,0 +1 @@ +SIMPLE += simple_args diff --git a/tests/simple_external_putchar.qbt b/tests/simple_external_putchar.qbt deleted file mode 100644 index b76844c..0000000 --- a/tests/simple_external_putchar.qbt +++ /dev/null @@ -1,5 +0,0 @@ -main() -{ - &_putchar('H') => (); - => (); -} diff --git a/tests/simple_external_putchar/simple_external_putchar.qbt b/tests/simple_external_putchar/simple_external_putchar.qbt new file mode 100644 index 0000000..b76844c --- /dev/null +++ b/tests/simple_external_putchar/simple_external_putchar.qbt @@ -0,0 +1,5 @@ +main() +{ + &_putchar('H') => (); + => (); +} diff --git a/tests/simple_external_putchar/source.mk b/tests/simple_external_putchar/source.mk new file mode 100644 index 0000000..a226f93 --- /dev/null +++ b/tests/simple_external_putchar/source.mk @@ -0,0 +1 @@ +SIMPLE += simple_external_putchar diff --git a/tests/simple_loop.qbt b/tests/simple_loop.qbt deleted file mode 100644 index 32e544f..0000000 --- a/tests/simple_loop.qbt +++ /dev/null @@ -1,13 +0,0 @@ -main() -{ - i27 i = 0; - i27 max = 1000; - i27 sum = 0; - -top: - i27 sum = sum + i; - i27 i = i + 1; - i < max -> top; - &_putchar(sum) => (); - => (); -} diff --git a/tests/simple_loop/simple_loop.qbt b/tests/simple_loop/simple_loop.qbt new file mode 100644 index 0000000..32e544f --- /dev/null +++ b/tests/simple_loop/simple_loop.qbt @@ -0,0 +1,13 @@ +main() +{ + i27 i = 0; + i27 max = 1000; + i27 sum = 0; + +top: + i27 sum = sum + i; + i27 i = i + 1; + i < max -> top; + &_putchar(sum) => (); + => (); +} diff --git a/tests/simple_loop/source.mk b/tests/simple_loop/source.mk new file mode 100644 index 0000000..4ec9398 --- /dev/null +++ b/tests/simple_loop/source.mk @@ -0,0 +1 @@ +SIMPLE += simple_loop diff --git a/tests/unreachable.qbt b/tests/unreachable.qbt deleted file mode 100644 index b97f9e1..0000000 --- a/tests/unreachable.qbt +++ /dev/null @@ -1,18 +0,0 @@ -in_jump() { - i27 r0 = 0; - -> after; - - i27 r1 = 0; - => (r1); - - after: - => (r0); -} - -after_return() { - i27 r0 = 0; - => (r0); - - i27 r1 = 10; - => (r1); -} diff --git a/tests/unreachable/source.mk b/tests/unreachable/source.mk new file mode 100644 index 0000000..a647456 --- /dev/null +++ b/tests/unreachable/source.mk @@ -0,0 +1 @@ +SIMPLE += unreachable diff --git a/tests/unreachable/unreachable.qbt b/tests/unreachable/unreachable.qbt new file mode 100644 index 0000000..b97f9e1 --- /dev/null +++ b/tests/unreachable/unreachable.qbt @@ -0,0 +1,18 @@ +in_jump() { + i27 r0 = 0; + -> after; + + i27 r1 = 0; + => (r1); + + after: + => (r0); +} + +after_return() { + i27 r0 = 0; + => (r0); + + i27 r1 = 10; + => (r1); +} -- cgit v1.3