Fixed memory corruption bug in opt_rmunused
authorClifford Wolf <clifford@clifford.at>
Thu, 23 May 2013 11:19:28 +0000 (13:19 +0200)
committerClifford Wolf <clifford@clifford.at>
Thu, 23 May 2013 11:19:28 +0000 (13:19 +0200)
passes/opt/opt_rmunused.cc

index 6cec9b2942deff87306df63bed0d1e7b603d42b8..3d6d755afc5698950d9c5244467be4c71897c9f6 100644 (file)
@@ -172,7 +172,6 @@ static void rmunused_module_signals(RTLIL::Module *module)
                        RTLIL::SigSpec s1 = RTLIL::SigSpec(wire), s2 = s1;
                        assign_map.apply(s2);
                        if (!used_signals.check_any(s2) && wire->port_id == 0) {
-                               log("  removing unused non-port wire %s.\n", wire->name.c_str());
                                del_wires.push_back(wire);
                        } else {
                                s1.expand();
@@ -187,6 +186,8 @@ static void rmunused_module_signals(RTLIL::Module *module)
                                if (new_conn.first.width > 0) {
                                        new_conn.first.optimize();
                                        new_conn.second.optimize();
+                                       used_signals.add(new_conn.first);
+                                       used_signals.add(new_conn.second);
                                        module->connections.push_back(new_conn);
                                }
                        }
@@ -216,13 +217,19 @@ static void rmunused_module_signals(RTLIL::Module *module)
                }
        }
 
-       for (auto wire : del_wires) {
-               module->wires.erase(wire->name);
-               delete wire;
-       }
+       int del_wires_count = 0;
+       for (auto wire : del_wires)
+               if (!used_signals.check_any(RTLIL::SigSpec(wire))) {
+                       if (check_public_name(wire->name)) {
+                               log("  removing unused non-port wire %s.\n", wire->name.c_str());
+                               del_wires_count++;
+                       }
+                       module->wires.erase(wire->name);
+                       delete wire;
+               }
 
-       if (del_wires.size() > 0)
-               log("  removed %zd unused temporary wires.\n", del_wires.size());
+       if (del_wires_count > 0)
+               log("  removed %d unused temporary wires.\n", del_wires_count);
 }
 
 static void rmunused_module(RTLIL::Module *module)