From f0a5a47371e227e2ac5d840c3fa7dfbf83ce8a6d Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Thu, 23 Jul 2020 19:04:15 -0600 Subject: [PATCH] fix break/continue causing return after loop --- src/Convert/Jump.hs | 8 +++++++- test/basic/jump.sv | 22 ++++++++++++++++++++++ test/basic/jump.v | 23 +++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/Convert/Jump.hs b/src/Convert/Jump.hs index 1fbec2b..beb4998 100644 --- a/src/Convert/Jump.hs +++ b/src/Convert/Jump.hs @@ -261,13 +261,19 @@ convertLoop loop comp stmt = do (BinOp Ne (Ident jumpState) jsReturn) (asgn jumpState (Ident jsStackIdent)) Null + let jsCheckReturn = If NoCheck + (BinOp Ne (Ident jumpState) jsReturn) + (asgn jumpState jsNone) + Null return $ if not afterHasJump then loop comp stmt' else if origLoopDepth == 0 then Block Seq "" [] - [ loop comp' body ] + [ loop comp' body + , jsCheckReturn + ] else Block Seq "" [ jsStackDecl ] diff --git a/test/basic/jump.sv b/test/basic/jump.sv index 8a70a56..fd11977 100644 --- a/test/basic/jump.sv +++ b/test/basic/jump.sv @@ -114,4 +114,26 @@ module top; end initial #5 $finish; + initial begin + for (int unsigned i = 0; i < 5; ++i) begin + $display("Loop D-1:", i); + if (i == 3) begin + $display("Loop D-2:", i); + break; + $display("UNREACHABLE ", `__LINE__); + end + $display("Loop D-3:", i); + end + for (int unsigned i = 0; i < 5; i++) begin + $display("Loop E-1:", i); + if (i == 2) begin + $display("Loop E-2:", i); + break; + $display("UNREACHABLE ", `__LINE__); + end + $display("Loop E-3:", i); + end + $display("Block F-1"); + end + endmodule diff --git a/test/basic/jump.v b/test/basic/jump.v index 45f6667..3497526 100644 --- a/test/basic/jump.v +++ b/test/basic/jump.v @@ -89,4 +89,27 @@ module top; end initial #5 $finish; + initial begin : loops_de + reg unsigned [31:0] i; + for (i = 0; i < 5; ++i) begin + $display("Loop D-1:", i); + if (i == 3) begin + $display("Loop D-2:", i); + i = 5; + end + else + $display("Loop D-3:", i); + end + for (i = 0; i < 5; i++) begin + $display("Loop E-1:", i); + if (i == 2) begin + $display("Loop E-2:", i); + i = 5; + end + else + $display("Loop E-3:", i); + end + $display("Block F-1"); + end + endmodule