<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">
<span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Hi,</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Thanks for the feedback.  I think there are
 really two independent aspects to the proposal:</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(1) Which 16-bit float types should change
 behaviour?</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(2) When should they change behaviour?</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">For (1) the choices are:</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(1a) Change float16_t and __fp16 [Approach
 A in Sjoerd's email]</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(1b) Change float16_t only [Approach B]</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">For (2) the choices can be divided up as:</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(2a) Make the new behaviour opt-in</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(2b) Make the new behaviour opt-out</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(2c) Make the new behaviour unconditional</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">That gives 6 combinations in total.  I think
 the feedback so far is that (1b) + (2c) is preferable to (1a) + (2c), which is just the kind of thing we were hoping for from this thread, thanks.  In addition to that, do you have any thoughts about the other 4 combinations?</span><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Personally I was wary of (1b) because, as you
 say, it changes a typedef provided by the ACLE.  This is an ABI break, in the sense that it changes the mangling of a C++ function (F) that takes float16_t arguments.  Definitions of F compiled before the change won't link against uses of F compiled after
 the change, and definitions of F compiled after the change won't link against uses of F compiled before the change.</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">From that point of view, (2a) seems like the
 most conservative option: existing binaries remain link-compatible with new binaries, and existing float16_t and __fp16 code keep their current behaviour.  Other targets that have adopted __fp16 remain unaffected.</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</span></div>
<div><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">(1a) + (2b) is less conservative: existing binaries remain link-compatible with new binaries, but projects that
 rely on the existing float16_t and __fp16 behaviour would need to be adjusted for newer compilers.  Perhaps there's a weak analogy here with bumping the default -std= option.</span></div>
<div><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</span></div>
<span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">This is only a high-level classification.  The opt-ins or opt-outs could be controlled in various ways.  Possibilities
 include:</span>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">
<ul>
<li><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">a new command-line option</span></li><li><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">a new pragma (for (1a))</span></li><li><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">a special macro that needs to be defined before including the ACLE header files (for (1b))</span><br>
</li></ul>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">The defaults could depend on the target, if
 that seemed preferable.</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">When compiling a function F that uses float16_t
 (perhaps internally), the float16_t semantics effectively become a property of F's definition.  Mixing a definition of F with the old float16_t semantics and a definition of F with new float16_t semantics would break the One Definition Rule.  (2a) and (2b)
 make it easier to avoid ODR violations, (2c) would effectively force the user to recompile affected .os.</span><br>
</div>
<div><br>
</div>
<div><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Thanks, and sorry for the long email.</span></div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">Richard</span><br>
</div>
<div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);"><br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Steve (Numerics) Canon <scanon@apple.com><br>
<b>Sent:</b> 10 December 2020 16:18<br>
<b>To:</b> Sjoerd Meijer <Sjoerd.Meijer@arm.com><br>
<b>Cc:</b> cfe-dev@lists.llvm.org Developers <cfe-dev@lists.llvm.org>; Richard Sandiford <Richard.Sandiford@arm.com><br>
<b>Subject:</b> Re: [cfe-dev] Changing semantics of __fp16</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Hi —<br>
<br>
Silently changing the semantics of __fp16 (Approach A) so that existing programs suddenly get different (and in many cases, worse) results seems quite problematic to me.<br>
<br>
Approach B is _also_ deeply flawed, however, as it violates the ACLE documentation for float16_t:<br>
<br>
> If the __fp16 type is defined, float16_t is defined as an alias for it.<br>
<br>
I have a slight preference for approach B, because it only effects people using float16_t, and not users of __fp16, and allows them the escape valve of switching to using __fp16 explicitly if they need the old behavior.<br>
<br>
– Steve</div>
</span></font></div>
</body>
</html>