<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jul 24, 2020 at 9:35 AM Nicolai Hähnle <<a href="mailto:nhaehnle@gmail.com">nhaehnle@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On Fri, Jul 24, 2020 at 12:14 AM Mehdi AMINI <<a href="mailto:joker.eph@gmail.com" target="_blank">joker.eph@gmail.com</a>> wrote:<br>
> On Thu, Jul 23, 2020 at 8:29 AM Nicolai Hähnle via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>> Hi Varun,<br>
>><br>
>> On Wed, Jul 22, 2020 at 2:17 AM Varun Gandhi via llvm-dev<br>
>> <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>> > * Stability Guarantees: The C++ API is does not guarantee any stability. Changes may be made without any notice about deprecation and alternate APIs for the same functionality may not be included. Downstream projects using the C++ API are expected to keep up with changes.<br>
>><br>
>> I'm generally on board with this, certainly between LLVM releases, but<br>
>> I feel like it would be friendlier to use (potentially short-lived)<br>
>> deprecation as a tool for LLVM trunk.<br>
>><br>
>> We maintain an out-of-tree compiler[0] and try to be good citizens by<br>
>> following LLVM trunk very closely. It is always frustrating when a<br>
>> very central part of LLVM (like the Builders, or Instructions) have a<br>
>> "flag-day" change, where our frontend must be changed in a way where<br>
>> the new version doesn't work with LLVM trunk that is even a few days<br>
>> old, and the old version doesn't work with current LLVM trunk.<br>
>><br>
>> In many, many cases it is almost zero effort for the person making the<br>
>> chance in LLVM to split it up into a sequence of logical changes:<br>
>><br>
>> 1) Add the new API.<br>
>> 2) Use it in llvm-project.<br>
>> 3) Add LLVM_ATTRIBUTE_DEPRECATED to the old API.<br>
>> 4) Remove the old API.<br>
>><br>
>> 1-3 could be in a single commit, but having a few weeks between them<br>
>> and point 4 helps _massively_.<br>
><br>
><br>
> I don't see this as a "almost zero effort", I see this as a potentially *heavy* effort actually.<br>
<br>
What do you base this belief on?<br></blockquote><div><br></div><div>The experience of refactoring some large components in LLVM, contrasted with working on other codebases where I couldn't actually do this just like in LLVM and so we just didn't do it because the change in cost/benefit.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
<br>
> I am also fairly wary of the side-effect of such expectation in that it will:<br>
> - discourage refactoring / cleanup, leading to an overall more cumbersome/convoluted  API surface and overall codebase.<br>
> - encourage to "work-around" the process by creating duplication of features because designing around deprecation is "work".<br>
<br>
The single most discouraging thing about refactoring / cleanup in LLVM<br>
is that there are very, very few reviewers willing to say "Yes".<br></blockquote><div><br></div><div>By increasing the amount of churn in the codebase and the number of patches for a refactoring and the mental effort to assess what can break and what can/can't be made</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
Besides, I think you misunderstood: the point isn't to *forbid*<br>
flag-day changes. The point is to encourage thinking about how to do<br>
refactoring better. Sometimes a flag-day change is required, and<br>
that's fine, but in the vast majority of cases it isn't.<br></blockquote><div><br></div><div>No I perfectly understood, I'm still not in favor of codifying an encouragement in this direction: I'm not eager to have reviewers ask me to change my patch to follow the scheme you describe for stability purposes.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
We have seen this in practice this year with the Align changes and the<br>
SVE changes, and it generally works well (git log -S<br>
LLVM_ATTRIBUTE_DEPRECATED shows the related changes -- there aren't<br>
many of them, but there aren't many changes with the potential of<br>
breaking a frontend build in the first place).<br>
<br>
I'm simply saying that we should document established practice that<br>
exists in the LLVM community today.</blockquote><div><br></div><div>If an author *and* a reviewers agreed at the start to take this route because it is more convenient for landing the changes: this is perfectly fine.</div><div>I would do it if the motivation was to land the change more easily (easier to craft, easier to review, etc.), but this isn't the same thing as "providing stability for a fork of LLVM" (I don't believe this is just "documenting what is an established practice today") .</div><div><br></div><div>-- </div><div>Mehdi</div></div></div>