diff options
33 files changed, 1787 insertions, 1567 deletions
@@ -113,3 +113,4 @@ a license to everyone to use it as detailed in LICENSE.) * Heidi Pan <heidi.pan@intel.com> (copyright owned by Intel) * Vasilis Kalintiris <ehostunreach@gmail.com> * Adam C. Clifton <adam@hulkamaniac.com> +* Volo Zyko <volo.zyko@gmail.com> diff --git a/cmake/Platform/Emscripten.cmake b/cmake/Platform/Emscripten.cmake index c30632ca..ef813eb8 100644 --- a/cmake/Platform/Emscripten.cmake +++ b/cmake/Platform/Emscripten.cmake @@ -109,6 +109,8 @@ set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG "@") # Specify the program to use when building static libraries. Force Emscripten-related command line options to clang. set(CMAKE_CXX_ARCHIVE_CREATE "${CMAKE_AR} rc <TARGET> ${CMAKE_START_TEMP_FILE} <LINK_FLAGS> <OBJECTS>${CMAKE_END_TEMP_FILE}") set(CMAKE_C_ARCHIVE_CREATE "${CMAKE_AR} rc <TARGET> ${CMAKE_START_TEMP_FILE} <LINK_FLAGS> <OBJECTS>${CMAKE_END_TEMP_FILE}") +set(CMAKE_CXX_ARCHIVE_APPEND "${CMAKE_AR} r <TARGET> ${CMAKE_START_TEMP_FILE} <LINK_FLAGS> <OBJECTS>${CMAKE_END_TEMP_FILE}") +set(CMAKE_C_ARCHIVE_APPEND "${CMAKE_AR} r <TARGET> ${CMAKE_START_TEMP_FILE} <LINK_FLAGS> <OBJECTS>${CMAKE_END_TEMP_FILE}") # Set a global EMSCRIPTEN variable that can be used in client CMakeLists.txt to detect when building using Emscripten. # There seems to be some kind of bug with CMake, so you might need to define this manually on the command line with "-DEMSCRIPTEN=1". @@ -1079,7 +1079,7 @@ try: if not arg.startswith('-'): if not os.path.exists(arg): - logging.error(arg + ': No such file or directory') + logging.error('%s: No such file or directory ("%s" was expected to be an input file, based on the commandline arguments provided)' % (arg, arg)) exit(1) arg_ending = filename_type_ending(arg) diff --git a/src/analyzer.js b/src/analyzer.js index 17582ea3..e8ca6cf6 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -1570,7 +1570,17 @@ function analyzer(data, sidePass) { for (var j = 0; j < label.lines.length; j++) { var line = label.lines[j]; if ((line.intertype == 'call' || line.intertype == 'invoke') && line.ident == setjmp) { - // Add a new label + if (line.intertype == 'invoke') { + // setjmp cannot trigger unwinding, so just reduce the invoke to a call + branch + line.intertype = 'call'; + label.lines.push({ + intertype: 'branch', + label: line.toLabel, + lineNum: line.lineNum + 0.01, // XXX legalizing might confuse this + }); + line.toLabel = line.unwindLabel = -2; + } + // split this label into up to the setjmp (including), then a new label for the rest. longjmp will reach the rest var oldLabel = label.ident; var newLabel = func.labelIdCounter++; if (!func.setjmpTable) func.setjmpTable = []; diff --git a/src/compiler.js b/src/compiler.js index 7d768c3d..e4ce1c88 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -134,7 +134,7 @@ load('settings.js'); var settings_file = arguments_[0]; var ll_file = arguments_[1]; phase = arguments_[2]; -if (phase == 'pre') { +if (phase == 'pre' || phase == 'glue') { additionalLibraries = Array.prototype.slice.call(arguments_, 3); } else { var forwardedDataFile = arguments_[3]; diff --git a/src/library_gl.js b/src/library_gl.js index 29f78c8a..efe3b868 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -547,6 +547,9 @@ var LibraryGL = { Module.ctx.getExtension('WEBKIT_EXT_texture_filter_anisotropic'); GL.floatExt = Module.ctx.getExtension('OES_texture_float'); + + // Extension available from Firefox 26 and Google Chrome 30 + GL.instancedArraysExt = Module.ctx.getExtension('ANGLE_instanced_arrays'); // These are the 'safe' feature-enabling extensions that don't add any performance impact related to e.g. debugging, and // should be enabled by default so that client GLES2/GL code will not need to go through extra hoops to get its stuff working. @@ -4959,6 +4962,45 @@ var LibraryGL = { return Module.ctx.getError(); } }, + + // ANGLE_instanced_arrays WebGL extension related functions + + glVertexAttribDivisor__sig: 'vii', + glVertexAttribDivisor: function(index, divisor) { +#if GL_ASSERTIONS + assert(GL.instancedArraysExt, 'Must have ANGLE_instanced_arrays extension to use WebGL instancing'); +#endif + GL.instancedArraysExt.vertexAttribDivisorANGLE(index, divisor); + }, + + glDrawArraysInstanced_sig: 'viiii', + glDrawArraysInstanced: function(mode, first, count, primcount) { +#if GL_ASSERTIONS + assert(GL.instancedArraysExt, 'Must have ANGLE_instanced_arrays extension to use WebGL instancing'); +#endif + GL.instancedArraysExt.drawArraysInstancedANGLE(mode, first, count, primcount); + }, + + glDrawElementsInstanced_sig: 'viiiii', + glDrawElementsInstanced: function(mode, count, type, indices, primcount) { +#if GL_ASSERTIONS + assert(GL.instancedArraysExt, 'Must have ANGLE_instanced_arrays extension to use WebGL instancing'); +#endif + GL.instancedArraysExt.drawElementsInstancedANGLE(mode, count, type, indices, primcount); + }, + + // OpenGL Desktop/ES 2.0 instancing extensions compatibility + + glVertexAttribDivisorNV: 'glVertexAttribDivisor', + glDrawArraysInstancedNV: 'glDrawArraysInstanced', + glDrawElementsInstancedNV: 'glDrawElementsInstanced', + glVertexAttribDivisorEXT: 'glVertexAttribDivisor', + glDrawArraysInstancedEXT: 'glDrawArraysInstanced', + glDrawElementsInstancedEXT: 'glDrawElementsInstanced', + glVertexAttribDivisorARB: 'glVertexAttribDivisor', + glDrawArraysInstancedARB: 'glDrawArraysInstanced', + glDrawElementsInstancedARB: 'glDrawElementsInstanced', + // signatures of simple pass-through functions, see later glActiveTexture__sig: 'vi', diff --git a/src/library_sdl.js b/src/library_sdl.js index 2efc1271..1c1e8107 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -1220,6 +1220,7 @@ var LibrarySDL = { if (surf) SDL.freeSurface(surf); }, + SDL_UpperBlit__deps: ['SDL_LockSurface'], SDL_UpperBlit: function(src, srcrect, dst, dstrect) { var srcData = SDL.surfaces[src]; var dstData = SDL.surfaces[dst]; diff --git a/src/relooper/Relooper.cpp b/src/relooper/Relooper.cpp index d2a48f63..70cf844b 100644 --- a/src/relooper/Relooper.cpp +++ b/src/relooper/Relooper.cpp @@ -101,9 +101,7 @@ void Branch::Render(Block *Target, bool SetLabel) { // Block -int Block::IdCounter = 1; // 0 is reserved for clearings - -Block::Block(const char *CodeInit, const char *BranchVarInit) : Parent(NULL), Id(Block::IdCounter++), IsCheckedMultipleEntry(false) { +Block::Block(const char *CodeInit, const char *BranchVarInit) : Parent(NULL), Id(-1), IsCheckedMultipleEntry(false) { Code = strdup(CodeInit); BranchVar = BranchVarInit ? strdup(BranchVarInit) : NULL; } @@ -142,6 +140,7 @@ void Block::Render(bool InLoop) { if (!ProcessedBranchesOut.size()) return; bool SetLabel = true; // in some cases it is clear we can avoid setting label, see later + bool ForceSetLabel = Shape::IsEmulated(Parent); // A setting of the label variable (label = x) is necessary if it can // cause an impact. The main case is where we set label to x, then elsewhere @@ -210,7 +209,7 @@ void Block::Render(bool InLoop) { Target = DefaultTarget; Details = ProcessedBranchesOut[DefaultTarget]; } - bool SetCurrLabel = SetLabel && Target->IsCheckedMultipleEntry; + bool SetCurrLabel = (SetLabel && Target->IsCheckedMultipleEntry) || ForceSetLabel; bool HasFusedContent = Fused && contains(Fused->InnerMap, Target); bool HasContent = SetCurrLabel || Details->Type != Branch::Direct || HasFusedContent || Details->Code; if (iter != ProcessedBranchesOut.end()) { @@ -272,10 +271,6 @@ void Block::Render(bool InLoop) { } } -// Shape - -int Shape::IdCounter = 0; - // MultipleShape void MultipleShape::RenderLoopPrefix() { @@ -330,16 +325,19 @@ void LoopShape::Render(bool InLoop) { if (Next) Next->Render(InLoop); }; -/* // EmulatedShape void EmulatedShape::Render(bool InLoop) { + PrintIndented("label = %d;\n", Entry->Id); + if (Labeled) { + PrintIndented("L%d: ", Id); + } PrintIndented("while(1) {\n"); Indenter::Indent(); - PrintIndented("switch(label) {\n"); + PrintIndented("switch(label|0) {\n"); Indenter::Indent(); - for (int i = 0; i < Blocks.size(); i++) { - Block *Curr = Blocks[i]; + for (BlockSet::iterator iter = Blocks.begin(); iter != Blocks.end(); iter++) { + Block *Curr = *iter; PrintIndented("case %d: {\n", Curr->Id); Indenter::Indent(); Curr->Render(InLoop); @@ -353,11 +351,10 @@ void EmulatedShape::Render(bool InLoop) { PrintIndented("}\n"); if (Next) Next->Render(InLoop); }; -*/ // Relooper -Relooper::Relooper() : Root(NULL) { +Relooper::Relooper() : Root(NULL), Emulate(false), BlockIdCounter(1), ShapeIdCounter(0) { // block ID 0 is reserved for clearings } Relooper::~Relooper() { @@ -366,6 +363,7 @@ Relooper::~Relooper() { } void Relooper::AddBlock(Block *New) { + New->Id = BlockIdCounter++; Blocks.push_back(New); } @@ -461,7 +459,7 @@ void Relooper::Calculate(Block *Entry) { } } - Pre.SplitDeadEnds(); + if (!Emulate) Pre.SplitDeadEnds(); // Recursively process the graph @@ -470,6 +468,7 @@ void Relooper::Calculate(Block *Entry) { // Add a shape to the list of shapes in this Relooper calculation void Notice(Shape *New) { + New->Id = Parent->ShapeIdCounter++; Parent->Shapes.push_back(New); } @@ -526,6 +525,21 @@ void Relooper::Calculate(Block *Entry) { return Simple; } + Shape *MakeEmulated(BlockSet &Blocks, Block *Entry, BlockSet &NextEntries) { + PrintDebug("creating emulated block with entry #%d and everything it can reach, %d blocks\n", Entry->Id, Blocks.size()); + EmulatedShape *Emulated = new EmulatedShape; + Notice(Emulated); + Emulated->Entry = Entry; + for (BlockSet::iterator iter = Blocks.begin(); iter != Blocks.end(); iter++) { + Block *Curr = *iter; + Emulated->Blocks.insert(Curr); + Curr->Parent = Emulated; + Solipsize(Curr, Branch::Continue, Emulated, Blocks); + } + Blocks.clear(); + return Emulated; + } + Shape *MakeLoop(BlockSet &Blocks, BlockSet& Entries, BlockSet &NextEntries) { // Find the inner blocks in this loop. Proceed backwards from the entries until // you reach a seen block, collecting as you go. @@ -837,6 +851,9 @@ void Relooper::Calculate(Block *Entry) { if (Entries->size() == 0) return Ret; if (Entries->size() == 1) { Block *Curr = *(Entries->begin()); + if (Parent->Emulate) { + Make(MakeEmulated(Blocks, Curr, *NextEntries)); + } if (Curr->BranchesIn.size() == 0) { // One entry, no looping ==> Simple Make(MakeSimple(Blocks, Curr, *NextEntries)); @@ -844,6 +861,7 @@ void Relooper::Calculate(Block *Entry) { // One entry, looping ==> Loop Make(MakeLoop(Blocks, *Entries, *NextEntries)); } + // More than one entry, try to eliminate through a Multiple groups of // independent blocks from an entry/ies. It is important to remove through // multiples as opposed to looping since the former is more performant. diff --git a/src/relooper/Relooper.h b/src/relooper/Relooper.h index f3dedf8c..04f2ffc3 100644 --- a/src/relooper/Relooper.h +++ b/src/relooper/Relooper.h @@ -57,7 +57,7 @@ struct Block { BlockBranchMap ProcessedBranchesOut; BlockSet ProcessedBranchesIn; Shape *Parent; // The shape we are directly inside - int Id; // A unique identifier + int Id; // A unique identifier, defined when added to relooper const char *Code; // The string representation of the code in this block. Owning pointer (we copy the input) const char *BranchVar; // If we have more than one branch out, the variable whose value determines where we go bool IsCheckedMultipleEntry; // If true, we are a multiple entry, so reaching us requires setting the label variable @@ -69,9 +69,6 @@ struct Block { // Prints out the instructions code and branchings void Render(bool InLoop); - - // INTERNAL - static int IdCounter; }; // Represents a structured control flow shape, one of @@ -96,20 +93,22 @@ class SimpleShape; class LabeledShape; class MultipleShape; class LoopShape; +class EmulatedShape; struct Shape { - int Id; // A unique identifier. Used to identify loops, labels are Lx where x is the Id. + int Id; // A unique identifier. Used to identify loops, labels are Lx where x is the Id. Defined when added to relooper Shape *Next; // The shape that will appear in the code right after this one Shape *Natural; // The shape that control flow gets to naturally (if there is Next, then this is Next) enum ShapeType { Simple, Multiple, - Loop + Loop, + Emulated }; ShapeType Type; - Shape(ShapeType TypeInit) : Id(Shape::IdCounter++), Next(NULL), Type(TypeInit) {} + Shape(ShapeType TypeInit) : Id(-1), Next(NULL), Type(TypeInit) {} virtual ~Shape() {} virtual void Render(bool InLoop) = 0; @@ -118,9 +117,7 @@ struct Shape { static MultipleShape *IsMultiple(Shape *It) { return It && It->Type == Multiple ? (MultipleShape*)It : NULL; } static LoopShape *IsLoop(Shape *It) { return It && It->Type == Loop ? (LoopShape*)It : NULL; } static LabeledShape *IsLabeled(Shape *It) { return IsMultiple(It) || IsLoop(It) ? (LabeledShape*)It : NULL; } - - // INTERNAL - static int IdCounter; + static EmulatedShape *IsEmulated(Shape *It) { return It && It->Type == Emulated ? (EmulatedShape*)It : NULL; } }; struct SimpleShape : public Shape { @@ -162,12 +159,15 @@ struct LoopShape : public LabeledShape { void Render(bool InLoop); }; -/* -struct EmulatedShape : public Shape { - std::deque<Block*> Blocks; +// TODO EmulatedShape is only partially functional. Currently it can be used for the +// entire set of blocks being relooped, but not subsets. +struct EmulatedShape : public LabeledShape { + Block *Entry; + BlockSet Blocks; + + EmulatedShape() : LabeledShape(Emulated) { Labeled = true; } void Render(bool InLoop); }; -*/ // Implements the relooper algorithm for a function's blocks. // @@ -184,6 +184,9 @@ struct Relooper { std::deque<Block*> Blocks; std::deque<Shape*> Shapes; Shape *Root; + bool Emulate; + int BlockIdCounter; + int ShapeIdCounter; Relooper(); ~Relooper(); @@ -204,6 +207,9 @@ struct Relooper { // Sets asm.js mode on or off (default is off) static void SetAsmJSMode(int On); + + // Sets whether we must emulate everything with switch-loop code + void SetEmulate(int E) { Emulate = E; } }; typedef std::map<Block*, BlockSet> BlockBlockSetMap; diff --git a/src/relooper/fuzzer.py b/src/relooper/fuzzer.py index 50846d10..fa47583e 100644 --- a/src/relooper/fuzzer.py +++ b/src/relooper/fuzzer.py @@ -87,6 +87,12 @@ int main() { Relooper r; ''' + if random.random() < 0.1: + print 'emulate' + fast += ''' + r.SetEmulate(true); +''' + for i in range(num): fast += ''' r.AddBlock(b%d); ''' % i diff --git a/src/relooper/test.cpp b/src/relooper/test.cpp index fbd9c7aa..773f6ee4 100644 --- a/src/relooper/test.cpp +++ b/src/relooper/test.cpp @@ -258,5 +258,33 @@ int main() { puts(buffer); } + + if (1) { + Relooper::SetOutputBuffer(buffer, sizeof(buffer)); + + printf("\n\n-- If pattern, emulated --\n\n", "the_var"); + + Block *b_a = new Block("// block A\n", NULL); + Block *b_b = new Block("// block B\n", "b_check()"); + Block *b_c = new Block("// block C\n", NULL); + + b_a->AddBranchTo(b_b, "check == 10", "atob();"); + b_a->AddBranchTo(b_c, NULL, "atoc();"); + + b_b->AddBranchTo(b_c, "case 17:", "btoc();"); + b_b->AddBranchTo(b_a, NULL, NULL); + + Relooper r; + r.SetEmulate(true); + r.AddBlock(b_a); + r.AddBlock(b_b); + r.AddBlock(b_c); + + r.Calculate(b_a); + printf("\n\n", "the_var"); + r.Render(); + + puts(buffer); + } } diff --git a/src/relooper/test.txt b/src/relooper/test.txt index 2c530567..540f7bdb 100644 --- a/src/relooper/test.txt +++ b/src/relooper/test.txt @@ -4,23 +4,23 @@ -// block A -switch (the_var) { -check == 10 { - atob(); - // block B + // block A switch (the_var) { + check == 10 { + atob(); + // block B + switch (the_var) { + default: { + btoc(); + } + } + break; + } default: { - btoc(); + atoc(); } } - break; -} -default: { - atoc(); -} -} -// block C + // block C @@ -28,25 +28,25 @@ default: { -// block A -switch (the_var) { -check == 15 { - // block B + // block A switch (the_var) { - default: { - } + check == 15 { + // block B + switch (the_var) { + default: { + } + } + break; } - break; -} -default: { - // block C - switch (the_var) { default: { + // block C + switch (the_var) { + default: { + } + } } } -} -} -// block D + // block D @@ -54,81 +54,81 @@ default: { -L9: while(1) { - // block A - var check = maybe(); - switch (the_var) { - default: { - } - } - // block B - switch (the_var) { - check == 41 { - break; - } - default: { - break L9; - } + L0: while(1) { + // block A + var check = maybe(); + switch (the_var) { + default: { + } + } + // block B + switch (the_var) { + check == 41 { + break; + } + default: { + break L0; + } + } } -} -// block C + // block C -- Loop with phi to head -// code 1 -switch (the_var) { -default: { - var $i_0 = 0;var $x_0 = 5; -} -} -L14: while(1) { - // code 2 + // code 1 switch (the_var) { - $2 { - break; - } default: { - var $x_1 = $x_0; - label = 18; - break L14; + var $i_0 = 0;var $x_0 = 5; + } + } + L1: while(1) { + // code 2 + switch (the_var) { + $2 { + break; + } + default: { + var $x_1 = $x_0; + label = -1; + break L1; + } + } + // code 3 + switch (the_var) { + $6 { + break L1; + break; + } + default: { + var $i_0 = $7;var $x_0 = $5; + } + } } + if (label == -1) { + // code 7 } - // code 3 + // code 4 switch (the_var) { - $6 { - break L14; + $10 { + // code 5 + switch (the_var) { + default: { + } + } break; } default: { - var $i_0 = $7;var $x_0 = $5; } } -} -if (label == 18) { - // code 7 -} -// code 4 -switch (the_var) { -$10 { - // code 5 + // code 6 switch (the_var) { default: { + var $x_1 = $13; } } - break; -} -default: { -} -} -// code 6 -switch (the_var) { -default: { - var $x_1 = $13; -} -} -// code 7 + // code 7 @@ -136,30 +136,30 @@ default: { -// block A................................................................................................... -switch (the_var) { -chak() { - atob(); - // block B................................................................................................... + // block A................................................................................................... switch (the_var) { - default: { - btod(); - } + chak() { + atob(); + // block B................................................................................................... + switch (the_var) { + default: { + btod(); + } + } + // block D + break; } - // block D - break; -} -default: { - atoc(); - // block C................................................................................................... - switch (the_var) { default: { - ctod2(); + atoc(); + // block C................................................................................................... + switch (the_var) { + default: { + ctod2(); + } + } + // block D } } - // block D -} -} @@ -167,27 +167,27 @@ default: { -// block A -switch (the_var) { -check == 10 { - break; -} -default: { - return C; -} -} -while(1) { - // block B + // block A switch (the_var) { - default: { - } + check == 10 { + break; } - // block D - switch (the_var) { default: { + return C; } } -} + while(1) { + // block B + switch (the_var) { + default: { + } + } + // block D + switch (the_var) { + default: { + } + } + } @@ -195,51 +195,51 @@ while(1) { -// block A -L37: do { - switch (the_var) { - expensive() { - label = 33; - break; - } - default: { - // block B + // block A + L1: do { switch (the_var) { - expensive2() { - label = 33; - break L37; + expensive() { + label = 3; break; } default: { + // block B + switch (the_var) { + expensive2() { + label = 3; + break L1; + break; + } + default: { + } + } + // block D + switch (the_var) { + default: { + } + } } } - // block D + } while(0); + if (label == 3) { + // block C; switch (the_var) { default: { } } } + while(1) { + // block E + switch (the_var) { + default: { + } + } + // block F + switch (the_var) { + default: { + } + } } -} while(0); -if (label == 33) { - // block C; - switch (the_var) { - default: { - } - } -} -while(1) { - // block E - switch (the_var) { - default: { - } - } - // block F - switch (the_var) { - default: { - } - } -} @@ -247,26 +247,71 @@ while(1) { -// block A -L46: do { - switch (the_var) { - shouldLoop() { - while(1) { - // block B - switch (the_var) { - moarLoop() { + // block A + L1: do { + switch (the_var) { + shouldLoop() { + while(1) { + // block B + switch (the_var) { + moarLoop() { + break; + } + default: { + break L1; + } + } + } + break; + } + default: { + } + } + } while(0); + // block C + + + +-- If pattern, emulated -- + + + + label = 1; + L0: while(1) { + switch(label|0) { + case 3: { + // block C break; } - default: { - break L46; + case 1: { + // block A + if (check == 10) { + atob(); + label = 2; + continue L0; + } else { + atoc(); + label = 3; + continue L0; + } + break; } + case 2: { + // block B + switch (b_check()) { + case 17: { + btoc(); + label = 3; + continue L0; + break; + } + default: { + label = 1; + continue L0; + } + } + break; } } - break; - } - default: { - } } -} while(0); -// block C diff --git a/src/relooper/test2.txt b/src/relooper/test2.txt index a558a8b7..aba9ec1f 100644 --- a/src/relooper/test2.txt +++ b/src/relooper/test2.txt @@ -1,26 +1,26 @@ -ep -L1: do { - switch (var) { - ep -> LBB1 { - LBB1 - switch (the_var) { - LBB1 -> LBB2 { + ep + L1: do { + switch (var) { + ep -> LBB1 { + LBB1 + switch (the_var) { + LBB1 -> LBB2 { + break; + } + default: { + break L1; + } + } + LBB2 + switch (the_var) { + default: { + } + } break; } default: { - break L1; } } - LBB2 - switch (the_var) { - default: { - } - } - break; - } - default: { - } - } -} while(0); -LBB3 + } while(0); + LBB3 diff --git a/src/relooper/test3.txt b/src/relooper/test3.txt index f77e2618..33f85a7e 100644 --- a/src/relooper/test3.txt +++ b/src/relooper/test3.txt @@ -1,56 +1,56 @@ -ep -L1: do { - switch (the_var) { - ep -> LBB1 { - LBB1 + ep + L1: do { switch (the_var) { - LBB1 -> LBB2 { + ep -> LBB1 { + LBB1 + switch (the_var) { + LBB1 -> LBB2 { + break; + } + default: { + break L1; + } + } + LBB2 + switch (the_var) { + default: { + } + } break; } default: { - break L1; - } - } - LBB2 - switch (the_var) { - default: { } } - break; - } - default: { - } - } -} while(0); -LBB3 -L5: do { - switch (the_var) { - LBB3 -> LBB4 { - LBB4 + } while(0); + LBB3 + L5: do { switch (the_var) { - LBB4 -> LBB5 { - break; - } - default: { - break L5; - } - } - while(1) { - LBB5 + LBB3 -> LBB4 { + LBB4 switch (the_var) { - LBB5 -> LBB6 { - break L5; + LBB4 -> LBB5 { break; } default: { + break L5; + } } + while(1) { + LBB5 + switch (the_var) { + LBB5 -> LBB6 { + break L5; + break; + } + default: { + } + } } + break; + } + default: { + } } - break; - } - default: { - } - } -} while(0); -LBB6 + } while(0); + LBB6 diff --git a/src/relooper/test4.txt b/src/relooper/test4.txt index 1829e523..7e3fe8e1 100644 --- a/src/relooper/test4.txt +++ b/src/relooper/test4.txt @@ -1,44 +1,44 @@ -//19 -L1: do { - switch (the_var) { - 1 { - //20 + //19 + L1: do { switch (the_var) { 1 { + //20 + switch (the_var) { + 1 { + break; + } + default: { + label = 4; + break L1; + } + } + //21 + switch (the_var) { + default: { + } + } break; } default: { label = 4; - break L1; } } - //21 + } while(0); + if (label == 4) { + //22 switch (the_var) { default: { } } - break; - } - default: { - label = 4; } - } -} while(0); -if (label == 4) { - //22 + //23 switch (the_var) { + 1 { + //24 + break; + } default: { + //28 } } -} -//23 -switch (the_var) { - 1 { - //24 - break; -} -default: { - //28 -} -} diff --git a/src/relooper/test5.txt b/src/relooper/test5.txt index 82ef5edf..e3c204f6 100644 --- a/src/relooper/test5.txt +++ b/src/relooper/test5.txt @@ -1,56 +1,56 @@ -//0 -switch (the_var) { -check(0) { - L2: while(1) { - //1 - switch (the_var) { - check(1) { - break; - } - default: { - break L2; - } - } + //0 + switch (the_var) { + check(0) { + L2: while(1) { + //1 + switch (the_var) { + check(1) { + break; + } + default: { + break L2; + } + } + } + L4: while(1) { + //2 + switch (the_var) { + check(2) { + break; + } + default: { + break L4; + } + } + } + //3 + break; } - L4: while(1) { - //2 - switch (the_var) { - check(2) { - break; - } - default: { - break L4; - } - } + default: { + goingFrom0to4(); + L7: while(1) { + //4 + switch (the_var) { + check(4) { + break; + } + default: { + break L7; + } + } + } + L9: while(1) { + //5 + switch (the_var) { + check(5) { + break L9; + break; + } + default: { + } + } + } + //3 } - //3 - break; -} -default: { - goingFrom0to4(); - L7: while(1) { - //4 - switch (the_var) { - check(4) { - break; - } - default: { - break L7; - } - } - } - L9: while(1) { - //5 - switch (the_var) { - check(5) { - break L9; - break; - } - default: { - } - } } - //3 -} -} diff --git a/src/relooper/test6.txt b/src/relooper/test6.txt index f9d6e93a..837fc243 100644 --- a/src/relooper/test6.txt +++ b/src/relooper/test6.txt @@ -1,26 +1,26 @@ -//0 -L1: do { - switch (the_var) { - check(0) { - //1 + //0 + L1: do { switch (the_var) { - check(1) { + check(0) { + //1 + switch (the_var) { + check(1) { + break; + } + default: { + break L1; + } + } + //2 + switch (the_var) { + default: { + } + } break; } default: { - break L1; } } - //2 - switch (the_var) { - default: { - } - } - break; - } - default: { - } - } -} while(0); -//3 + } while(0); + //3 diff --git a/src/relooper/test_dead.txt b/src/relooper/test_dead.txt index ae54e2cd..43d557ae 100644 --- a/src/relooper/test_dead.txt +++ b/src/relooper/test_dead.txt @@ -4,6 +4,6 @@ -// block A + // block A I did not crash even though I have dead code with a branch! diff --git a/src/relooper/test_debug.txt b/src/relooper/test_debug.txt index eb33fdbc..498dee39 100644 --- a/src/relooper/test_debug.txt +++ b/src/relooper/test_debug.txt @@ -4,18 +4,18 @@ int main() { rl_set_output_buffer(buffer); void *block_map[10000]; void *rl = rl_new_relooper(); - void *b1 = rl_new_block("// code 1"); - block_map[1] = b1; - rl_relooper_add_block(rl, block_map[1]); - void *b2 = rl_new_block("// code 2"); - block_map[2] = b2; - rl_relooper_add_block(rl, block_map[2]); - void *b3 = rl_new_block("// code 3"); - block_map[3] = b3; - rl_relooper_add_block(rl, block_map[3]); - void *b4 = rl_new_block("// code 4"); - block_map[4] = b4; - rl_relooper_add_block(rl, block_map[4]); + void *b-1 = rl_new_block("// code -1"); + block_map[-1] = b-1; + rl_relooper_add_block(rl, block_map[-1]); + void *b-1 = rl_new_block("// code -1"); + block_map[-1] = b-1; + rl_relooper_add_block(rl, block_map[-1]); + void *b-1 = rl_new_block("// code -1"); + block_map[-1] = b-1; + rl_relooper_add_block(rl, block_map[-1]); + void *b-1 = rl_new_block("// code -1"); + block_map[-1] = b-1; + rl_relooper_add_block(rl, block_map[-1]); rl_block_add_branch_to(block_map[1], block_map[2], "ep -> LBB1", NULL); rl_block_add_branch_to(block_map[1], block_map[4], NULL, NULL); rl_block_add_branch_to(block_map[2], block_map[3], "LBB1 -> LBB2", NULL); @@ -114,29 +114,29 @@ int main() { // Process() returning // === Optimizing shapes === // Fusing Multiple to Simple -ep -L1: do { - switch (the_var) { - ep -> LBB1 { - LBB1 + ep + L1: do { switch (the_var) { - LBB1 -> LBB2 { + ep -> LBB1 { + LBB1 + switch (the_var) { + LBB1 -> LBB2 { + break; + } + default: { + break L1; + } + } + LBB2 + switch (the_var) { + default: { + } + } break; } default: { - break L1; } } - LBB2 - switch (the_var) { - default: { - } - } - break; - } - default: { - } - } -} while(0); -LBB3 + } while(0); + LBB3 diff --git a/src/relooper/test_fuzz1.txt b/src/relooper/test_fuzz1.txt index d887f5b8..ccd38934 100644 --- a/src/relooper/test_fuzz1.txt +++ b/src/relooper/test_fuzz1.txt @@ -1,72 +1,72 @@ -print('entry'); var label; var state; var decisions = [4, 1, 7, 2, 6, 6, 8]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } -switch (the_var) { -default: { -} -} -print(5); state = check(); -switch (the_var) { -default: { -} -} -print(6); state = check(); -switch (the_var) { -state == 7 { - print(7); state = check(); + print('entry'); var label; var state; var decisions = [4, 1, 7, 2, 6, 6, 8]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } switch (the_var) { default: { - label = 3; } } - break; -} -default: { -} -} -L5: while(1) { - if (label == 3) { - label = 0; - print(2); state = check(); + print(5); state = check(); + switch (the_var) { + default: { + } + } + print(6); state = check(); + switch (the_var) { + state == 7 { + print(7); state = check(); switch (the_var) { default: { + label = 3; } } + break; } - print(1); state = check(); - switch (the_var) { default: { } } - while(1) { - print(3); state = check(); - switch (the_var) { - state == 8 { - break; + L5: while(1) { + if (label == 3) { + label = 0; + print(2); state = check(); + switch (the_var) { + default: { + } + } } - default: { - continue L5; - } - } - print(8); state = check(); + print(1); state = check(); switch (the_var) { - state == 4 { - break; - } default: { - label = 3; - continue L5; } } - print(4); state = check(); - switch (the_var) { - state == 3 { - break; - } - default: { - continue L5; - } + while(1) { + print(3); state = check(); + switch (the_var) { + state == 8 { + break; + } + default: { + continue L5; + } + } + print(8); state = check(); + switch (the_var) { + state == 4 { + break; + } + default: { + label = 3; + continue L5; + } + } + print(4); state = check(); + switch (the_var) { + state == 3 { + break; + } + default: { + continue L5; + } + } } } -} diff --git a/src/relooper/test_fuzz2.txt b/src/relooper/test_fuzz2.txt index 69f4350c..a94908a1 100644 --- a/src/relooper/test_fuzz2.txt +++ b/src/relooper/test_fuzz2.txt @@ -1,30 +1,30 @@ -print('entry'); var label; var state; var decisions = [4, 1, 4, 3, 4, 1, 2, 5, 1, 3, 5, 5, 1, 5, 2, 4, 4, 3]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } -switch (the_var) { -state == 1 { - while(1) { - print(1); state = check(); - switch (the_var) { - default: { - } + print('entry'); var label; var state; var decisions = [4, 1, 4, 3, 4, 1, 2, 5, 1, 3, 5, 5, 1, 5, 2, 4, 4, 3]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } + switch (the_var) { + state == 1 { + while(1) { + print(1); state = check(); + switch (the_var) { + default: { + } + } } + break; } - break; -} -default: { -} -} -while(1) { - print(3); state = check(); - switch (the_var) { default: { } } - print(2); state = check(); - switch (the_var) { - default: { - } + while(1) { + print(3); state = check(); + switch (the_var) { + default: { + } + } + print(2); state = check(); + switch (the_var) { + default: { + } + } } -} diff --git a/src/relooper/test_fuzz3.txt b/src/relooper/test_fuzz3.txt index 398b4803..15037eec 100644 --- a/src/relooper/test_fuzz3.txt +++ b/src/relooper/test_fuzz3.txt @@ -1,25 +1,25 @@ -print('entry'); var label; var state; var decisions = [3, 3, 4, 1, 2, 1, 2, 4, 4, 4, 2, 3, 3, 1, 2]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } -switch (the_var) { -default: { -} -} -print(1); state = check(); -switch (the_var) { -default: { -} -} -print(3); state = check(); -switch (the_var) { -default: { -} -} -while(1) { - print(4); state = check(); + print('entry'); var label; var state; var decisions = [3, 3, 4, 1, 2, 1, 2, 4, 4, 4, 2, 3, 3, 1, 2]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } switch (the_var) { default: { } } -} + print(1); state = check(); + switch (the_var) { + default: { + } + } + print(3); state = check(); + switch (the_var) { + default: { + } + } + while(1) { + print(4); state = check(); + switch (the_var) { + default: { + } + } + } diff --git a/src/relooper/test_fuzz4.txt b/src/relooper/test_fuzz4.txt index 2e2f2c6f..adf879f9 100644 --- a/src/relooper/test_fuzz4.txt +++ b/src/relooper/test_fuzz4.txt @@ -1,41 +1,41 @@ -print('entry'); var label; var state; var decisions = [2, 2, 1, 3, 2, 2, 1, 3, 2, 3, 3, 1, 3, 2, 1]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } -switch (the_var) { -state == 2 { - while(1) { - print(2); state = check(); - switch (the_var) { - default: { - } - } - } - break; -} -default: { -} -} -L4: while(1) { - print(4); state = check(); + print('entry'); var label; var state; var decisions = [2, 2, 1, 3, 2, 2, 1, 3, 2, 3, 3, 1, 3, 2, 1]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } switch (the_var) { - state == 4 { + state == 2 { + while(1) { + print(2); state = check(); + switch (the_var) { + default: { + } + } + } break; } default: { - break L4; } } -} -print(3); state = check(); -switch (the_var) { -default: { -} -} -while(1) { - print(1); state = check(); + L4: while(1) { + print(4); state = check(); + switch (the_var) { + state == 4 { + break; + } + default: { + break L4; + } + } + } + print(3); state = check(); switch (the_var) { default: { } } -} + while(1) { + print(1); state = check(); + switch (the_var) { + default: { + } + } + } diff --git a/src/relooper/test_fuzz5.txt b/src/relooper/test_fuzz5.txt index f87e5b79..fea540ed 100644 --- a/src/relooper/test_fuzz5.txt +++ b/src/relooper/test_fuzz5.txt @@ -1,86 +1,86 @@ -print('entry'); var label; var state; var decisions = [133, 98, 134, 143, 162, 187, 130, 87, 91, 49, 102, 47, 9, 132, 179, 176, 157, 25, 64, 161, 57, 107, 16, 167, 185, 45, 191, 180, 23, 131]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } -switch (the_var) { -default: { -} -} -L1: while(1) { - print(7); state = check(); + print('entry'); var label; var state; var decisions = [133, 98, 134, 143, 162, 187, 130, 87, 91, 49, 102, 47, 9, 132, 179, 176, 157, 25, 64, 161, 57, 107, 16, 167, 185, 45, 191, 180, 23, 131]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } switch (the_var) { - state % 3 == 1 { - label = 3; - break; + default: { + } } - state % 3 == 0 { - print(8); state = check(); + L1: while(1) { + print(7); state = check(); switch (the_var) { - state % 2 == 0 { - label = 5; + state % 3 == 1 { + label = 3; break; } - default: { - label = 7; - } - } - break; - } - default: { - break L1; - } - } - L5: while(1) { - if (label == 3) { - label = 0; - print(2); state = check(); - switch (the_var) { - default: { - } - } - print(1); state = check(); + state % 3 == 0 { + print(8); state = check(); switch (the_var) { state % 2 == 0 { label = 5; - continue L5; break; } default: { label = 7; - continue L5; } } + break; } - else if (label == 5) { - label = 0; - print(4); state = check(); - switch (the_var) { - default: { - label = 3; - continue L5; - } - } + default: { + break L1; } - else if (label == 7) { - label = 0; - print(6); state = check(); - switch (the_var) { - state % 2 == 0 { - continue L1; - break; + } + L5: while(1) { + if (label == 3) { + label = 0; + print(2); state = check(); + switch (the_var) { + default: { + } + } + print(1); state = check(); + switch (the_var) { + state % 2 == 0 { + label = 5; + continue L5; + break; + } + default: { + label = 7; + continue L5; + } + } } - default: { - label = 7; - continue L5; + else if (label == 5) { + label = 0; + print(4); state = check(); + switch (the_var) { + default: { + label = 3; + continue L5; + } + } } + else if (label == 7) { + label = 0; + print(6); state = check(); + switch (the_var) { + state % 2 == 0 { + continue L1; + break; + } + default: { + label = 7; + continue L5; + } + } } } } -} -while(1) { - print(3); state = check(); - switch (the_var) { - default: { - } + while(1) { + print(3); state = check(); + switch (the_var) { + default: { + } + } } -} diff --git a/src/relooper/test_fuzz6.txt b/src/relooper/test_fuzz6.txt index b9c1499a..40605dfc 100644 --- a/src/relooper/test_fuzz6.txt +++ b/src/relooper/test_fuzz6.txt @@ -1,291 +1,291 @@ -print('entry'); var label; var state; var decisions = [759, 1223, 618, 1805, 277, 512, 204, 1545, 606, 734, 585, 447, 1670, 1031, 665, 1728, 353, 634, 1033, 13, 658, 589, 474, 854, 405, 1111, 1640, 697, 1156, 1357, 317, 618, 990, 1401, 405, 564, 497, 829, 653, 1194, 25, 322, 1178, 198, 1565, 1419, 1608, 486, 368, 606, 813, 22, 148, 141, 261, 375, 472, 964, 1106, 694, 205, 771, 44, 675, 545, 1027, 1528, 240, 1289, 564, 792, 744, 366, 668, 823, 210, 428, 1009, 1662, 1317, 1183, 681, 14, 1334, 712, 506, 224, 695, 401, 1035, 384, 486, 1519, 122, 1186, 1487, 1819, 1702, 463, 1706, 660, 1642, 847, 991, 976, 940, 867, 46, 23, 1449, 56, 1711, 634, 404, 1558, 168, 710, 1581, 1302, 870, 997, 1295, 1739, 769, 1005, 291, 1638, 1771, 842, 659, 1695, 713, 935, 802, 1173, 1572, 850, 607, 996, 55, 1576, 321, 1815, 662, 1044, 1612, 1680, 1050, 844, 553, 278, 1447, 1662, 1094, 1797, 774, 1013, 1204, 907, 340, 1172, 1460, 869, 1264, 111, 1176, 484, 845, 258, 417, 1246, 1017, 745, 189, 333, 1658, 1395, 1764, 1786, 165, 404, 847, 1429, 1574, 403, 718, 1118, 1756, 94, 56, 1498, 1696, 1355, 840, 50, 82, 371, 1087, 875, 1337, 267, 958, 1209, 1167, 1025, 1684, 184, 962, 1496, 201, 127, 372, 1, 1005, 402, 1387, 213, 1143, 1271, 167, 10, 12, 1060, 1390, 1366, 893, 747, 1005, 481, 876, 227, 514, 589, 250, 273, 1188, 1052, 719, 219, 1006, 38, 120, 1454, 489, 672, 149, 534, 1081, 1721, 586, 330, 25, 356, 1743, 1607, 336, 981, 419, 1036, 1293, 1026, 1300, 1453, 792, 22, 45, 420, 409, 1027, 1437, 1421, 795, 136, 1276, 1610, 1593]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } -switch (the_var) { -default: { -} -} -L1: while(1) { - print(30); state = check();// ................................................................................................................................................................................................................. - switch (the_var) { - state % 3 == 0 { - break; - } - state % 3 == 1 { - label = 67; - break L1; - break; - } - default: { - break L1; - } - } - print(58); state = check();// ...................................................................................... - switch (the_var) { - default: { - } - } -} -if (label == 67) { - print(66); state = check();// ............................................................................................................... + print('entry'); var label; var state; var decisions = [759, 1223, 618, 1805, 277, 512, 204, 1545, 606, 734, 585, 447, 1670, 1031, 665, 1728, 353, 634, 1033, 13, 658, 589, 474, 854, 405, 1111, 1640, 697, 1156, 1357, 317, 618, 990, 1401, 405, 564, 497, 829, 653, 1194, 25, 322, 1178, 198, 1565, 1419, 1608, 486, 368, 606, 813, 22, 148, 141, 261, 375, 472, 964, 1106, 694, 205, 771, 44, 675, 545, 1027, 1528, 240, 1289, 564, 792, 744, 366, 668, 823, 210, 428, 1009, 1662, 1317, 1183, 681, 14, 1334, 712, 506, 224, 695, 401, 1035, 384, 486, 1519, 122, 1186, 1487, 1819, 1702, 463, 1706, 660, 1642, 847, 991, 976, 940, 867, 46, 23, 1449, 56, 1711, 634, 404, 1558, 168, 710, 1581, 1302, 870, 997, 1295, 1739, 769, 1005, 291, 1638, 1771, 842, 659, 1695, 713, 935, 802, 1173, 1572, 850, 607, 996, 55, 1576, 321, 1815, 662, 1044, 1612, 1680, 1050, 844, 553, 278, 1447, 1662, 1094, 1797, 774, 1013, 1204, 907, 340, 1172, 1460, 869, 1264, 111, 1176, 484, 845, 258, 417, 1246, 1017, 745, 189, 333, 1658, 1395, 1764, 1786, 165, 404, 847, 1429, 1574, 403, 718, 1118, 1756, 94, 56, 1498, 1696, 1355, 840, 50, 82, 371, 1087, 875, 1337, 267, 958, 1209, 1167, 1025, 1684, 184, 962, 1496, 201, 127, 372, 1, 1005, 402, 1387, 213, 1143, 1271, 167, 10, 12, 1060, 1390, 1366, 893, 747, 1005, 481, 876, 227, 514, 589, 250, 273, 1188, 1052, 719, 219, 1006, 38, 120, 1454, 489, 672, 149, 534, 1081, 1721, 586, 330, 25, 356, 1743, 1607, 336, 981, 419, 1036, 1293, 1026, 1300, 1453, 792, 22, 45, 420, 409, 1027, 1437, 1421, 795, 136, 1276, 1610, 1593]; var index = 0; function check() { if (index == decisions.length) throw 'HALT'; return decisions[index++] } switch (the_var) { default: { } } -} -print(6); state = check();// ......... -switch (the_var) { -default: { -} -} -while(1) { - print(88); state = check();// .................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... - switch (the_var) { - default: { + L1: while(1) { + print(30); state = check();// ................................................................................................................................................................................................................. + switch (the_var) { + state % 3 == 0 { + break; + } + state % 3 == 1 { + label = 67; + break L1; + break; + } + default: { + break L1; + } + } + print(58); state = check();// ...................................................................................... + switch (the_var) { + default: { + } + } } + if (label == 67) { + print(66); state = check();// ............................................................................................................... + switch (the_var) { + default: { + } + } } - print(70); state = check();// .......................................................................................................................... + print(6); state = check();// ......... switch (the_var) { default: { } } - L10: while(1) { - print(47); state = check();// .................................................................................................................................... + while(1) { + print(88); state = check();// .................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... switch (the_var) { default: { } } - print(28); state = check();// .............................................................................................................. + print(70); state = check();// .......................................................................................................................... switch (the_var) { default: { } } - L13: while(1) { - print(75); state = check();// ............................................. + L10: while(1) { + print(47); state = check();// .................................................................................................................................... switch (the_var) { default: { } } - print(7); state = check();// ............................................................................................................................................................................................. + print(28); state = check();// .............................................................................................................. switch (the_var) { - state % 2 == 0 { - break; - } default: { - break L13; - } } - } - print(89); state = check();// ...................................................................................................................................................................................................................................................................................................................................................... - switch (the_var) { - default: { - } - } - print(68); state = check();// ...................................................................................................................................................................................................................................................................................................................... - switch (the_var) { - default: { - } - } - L18: while(1) { - print(51); state = check();// ............................................................................................. - switch (the_var) { - default: { } - } - L20: while(1) { - print(36); state = check();// ......................... + L13: while(1) { + print(75); state = check();// ............................................. switch (the_var) { - state % 2 == 0 { - break L20; - break; - } default: { } } - print(16); state = check();// ................................................................................................................................................................................................................................................................................................................................................................ + print(7); state = check();// ............................................................................................................................................................................................. switch (the_var) { - default: { - } + state % 2 == 0 { + break; } - print(57); state = check();// ........................................................................................................................................................................................................................................................................................................................... - switch (the_var) { default: { + break L13; } } - print(39); state = check();// ................ + } + print(89); state = check();// ...................................................................................................................................................................................................................................................................................................................................................... + switch (the_var) { + default: { + } + } + print(68); state = check();// ...................................................................................................................................................................................................................................................................................................................... + switch (the_var) { + default: { + } + } + L18: while(1) { + print(51); state = check();// ............................................................................................. switch (the_var) { - state % 3 == 0 { - break; - } - state % 3 == 1 { - label = 74; - break; - } default: { - label = 32; - break L20; } } - L25: while(1) { - if (label == 74) { - label = 0; - print(73); state = check();// . + L20: while(1) { + print(36); state = check();// ......................... + switch (the_var) { + state % 2 == 0 { + break L20; + break; + } + default: { + } + } + print(16); state = check();// ................................................................................................................................................................................................................................................................................................................................................................ + switch (the_var) { + default: { + } + } + print(57); state = check();// ........................................................................................................................................................................................................................................................................................................................... + switch (the_var) { + default: { + } + } + print(39); state = check();// ................ + switch (the_var) { + state % 3 == 0 { + break; + } + state % 3 == 1 { + label = 74; + break; + } + default: { + label = 32; + break L20; + } + } + L25: while(1) { + if (label == 74) { + label = 0; + print(73); state = check();// . + switch (the_var) { + state % 3 == 1 { + label = 32; + break L20; + break; + } + state % 3 == 0 { + break L25; + break; + } + default: { + } + } + print(43); state = check();// ......... + switch (the_var) { + default: { + } + } + print(32); state = check();// ...................................................................................................... + switch (the_var) { + default: { + } + } + print(83); state = check();// ........................................................................................ + switch (the_var) { + default: { + } + } + print(77); state = check();// ........................................................................................................................................................................................................................................................................................... + switch (the_var) { + default: { + } + } + print(76); state = check();// .............................................................................................................................................................................................................................................................................................................................................................................................................................. + switch (the_var) { + default: { + } + } + print(22); state = check();// ......................................................................................................... + switch (the_var) { + default: { + } + } + } + print(72); state = check();// .......................................................................................................... switch (the_var) { - state % 3 == 1 { - label = 32; + state % 2 == 0 { + label = 92; break L20; break; } - state % 3 == 0 { - break L25; + default: { + } + } + print(80); state = check();// .................................... + switch (the_var) { + state % 2 == 0 { + continue L18; break; } default: { } } - print(43); state = check();// ......... + print(50); state = check();// ........................................ switch (the_var) { default: { } } - print(32); state = check();// ...................................................................................................... + print(29); state = check();// ............... switch (the_var) { default: { } } - print(83); state = check();// ........................................................................................ + print(8); state = check();// .................................................................................................................................................................................................................................................... switch (the_var) { + state % 2 == 0 { + continue L10; + break; + } default: { } } - print(77); state = check();// ........................................................................................................................................................................................................................................................................................... + print(19); state = check();// ...................................................................................................................................................................................................................... switch (the_var) { default: { } } - print(76); state = check();// .............................................................................................................................................................................................................................................................................................................................................................................................................................. + print(56); state = check();// .................................................................................................................................................................................................................... switch (the_var) { default: { } } - print(22); state = check();// ......................................................................................................... + print(34); state = check();// .......................................................................................................................................... switch (the_var) { default: { + label = 74; } } } - print(72); state = check();// .......................................................................................................... - switch (the_var) { - state % 2 == 0 { - label = 92; - break L20; - break; - } - default: { - } - } - print(80); state = check();// .................................... - switch (the_var) { - state % 2 == 0 { - continue L18; - break; - } - default: { - } - } - print(50); state = check();// ........................................ - switch (the_var) { - default: { - } - } - print(29); state = check();// ............... - switch (the_var) { - default: { - } - } - print(8); state = check();// .................................................................................................................................................................................................................................................... + print(62); state = check();// ....................................................................................... switch (the_var) { - state % 2 == 0 { - continue L10; - break; - } default: { } } - print(19); state = check();// ...................................................................................................................................................................................................................... + } + if (label == 32) { + label = 0; + print(31); state = check();// .......................................................................................................................................................................................................... switch (the_var) { default: { } } - print(56); state = check();// .................................................................................................................................................................................................................... + } + else if (label == 92) { + label = 0; + print(91); state = check();// .............................................. switch (the_var) { default: { } } - print(34); state = check();// .......................................................................................................................................... + print(33); state = check();// .... switch (the_var) { default: { - label = 74; } } } - print(62); state = check();// ....................................................................................... + print(60); state = check();// ...................................................................................................................................................................................................................................... switch (the_var) { default: { } } - } - if (label == 32) { - label = 0; - print(31); state = check();// .......................................................................................................................................................................................................... + print(10); state = check();// ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... switch (the_var) { default: { } } - } - else if (label == 92) { - label = 0; - print(91); state = check();// .............................................. + print(52); state = check();// .............................................................................. switch (the_var) { + state % 2 == 0 { + break L10; + break; + } default: { } } - print(33); state = check();// .... + print(2); state = check();// ......... switch (the_var) { default: { } } } - print(60); state = check();// ...................................................................................................................................................................................................................................... - switch (the_var) { - default: { - } - } - print(10); state = check();// ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... - switch (the_var) { - default: { - } - } - print(52); state = check();// .............................................................................. - switch (the_var) { - state % 2 == 0 { - break L10; - break; - } - default: { - } - } - print(2); state = check();// ......... - switch (the_var) { - default: { - } - } + } + print(61); state = check();// ......................................................................................................................................................... + switch (the_var) { + default: { + } } } - print(61); state = check();// ......................................................................................................................................................... - switch (the_var) { - default: { - } - } -} diff --git a/src/relooper/test_inf.txt b/src/relooper/test_inf.txt index 6db32edb..2acadbfb 100644 --- a/src/relooper/test_inf.txt +++ b/src/relooper/test_inf.txt @@ -1,1072 +1,1039 @@ -code 0 -switch (the_var) { -uint(i4) >= uint(i5) { - code 2 + code 0 switch (the_var) { - default: { - } - } - break; -} -default: { - code 1 - switch (the_var) { - default: { - } - } -} -} -code 3 -L5: do { - switch (the_var) { - i2 == 0 { + uint(i4) >= uint(i5) { + code 2 + switch (the_var) { + default: { + } + } break; } default: { - code 4 + code 1 switch (the_var) { default: { } } - while(1) { - code 5 + } + } + code 3 + L5: do { + switch (the_var) { + i2 == 0 { + break; + } + default: { + code 4 switch (the_var) { - uint(i6) >= uint(i7) { - code 7 - switch (the_var) { - default: { - } - } - break; - } default: { - code 6 - switch (the_var) { - default: { - } - } } } - code 8 - switch (the_var) { - uint(i6) >= uint(i7) { - code 10 + while(1) { + code 5 switch (the_var) { + uint(i6) >= uint(i7) { + code 7 + switch (the_var) { + default: { + } + } + break; + } default: { + code 6 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 9 + code 8 switch (the_var) { + uint(i6) >= uint(i7) { + code 10 + switch (the_var) { + default: { + } + } + break; + } default: { + code 9 + switch (the_var) { + default: { + } + } } } - } - } - code 11 - switch (the_var) { - uint(i5) >= uint(i6) { - code 13 + code 11 switch (the_var) { + uint(i5) >= uint(i6) { + code 13 + switch (the_var) { + default: { + } + } + break; + } default: { + code 12 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 12 + code 14 switch (the_var) { + i2 != 0 { + break; + } default: { + break L5; } } } - } - code 14 - switch (the_var) { - i2 != 0 { - break; - } - default: { - break L5; - } - } } - } - } -} while(0); -code 15 -switch (the_var) { -uint(i4) >= uint(i5) { - code 17 - switch (the_var) { - default: { - } - } - break; -} -default: { - code 16 - switch (the_var) { - default: { - } - } -} -} -code 18 -L26: do { + } + } while(0); + code 15 switch (the_var) { - i2 == 0 { + uint(i4) >= uint(i5) { + code 17 + switch (the_var) { + default: { + } + } break; } default: { - code 19 + code 16 switch (the_var) { default: { } } - while(1) { - code 20 + } + } + code 18 + L26: do { + switch (the_var) { + i2 == 0 { + break; + } + default: { + code 19 switch (the_var) { - uint(i5) >= uint(i6) { - code 22 - switch (the_var) { - default: { - } - } - break; - } default: { - code 21 - switch (the_var) { - default: { - } - } } } - code 23 - switch (the_var) { - uint(i5) >= uint(i6) { - code 25 + while(1) { + code 20 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 22 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 24 - switch (the_var) { default: { + code 21 + switch (the_var) { + default: { + } + } } } - } - } - code 26 - switch (the_var) { - uint(i5) >= uint(i6) { - code 28 + code 23 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 25 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 27 - switch (the_var) { default: { + code 24 + switch (the_var) { + default: { + } + } } } - } - } - code 29 - switch (the_var) { - uint(i5) >= uint(i6) { - code 31 + code 26 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 28 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 30 - switch (the_var) { default: { + code 27 + switch (the_var) { + default: { + } + } } } - } - } - code 32 - switch (the_var) { - uint(i5) >= uint(i6) { - code 34 + code 29 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 31 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 33 - switch (the_var) { default: { + code 30 + switch (the_var) { + default: { + } + } } } - } - } - code 35 - switch (the_var) { - uint(i5) >= uint(i6) { - code 37 + code 32 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 34 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 36 - switch (the_var) { default: { + code 33 + switch (the_var) { + default: { + } + } } } - } - } - code 38 - switch (the_var) { - uint(i5) >= uint(i6) { - code 40 + code 35 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 37 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 39 - switch (the_var) { default: { + code 36 + switch (the_var) { + default: { + } + } } } - } - } - code 41 - switch (the_var) { - uint(i5) >= uint(i6) { - code 43 + code 38 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 40 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 42 - switch (the_var) { default: { + code 39 + switch (the_var) { + default: { + } + } } } - } - } - code 44 - switch (the_var) { - uint(i5) >= uint(i6) { - code 46 + code 41 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 43 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 45 - switch (the_var) { default: { + code 42 + switch (the_var) { + default: { + } + } } } - } - } - code 47 - switch (the_var) { - uint(i5) >= uint(i6) { - code 49 + code 44 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 46 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 48 - switch (the_var) { default: { + code 45 + switch (the_var) { + default: { + } + } } } - } - } - code 50 - switch (the_var) { - uint(i5) >= uint(i6) { - code 52 + code 47 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 49 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 51 - switch (the_var) { default: { + code 48 + switch (the_var) { + default: { + } + } } } - } - } - code 53 - switch (the_var) { - uint(i5) >= uint(i6) { - code 55 + code 50 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 52 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 54 - switch (the_var) { default: { + code 51 + switch (the_var) { + default: { + } + } } } - } - } - code 56 - switch (the_var) { - uint(i5) >= uint(i6) { - code 58 + code 53 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 55 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 57 - switch (the_var) { default: { + code 54 + switch (the_var) { + default: { + } + } } } - } - } - code 59 - switch (the_var) { - uint(i5) >= uint(i6) { - code 61 + code 56 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 58 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 60 - switch (the_var) { default: { + code 57 + switch (the_var) { + default: { + } + } } } - } - } - code 62 - switch (the_var) { - uint(i5) >= uint(i6) { - code 64 + code 59 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 61 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 63 - switch (the_var) { default: { + code 60 + switch (the_var) { + default: { + } + } } } - } - } - code 65 - switch (the_var) { - uint(i5) >= uint(i6) { - code 67 + code 62 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 64 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 66 - switch (the_var) { default: { + code 63 + switch (the_var) { + default: { + } + } } } - } - } - code 68 - switch (the_var) { - uint(i5) >= uint(i6) { - code 70 + code 65 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 67 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 69 - switch (the_var) { default: { + code 66 + switch (the_var) { + default: { + } + } } } - } - } - code 71 - switch (the_var) { - uint(i5) >= uint(i6) { - code 73 + code 68 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 70 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 72 - switch (the_var) { default: { + code 69 + switch (the_var) { + default: { + } + } } } - } - } - code 74 - switch (the_var) { - uint(i5) >= uint(i6) { - code 76 + code 71 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 73 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 75 - switch (the_var) { default: { + code 72 + switch (the_var) { + default: { + } + } } } - } - } - code 77 - switch (the_var) { - uint(i5) >= uint(i6) { - code 79 + code 74 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 76 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 78 - switch (the_var) { default: { + code 75 + switch (the_var) { + default: { + } + } } } - } - } - code 80 - switch (the_var) { - uint(i5) >= uint(i6) { - code 82 + code 77 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 79 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 81 - switch (the_var) { default: { + code 78 + switch (the_var) { + default: { + } + } } } - } - } - code 83 - switch (the_var) { - uint(i5) >= uint(i6) { - code 85 + code 80 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 82 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 84 - switch (the_var) { default: { + code 81 + switch (the_var) { + default: { + } + } } } - } - } - code 86 - switch (the_var) { - uint(i5) >= uint(i6) { - code 88 + code 83 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 85 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 87 - switch (the_var) { default: { + code 84 + switch (the_var) { + default: { + } + } } } - } - } - code 89 - switch (the_var) { - uint(i5) >= uint(i6) { - code 91 + code 86 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 88 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 90 - switch (the_var) { default: { + code 87 + switch (the_var) { + default: { + } + } } } - } - } - code 92 - switch (the_var) { - uint(i5) >= uint(i6) { - code 94 + code 89 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 91 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 93 - switch (the_var) { default: { + code 90 + switch (the_var) { + default: { + } + } } } - } - } - code 95 - switch (the_var) { - uint(i5) >= uint(i6) { - code 97 + code 92 switch (the_var) { + uint(i5) >= uint(i6) { + code 94 + switch (the_var) { + default: { + } + } + break; + } default: { + code 93 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 96 + code 95 switch (the_var) { + uint(i5) >= uint(i6) { + code 97 + switch (the_var) { + default: { + } + } + break; + } default: { + code 96 + switch (the_var) { + default: { + } + } } } - } - } - code 98 - switch (the_var) { - uint(i5) >= uint(i6) { - code 100 + code 98 switch (the_var) { + uint(i5) >= uint(i6) { + code 100 + switch (the_var) { + default: { + } + } + break; + } default: { + code 99 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 99 + code 101 switch (the_var) { + i2 != 0 { + break; + } default: { + break L26; } } } - } - code 101 - switch (the_var) { - i2 != 0 { - break; - } - default: { - break L26; - } - } } - } - } -} while(0); -code 102 -switch (the_var) { -uint(i4) >= uint(i5) { - code 104 - switch (the_var) { - default: { - } - } - break; -} -default: { - code 103 - switch (the_var) { - default: { - } - } -} -} -code 105 -L143: do { + } + } while(0); + code 102 switch (the_var) { - i2 == 0 { + uint(i4) >= uint(i5) { + code 104 + switch (the_var) { + default: { + } + } break; } default: { - code 106 + code 103 switch (the_var) { default: { } } - while(1) { - code 107 + } + } + code 105 + L143: do { + switch (the_var) { + i2 == 0 { + break; + } + default: { + code 106 switch (the_var) { - uint(i5) >= uint(i6) { - code 109 - switch (the_var) { - default: { - } - } - break; - } default: { - code 108 - switch (the_var) { - default: { - } - } } } - code 110 - switch (the_var) { - uint(i5) >= uint(i6) { - code 112 + while(1) { + code 107 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 109 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 111 - switch (the_var) { default: { + code 108 + switch (the_var) { + default: { + } + } } } - } - } - code 113 - switch (the_var) { - uint(i5) >= uint(i6) { - code 115 + code 110 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 112 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 114 - switch (the_var) { default: { + code 111 + switch (the_var) { + default: { + } + } } } - } - } - code 116 - switch (the_var) { - uint(i5) >= uint(i6) { - code 118 + code 113 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 115 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 117 - switch (the_var) { default: { + code 114 + switch (the_var) { + default: { + } + } } } - } - } - code 119 - switch (the_var) { - uint(i5) >= uint(i6) { - code 121 + code 116 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 118 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 120 - switch (the_var) { default: { + code 117 + switch (the_var) { + default: { + } + } } } - } - } - code 122 - switch (the_var) { - uint(i5) >= uint(i6) { - code 124 + code 119 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 121 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 123 - switch (the_var) { default: { + code 120 + switch (the_var) { + default: { + } + } } } - } - } - code 125 - switch (the_var) { - uint(i5) >= uint(i6) { - code 127 + code 122 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 124 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 126 - switch (the_var) { default: { + code 123 + switch (the_var) { + default: { + } + } } } - } - } - code 128 - switch (the_var) { - uint(i5) >= uint(i6) { - code 130 + code 125 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 127 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 129 - switch (the_var) { default: { + code 126 + switch (the_var) { + default: { + } + } } } - } - } - code 131 - switch (the_var) { - uint(i5) >= uint(i6) { - code 133 + code 128 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 130 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 132 - switch (the_var) { default: { + code 129 + switch (the_var) { + default: { + } + } } } - } - } - code 134 - switch (the_var) { - uint(i5) >= uint(i6) { - code 136 + code 131 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 133 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 135 - switch (the_var) { default: { + code 132 + switch (the_var) { + default: { + } + } } } - } - } - code 137 - switch (the_var) { - uint(i5) >= uint(i6) { - code 139 + code 134 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 136 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 138 - switch (the_var) { default: { + code 135 + switch (the_var) { + default: { + } + } } } - } - } - code 140 - switch (the_var) { - uint(i5) >= uint(i6) { - code 142 + code 137 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 139 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 141 - switch (the_var) { default: { + code 138 + switch (the_var) { + default: { + } + } } } - } - } - code 143 - switch (the_var) { - uint(i5) >= uint(i6) { - code 145 + code 140 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 142 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 144 - switch (the_var) { default: { + code 141 + switch (the_var) { + default: { + } + } } } - } - } - code 146 - switch (the_var) { - uint(i5) >= uint(i6) { - code 148 + code 143 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 145 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 147 - switch (the_var) { default: { + code 144 + switch (the_var) { + default: { + } + } } } - } - } - code 149 - switch (the_var) { - uint(i5) >= uint(i6) { - code 151 + code 146 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 148 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 150 - switch (the_var) { default: { + code 147 + switch (the_var) { + default: { + } + } } } - } - } - code 152 - switch (the_var) { - uint(i5) >= uint(i6) { - code 154 + code 149 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 151 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 153 - switch (the_var) { default: { + code 150 + switch (the_var) { + default: { + } + } } } - } - } - code 155 - switch (the_var) { - uint(i5) >= uint(i6) { - code 157 + code 152 switch (the_var) { - default: { + uint(i5) >= uint(i6) { + code 154 + switch (the_var) { + default: { + } + } + break; } - } - break; - } - default: { - code 156 - switch (the_var) { default: { + code 153 + switch (the_var) { + default: { + } + } } } - } - } - code 158 - switch (the_var) { - uint(i5) >= uint(i6) { - code 160 + code 155 switch (the_var) { - default: { - } + uint(i5) >= uint(i6) { + code 157 + switch (the_var) { + default: { + } + } + break; } - break; - } - default: { - code 159 - switch (the_var) { default: { + code 156 + switch (the_var) { + default: { + } + } } } - } - } - code 161 - switch (the_var) { - uint(i5) >= uint(i6) { - code 163 + code 158 switch (the_var) { + uint(i5) >= uint(i6) { + code 160 + switch (the_var) { + default: { + } + } + break; + } default: { + code 159 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 162 + code 161 switch (the_var) { + uint(i5) >= uint(i6) { + code 163 + switch (the_var) { + default: { + } + } + break; + } default: { + code 162 + switch (the_var) { + default: { + } + } } } - } - } - code 164 - switch (the_var) { - uint(i5) >= uint(i6) { - code 166 + code 164 switch (the_var) { + uint(i5) >= uint(i6) { + code 166 + switch (the_var) { + default: { + } + } + break; + } default: { + code 165 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 165 + code 167 switch (the_var) { + i2 != 0 { + break; + } default: { + break L143; } } } - } - code 167 - switch (the_var) { - i2 != 0 { - break; - } - default: { - break L143; - } - } } - } - } -} while(0); -code 168 -switch (the_var) { -uint(i4) >= uint(i5) { - code 170 - switch (the_var) { - default: { - } - } - break; -} -default: { - code 169 - switch (the_var) { - default: { - } - } -} -} -code 171 -switch (the_var) { -i2 == 0 { - code 183 - break; -} -default: { -} -} -code 172 -switch (the_var) { -default: { -} -} -L235: while(1) { - code 173 + } + } while(0); + code 168 switch (the_var) { - uint(i5) >= uint(i6) { - code 175 + uint(i4) >= uint(i5) { + code 170 switch (the_var) { default: { } @@ -1074,58 +1041,91 @@ L235: while(1) { break; } default: { - code 174 + code 169 switch (the_var) { default: { } } } } - code 176 + code 171 + switch (the_var) { + i2 == 0 { + code 183 + break; + } + default: { + } + } + code 172 switch (the_var) { - uint(i5) >= uint(i6) { - code 178 + default: { + } + } + L235: while(1) { + code 173 switch (the_var) { + uint(i5) >= uint(i6) { + code 175 + switch (the_var) { + default: { + } + } + break; + } default: { + code 174 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 177 + code 176 switch (the_var) { + uint(i5) >= uint(i6) { + code 178 + switch (the_var) { + default: { + } + } + break; + } default: { + code 177 + switch (the_var) { + default: { + } + } } } - } - } - code 179 - switch (the_var) { - uint(i4) >= uint(i5) { - code 181 + code 179 switch (the_var) { + uint(i4) >= uint(i5) { + code 181 + switch (the_var) { + default: { + } + } + break; + } default: { + code 180 + switch (the_var) { + default: { + } + } } } - break; - } - default: { - code 180 + code 182 switch (the_var) { + i2 != 0 { + break; + } default: { + break L235; } } } - } - code 182 - switch (the_var) { - i2 != 0 { - break; - } - default: { - break L235; - } - } -} -code 183 + code 183 diff --git a/src/relooper/testit.sh b/src/relooper/testit.sh index 88db35fb..6e984b5a 100755 --- a/src/relooper/testit.sh +++ b/src/relooper/testit.sh @@ -2,61 +2,61 @@ echo "test" ./test &> test.out -diff -U 5 test.txt test.out +diff -w -U 5 test.txt test.out echo "test 2" ./test2 &> test2.out -diff -U 5 test2.txt test2.out +diff -w -U 5 test2.txt test2.out echo "test 3" ./test3 &> test3.out -diff -U 5 test3.txt test3.out +diff -w -U 5 test3.txt test3.out echo "test debug" ./test_debug &> test_debug.out -diff -U 5 test_debug.txt test_debug.out +diff -w -U 5 test_debug.txt test_debug.out echo "test dead" ./test_dead &> test_dead.out -diff -U 5 test_dead.txt test_dead.out +diff -w -U 5 test_dead.txt test_dead.out echo "test 4" ./test4 &> test4.out -diff -U 5 test4.txt test4.out +diff -w -U 5 test4.txt test4.out echo "test 5" ./test5 &> test5.out -diff -U 5 test5.txt test5.out +diff -w -U 5 test5.txt test5.out echo "test 6" ./test6 &> test6.out -diff -U 5 test6.txt test6.out +diff -w -U 5 test6.txt test6.out echo "test inf" ./test_inf &> test_inf.out -diff -U 5 test_inf.txt test_inf.out +diff -w -U 5 test_inf.txt test_inf.out echo "test fuzz1" ./test_fuzz1 &> test_fuzz1.out -diff -U 5 test_fuzz1.txt test_fuzz1.out +diff -w -U 5 test_fuzz1.txt test_fuzz1.out echo "test fuzz2" ./test_fuzz2 &> test_fuzz2.out -diff -U 5 test_fuzz2.txt test_fuzz2.out +diff -w -U 5 test_fuzz2.txt test_fuzz2.out echo "test fuzz3" ./test_fuzz3 &> test_fuzz3.out -diff -U 5 test_fuzz3.txt test_fuzz3.out +diff -w -U 5 test_fuzz3.txt test_fuzz3.out echo "test fuzz4" ./test_fuzz4 &> test_fuzz4.out -diff -U 5 test_fuzz4.txt test_fuzz4.out +diff -w -U 5 test_fuzz4.txt test_fuzz4.out echo "test fuzz5" ./test_fuzz5 &> test_fuzz5.out -diff -U 5 test_fuzz5.txt test_fuzz5.out +diff -w -U 5 test_fuzz5.txt test_fuzz5.out echo "test fuzz6" ./test_fuzz6 &> test_fuzz6.out -diff -U 5 test_fuzz6.txt test_fuzz6.out +diff -w -U 5 test_fuzz6.txt test_fuzz6.out diff --git a/tests/cases/longjmp_tiny_invoke_phi.ll b/tests/cases/longjmp_tiny_invoke_phi.ll new file mode 100644 index 00000000..30c43339 --- /dev/null +++ b/tests/cases/longjmp_tiny_invoke_phi.ll @@ -0,0 +1,46 @@ +; ModuleID = '/tmp/emscripten_temp/src.cpp.o' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-pc-linux-gnu" + +@_ZL3buf = internal global [20 x i16] zeroinitializer, align 2 +@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1 +@.str1 = private unnamed_addr constant [6 x i8] c"more\0A\00", align 1 +@.str2 = private unnamed_addr constant [6 x i8] c"fair\0A\00", align 1 + +define i32 @main() { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %call = invoke i32 @setjmp(i16* getelementptr inbounds ([20 x i16]* @_ZL3buf, i32 0, i32 0)) returns_twice + to label %allgood unwind label %awful + +allgood: + %p = phi i32 [0, %entry], [1, %if.else] + %calll = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str2, i32 0, i32 0)) + %total = add i32 %p, %call + %tobool = icmp ne i32 %total, 10 + br i1 %tobool, label %if.then, label %if.else + +if.then: ; preds = %entry + %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0)) + call void @longjmp(i16* getelementptr inbounds ([20 x i16]* @_ZL3buf, i32 0, i32 0), i32 10) + br label %if.end + +if.else: ; preds = %entry + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0)) + %chak = icmp ne i32 %call2, 1337 + br i1 %chak, label %if.end, label %allgood + +if.end: ; preds = %if.else, %if.then + ret i32 0 + +awful: + ret i32 1 +} + +declare i32 @setjmp(i16*) returns_twice + +declare i32 @printf(i8*, ...) + +declare void @longjmp(i16*, i32) + diff --git a/tests/cases/longjmp_tiny_invoke_phi.txt b/tests/cases/longjmp_tiny_invoke_phi.txt new file mode 100644 index 00000000..aaa41d11 --- /dev/null +++ b/tests/cases/longjmp_tiny_invoke_phi.txt @@ -0,0 +1,4 @@ +fair +hello world +fair +more diff --git a/tests/test_core.py b/tests/test_core.py index e61f5c35..9e52792c 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5032,7 +5032,7 @@ def process(filename): 'structphiparam', 'callwithstructural_ta2', 'callwithstructural64_ta2', 'structinparam', # pnacl limitations in ExpandStructRegs '2xi40', # pnacl limitations in ExpandGetElementPtr 'legalizer_ta2', '514_ta2', # pnacl limitation in not legalizing i104, i96, etc. - 'longjmp_tiny', 'longjmp_tiny_invoke', 'longjmp_tiny_phi', 'longjmp_tiny_phi2', 'indirectbrphi', 'ptrtoint_blockaddr', 'quoted', # current fastcomp limitations FIXME + 'longjmp_tiny', 'longjmp_tiny_invoke', 'longjmp_tiny_phi', 'longjmp_tiny_phi2', 'longjmp_tiny_invoke_phi', 'indirectbrphi', 'ptrtoint_blockaddr', 'quoted', # current fastcomp limitations FIXME 'sillyfuncast', 'sillyfuncast2', 'sillybitcast', 'atomicrmw_unaligned' # TODO XXX ]: continue if '_ta2' in shortname and not Settings.USE_TYPED_ARRAYS == 2: diff --git a/tests/test_other.py b/tests/test_other.py index eb9bd23d..43bd3025 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -1165,7 +1165,7 @@ f.close() ''') Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--js-library', os.path.join(self.get_dir(), 'mylib1.js'), - '--js-library', os.path.join(self.get_dir(), 'mylib2.js')]).communicate() + '--js-library', os.path.join(self.get_dir(), 'mylib2.js')]).communicate() self.assertContained('hello from lib!\n*32*\n', run_js(os.path.join(self.get_dir(), 'a.out.js'))) def test_identical_basenames(self): diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index c63cb36a..161ed59c 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3125,6 +3125,17 @@ function outline(ast) { parts = []; var curr = node; while (1) { + if (!curr[3]) { + // we normally expect ..if (cond) { .. } else [if (nextCond) {] (in [] is what we hope to see) + // but are now seeing ..if (cond) { .. } with no else. This might be + // ..if (cond) if (nextCond) { + // which vacuum can generate from if (cond) {} else if (nextCond), making it + // if (!cond) if (nextCond) + // so we undo that, in hopes of making it more flattenable + curr[3] = curr[2]; + curr[2] = ['block', []]; + curr[1] = simplifyNotCompsDirect(['unary-prefix', '!', curr[1]]); + } parts.push({ condition: curr[1], body: curr[2] }); curr = curr[3]; if (!curr) break; diff --git a/tools/shared.py b/tools/shared.py index 5a6a5360..eb1c63be 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -322,7 +322,7 @@ def find_temp_directory(): # we re-check sanity when the settings are changed) # We also re-check sanity and clear the cache when the version changes -EMSCRIPTEN_VERSION = '1.7.8' +EMSCRIPTEN_VERSION = '1.8.0' def generate_sanity(): return EMSCRIPTEN_VERSION + '|' + get_llvm_target() + '|' + LLVM_ROOT @@ -1094,7 +1094,7 @@ class Building: # 8k is a bit of an arbitrary limit, but a reasonable one # for max command line size before we use a respose file response_file = None - if WINDOWS and len(' '.join(link_cmd)) > 8192: + if len(' '.join(link_cmd)) > 8192: logging.debug('using response file for llvm-link') [response_fd, response_file] = mkstemp(suffix='.response', dir=TEMP_DIR) |