This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/57156] miscompilation of call to _mm_cmpeq_epi8(a, a) or _mm_comtrue_epu8(a, a) with uninitialized a


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57156

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> 2013-05-03 12:27:05 UTC ---
(In reply to comment #5)
> (In reply to comment #4)
> > I wouldn't know how to counter this for the _mm_cmpeq_epi8 case
> 
> Actually, I have yet to find something in the standard that says using an
> uninitialized __m128 is undefined behavior. ;)
> Thus the only standard that would define the rules here would be Intel's, no?
> And from reading their docs I understand that calling an intrinsics maps to the
> behavior you'd get when using the associated instruction. In this case
> comparing any XMM register with itself will result in what I expect.

The standard says that using uninitialized variables invoke undefined
behavior.  That doesn't magically exclude types that are not explicitely
covered by the standard.  Doing

 int a;
 _Bool true = a == a;

is undefined as well, so is

 int a;
 int zero = a ^ a;

You cannot translate optimized assembler back to C in this way.

Well, you can.  Sth like

 register int a asm("eax");
 int zero = a ^ a;

should do it.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]