[LLVMbugs] [Bug 9971] New: wrong code in union access
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Fri May 20 13:25:16 PDT 2011
http://llvm.org/bugs/show_bug.cgi?id=9971
Summary: wrong code in union access
Product: clang
Version: trunk
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P
Component: -New Bugs
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: mattiase at acm.org
CC: llvmbugs at cs.uiuc.edu
The test case below (plain C) is miscompiled by clang when using -O2.
clang version 3.0 (trunk 131747)
Target: x86_64-unknown-linux-gnu
typedef union {
unsigned long long dword[2];
unsigned short half[8];
} vector_t;
void vrlh(vector_t *va, vector_t *vb, vector_t *vd)
{
vector_t t;
for (int i = 0; i < 8; i++) {
int sh = vb->half[7 - i] & 0xf;
t.half[7 - i] = va->half[7 - i] << sh | va->half[7 - i] >> (16 - sh);
}
vd->dword[1] = t.dword[1]; // These lines will be
vd->dword[0] = t.dword[0]; // ignored by the compiler.
}
I presume that clang should work like gcc with respects to unions (setting one
member and reading another defined in the punning way).
As you can see, the two last lines seem to have disappeared:
0000000000000000 <vrlh>:
0: ba 07 00 00 00 mov $0x7,%edx
5: 66 66 2e 0f 1f 84 00 nopw %cs:0x0(%rax,%rax,1)
c: 00 00 00 00
10: 0f b7 04 57 movzwl (%rdi,%rdx,2),%eax
14: 44 0f b7 04 56 movzwl (%rsi,%rdx,2),%r8d
19: 41 83 e0 0f and $0xf,%r8d
1d: 44 88 c1 mov %r8b,%cl
20: 41 89 c1 mov %eax,%r9d
23: 41 d3 e1 shl %cl,%r9d
26: b9 10 00 00 00 mov $0x10,%ecx
2b: 44 29 c1 sub %r8d,%ecx
2e: d3 e8 shr %cl,%eax
30: 44 09 c8 or %r9d,%eax
33: 66 89 44 54 f0 mov %ax,-0x10(%rsp,%rdx,2)
38: 48 85 d2 test %rdx,%rdx
3b: 48 8d 52 ff lea -0x1(%rdx),%rdx
3f: 75 cf jne 10 <vrlh+0x10>
41: c3 retq
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list