From 12aebb0727edf5189578ab19f7f0dc69d568bfd9 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 09:56:21 -0700 Subject: [PATCH 01/27] Fixed escaped character lexical interpretation --- FrontEnd/scanner.l | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index 4ef1936..4c0decb 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -75,7 +75,8 @@ write|WRITE {return WRITESY;} '\\n' {yylval.char_val = '\n';return CHARCONSTSY;} '\\t' {yylval.char_val = '\t';return CHARCONSTSY;} '\\r' {yylval.char_val = '\r';return CHARCONSTSY;} -'\\?.' {yylval.char_val = yytext[1];return CHARCONSTSY;} +'.' {yylval.char_val = yytext[1];return CHARCONSTSY;} +'\\.' {yylval.char_val = yytext[2];return CHARCONSTSY;} \"[a-zA-Z0-9~`!@'#$%^&*()_+=\-\[\]{}\\\/><,.:;| ]*\" {yylval.str_val = strdup(yytext); return STRINGSY;} From 94042adf342cddfca92ada84eca45360e907352b Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 10:02:11 -0700 Subject: [PATCH 02/27] Fixed improper acceptance of single backslash string --- FrontEnd/scanner.l | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index 4c0decb..b2d7031 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -78,7 +78,7 @@ write|WRITE {return WRITESY;} '.' {yylval.char_val = yytext[1];return CHARCONSTSY;} '\\.' {yylval.char_val = yytext[2];return CHARCONSTSY;} -\"[a-zA-Z0-9~`!@'#$%^&*()_+=\-\[\]{}\\\/><,.:;| ]*\" {yylval.str_val = strdup(yytext); return STRINGSY;} +\"([a-zA-Z0-9~`!@'#$%^&*()_+=\-\[\]{}\/><,.:;| ]|\\[!-~])*\" {yylval.str_val = strdup(yytext); return STRINGSY;} \$.*$ {ProcessLog::getInstance()->nextLine();} \n {ProcessLog::getInstance()->nextLine();} From 0dece39aae979592bceb55869aa2f558989848db Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 10:15:36 -0700 Subject: [PATCH 03/27] Added '?' to String literals and simplified regex --- FrontEnd/scanner.l | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index b2d7031..0eb2a79 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -78,7 +78,7 @@ write|WRITE {return WRITESY;} '.' {yylval.char_val = yytext[1];return CHARCONSTSY;} '\\.' {yylval.char_val = yytext[2];return CHARCONSTSY;} -\"([a-zA-Z0-9~`!@'#$%^&*()_+=\-\[\]{}\/><,.:;| ]|\\[!-~])*\" {yylval.str_val = strdup(yytext); return STRINGSY;} +\"([ !#-~]|\\[!-~])*\" {yylval.str_val = strdup(yytext); return STRINGSY;} \$.*$ {ProcessLog::getInstance()->nextLine();} \n {ProcessLog::getInstance()->nextLine();} From 13db32890a92398d2098cc9b1f8ce0b31de699e0 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 10:31:40 -0700 Subject: [PATCH 04/27] Disallowed tab and single backslash in character literals --- FrontEnd/scanner.l | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index 0eb2a79..7a1c4c2 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -75,8 +75,8 @@ write|WRITE {return WRITESY;} '\\n' {yylval.char_val = '\n';return CHARCONSTSY;} '\\t' {yylval.char_val = '\t';return CHARCONSTSY;} '\\r' {yylval.char_val = '\r';return CHARCONSTSY;} -'.' {yylval.char_val = yytext[1];return CHARCONSTSY;} -'\\.' {yylval.char_val = yytext[2];return CHARCONSTSY;} +'[ !-\[\]-~]' {yylval.char_val = yytext[1];return CHARCONSTSY;} +'\\[ !-~]' {yylval.char_val = yytext[2];return CHARCONSTSY;} \"([ !#-~]|\\[!-~])*\" {yylval.str_val = strdup(yytext); return STRINGSY;} From 8cbda3d9d1df6fe22f2551121c19599976b4d776 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 10:32:37 -0700 Subject: [PATCH 05/27] Allowed escaped spaces in string literals --- FrontEnd/scanner.l | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index 7a1c4c2..b5ba0bb 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -78,7 +78,7 @@ write|WRITE {return WRITESY;} '[ !-\[\]-~]' {yylval.char_val = yytext[1];return CHARCONSTSY;} '\\[ !-~]' {yylval.char_val = yytext[2];return CHARCONSTSY;} -\"([ !#-~]|\\[!-~])*\" {yylval.str_val = strdup(yytext); return STRINGSY;} +\"([ !#-~]|\\[ !-~])*\" {yylval.str_val = strdup(yytext); return STRINGSY;} \$.*$ {ProcessLog::getInstance()->nextLine();} \n {ProcessLog::getInstance()->nextLine();} From 61ec4e1f61d6dff2c6618e4b37cd60b55cf39f78 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 10:41:09 -0700 Subject: [PATCH 06/27] Added backspace and formfeed as character literals --- FrontEnd/scanner.l | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index b5ba0bb..f64bf93 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -73,8 +73,10 @@ write|WRITE {return WRITESY;} [0-9]+[0-9]* {yylval.int_val = strtol(yytext,nullptr,0);return INTSY;} '\\n' {yylval.char_val = '\n';return CHARCONSTSY;} -'\\t' {yylval.char_val = '\t';return CHARCONSTSY;} '\\r' {yylval.char_val = '\r';return CHARCONSTSY;} +'\\b' {yylval.char_val = '\b';return CHARCONSTSY;} +'\\t' {yylval.char_val = '\t';return CHARCONSTSY;} +'\\f' {yylval.char_val = '\f';return CHARCONSTSY;} '[ !-\[\]-~]' {yylval.char_val = yytext[1];return CHARCONSTSY;} '\\[ !-~]' {yylval.char_val = yytext[2];return CHARCONSTSY;} From 61eb436f539525544be475de63119b610345b388 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 11:10:26 -0700 Subject: [PATCH 07/27] Fixed escaped 0 in string -> null-terminator bug --- FrontEnd/scanner.l | 50 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index f64bf93..85e9c2f 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -4,6 +4,8 @@ #include "parser.hpp" #include "ProcessLog.hpp" #include "logger.h" + +char* replaceAllNullWithZero(char*); %} %option nounput @@ -80,7 +82,7 @@ write|WRITE {return WRITESY;} '[ !-\[\]-~]' {yylval.char_val = yytext[1];return CHARCONSTSY;} '\\[ !-~]' {yylval.char_val = yytext[2];return CHARCONSTSY;} -\"([ !#-~]|\\[ !-~])*\" {yylval.str_val = strdup(yytext); return STRINGSY;} +\"([ !#-~]|\\[ !-~])*\" {yylval.str_val = replaceAllNullWithZero(yytext); return STRINGSY;} \$.*$ {ProcessLog::getInstance()->nextLine();} \n {ProcessLog::getInstance()->nextLine();} @@ -88,3 +90,49 @@ write|WRITE {return WRITESY;} . {LOG(ERROR) << std::string("Unexpected token ")+yytext;} %% + +char* replaceAllNullWithZero(char* str) +{ + char* s = strdup(str); + + int str_i = 0; + int s_i = 0; + while (str[str_i]) + { + if (str[str_i] == '\\' && str[str_i+1] == '0') + { + s[s_i++] = str[++str_i]; + str_i++; + } + else if (str[str_i] == '\\') + { + s[s_i++] = str[str_i++]; + s[s_i++] = str[str_i++]; + } + else + s[s_i++] = str[str_i++]; + } + + s[s_i++] = 0; + return s; +} + + + + + + + + + + + + + + + + + + + + From b55d08a16676ace15dc8a30b5e6b7a74bc29f777 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 1 Mar 2018 11:42:57 -0700 Subject: [PATCH 08/27] Removed extra whitespace --- FrontEnd/scanner.l | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index 85e9c2f..db72bba 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -117,22 +117,3 @@ char* replaceAllNullWithZero(char* str) return s; } - - - - - - - - - - - - - - - - - - - From f147a2805a4a94dda008be252000f65e16e9222d Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:00:17 -0700 Subject: [PATCH 09/27] Fixed Scanner build issues with certain versions of flex --- FrontEnd/scanner.l | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FrontEnd/scanner.l b/FrontEnd/scanner.l index db72bba..a375ea1 100644 --- a/FrontEnd/scanner.l +++ b/FrontEnd/scanner.l @@ -9,6 +9,8 @@ char* replaceAllNullWithZero(char*); %} %option nounput +%option never-interactive +%option noyywrap %% From 3c76c9223788a5a7a2461933d5f7502cd3d5058c Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:01:23 -0700 Subject: [PATCH 10/27] Fixed build issue with std::function --- Optimizations/FlowGraph.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Optimizations/FlowGraph.h b/Optimizations/FlowGraph.h index ce00448..d1b0207 100644 --- a/Optimizations/FlowGraph.h +++ b/Optimizations/FlowGraph.h @@ -2,6 +2,7 @@ #define __cpsl__TraverseBasicBlock__ #include "AST/BasicBlock.hpp" +#include namespace cs6300 { From 10321b9e01f5cbdbad9609655f164f5b3f98ccbf Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:02:26 -0700 Subject: [PATCH 11/27] Fixed sporadic errors in using tester.sh due to lack of strdup --- log/logger.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log/logger.cpp b/log/logger.cpp index 8ccc68c..223ac2d 100644 --- a/log/logger.cpp +++ b/log/logger.cpp @@ -7,13 +7,13 @@ INITIALIZE_EASYLOGGINGPP const char* cpsl_log::getLine() { - return std::to_string(ProcessLog::getInstance()->line()).c_str(); + return strdup(std::to_string(ProcessLog::getInstance()->line()).c_str()); } const char* cpsl_log::getFile() { - return boost::filesystem::basename(&ProcessLog::getInstance()->file()[0]) - .c_str(); + return strdup(boost::filesystem::basename(&ProcessLog::getInstance()->file()[0]) + .c_str()); } const std::string defaultLogFile = "log/log.conf"; From df896e7a26590e563a62b75f9e449dbbfd018633 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:03:18 -0700 Subject: [PATCH 12/27] Fixed source commenting (file:line) vs (line:file) --- AST_INC/AST/ThreeAddressInstruction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AST_INC/AST/ThreeAddressInstruction.cpp b/AST_INC/AST/ThreeAddressInstruction.cpp index bdf4753..dc07b34 100644 --- a/AST_INC/AST/ThreeAddressInstruction.cpp +++ b/AST_INC/AST/ThreeAddressInstruction.cpp @@ -18,8 +18,8 @@ cs6300::ThreeAddressInstruction::ThreeAddressInstruction(std::string c) } cs6300::ThreeAddressInstruction::ThreeAddressInstruction(std::string c, - std::string line, - std::string file) + std::string file, + std::string line) : op(Comment), dest(0), src1(0), src2(0), comment(c) { comment += "(" + file + ":" + line + ")"; From ad059bd5d73d76ad1f6bcefc5366f96675a26889 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:04:25 -0700 Subject: [PATCH 13/27] Replaced deprecated -std=c++0x switch with -std=c++11 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 072c235..53ec426 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ include_directories( ${WINDOWS_GNU} ) -set(EXTRA_COMPILE_FLAGS "-g -std=c++0x") +set(EXTRA_COMPILE_FLAGS "-g -std=c++11") #set(LCOV_FLAGS "--coverage") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_COMPILE_FLAGS} ${LCOV_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LCOV_FLAGS}") From 1424030a14e94f603ecee3a7256aa340e4cc47ae Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:05:58 -0700 Subject: [PATCH 14/27] Fixed extra nullptr statement in main, functs, and procs bug --- FrontEnd/FrontEnd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrontEnd/FrontEnd.cpp b/FrontEnd/FrontEnd.cpp index 3291c66..98fede9 100644 --- a/FrontEnd/FrontEnd.cpp +++ b/FrontEnd/FrontEnd.cpp @@ -154,7 +154,7 @@ int appendList(FEC& listSrc, int elementIndex) { auto elem = elementSrc.get(elementIndex); - return appendList(listSrc, listIndex, elem); + return (elem) ? appendList(listSrc, listIndex, elem) : listIndex; } template int binaryOp(int a, int b) From ca6ae12099030627feda969ca87189a1f41554bd Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:08:47 -0700 Subject: [PATCH 15/27] Fixed CPSL true and false being typed as integers bug --- FrontEnd/FrontEnd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FrontEnd/FrontEnd.cpp b/FrontEnd/FrontEnd.cpp index 98fede9..3dbd1b8 100644 --- a/FrontEnd/FrontEnd.cpp +++ b/FrontEnd/FrontEnd.cpp @@ -766,9 +766,9 @@ void cs6300::AddMain(int body) std::copy(b->begin(), b->end(), std::back_inserter(program->main)); int t = - state->expressions.add(std::make_shared(1)); + state->expressions.add(std::make_shared(true)); int f = - state->expressions.add(std::make_shared(0)); + state->expressions.add(std::make_shared(false)); AddLiteral("true", t); AddLiteral("TRUE", t); AddLiteral("false", f); From 97af345c3ddade81c808e90c116d112b56c1390d Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:12:12 -0700 Subject: [PATCH 16/27] Fixed CPSL not operator: pseudoinst not is a bitwise not across all bits, xor with 00000001 will only toggle the least significant bit --- AST_INC/AST/ThreeAddressInstruction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AST_INC/AST/ThreeAddressInstruction.cpp b/AST_INC/AST/ThreeAddressInstruction.cpp index dc07b34..4662bc9 100644 --- a/AST_INC/AST/ThreeAddressInstruction.cpp +++ b/AST_INC/AST/ThreeAddressInstruction.cpp @@ -112,7 +112,7 @@ std::ostream& cs6300::operator<<(std::ostream& out, out << "\tmflo $" << i.dest; break; case cs6300::ThreeAddressInstruction::Not: - out << "not $" << i.dest << ", $" << i.src1; + out << "xori $" << i.dest << ", $" << i.src1 << ", 1"; break; case cs6300::ThreeAddressInstruction::Or: out << "or $" << i.dest << ", $" << i.src1 << ", $" << i.src2; From 2eab6f46698536097a2be23c48a40f2d8f01f32d Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:16:30 -0700 Subject: [PATCH 17/27] Brought tests within spec: logical not operator is only defined for boolean expressions --- tester/Base/mix_expressions.cpsl | 4 ++-- tester/TestFiles/mix_expressions.cpsl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tester/Base/mix_expressions.cpsl b/tester/Base/mix_expressions.cpsl index 7ebf4ce..5e93dd6 100644 --- a/tester/Base/mix_expressions.cpsl +++ b/tester/Base/mix_expressions.cpsl @@ -30,8 +30,8 @@ d 2<=2=1 2<>2=0 2 8 -~-5=4 -~5=-6 +~true=0 +~false=1 Setting A to 5: Setting B to 8: 5 8 diff --git a/tester/TestFiles/mix_expressions.cpsl b/tester/TestFiles/mix_expressions.cpsl index 1f2db1b..c6f4a06 100644 --- a/tester/TestFiles/mix_expressions.cpsl +++ b/tester/TestFiles/mix_expressions.cpsl @@ -40,8 +40,8 @@ BEGIN write(a,' ',b,'\n'); a := 5; b := 15; - write("~-5=",~-5,'\n'); - write("~5=",~5,'\n'); + write("~true=",~true,'\n'); + write("~false=",~false,'\n'); write("Setting A to 5:"); a := 5; write("\nSetting B to 8:"); From 8e2b1d571b11be3f158a7afbc3f649c566e0082f Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:20:32 -0700 Subject: [PATCH 18/27] Fixed double return statement bug --- FrontEnd/FrontEnd.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/FrontEnd/FrontEnd.cpp b/FrontEnd/FrontEnd.cpp index 3dbd1b8..706a48d 100644 --- a/FrontEnd/FrontEnd.cpp +++ b/FrontEnd/FrontEnd.cpp @@ -750,7 +750,11 @@ void cs6300::AddFunction(int signature, int body) state->getSymTable()->addParameter(param.first, param.second); } auto b = state->statementLists.get(body); - b->push_back(std::make_shared(nullptr)); + + if (b->at(b->size()-1)->ClassName().compare("Return") != 0) + { + b->push_back(std::make_shared(nullptr)); + } auto program = state->getProgram(); program->functions[*sig] = std::make_shared(sig, *b, state->getSymTable()); From 07af0c60c6f34228abac5ec21c679e5bb00b4609 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:22:12 -0700 Subject: [PATCH 19/27] There is no reason to traverse the last node in the list because it has already been traversed within the earlier call --- Optimizations/MaximizeBlocks/MaximizeBlocks.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp index 4bd2661..8a9b4c2 100644 --- a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp +++ b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp @@ -10,7 +10,6 @@ void cs6300::maximizeBlocks(cs6300::FlowGraph original) { // traverse the blocks cs6300::traverse(original.first); - cs6300::traverse(original.second); } void cs6300::traverse(std::shared_ptr block) From 62399b1841dbf6dcc3b320b776515d910aeff232 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:28:41 -0700 Subject: [PATCH 20/27] Fixed duplicate basic blocks on branches --- .../MaximizeBlocks/MaximizeBlocks.cpp | 27 +++++++++++++------ .../MaximizeBlocks/MaximizeBlocks.hpp | 5 ++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp index 8a9b4c2..6e66e16 100644 --- a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp +++ b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp @@ -9,31 +9,42 @@ void cs6300::maximizeBlocks(cs6300::FlowGraph original) { // traverse the blocks - cs6300::traverse(original.first); + auto vb = VisitedBlocks::instance(); + vb->reset(); + buildParentCounts(original.first); + vb->reset(); + combineBlocks(original.first); } -void cs6300::traverse(std::shared_ptr block) +void cs6300::buildParentCounts(std::shared_ptr block) { auto vb = VisitedBlocks::instance(); auto np = NumParents::instance(); - if (vb->isVisited(block)) - { - return; - } + if (vb->isVisited(block)) return; if (block->branchTo != nullptr) { - // add parents on the way down... np->addParent(block->branchTo); traverse(block->branchTo); } if (block->jumpTo != nullptr) { - // add parents on the way down... np->addParent(block->jumpTo); traverse(block->jumpTo); } +} + +void cs6300::combineBlocks(std::shared_ptr block) +{ + auto vb = VisitedBlocks::instance(); + auto np = NumParents::instance(); + + if (vb->isVisited(block)) return; + + if (block->branchTo) combineBlocks(block->branchTo); + if (block->jumpTo) combineBlocks(block->jumpTo); + // determine if they can be merged on the way back up... if (block->jumpTo != nullptr && block->branchTo == nullptr && np->getNumParents(block->jumpTo) == 1) diff --git a/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp b/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp index f1fbefc..5dd7185 100644 --- a/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp +++ b/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp @@ -12,9 +12,10 @@ namespace cs6300 { -void maximizeBlocks(cs6300::FlowGraph); +void maximizeBlocks(FlowGraph); -void traverse(std::shared_ptr block); +void buildParentCounts(std::shared_ptr block); +void combineBlocks(std::shared_ptr); } #endif From 6114907cd7f7195a998689aea23c363d2a5eb291 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:32:07 -0700 Subject: [PATCH 21/27] Added code to update the pointer to the last block in a flowgraph --- Optimizations/MaximizeBlocks/MaximizeBlocks.cpp | 16 +++++++++++----- Optimizations/MaximizeBlocks/MaximizeBlocks.hpp | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp index 6e66e16..d1a0456 100644 --- a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp +++ b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp @@ -6,14 +6,14 @@ #include "VisitedBlocks.hpp" #include "NumParents.hpp" -void cs6300::maximizeBlocks(cs6300::FlowGraph original) +void cs6300::maximizeBlocks(cs6300::FlowGraph& original) { // traverse the blocks auto vb = VisitedBlocks::instance(); vb->reset(); buildParentCounts(original.first); vb->reset(); - combineBlocks(original.first); + combineBlocks(original.first, original); } void cs6300::buildParentCounts(std::shared_ptr block) @@ -35,20 +35,26 @@ void cs6300::buildParentCounts(std::shared_ptr block) } } -void cs6300::combineBlocks(std::shared_ptr block) +void cs6300::combineBlocks(std::shared_ptr block, FlowGraph& graph) { auto vb = VisitedBlocks::instance(); auto np = NumParents::instance(); if (vb->isVisited(block)) return; - if (block->branchTo) combineBlocks(block->branchTo); - if (block->jumpTo) combineBlocks(block->jumpTo); + if (block->branchTo) combineBlocks(block->branchTo, graph); + if (block->jumpTo) combineBlocks(block->jumpTo, graph); // determine if they can be merged on the way back up... if (block->jumpTo != nullptr && block->branchTo == nullptr && np->getNumParents(block->jumpTo) == 1) { + //Redirect the end of the graph + if (block->jumpTo == graph.second) + { + graph.second = block; + } + // merge jumpTo to this block for (auto inst : block->jumpTo->instructions) { diff --git a/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp b/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp index 5dd7185..4893d1d 100644 --- a/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp +++ b/Optimizations/MaximizeBlocks/MaximizeBlocks.hpp @@ -12,10 +12,10 @@ namespace cs6300 { -void maximizeBlocks(FlowGraph); +void maximizeBlocks(FlowGraph&); void buildParentCounts(std::shared_ptr block); -void combineBlocks(std::shared_ptr); +void combineBlocks(std::shared_ptr, FlowGraph&); } #endif From 39a145d54dc422455ff32b73563e137b0f1aa4ab Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:36:30 -0700 Subject: [PATCH 22/27] I missed a couple traverse calls --- Optimizations/MaximizeBlocks/MaximizeBlocks.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp index d1a0456..0a5984d 100644 --- a/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp +++ b/Optimizations/MaximizeBlocks/MaximizeBlocks.cpp @@ -26,12 +26,12 @@ void cs6300::buildParentCounts(std::shared_ptr block) if (block->branchTo != nullptr) { np->addParent(block->branchTo); - traverse(block->branchTo); + buildParentCounts(block->branchTo); } if (block->jumpTo != nullptr) { np->addParent(block->jumpTo); - traverse(block->jumpTo); + buildParentCounts(block->jumpTo); } } From 4dd5c270cc3299cb72c8a4f8672111ec0cf06184 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:45:02 -0700 Subject: [PATCH 23/27] Updated base instruction counts --- tester/Base/count_mix_control.cpsl | 2 +- tester/Base/count_mix_expressions.cpsl | 2 +- tester/Base/count_nested_if.cpsl | 2 +- tester/Base/count_personnel.cpsl | 2 +- tester/Base/count_simple_else.cpsl | 2 +- tester/Base/count_simple_elseif.cpsl | 2 +- tester/Base/count_simple_if.cpsl | 2 +- tester/Base/count_simple_recursion.cpsl | 2 +- tester/Base/count_swap.cpsl | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tester/Base/count_mix_control.cpsl b/tester/Base/count_mix_control.cpsl index b3a37ac..891a65a 100644 --- a/tester/Base/count_mix_control.cpsl +++ b/tester/Base/count_mix_control.cpsl @@ -1 +1 @@ -2825 +2839 diff --git a/tester/Base/count_mix_expressions.cpsl b/tester/Base/count_mix_expressions.cpsl index fc15416..e2bb11d 100644 --- a/tester/Base/count_mix_expressions.cpsl +++ b/tester/Base/count_mix_expressions.cpsl @@ -1 +1 @@ -1095 +1098 diff --git a/tester/Base/count_nested_if.cpsl b/tester/Base/count_nested_if.cpsl index 920a139..ea90ee3 100644 --- a/tester/Base/count_nested_if.cpsl +++ b/tester/Base/count_nested_if.cpsl @@ -1 +1 @@ -43 +45 diff --git a/tester/Base/count_personnel.cpsl b/tester/Base/count_personnel.cpsl index b3b6f67..6ceb1c6 100644 --- a/tester/Base/count_personnel.cpsl +++ b/tester/Base/count_personnel.cpsl @@ -1 +1 @@ -19209 +19221 diff --git a/tester/Base/count_simple_else.cpsl b/tester/Base/count_simple_else.cpsl index 84df352..8643cf6 100644 --- a/tester/Base/count_simple_else.cpsl +++ b/tester/Base/count_simple_else.cpsl @@ -1 +1 @@ -87 +89 diff --git a/tester/Base/count_simple_elseif.cpsl b/tester/Base/count_simple_elseif.cpsl index abac1ea..21e72e8 100644 --- a/tester/Base/count_simple_elseif.cpsl +++ b/tester/Base/count_simple_elseif.cpsl @@ -1 +1 @@ -47 +48 diff --git a/tester/Base/count_simple_if.cpsl b/tester/Base/count_simple_if.cpsl index f04c001..64bb6b7 100644 --- a/tester/Base/count_simple_if.cpsl +++ b/tester/Base/count_simple_if.cpsl @@ -1 +1 @@ -29 +30 diff --git a/tester/Base/count_simple_recursion.cpsl b/tester/Base/count_simple_recursion.cpsl index f1349af..6fb0715 100644 --- a/tester/Base/count_simple_recursion.cpsl +++ b/tester/Base/count_simple_recursion.cpsl @@ -1 +1 @@ -2753 +2754 diff --git a/tester/Base/count_swap.cpsl b/tester/Base/count_swap.cpsl index 1817215..9ee3415 100644 --- a/tester/Base/count_swap.cpsl +++ b/tester/Base/count_swap.cpsl @@ -1 +1 @@ -254585 +254949 From 52aa9cccf7adde9da1686d135dc001a477b255f9 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 15:52:37 -0700 Subject: [PATCH 24/27] Fixed MARS errors not displaying --- tester/tester.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tester/tester.sh b/tester/tester.sh index d817112..23cab12 100755 --- a/tester/tester.sh +++ b/tester/tester.sh @@ -49,7 +49,7 @@ for file in ${files}; do echo -n "Executing: ${file}..." java -Djava.awt.headless=true -jar ${MARSDIR}${MARSJAR} me ic nc 1000000 ${ASM}${file} 2> stderr.txt > ${RESULTS}${file} - if [ $? -ne 0 ]; then + if [ ! -s ${RESULTS}${file} ]; then echo " Error running: java -jar nc 1000000 ${MARSDIR}${MARSJAR} ${ASM}${file} > ${RESULTS}${file}" cat stderr.txt ret=1 From 038872c0e676304beaa0c6caef3a7ded1e54bc14 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 16:13:47 -0700 Subject: [PATCH 25/27] Added more details to tester output --- tester/tester.sh | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tester/tester.sh b/tester/tester.sh index 23cab12..91d34c6 100755 --- a/tester/tester.sh +++ b/tester/tester.sh @@ -29,6 +29,13 @@ trap on_die TERM ret=0 +baseTotal=0 +outTotal=0 +totalPerc=0 +count=0 +best=900 +worst=0 + for file in ${files}; do file=$(basename ${file}) @@ -82,7 +89,32 @@ for file in ${files}; do echo " diff ${RESULTS}${file} ${BASE}${file}" echo ${diff} echo + ret=1 fi + + baseTotal=$((baseTotal + be)) + outTotal=$((outTotal + le)) + totalPerc=$((totalPerc + div)) + count=$((count + 1)) + worst=$((worstdiv?div:best)) + done rm -f stderr.txt + +if [ $ret -ne 1 ]; then + echo + echo "No Errors Found" + echo + totalDiv=$(((outTotal*100)/baseTotal)) + echo "Total Instructions: ${outTotal}/${baseTotal} ${totalDiv}%" + avgPerc=$((totalPerc/count)) + echo "Average of Percentages: ${totalPerc}%/${count} ${avgPerc}%" + echo "Best Improvement Percentage: ${best}%" + echo "Worst Improvement Percentage: ${worst}%" +else + echo + echo "Errors Found" +fi + exit ${ret} From 5d180b90ddb1320a034717f063340ac317b62a81 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Thu, 17 Jan 2019 16:17:10 -0700 Subject: [PATCH 26/27] Updated Not Unit Test to use xori --- Testing/UnitTests/ExpressionTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Testing/UnitTests/ExpressionTest.cpp b/Testing/UnitTests/ExpressionTest.cpp index 05f1304..db5b423 100644 --- a/Testing/UnitTests/ExpressionTest.cpp +++ b/Testing/UnitTests/ExpressionTest.cpp @@ -531,7 +531,7 @@ TEST_CASE("NotExpression", "[expression]") auto exp = R"(BB1: li $1, 15 -not $2, $1 +xori $2, $1, 1 )"; REQUIRE(s == exp); } From 64c8d8036875f6f5ef07eaae1185b98326957539 Mon Sep 17 00:00:00 2001 From: Christopher Higgs Date: Sat, 9 Mar 2019 19:10:25 -0700 Subject: [PATCH 27/27] Fixed overlooked bitwise not useage --- AST_INC/AST/Expressions/NotExpression.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AST_INC/AST/Expressions/NotExpression.cpp b/AST_INC/AST/Expressions/NotExpression.cpp index 1f14047..e8bd993 100644 --- a/AST_INC/AST/Expressions/NotExpression.cpp +++ b/AST_INC/AST/Expressions/NotExpression.cpp @@ -18,7 +18,7 @@ std::shared_ptr cs6300::NotExpression::type() const } int cs6300::NotExpression::value() const { - return ~m_expr->value(); + return !m_expr->value(); } bool cs6300::NotExpression::isConst() const {