Skip to content

Commit

Permalink
add additional check to verify the number of arguments in SSA
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilippGrulich authored Jul 30, 2024
1 parent b9a9092 commit f512110
Show file tree
Hide file tree
Showing 9 changed files with 187 additions and 154 deletions.
7 changes: 7 additions & 0 deletions nautilus/src/nautilus/tracing/phases/SSACreationPhase.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

#include <nautilus/exceptions/RuntimeException.hpp>
#include <nautilus/logging.hpp>
#include <nautilus/tracing/ExecutionTrace.hpp>
#include <nautilus/tracing/phases/SSACreationPhase.hpp>
#include <unordered_map>
Expand Down Expand Up @@ -53,6 +55,11 @@ std::shared_ptr<ExecutionTrace> 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);
Expand Down
44 changes: 22 additions & 22 deletions nautilus/test/data/after_ssa/staticLoop.trace
Original file line number Diff line number Diff line change
@@ -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
44 changes: 22 additions & 22 deletions nautilus/test/data/after_ssa/staticLoopIncrement.trace
Original file line number Diff line number Diff line change
@@ -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
44 changes: 22 additions & 22 deletions nautilus/test/data/ir/staticLoop.trace
Original file line number Diff line number Diff line change
@@ -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
44 changes: 22 additions & 22 deletions nautilus/test/data/ir/staticLoopIncrement.trace
Original file line number Diff line number Diff line change
@@ -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
64 changes: 32 additions & 32 deletions nautilus/test/data/tracing/staticLoop.trace
Original file line number Diff line number Diff line change
@@ -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
64 changes: 32 additions & 32 deletions nautilus/test/data/tracing/staticLoopIncrement.trace
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions nautilus/test/execution-tests/ExecutionTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,27 @@

namespace nautilus::engine {

struct RObject {
val<int32_t> a;
val<int32_t> b;
};

RObject returnObject(val<int32_t> a, val<int32_t> b) {
if (a > b) {
return {.a = a, .b = b};
}
return {.a = 0, .b = 0};
}

val<int32_t> constructComplexReturnObject(val<int32_t> a, val<int32_t> 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<int8_t, int32_t>);
REQUIRE(f((int8_t) 34) == 34);
Expand Down Expand Up @@ -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
Loading

0 comments on commit f512110

Please sign in to comment.