Propagate const_fold through generate blocks and branches
authorZachary Snow <zach@zachjs.com>
Sun, 9 Aug 2020 15:52:55 +0000 (09:52 -0600)
committerZachary Snow <zach@zachjs.com>
Sun, 9 Aug 2020 21:21:08 +0000 (17:21 -0400)
frontends/ast/simplify.cc
tests/simple/const_branch_finish.v [new file with mode: 0644]

index 66f22e1135ebc4469f43389371b03dbf6c295061..fb23b0644f5e542fa829a07789542a05dbd2342a 100644 (file)
@@ -1807,7 +1807,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
 
                        if (type == AST_GENFOR) {
                                for (size_t i = 0; i < buf->children.size(); i++) {
-                                       buf->children[i]->simplify(false, false, false, stage, -1, false, false);
+                                       buf->children[i]->simplify(const_fold, false, false, stage, -1, false, false);
                                        current_ast_mod->children.push_back(buf->children[i]);
                                }
                        } else {
@@ -1883,7 +1883,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                }
 
                for (size_t i = 0; i < children.size(); i++) {
-                       children[i]->simplify(false, false, false, stage, -1, false, false);
+                       children[i]->simplify(const_fold, false, false, stage, -1, false, false);
                        current_ast_mod->children.push_back(children[i]);
                }
 
@@ -1920,7 +1920,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        }
 
                        for (size_t i = 0; i < buf->children.size(); i++) {
-                               buf->children[i]->simplify(false, false, false, stage, -1, false, false);
+                               buf->children[i]->simplify(const_fold, false, false, stage, -1, false, false);
                                current_ast_mod->children.push_back(buf->children[i]);
                        }
 
@@ -1999,7 +1999,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        }
 
                        for (size_t i = 0; i < buf->children.size(); i++) {
-                               buf->children[i]->simplify(false, false, false, stage, -1, false, false);
+                               buf->children[i]->simplify(const_fold, false, false, stage, -1, false, false);
                                current_ast_mod->children.push_back(buf->children[i]);
                        }
 
diff --git a/tests/simple/const_branch_finish.v b/tests/simple/const_branch_finish.v
new file mode 100644 (file)
index 0000000..8166688
--- /dev/null
@@ -0,0 +1,39 @@
+`define CONSTANT_CHECK \
+       if (WIDTH === 'bx) begin \
+               $display("FAIL"); \
+               $finish; \
+       end
+
+module top;
+       parameter WIDTH = 32;
+       integer j;
+       initial begin
+               `CONSTANT_CHECK
+               if (WIDTH == 32) begin : procedural_conditional_block
+                       `CONSTANT_CHECK
+               end
+               case (WIDTH)
+                       32: `CONSTANT_CHECK
+                       default: ;
+               endcase
+               for (j = 0; j < 2; j = j + 1) begin : procedural_loop_block
+                       `CONSTANT_CHECK
+               end
+       end
+       generate
+               begin : unconditional_block
+                       initial `CONSTANT_CHECK
+               end
+               if (WIDTH == 32) begin : conditional_block
+                       initial `CONSTANT_CHECK
+               end
+               case (WIDTH)
+                       32: initial `CONSTANT_CHECK
+                       default: ;
+               endcase
+               genvar i;
+               for (i = 0; i < 2; i = i + 1) begin : loop_block
+                       initial `CONSTANT_CHECK
+               end
+       endgenerate
+endmodule