There are some situations where an __undefined__ keyword would be useful,
especially w.r.t. vector intrinsics. Here is an example that came up recently.
<a bunch of 4 wide vector computation>
t1 = _mm_movehl_ps(t0, t0);
t2 = _mm_add_ps(t1, t0);
_mm_storel_pi(mem, t2);
In this example, the programmer doesn't care about the upper elements of the
result of the _mm_movehl_ps intrinsic. They are never used. The only purpose
of the first argument to _mm_movehl_ps is to produce these values that are
never used. But the programmer has to pass *something* as that first argument.
And in this case, the choice of t0 causes the compiler to insert an extra
copy. Ideally, the programmer would like to write this:
<a bunch of 4 wide vector computation>
t1 = _mm_movehl_ps(__undefined__, t0);
t2 = _mm_add_ps(t1, t0);
_mm_storel_pi(mem, t2);
For the Intel Compiler, we are adding new intrinsics to solve this problem,
e.g. __m128 _mm_undefined_ps(). A keyword would be a nice alternative if we
could find a convenient syntax.
Dave Kreitzer
IA32/Intel64 Code Generation
Intel Compiler Lab
-----Original Message-----
From: Mark Mitchell [mailto:[email protected]]
Sent: Friday, August 20, 2010 7:33 PM
To: H.J. Lu
Cc: Bernd Schmidt; Ian Lance Taylor; GCC Development; Kreitzer, David L;
Girkar, Milind
Subject: Re: Add uninitialized attribute?
H.J. Lu wrote:
> void *undef __attribute__ ((uninitialized)); // Or something similar
>
> foo (undef);
>
> Compiler can pass some junk to foo.
I don't think that's a very good idea. If we need this, which I doubt,
it should be something like a new __undefined__ keyword, that expands to
an undefined value. In C++, a syntax like __undefined__<X>() would be
plausible; I'm not sure there's a good C syntax. Perhaps you could do
what tgmath does.
I guess if you had this, you could use it in place of the attribute;
int i = __undefined__<int>();
would serve to indicate that you were knowingly not initializing i.
--
Mark Mitchell
CodeSourcery
[email protected]
(650) 331-3385 x713