From f512110e7b9125cb5b32b792408dfbfc6c8b18d0 Mon Sep 17 00:00:00 2001 From: Philipp Grulich Date: Tue, 30 Jul 2024 23:46:26 +0200 Subject: [PATCH] add additional check to verify the number of arguments in SSA --- .../tracing/phases/SSACreationPhase.cpp | 7 ++ nautilus/test/data/after_ssa/staticLoop.trace | 44 ++++++------- .../data/after_ssa/staticLoopIncrement.trace | 44 ++++++------- nautilus/test/data/ir/staticLoop.trace | 44 ++++++------- .../test/data/ir/staticLoopIncrement.trace | 44 ++++++------- nautilus/test/data/tracing/staticLoop.trace | 64 +++++++++---------- .../data/tracing/staticLoopIncrement.trace | 64 +++++++++---------- .../test/execution-tests/ExecutionTest.cpp | 26 ++++++++ .../execution-tests/StaticLoopFunctions.hpp | 4 +- 9 files changed, 187 insertions(+), 154 deletions(-) diff --git a/nautilus/src/nautilus/tracing/phases/SSACreationPhase.cpp b/nautilus/src/nautilus/tracing/phases/SSACreationPhase.cpp index 95984c02..e4ded8ab 100644 --- a/nautilus/src/nautilus/tracing/phases/SSACreationPhase.cpp +++ b/nautilus/src/nautilus/tracing/phases/SSACreationPhase.cpp @@ -1,4 +1,6 @@ +#include +#include #include #include #include @@ -53,6 +55,11 @@ std::shared_ptr SSACreationPhase::SSACreationPhaseContext::proce // As a result two blocks, can't use the same value references. makeBlockArgumentsUnique(); + // check arguments + if (trace->arguments.size() != trace->getBlocks().front().arguments.size()) { + throw RuntimeException(fmt::format("Wrong number of arguments in trace: expected {}, got {}\n", trace->arguments.size(), trace->getBlocks().front().arguments.size())); + } + // sort arguments std::sort(trace->getBlocks().front().arguments.begin(), trace->getBlocks().front().arguments.end()); return std::move(trace); diff --git a/nautilus/test/data/after_ssa/staticLoop.trace b/nautilus/test/data/after_ssa/staticLoop.trace index 23c9f0fc..6022c849 100644 --- a/nautilus/test/data/after_ssa/staticLoop.trace +++ b/nautilus/test/data/after_ssa/staticLoop.trace @@ -1,23 +1,23 @@ B0() - CONST $2 1 :i32 - CONST $3 10 :i32 - ADD $4 $2 $3 :i32 - CONST $5 10 :i32 - ADD $6 $4 $5 :i32 - CONST $7 10 :i32 - ADD $8 $6 $7 :i32 - CONST $9 10 :i32 - ADD $10 $8 $9 :i32 - CONST $11 10 :i32 - ADD $12 $10 $11 :i32 - CONST $13 10 :i32 - ADD $14 $12 $13 :i32 - CONST $15 10 :i32 - ADD $16 $14 $15 :i32 - CONST $17 10 :i32 - ADD $18 $16 $17 :i32 - CONST $19 10 :i32 - ADD $20 $18 $19 :i32 - CONST $21 10 :i32 - ADD $22 $20 $21 :i32 - RETURN $22 :i32 + CONST $1 1 :i32 + CONST $2 10 :i32 + ADD $3 $1 $2 :i32 + CONST $4 10 :i32 + ADD $5 $3 $4 :i32 + CONST $6 10 :i32 + ADD $7 $5 $6 :i32 + CONST $8 10 :i32 + ADD $9 $7 $8 :i32 + CONST $10 10 :i32 + ADD $11 $9 $10 :i32 + CONST $12 10 :i32 + ADD $13 $11 $12 :i32 + CONST $14 10 :i32 + ADD $15 $13 $14 :i32 + CONST $16 10 :i32 + ADD $17 $15 $16 :i32 + CONST $18 10 :i32 + ADD $19 $17 $18 :i32 + CONST $20 10 :i32 + ADD $21 $19 $20 :i32 + RETURN $21 :i32 diff --git a/nautilus/test/data/after_ssa/staticLoopIncrement.trace b/nautilus/test/data/after_ssa/staticLoopIncrement.trace index 23c9f0fc..6022c849 100644 --- a/nautilus/test/data/after_ssa/staticLoopIncrement.trace +++ b/nautilus/test/data/after_ssa/staticLoopIncrement.trace @@ -1,23 +1,23 @@ B0() - CONST $2 1 :i32 - CONST $3 10 :i32 - ADD $4 $2 $3 :i32 - CONST $5 10 :i32 - ADD $6 $4 $5 :i32 - CONST $7 10 :i32 - ADD $8 $6 $7 :i32 - CONST $9 10 :i32 - ADD $10 $8 $9 :i32 - CONST $11 10 :i32 - ADD $12 $10 $11 :i32 - CONST $13 10 :i32 - ADD $14 $12 $13 :i32 - CONST $15 10 :i32 - ADD $16 $14 $15 :i32 - CONST $17 10 :i32 - ADD $18 $16 $17 :i32 - CONST $19 10 :i32 - ADD $20 $18 $19 :i32 - CONST $21 10 :i32 - ADD $22 $20 $21 :i32 - RETURN $22 :i32 + CONST $1 1 :i32 + CONST $2 10 :i32 + ADD $3 $1 $2 :i32 + CONST $4 10 :i32 + ADD $5 $3 $4 :i32 + CONST $6 10 :i32 + ADD $7 $5 $6 :i32 + CONST $8 10 :i32 + ADD $9 $7 $8 :i32 + CONST $10 10 :i32 + ADD $11 $9 $10 :i32 + CONST $12 10 :i32 + ADD $13 $11 $12 :i32 + CONST $14 10 :i32 + ADD $15 $13 $14 :i32 + CONST $16 10 :i32 + ADD $17 $15 $16 :i32 + CONST $18 10 :i32 + ADD $19 $17 $18 :i32 + CONST $20 10 :i32 + ADD $21 $19 $20 :i32 + RETURN $21 :i32 diff --git a/nautilus/test/data/ir/staticLoop.trace b/nautilus/test/data/ir/staticLoop.trace index fd817e7e..1740c599 100644 --- a/nautilus/test/data/ir/staticLoop.trace +++ b/nautilus/test/data/ir/staticLoop.trace @@ -1,27 +1,27 @@ NESIR { execute() { Block_0(): - $2 = 1 :i32 - $3 = 10 :i32 - $4 = $2 + $3 :i32 - $5 = 10 :i32 - $6 = $4 + $5 :i32 - $7 = 10 :i32 - $8 = $6 + $7 :i32 - $9 = 10 :i32 - $10 = $8 + $9 :i32 - $11 = 10 :i32 - $12 = $10 + $11 :i32 - $13 = 10 :i32 - $14 = $12 + $13 :i32 - $15 = 10 :i32 - $16 = $14 + $15 :i32 - $17 = 10 :i32 - $18 = $16 + $17 :i32 - $19 = 10 :i32 - $20 = $18 + $19 :i32 - $21 = 10 :i32 - $22 = $20 + $21 :i32 - return ($22) :i32 + $1 = 1 :i32 + $2 = 10 :i32 + $3 = $1 + $2 :i32 + $4 = 10 :i32 + $5 = $3 + $4 :i32 + $6 = 10 :i32 + $7 = $5 + $6 :i32 + $8 = 10 :i32 + $9 = $7 + $8 :i32 + $10 = 10 :i32 + $11 = $9 + $10 :i32 + $12 = 10 :i32 + $13 = $11 + $12 :i32 + $14 = 10 :i32 + $15 = $13 + $14 :i32 + $16 = 10 :i32 + $17 = $15 + $16 :i32 + $18 = 10 :i32 + $19 = $17 + $18 :i32 + $20 = 10 :i32 + $21 = $19 + $20 :i32 + return ($21) :i32 } } //NESIR \ No newline at end of file diff --git a/nautilus/test/data/ir/staticLoopIncrement.trace b/nautilus/test/data/ir/staticLoopIncrement.trace index fd817e7e..1740c599 100644 --- a/nautilus/test/data/ir/staticLoopIncrement.trace +++ b/nautilus/test/data/ir/staticLoopIncrement.trace @@ -1,27 +1,27 @@ NESIR { execute() { Block_0(): - $2 = 1 :i32 - $3 = 10 :i32 - $4 = $2 + $3 :i32 - $5 = 10 :i32 - $6 = $4 + $5 :i32 - $7 = 10 :i32 - $8 = $6 + $7 :i32 - $9 = 10 :i32 - $10 = $8 + $9 :i32 - $11 = 10 :i32 - $12 = $10 + $11 :i32 - $13 = 10 :i32 - $14 = $12 + $13 :i32 - $15 = 10 :i32 - $16 = $14 + $15 :i32 - $17 = 10 :i32 - $18 = $16 + $17 :i32 - $19 = 10 :i32 - $20 = $18 + $19 :i32 - $21 = 10 :i32 - $22 = $20 + $21 :i32 - return ($22) :i32 + $1 = 1 :i32 + $2 = 10 :i32 + $3 = $1 + $2 :i32 + $4 = 10 :i32 + $5 = $3 + $4 :i32 + $6 = 10 :i32 + $7 = $5 + $6 :i32 + $8 = 10 :i32 + $9 = $7 + $8 :i32 + $10 = 10 :i32 + $11 = $9 + $10 :i32 + $12 = 10 :i32 + $13 = $11 + $12 :i32 + $14 = 10 :i32 + $15 = $13 + $14 :i32 + $16 = 10 :i32 + $17 = $15 + $16 :i32 + $18 = 10 :i32 + $19 = $17 + $18 :i32 + $20 = 10 :i32 + $21 = $19 + $20 :i32 + return ($21) :i32 } } //NESIR \ No newline at end of file diff --git a/nautilus/test/data/tracing/staticLoop.trace b/nautilus/test/data/tracing/staticLoop.trace index 404487f0..60c02701 100644 --- a/nautilus/test/data/tracing/staticLoop.trace +++ b/nautilus/test/data/tracing/staticLoop.trace @@ -1,33 +1,33 @@ B0() - CONST $2 1 :i32 - CONST $3 10 :i32 - ADD $4 $2 $3 :i32 - ASSIGN $2 $4 :i32 - CONST $5 10 :i32 - ADD $6 $2 $5 :i32 - ASSIGN $2 $6 :i32 - CONST $7 10 :i32 - ADD $8 $2 $7 :i32 - ASSIGN $2 $8 :i32 - CONST $9 10 :i32 - ADD $10 $2 $9 :i32 - ASSIGN $2 $10 :i32 - CONST $11 10 :i32 - ADD $12 $2 $11 :i32 - ASSIGN $2 $12 :i32 - CONST $13 10 :i32 - ADD $14 $2 $13 :i32 - ASSIGN $2 $14 :i32 - CONST $15 10 :i32 - ADD $16 $2 $15 :i32 - ASSIGN $2 $16 :i32 - CONST $17 10 :i32 - ADD $18 $2 $17 :i32 - ASSIGN $2 $18 :i32 - CONST $19 10 :i32 - ADD $20 $2 $19 :i32 - ASSIGN $2 $20 :i32 - CONST $21 10 :i32 - ADD $22 $2 $21 :i32 - ASSIGN $2 $22 :i32 - RETURN $2 :i32 + CONST $1 1 :i32 + CONST $2 10 :i32 + ADD $3 $1 $2 :i32 + ASSIGN $1 $3 :i32 + CONST $4 10 :i32 + ADD $5 $1 $4 :i32 + ASSIGN $1 $5 :i32 + CONST $6 10 :i32 + ADD $7 $1 $6 :i32 + ASSIGN $1 $7 :i32 + CONST $8 10 :i32 + ADD $9 $1 $8 :i32 + ASSIGN $1 $9 :i32 + CONST $10 10 :i32 + ADD $11 $1 $10 :i32 + ASSIGN $1 $11 :i32 + CONST $12 10 :i32 + ADD $13 $1 $12 :i32 + ASSIGN $1 $13 :i32 + CONST $14 10 :i32 + ADD $15 $1 $14 :i32 + ASSIGN $1 $15 :i32 + CONST $16 10 :i32 + ADD $17 $1 $16 :i32 + ASSIGN $1 $17 :i32 + CONST $18 10 :i32 + ADD $19 $1 $18 :i32 + ASSIGN $1 $19 :i32 + CONST $20 10 :i32 + ADD $21 $1 $20 :i32 + ASSIGN $1 $21 :i32 + RETURN $1 :i32 diff --git a/nautilus/test/data/tracing/staticLoopIncrement.trace b/nautilus/test/data/tracing/staticLoopIncrement.trace index 404487f0..60c02701 100644 --- a/nautilus/test/data/tracing/staticLoopIncrement.trace +++ b/nautilus/test/data/tracing/staticLoopIncrement.trace @@ -1,33 +1,33 @@ B0() - CONST $2 1 :i32 - CONST $3 10 :i32 - ADD $4 $2 $3 :i32 - ASSIGN $2 $4 :i32 - CONST $5 10 :i32 - ADD $6 $2 $5 :i32 - ASSIGN $2 $6 :i32 - CONST $7 10 :i32 - ADD $8 $2 $7 :i32 - ASSIGN $2 $8 :i32 - CONST $9 10 :i32 - ADD $10 $2 $9 :i32 - ASSIGN $2 $10 :i32 - CONST $11 10 :i32 - ADD $12 $2 $11 :i32 - ASSIGN $2 $12 :i32 - CONST $13 10 :i32 - ADD $14 $2 $13 :i32 - ASSIGN $2 $14 :i32 - CONST $15 10 :i32 - ADD $16 $2 $15 :i32 - ASSIGN $2 $16 :i32 - CONST $17 10 :i32 - ADD $18 $2 $17 :i32 - ASSIGN $2 $18 :i32 - CONST $19 10 :i32 - ADD $20 $2 $19 :i32 - ASSIGN $2 $20 :i32 - CONST $21 10 :i32 - ADD $22 $2 $21 :i32 - ASSIGN $2 $22 :i32 - RETURN $2 :i32 + CONST $1 1 :i32 + CONST $2 10 :i32 + ADD $3 $1 $2 :i32 + ASSIGN $1 $3 :i32 + CONST $4 10 :i32 + ADD $5 $1 $4 :i32 + ASSIGN $1 $5 :i32 + CONST $6 10 :i32 + ADD $7 $1 $6 :i32 + ASSIGN $1 $7 :i32 + CONST $8 10 :i32 + ADD $9 $1 $8 :i32 + ASSIGN $1 $9 :i32 + CONST $10 10 :i32 + ADD $11 $1 $10 :i32 + ASSIGN $1 $11 :i32 + CONST $12 10 :i32 + ADD $13 $1 $12 :i32 + ASSIGN $1 $13 :i32 + CONST $14 10 :i32 + ADD $15 $1 $14 :i32 + ASSIGN $1 $15 :i32 + CONST $16 10 :i32 + ADD $17 $1 $16 :i32 + ASSIGN $1 $17 :i32 + CONST $18 10 :i32 + ADD $19 $1 $18 :i32 + ASSIGN $1 $19 :i32 + CONST $20 10 :i32 + ADD $21 $1 $20 :i32 + ASSIGN $1 $21 :i32 + RETURN $1 :i32 diff --git a/nautilus/test/execution-tests/ExecutionTest.cpp b/nautilus/test/execution-tests/ExecutionTest.cpp index 331f9079..b669247a 100644 --- a/nautilus/test/execution-tests/ExecutionTest.cpp +++ b/nautilus/test/execution-tests/ExecutionTest.cpp @@ -10,7 +10,27 @@ namespace nautilus::engine { +struct RObject { + val a; + val b; +}; + +RObject returnObject(val a, val b) { + if (a > b) { + return {.a = a, .b = b}; + } + return {.a = 0, .b = 0}; +} + +val constructComplexReturnObject(val a, val b) { + auto r = returnObject(a, b); + auto t1 = r.a + 1; + auto t2 = r.b + 1; + return t1 + t2; +} + void addTest(engine::NautilusEngine& engine) { + SECTION("staticCast") { auto f = engine.registerFunction(staticCastExpression); REQUIRE(f((int8_t) 34) == 34); @@ -902,8 +922,14 @@ TEST_CASE("Engine Compiler Test") { options.setOption("engine.backend", backend); auto engine = engine::NautilusEngine(options); runAllTests(engine); + SECTION("constructComplexReturnObject") { + // we assume that this throws a runtime exception with + // wrong number of arguments after tracing" + REQUIRE_THROWS(engine.registerFunction(constructComplexReturnObject)); + } } } + } #endif } // namespace nautilus::engine diff --git a/nautilus/test/execution-tests/StaticLoopFunctions.hpp b/nautilus/test/execution-tests/StaticLoopFunctions.hpp index 26a0f7ba..b9aa4196 100644 --- a/nautilus/test/execution-tests/StaticLoopFunctions.hpp +++ b/nautilus/test/execution-tests/StaticLoopFunctions.hpp @@ -4,7 +4,7 @@ namespace nautilus::engine { -val staticLoop(val) { +val staticLoop() { val agg = val(1); for (static_val start = 0; start < 10; start = start + 1) { agg = agg + 10; @@ -47,7 +47,7 @@ val staticIterator(val ref) { return sum; } -val staticLoopIncrement(val) { +val staticLoopIncrement() { val agg = val(1); for (static_val start = 0; start < 10; start++) { agg = agg + 10;