aaron.ballman added inline comments.

================
Comment at: clang/include/clang/Basic/AttrDocs.td:1861
+
+  do [[unlikely]] {   // The loop will always iterate once
+    ...               // The likelihood attribute affects the likelihood of the
----------------
Mordante wrote:
> aaron.ballman wrote:
> > Oye, I don't know how I feel about this. According to the standard 
> > (http://eel.is/c++draft/stmt.pre#1), the unlikely attribute appertains to 
> > the compound statement, not the expression within the while loop and that 
> > compound statement is required to be entered at least once so this just 
> > feels really unintuitive to me. WDYT?
> I like the current approach. I agree it feels a bit odd, the initial path of 
> execution will always be the substatement. Whether the substatement will be 
> executed after the condition in the `while` isn't known upfront so there the 
> likelihood attribute can help. If we don't allow it here I see no other way 
> to express the fact the user expects it unlikely the loop more than one 
> iteration.
> 
> I just did a short test with GCC and MSVC and it seems to have no effect on 
> the generated assembly code. So maybe it would be better to remove it for now 
> and discuss it later with the other vendors. Do you agree?
> 
> I just did a short test with GCC and MSVC and it seems to have no effect on 
> the generated assembly code. So maybe it would be better to remove it for now 
> and discuss it later with the other vendors. Do you agree?

I think that's a great approach, thank you!

The reason I am uncomfortable with the current approach is that we went to a 
lot of effort to make appertainment clear for attributes and *not* let them 
slide around like GNU-style attributes, and that's effectively what this one is 
doing. So while the behavior we get is not the worst, it opens the door to more 
"oh, but I know better than the user where this belongs" sort of shenanigans 
that we should be resistant to.


================
Comment at: clang/include/clang/Basic/AttrDocs.td:1866
+  while(true) [[unlikely]] {
+    ...               // The attribute has no effect
+  }                   // Clang elides comparison and generates an infinite loop
----------------
Mordante wrote:
> aaron.ballman wrote:
> > This is a bit of an edge case where I can't tell whether we should or 
> > should not diagnose. On the one hand, the user wrote something and we think 
> > it's meaningless, which we would usually diagnose as being an ignored 
> > attribute so the user can maybe react to it. On the other hand, "has no 
> > effect" is perhaps not the same as "ignored", as with `i + 0` (it's not 
> > really ignored but you would expect it to have no effect either).
> In this case it's ignored since the CodeGen doesn't create a branch 
> instruction. GCC does the same at -O0, MSVC creates the branch at -O0, but 
> removes it at higher optimization levels. So since the other two main 
> compilers also remove the branch I think we could issue a diagnostic in this 
> case we can do that when the CodeGen determines the branch isn't needed. In 
> that case I don't expect false positives. Agreed?
> 
> 
I think that's reasonable if it's easy enough for you to do, but I don't insist 
on a diagnostic if it turns out to be tricky to support for some reason.


================
Comment at: clang/include/clang/Basic/AttrDocs.td:1871
+    ...               // The attribute has no effect
+  } while(0);         // Clang elides comparison and generates no loop
+
----------------
Mordante wrote:
> aaron.ballman wrote:
> > elides comparison -> elides the comparison
> If we keep the do/while likelihood and issue a diagnostic for `while(1)` we 
> should do the same here.
Agreed, good catch!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D89899/new/

https://reviews.llvm.org/D89899

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to