The following code is miscompiled by clang-trunk at -O1 and above in 32-bit mode (not 64-bit mode) on x86_64-linux-gnu. $: clang-trunk -v clang version 3.8.0 (trunk 256450) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /usr/local/bin Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.3 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.2.1 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.4 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.4.7 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6.4 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7.3 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.4 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.3 Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.2.1 Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.6.3 Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.7.4 Found candidate GCC installation: /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.8.2 Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9 Candidate multilib: .;@m64 Candidate multilib: 32;@m32 Candidate multilib: x32;@mx32 Selected multilib: .;@m64 $: $: clang-trunk small.c -m32 -O3 ; ./a.out 127 $: clang-trunk small.c -m32 -O2 ; ./a.out 127 $: clang-trunk small.c -m32 -Os ; ./a.out 127 $: clang-trunk small.c -m32 -O1 ; ./a.out 1 $: clang-trunk small.c -m32 -O0 ; ./a.out 1 $: clang-trunk small.c -m64 -O3 ; ./a.out 1 $: cat small.c int printf(const char*, ...); char a, b, d; int c; int main() { int e = b++; c++; d = a++ == e; if (c) printf("%d\n", (int)b); return 0; }
This looks related to r255362. When trying to generate a SAHF sequence, computeRegisterLiveness()/analyzePhysReg() believe AX is dead because AH is killed - while AL is in fact alive and contains b. I think in analyzePhysReg() bool Covered = TRI->isSuperRegisterEq(MOReg, Reg); should be: bool Covered = TRI->isSuperRegisterEq(Reg, MOReg); but that causes other tests to fail.
Thanks for the analysis Michael, I think this is indeed the problem and I got confused by the fact that isSuperRegister(A, B) means B is a super register of A (the reverse would be a lot more intuitive IMO). Fixing this lets two of the test cases run into the FIXME in X86InstrInfo::copyPhysReg(). I'll commit a change soon and disable -verify-machineinstrs for those two tests for now.
Fixed in r256799 (and I added a lit test case based on this bug in r256801).
*** Bug 26025 has been marked as a duplicate of this bug. ***
*** Bug 26009 has been marked as a duplicate of this bug. ***