[llvm] [DWARFLinkerParallel] Change more cases of compare_exchange_weak to compare_exchange_strong (PR #138692)
Martin Storsjö via llvm-commits
llvm-commits at lists.llvm.org
Sun May 11 13:54:33 PDT 2025
mstorsjo wrote:
> > > > > The remaining uses of compare_exchange_weak() in
> > > > > DWARFLinkerCompileUnit.h also seem very suspicious; if there would be a true concurrent write, leading to compare_exchange_weak() returning false, it seems like we would get stuck in an endless loop - but changing them to compare_exchange_strong() wouldn't make any difference with respect to that.
> > > >
> > > >
> > > > Can you have a look at these cases? (I haven't run into issues with them, but the code looks like it could lock up.)
> > >
> > >
> > > yes, you are right those places look incorrect. Thank you for pointing to this.
> > > Instead of
> > > ```
> > > auto InputData = Flags.load();
> > > while (!Flags.compare_exchange_weak(InputData,
> > > ((InputData & ~0x7) | Placement))) {
> > > }
> > > ```
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > there should be something like
> > > ```
> > > do {
> > > auto InputData = Flags.load();
> > > while (!Flags.compare_exchange_weak(InputData,
> > > ((InputData & ~0x7) | Placement)));
> > > ```
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > Would you prefer me to do these changes or would you prefer to do these changes youself?
> >
> >
> > Yes, that looks correct to me. As you're more familiar with the overall intent here (I'm just trying to debug things that show up when running `ninja check` ;-) ) I'd prefer if you'd open such a PR, but I can review it!
>
> My answer was too hurry. This code looks OK:
>
> ```
> auto InputData = Flags.load();
> while (!Flags.compare_exchange_weak(InputData,
> ((InputData & ~0x7) | Placement))) {
> }
> ```
>
> There should not be endless loop here. if there would be a true concurrent write, leading to compare_exchange_weak() returning false, then InputData would be updated with current value of "Flags". Then it would - either match on next iteration and loop will finish, either(in case new concurrent write) it would be updated again.
>
> So, after this MR was integrated, it looks like no more other issues inside dwarflinker parallel with usages of compare_exchange_weak.
Oh, indeed - you're right, I forgot that it updates the `InputData` variable with the new value on change. Yes then those things should indeed be ok.
https://github.com/llvm/llvm-project/pull/138692
More information about the llvm-commits
mailing list