<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p><br>
</p>
<div class="moz-cite-prefix">On 07/06/2017 09:24 AM, Alexandre
Isoard wrote:<br>
</div>
<blockquote
cite="mid:CANLM5Ld8bSGEMfNxS_2nt_2tOxATDE1ipqfj5-tBcbhs8p1TsA@mail.gmail.com"
type="cite">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<div dir="ltr">Hi Hal,
<div><br>
</div>
<div>I just want to check I understand correctly the subtlety,
in C++ an overflowing signed addition is an undefined behavior
(so Clang adds the nsw keyword to the sign add), while a
signed cast that overflow is "only" implementation defined (so
Clang cant risk to produce poison on trunc). Is that right?</div>
</div>
</blockquote>
<br>
Correct.<br>
<br>
<blockquote
cite="mid:CANLM5Ld8bSGEMfNxS_2nt_2tOxATDE1ipqfj5-tBcbhs8p1TsA@mail.gmail.com"
type="cite">
<div dir="ltr">
<div><br>
</div>
<div>If trunc produced undef instead of poison, clang could use
it, but then it is less useful and/or unwanted?</div>
</div>
</blockquote>
<br>
If the behavior was undefined, then we could have a flag that
carried the possibility of producing poison. But the standard
requires us to define the behavior, so we need to give the construct
some well-defined meaning (which might be platform dependent). It is
"just" a matter of the choices made by the standards committee(s).<br>
<br>
-Hal<br>
<br>
<blockquote
cite="mid:CANLM5Ld8bSGEMfNxS_2nt_2tOxATDE1ipqfj5-tBcbhs8p1TsA@mail.gmail.com"
type="cite">
<div dir="ltr">
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Jul 5, 2017 at 10:30 PM, Hal
Finkel <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><span>
<p><br>
</p>
<div
class="m_5162489970081525388m_-3311001276389849401moz-cite-prefix">On
07/05/2017 03:10 PM, Alexandre Isoard wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Ah, ok. I read it wrong. In *neither*
case it is UB.
<div><br>
</div>
<div>Hum, can an implementation define it as UB?
:-)</div>
</div>
</blockquote>
<br>
</span> Nope :-)<br>
<br>
The only case I've thought of where we could add these
for C++ would be on conversions to (most) enums (because
they used signed underlying types and the out-of-bounds
mapping won't generally be one of the allowed values (or
maybe we can define this to be the case?)).<span
class="m_5162489970081525388HOEnZb"><font
color="#888888"><br>
<br>
-Hal</font></span>
<div>
<div class="m_5162489970081525388h5"><br>
<br>
<blockquote type="cite">
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Jul 5, 2017 at
9:09 PM, Alexandre Isoard <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:alexandre.isoard@gmail.com"
target="_blank">alexandre.isoard@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0 .8ex;border-left:1px
#ccc solid;padding-left:1ex">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote"><span>On Wed,
Jul 5, 2017 at 3:59 PM, Hal Finkel
via llvm-dev <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:llvm-dev@lists.llvm.org"
target="_blank">llvm-dev@lists.llvm.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex"><span><br>
On 07/04/2017 01:41 AM, Dr.-Ing.
Christoph Cullmann via llvm-dev
wrote:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex"> Hi,<br>
<br>
<blockquote
class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex"> Hi
Alexandre,<br>
<br>
LLVM currently doesn't have
trunc nsw/nuw, no.<br>
Which frontend would emit
such instructions? Any
application in mind?<br>
Just asking because if no
frontend could emit those,
then the motivation to<br>
add nsw/nuw support to trunc
would be very low I guess.<br>
</blockquote>
I think the clang frontend
could use that to allow better
static analysis of integer
overflows<br>
on the LLVM IR.<br>
<br>
It might be interesting for
static analysis tools that
want to know if you truncate
something<br>
that is too large for the
target range but you need the
sign to determine, e.g. the
C/C++ frontend<br>
could use that flag for trunc
of signed/unsigned integers,
then you could e.g. check if<br>
<br>
(uint8_t)x<br>
<br>
changes the values if x has
stuff out of the 0..255 range.<br>
<br>
e.g. x as int with -100 =>
trunc nuw to 8 => bad<br>
<br>
(int8_t)x<br>
<br>
=> trunc nsw to 8 =>
ok<br>
</blockquote>
<br>
</span> I'm not sure that a C/C++
frontend could add this flag. In
C++, the conversion for unsigned
types is specified and for signed
types, it's implementation
defined, but in neither case is it
UB.<br>
</blockquote>
<div><br>
</div>
</span>
<div>Hmm, I don't get it.</div>
<div><br>
</div>
<div>Two questions:</div>
<div>- if the conversion for unsigned
types is specified, how is it
undefined behavior?</div>
<div>- if the conversion for signed
types is UB, then this is a direct
application of those flags, isn't
it?</div>
<div>
<div
class="m_5162489970081525388m_-3311001276389849401h5">
<div><br>
</div>
<blockquote class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex"> -Hal
<div>
<div
class="m_5162489970081525388m_-3311001276389849401m_-5682808666156860653h5"><br>
<br>
<blockquote
class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex"> <br>
Greetings<br>
Christoph<br>
<br>
<blockquote
class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px
#ccc
solid;padding-left:1ex">
Thanks,<br>
Nuno<br>
<br>
-----Original
Message-----<br>
From: Alexandre Isoard
via llvm-dev<br>
Sent: Monday, July 3,
2017 8:38 PM<br>
To: llvm-dev<br>
Subject: [llvm-dev]
trunc nsw/nuw?<br>
<br>
<br>
Hello,<br>
<br>
From [1], trunc does
not seems to have a
nsw/nuw attribute.<br>
Is it possible to have
that? Or do we have that
and it is not
up-to-date?<br>
<br>
The definition would be:<br>
<br>
If the nuw keyword is
present, the result
value of the trunc is a
poison<br>
value if the truncated
high order bits are
non-zero. If the nsw
keyword is<br>
present, the result
value of the trunc is a
poison value if the
truncated<br>
high order bits are not
all equal to the
non-truncated bit of the
highest<br>
order.<br>
<br>
This allow to cancel
out:<br>
- sext with trunc nsw<br>
- zext with trunc nuw<br>
<br>
And probably to commute
with
add/sub/mul/lshr/ashr/shl/urem<wbr>/udiv/udiv
(with<br>
the correct flags).<br>
<br>
[1]: <a
moz-do-not-send="true"
href="http://llvm.org/docs/LangRef.html#trunc-to-instruction"
rel="noreferrer"
target="_blank">http://llvm.org/docs/LangRef.h<wbr>tml#trunc-to-instruction</a><br>
<br>
<br>
--<br>
<br>
Alexandre Isoard<br>
<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing
list<br>
<a
moz-do-not-send="true"
href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a
moz-do-not-send="true"
href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev"
rel="noreferrer"
target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</blockquote>
</blockquote>
<br>
-- <br>
</div>
</div>
Hal Finkel<br>
Lead, Compiler Technology and
Programming Languages<br>
Leadership Computing Facility<br>
Argonne National Laboratory
<div
class="m_5162489970081525388m_-3311001276389849401m_-5682808666156860653HOEnZb">
<div
class="m_5162489970081525388m_-3311001276389849401m_-5682808666156860653h5"><br>
<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a moz-do-not-send="true"
href="mailto:llvm-dev@lists.llvm.org"
target="_blank">llvm-dev@lists.llvm.org</a><br>
<a moz-do-not-send="true"
href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev"
rel="noreferrer"
target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</div>
</div>
</blockquote>
</div>
</div>
</div>
<span
class="m_5162489970081525388m_-3311001276389849401HOEnZb"><font
color="#888888"><br>
<br clear="all">
<div><br>
</div>
-- <br>
<div
class="m_5162489970081525388m_-3311001276389849401m_-5682808666156860653gmail_signature"
data-smartmail="gmail_signature">
<div dir="ltr"><b>Alexandre Isoard</b><br>
</div>
</div>
</font></span></div>
</div>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
<div
class="m_5162489970081525388m_-3311001276389849401gmail_signature"
data-smartmail="gmail_signature">
<div dir="ltr"><b>Alexandre Isoard</b><br>
</div>
</div>
</div>
</blockquote>
<br>
<pre class="m_5162489970081525388m_-3311001276389849401moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
</div>
</div>
</div>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
<div class="m_5162489970081525388gmail_signature"
data-smartmail="gmail_signature">
<div dir="ltr"><b>Alexandre Isoard</b><br>
</div>
</div>
</div>
</div>
</blockquote>
<br>
<pre class="moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
</body>
</html>