Add print-cfg tests

This commit is contained in:
Morgan Phillips
2016-07-14 13:43:11 -07:00
parent 4e74d85056
commit 41d4cdba46
6 changed files with 118 additions and 1 deletions

View File

@@ -7,7 +7,7 @@
# - Make a debug build of all crates. # - Make a debug build of all crates.
# - Make a release build of cton-util. # - Make a release build of cton-util.
# - Run file-level tests with the release build of cton-util. # - Run file-level tests with the release build of cton-util.
# #
# All tests run by this script should be passing at all times. # All tests run by this script should be passing at all times.
# Exit immediately on errors. # Exit immediately on errors.
@@ -35,5 +35,6 @@ export CTONUTIL="$topdir/src/tools/target/release/cton-util"
echo ====== Parser tests ====== echo ====== Parser tests ======
cd "$topdir/tests" cd "$topdir/tests"
parser/run.sh parser/run.sh
cfg/run.sh
echo ====== OK ====== echo ====== OK ======

View File

@@ -0,0 +1,14 @@
CFG tests
============
This directory contains test cases for the Cretonne cfg printer.
Each test case consists of a `foo.cton` input file annotated with its expected connections.
Annotations are comments of the form: `ebbx:insty -> ebbz` where ebbx is connected to ebbz via
a branch or jump instruction at line y. Instructions are labeled by line number starting from zero: `inst0` .. `instn`.
Each input file is run through the `cton-util print-cfg` command and the
output is compared against the specially formatted comments to ensure that
expected connections exist. This scheme allows for changes to graph style
without the need to update tests.

View File

@@ -0,0 +1,30 @@
; For testing cfg generation. This code is nonsense.
function nonsense(i32, i32) -> f32 {
ebb0(v1: i32, v2: i32):
v3 = f64const 0x0.0
brz v2, ebb2 ;;;; ebb0:inst1 -> ebb2
v4 = iconst.i32 0
jump ebb1(v4) ;;;; ebb0:inst3 -> ebb1
ebb1(v5: i32):
v6 = imul_imm v5, 4
v7 = iadd v1, v6
v8 = f32const 0.0
v9 = f32const 0.0
v10 = f32const 0.0
v11 = fadd v9, v10
v12 = iadd_imm v5, 1
v13 = icmp ult, v12, v2
brnz v13, ebb1(v12) ;;;; ebb1:inst12 -> ebb1
v14 = f64const 0.0
v15 = f64const 0.0
v16 = fdiv v14, v15
v17 = f32const 0.0
return v17
ebb2:
v100 = f32const 0.0
return v100
}

38
cranelift/tests/cfg/run.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
# Go to tests directory.
cd $(dirname "$0")/..
# The path to cton-util should be in $CTONUTIL.
if [ -z "$CTONUTIL" ]; then
CTONUTIL=../src/tools/target/debug/cton-util
fi
if [ ! -x "$CTONUTIL" ]; then
echo "Can't fund executable cton-util: $CTONUTIL" 1>&2
exit 1
fi
declare -a fails
for testcase in $(find cfg -name '*.cton'); do
annotations=$(cat $testcase | awk /';;;;'/ | awk -F ";;;;" '{print $2}' | sort)
connections=$("${CTONUTIL}" print-cfg "$testcase" | awk /"->"/ | sort)
if diff -u <(echo $annotations) <(echo $connections); then
echo OK $testcase
else
fails=(${fails[@]} "$testcase")
echo FAIL $testcase
fi
done
if [ ${#fails[@]} -ne 0 ]; then
echo
echo Failures:
for f in "${fails[@]}"; do
echo " $f"
done
exit 1
else
echo "All passed"
fi

View File

@@ -0,0 +1,18 @@
; For testing cfg generation. This code explores the implications of encountering
; a terminating instruction before any connections have been made.
function nonsense(i32) {
ebb0(v1: i32):
trap
brnz v1, ebb2 ;;;; ebb0:inst1 -> ebb2
jump ebb1 ;;;; ebb0:inst2 -> ebb1
ebb1:
v2 = iconst.i32 0
v3 = iadd v1, v3
jump ebb0(v3) ;;;; ebb1:inst5 -> ebb0
ebb2:
return v1
}

View File

@@ -0,0 +1,16 @@
; For testing cfg generation where some block is never reached.
function not_reached(i32) -> i32 {
ebb0(v0: i32):
brnz v0, ebb2 ;;;; ebb0:inst0 -> ebb2
trap
ebb1:
v1 = iconst.i32 1
v2 = iadd v0, v1
jump ebb0(v2) ;;;; ebb1:inst4 -> ebb0
ebb2:
return v0
}