[llvm-dev] DenseMap/ValueMap: is M[New]=M[Old] valid ?

Martin Storsjö via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 26 22:58:44 PDT 2019


I actually ran into an elusive bug with this exact same issue some time 
ago as well, see https://bugs.llvm.org/show_bug.cgi?id=42065 and 
https://reviews.llvm.org/D62624.

The strange thing about that bug was that it only showed up if built with 
GCC; Clang dereferenced the right hand side reference before evaluating 
the left hand side, as long as the value type was as small as the 
reference itself.

// Martin

On Thu, 26 Sep 2019, David Blaikie via llvm-dev wrote:

> Yep - You'd have to separate them for correctness if "NewKey" might not
> already be in "M".
> 
> On Thu, Sep 26, 2019 at 2:48 PM Jeroen Dobbelaere via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
>       Hi,
>
>       I have a question about llvm/ADT/DenseMap.h and
>       llvm/IR/ValueMap.h:
>
>       When you have a:
>            MapType M;
>
>       is it safe to do:
>           M[NewKey] = M[OldKey];
>
>       or do you need to do it in two steps:
>          auto tmp = M[OldKey]; // ensure the reference to M[OldKey] is
>       copied, before reassigning.
>          M[NewKey] = tmp;      // might reallocate
>
>       aka, will a possible allocation for M[NewKey] invalidate the
>       reference that M[OldKey] returns ?
>
>       Greetings,
>
>       Jeroen Dobbelaere


More information about the llvm-dev mailing list