Use default copy constructor for RTLIL::SigBit
authorRupert Swarbrick <rswarbrick@gmail.com>
Fri, 22 May 2020 15:59:24 +0000 (16:59 +0100)
committerRupert Swarbrick <rswarbrick@gmail.com>
Tue, 26 May 2020 12:18:01 +0000 (13:18 +0100)
There was a handwritten copy constructor, which I'm not sure was
actually legal C++ (it unconditionally read from the 'data' member of
a union, which wouldn't have been written if wire was true). It was
also a bit less efficient than the constructor you get from the
compiler by default (which is allowed to just copy the memory).

This gives a marginal (~0.25%) decrease in code size when compiled
with GCC 9.3.

kernel/rtlil.h

index 11c45bbec77904615e85d669cfd5b2a181fb1bcb..4a23a2d063c80a83ae86d75f67eb9d2633cba8ff 100644 (file)
@@ -721,7 +721,7 @@ struct RTLIL::SigBit
        SigBit(const RTLIL::SigChunk &chunk);
        SigBit(const RTLIL::SigChunk &chunk, int index);
        SigBit(const RTLIL::SigSpec &sig);
-       SigBit(const RTLIL::SigBit &sigbit);
+       SigBit(const RTLIL::SigBit &sigbit) = default;
        RTLIL::SigBit &operator =(const RTLIL::SigBit &other) = default;
 
        bool operator <(const RTLIL::SigBit &other) const;
@@ -1494,7 +1494,6 @@ inline RTLIL::SigBit::SigBit(RTLIL::Wire *wire) : wire(wire), offset(0) { log_as
 inline RTLIL::SigBit::SigBit(RTLIL::Wire *wire, int offset) : wire(wire), offset(offset) { log_assert(wire != nullptr); }
 inline RTLIL::SigBit::SigBit(const RTLIL::SigChunk &chunk) : wire(chunk.wire) { log_assert(chunk.width == 1); if (wire) offset = chunk.offset; else data = chunk.data[0]; }
 inline RTLIL::SigBit::SigBit(const RTLIL::SigChunk &chunk, int index) : wire(chunk.wire) { if (wire) offset = chunk.offset + index; else data = chunk.data[index]; }
-inline RTLIL::SigBit::SigBit(const RTLIL::SigBit &sigbit) : wire(sigbit.wire), data(sigbit.data){ if (wire) offset = sigbit.offset; }
 
 inline bool RTLIL::SigBit::operator<(const RTLIL::SigBit &other) const {
        if (wire == other.wire)