[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-dev
Subject:    Re: [cfe-dev] [PROPOSAL] Reintroduce guards for Intel intrinsic headers
From:       Chandler Carruth <chandlerc () google ! com>
Date:       2015-08-03 0:09:37
Message-ID: CAGCO0Kh05o0zy-S_dW54xTYtAhB_rdyG9k8FNGGH=yyrobU4vQ () mail ! gmail ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


Would cherrypicking the diagnostics to the 3.7 branch be better or worse?
(I'm of two minds, curious what others think...)

On Sun, Aug 2, 2015 at 12:00 PM Justin Bogner <mail@justinbogner.com> wrote:

> Eric Christopher <echristo@gmail.com> writes:
> > On Thu, Jul 30, 2015 at 10:12 AM Reid Kleckner <rnk@google.com> wrote:
> >
> >     I'm opposed to this. Going forward, I would really like target
> intrinsics
> >     to be available regardless of the current feature set, so users
> don't need
> >     hacks like these.
> >
> > Agreed.
> >
> >
> >     I see two ways to do this with different tradeoffs:
> >     1. Diagnose missing target attributes when calling the intel
> intrinsics. I
> >     was surprised to find that we don't already do this.
> >
> > Sorry. This is on my list of things to do.
>
> +hans
>
> I agree with the direction of moving to use target attributes instead of
> relying on flaky ifdefs, but without any errors or warnings here this is
> a pretty serious diagnostic regression.
>
> I think we should revert this on the 3.7 branch. It can stay as is on
> trunk assuming the diagnostics are coming soon.
>
> Right now we end up in spaces where we get crashes in the backend
> instead of a sensible error in far too many situations. Notably:
>
>   https://llvm.org/bugs/show_bug.cgi?id=24125
>   https://llvm.org/bugs/show_bug.cgi?id=24087
>   https://llvm.org/bugs/show_bug.cgi?id=24335
>
> Additionally, I'm told this causes issues with configure scripts
> misdetecting available features, as well as strange compatibility issues
> like the one that led to this thread.
>
> This feature is woefully incomplete. We need the warnings/errors for it
> to be acceptable quality.
>
> >
> >     2. We could support some automatic transfer of the target attribute
> to the
> >     caller when calling these intrinsics, but I worry that this is too
> >     confusing.
> >
> > We could, but it's probably better to leave it as is.
> >
> > -eric
> >
> >
> >     Implicitly setting a target attribute may block inlining that the
> user
> >     expected to happen, for example. Alternatively, there may be a
> dynamic
> >     cpuid check in the same function between SSE2 and AVX variants of
> the same
> >     algorithm, and now the SSE2 loop will unexpectedly use AVX
> instructions.
> >
> >     So we should probably settle with telling the user to add -msseNN or
> >     __atribute__((target(("sseNN")))).
> >
> >     On Thu, Jul 30, 2015 at 8:53 AM, Vedant Kumar <vsk@apple.com> wrote:
> >
> >         I've run into some code which no longer compiles because of two
> recent
> >         changes:
> >
> >           41885d3 Update the intel intrinsic headers to use the target
> >         attribute support.
> >           695aff1 Use a define for per-file function attributes for the
> Intel
> >         intrinsic headers.
> >
> >         Specifically, one project defines its own SSE4.1 emulation
> routines
> >         when the real intrinsics aren't available. This is a problem
> because
> >         they've reused the names of the intrinsics. E.g;
> >
> >         > #ifndef __SSE4_1__
> >         > #define _mm_extract_epi8(a_, ndx) ({ ... })
> >         > static inline __m128i _mm_blendv_epi8(__m128i a, __m128i b,
> __m128i
> >         mask) { ... }
> >         > ...
> >         > #endif
> >
> >         SSE4.1 intrinsics now leak into the project when it's being
> compiled
> >         for targets without SSE4.1 support. Compilation fails with
> "error:
> >         redefinition ...".
> >
> >         When these changes were initially being discussed, I think our
> stance
> >         was that we shouldn't support code like this [1]. However, we
> should
> >         reconsider for the sake of avoiding breakage. AFAICT, we would
> need to
> >         revert just two types of changes:
> >
> >         In lib/Headers/__wmmintrin_aes.h:
> >
> >         > -#if defined (__SSE4_2__) || defined (__SSE4_1__)
> >         >  #include <smmintrin.h>
> >         > -#endif
> >
> >         In lib/Headers/smmintrin.h:
> >
> >         > -#ifndef __SSE4_1__
> >         > -#error "SSE4.1 instruction set not enabled"
> >         > -#else
> >
> >         I don't see any downsides to reintroducing these guards. If
> everyone's
> >         OK with this, I can mail a patch in. The alternative is to have
> >         clients rewrite their emulation layers like this:
> >
> >         > #ifdef __SSE4_1__
> >         > #define compat_mm_extract_epi8 _mm_extract_epi8
> >         > static inline __m128i combat_mm_blendv_epi8(__m128i a, __m128i
> b,
> >         __m128i mask) __attribute__((__target__(("sse4.1")))) {
> >         >   return _mm_blendv_epi8(a, b, mask);
> >         > }
> >         > ...
> >         > #else /* OK, no native SSE 4.1. Define our own. */
> >         > #define compat_mm_extract_epi8(a_, ndx) ({ ... })
> >         > static inline __m128i compat_mm_blendv_epi8(__m128i a, __m128i
> b,
> >         __m128i mask) { ... }
> >         > ...
> >         > #endif
> >
> >         ... and then replace all calls to intrinsics with calls to the
> new
> >         compatibility routines. This seems like a lot of tedious work,
> and I'd
> >         love to help people avoid it :).
> >
> >         Let me know what you think!
> >
> >         vedant
> >
> >         [1] http://lists.cs.uiuc.edu/pipermail/cfe-commits/
> >         Week-of-Mon-20150615/131192.html
> >         _______________________________________________
> >         cfe-dev mailing list
> >         cfe-dev@cs.uiuc.edu
> >         http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> >
> > _______________________________________________
> > cfe-dev mailing list
> > cfe-dev@cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>

[Attachment #5 (text/html)]

<div dir="ltr">Would cherrypicking the diagnostics to the 3.7 branch be better or \
worse? (I&#39;m of two minds, curious what others think...)</div><br><div \
class="gmail_quote"><div dir="ltr">On Sun, Aug 2, 2015 at 12:00 PM Justin Bogner \
&lt;<a href="mailto:mail@justinbogner.com">mail@justinbogner.com</a>&gt; \
wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 \
.8ex;border-left:1px #ccc solid;padding-left:1ex">Eric Christopher &lt;<a \
href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>&gt; \
writes:<br> &gt; On Thu, Jul 30, 2015 at 10:12 AM Reid Kleckner &lt;<a \
href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>&gt; wrote:<br> \
&gt;<br> &gt;        I&#39;m opposed to this. Going forward, I would really like \
target intrinsics<br> &gt;        to be available regardless of the current feature \
set, so users don&#39;t need<br> &gt;        hacks like these.<br>
&gt;<br>
&gt; Agreed.<br>
&gt;   <br>
&gt;<br>
&gt;        I see two ways to do this with different tradeoffs:<br>
&gt;        1. Diagnose missing target attributes when calling the intel intrinsics. \
I<br> &gt;        was surprised to find that we don&#39;t already do this.<br>
&gt;<br>
&gt; Sorry. This is on my list of things to do.<br>
<br>
+hans<br>
<br>
I agree with the direction of moving to use target attributes instead of<br>
relying on flaky ifdefs, but without any errors or warnings here this is<br>
a pretty serious diagnostic regression.<br>
<br>
I think we should revert this on the 3.7 branch. It can stay as is on<br>
trunk assuming the diagnostics are coming soon.<br>
<br>
Right now we end up in spaces where we get crashes in the backend<br>
instead of a sensible error in far too many situations. Notably:<br>
<br>
   <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__llvm.org_bugs_show-5F \
bug.cgi-3Fid-3D24125&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=CnzuN65ENJ1H9py9XLiRvC_UQz6u3 \
oG6GUNn7_wosSM&m=T50aKmHlKd-2VBLkqXn8bj9cBDDvXi8KMg47JVUgr3o&s=V0Z7H78AiGq9xeEwv43qYlLTezhhokQzXZvEeN5UDD4&e=" \
rel="noreferrer" target="_blank">https://llvm.org/bugs/show_bug.cgi?id=24125</a><br>  \
<a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__llvm.org_bugs_show-5Fbug \
.cgi-3Fid-3D24087&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=CnzuN65ENJ1H9py9XLiRvC_UQz6u3oG6 \
GUNn7_wosSM&m=T50aKmHlKd-2VBLkqXn8bj9cBDDvXi8KMg47JVUgr3o&s=YqV4s4yP152Q-H7Lx5AoaDl7EiGTL2Vb7FpGTZctERA&e=" \
rel="noreferrer" target="_blank">https://llvm.org/bugs/show_bug.cgi?id=24087</a><br>  \
<a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__llvm.org_bugs_show-5Fbug \
.cgi-3Fid-3D24335&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=CnzuN65ENJ1H9py9XLiRvC_UQz6u3oG6 \
GUNn7_wosSM&m=T50aKmHlKd-2VBLkqXn8bj9cBDDvXi8KMg47JVUgr3o&s=kQXP_hoA1Z0_y3QHzdtIGgL4AcrVhrljYhoznPVqvK8&e=" \
rel="noreferrer" target="_blank">https://llvm.org/bugs/show_bug.cgi?id=24335</a><br> \
<br> Additionally, I&#39;m told this causes issues with configure scripts<br>
misdetecting available features, as well as strange compatibility issues<br>
like the one that led to this thread.<br>
<br>
This feature is woefully incomplete. We need the warnings/errors for it<br>
to be acceptable quality.<br>
<br>
&gt;<br>
&gt;        2. We could support some automatic transfer of the target attribute to \
the<br> &gt;        caller when calling these intrinsics, but I worry that this is \
too<br> &gt;        confusing.<br>
&gt;<br>
&gt; We could, but it&#39;s probably better to leave it as is.<br>
&gt;<br>
&gt; -eric<br>
&gt;   <br>
&gt;<br>
&gt;        Implicitly setting a target attribute may block inlining that the \
user<br> &gt;        expected to happen, for example. Alternatively, there may be a \
dynamic<br> &gt;        cpuid check in the same function between SSE2 and AVX \
variants of the same<br> &gt;        algorithm, and now the SSE2 loop will \
unexpectedly use AVX instructions.<br> &gt;<br>
&gt;        So we should probably settle with telling the user to add -msseNN or<br>
&gt;        __atribute__((target((&quot;sseNN&quot;)))).<br>
&gt;<br>
&gt;        On Thu, Jul 30, 2015 at 8:53 AM, Vedant Kumar &lt;<a \
href="mailto:vsk@apple.com" target="_blank">vsk@apple.com</a>&gt; wrote:<br> &gt;<br>
&gt;              I&#39;ve run into some code which no longer compiles because of two \
recent<br> &gt;              changes:<br>
&gt;<br>
&gt;                 41885d3 Update the intel intrinsic headers to use the target<br>
&gt;              attribute support.<br>
&gt;                 695aff1 Use a define for per-file function attributes for the \
Intel<br> &gt;              intrinsic headers.<br>
&gt;<br>
&gt;              Specifically, one project defines its own SSE4.1 emulation \
routines<br> &gt;              when the real intrinsics aren&#39;t available. This is \
a problem because<br> &gt;              they&#39;ve reused the names of the \
intrinsics. E.g;<br> &gt;<br>
&gt;              &gt; #ifndef __SSE4_1__<br>
&gt;              &gt; #define _mm_extract_epi8(a_, ndx) ({ ... })<br>
&gt;              &gt; static inline __m128i _mm_blendv_epi8(__m128i a, __m128i b, \
__m128i<br> &gt;              mask) { ... }<br>
&gt;              &gt; ...<br>
&gt;              &gt; #endif<br>
&gt;<br>
&gt;              SSE4.1 intrinsics now leak into the project when it&#39;s being \
compiled<br> &gt;              for targets without SSE4.1 support. Compilation fails \
with &quot;error:<br> &gt;              redefinition ...&quot;.<br>
&gt;<br>
&gt;              When these changes were initially being discussed, I think our \
stance<br> &gt;              was that we shouldn&#39;t support code like this [1]. \
However, we should<br> &gt;              reconsider for the sake of avoiding \
breakage. AFAICT, we would need to<br> &gt;              revert just two types of \
changes:<br> &gt;<br>
&gt;              In lib/Headers/__wmmintrin_aes.h:<br>
&gt;<br>
&gt;              &gt; -#if defined (__SSE4_2__) || defined (__SSE4_1__)<br>
&gt;              &gt;   #include &lt;smmintrin.h&gt;<br>
&gt;              &gt; -#endif<br>
&gt;<br>
&gt;              In lib/Headers/smmintrin.h:<br>
&gt;<br>
&gt;              &gt; -#ifndef __SSE4_1__<br>
&gt;              &gt; -#error &quot;SSE4.1 instruction set not enabled&quot;<br>
&gt;              &gt; -#else<br>
&gt;<br>
&gt;              I don&#39;t see any downsides to reintroducing these guards. If \
everyone&#39;s<br> &gt;              OK with this, I can mail a patch in. The \
alternative is to have<br> &gt;              clients rewrite their emulation layers \
like this:<br> &gt;<br>
&gt;              &gt; #ifdef __SSE4_1__<br>
&gt;              &gt; #define compat_mm_extract_epi8 _mm_extract_epi8<br>
&gt;              &gt; static inline __m128i combat_mm_blendv_epi8(__m128i a, __m128i \
b,<br> &gt;              __m128i mask) \
__attribute__((__target__((&quot;sse4.1&quot;)))) {<br> &gt;              &gt;     \
return _mm_blendv_epi8(a, b, mask);<br> &gt;              &gt; }<br>
&gt;              &gt; ...<br>
&gt;              &gt; #else /* OK, no native SSE 4.1. Define our own. */<br>
&gt;              &gt; #define compat_mm_extract_epi8(a_, ndx) ({ ... })<br>
&gt;              &gt; static inline __m128i compat_mm_blendv_epi8(__m128i a, __m128i \
b,<br> &gt;              __m128i mask) { ... }<br>
&gt;              &gt; ...<br>
&gt;              &gt; #endif<br>
&gt;<br>
&gt;              ... and then replace all calls to intrinsics with calls to the \
new<br> &gt;              compatibility routines. This seems like a lot of tedious \
work, and I&#39;d<br> &gt;              love to help people avoid it :).<br>
&gt;<br>
&gt;              Let me know what you think!<br>
&gt;<br>
&gt;              vedant<br>
&gt;<br>
&gt;              [1] <a href="http://lists.cs.uiuc.edu/pipermail/cfe-commits/" \
rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/pipermail/cfe-commits/</a><br>
 &gt;              Week-of-Mon-20150615/131192.html<br>
&gt;              _______________________________________________<br>
&gt;              cfe-dev mailing list<br>
&gt;              <a href="mailto:cfe-dev@cs.uiuc.edu" \
target="_blank">cfe-dev@cs.uiuc.edu</a><br> &gt;              <a \
href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" rel="noreferrer" \
target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br> &gt;<br>
&gt; _______________________________________________<br>
&gt; cfe-dev mailing list<br>
&gt; <a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
&gt; <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" rel="noreferrer" \
target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br> <br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" rel="noreferrer" \
target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br> \
</blockquote></div>



_______________________________________________
cfe-dev mailing list
cfe-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic