http://llvm.org/bugs/show_bug.cgi?id=2191
Summary: missed optimization: b &= ~a
Product: new-bugs
Version: unspecified
Platform: PC
OS/Version: Linux
Status: NEW
Severity: enhancement
Priority: P2
Component: new bugs
AssignedTo: [EMAIL PROTECTED]
ReportedBy: [EMAIL PROTECTED]
CC: [email protected]
Using llvm-gcc SVN r49213 on the simple testcase below generates code with
extra mov instructions.
unsigned sum(unsigned a, unsigned b)
{
do {
a ^= b;
b &= ~a;
} while (b <<= 1);
return a;
}
This is the assembly generated, note the extra movl, and testl after the and:
sum:
.align 16
.LBB1_1: # bb
xorl %esi, %edi
movl %edi, %eax
xorl $2147483647, %eax
andl %esi, %eax
addl %eax, %eax
testl %eax, %eax
movl %eax, %esi
jne .LBB1_1 # bb
.LBB1_2: # bb12
movl %edi, %eax
ret
.size sum, .-sum
This should be a more optimized version (maybe xor could be changed to a not,
not sure):
sum:
.align 16
.LBB1_1: # bb
xorl %esi, %edi
movl %edi, %eax
xorl $2147483647, %eax
andl %eax, %esi
addl %esi, %esi
jne .LBB1_1 # bb
.LBB1_2: # bb12
movl %edi, %eax
ret
.size sum, .-sum
FWIW, gcc doesn't generate the optimized version either, here is what I get
with gcc-4.3 -O3:
sum:
.align 16
.LBB1_1: # bb
xorl %esi, %edi
movl %edi, %eax
xorl $2147483647, %eax
andl %esi, %eax
addl %eax, %eax
testl %eax, %eax
movl %eax, %esi
jne .LBB1_1 # bb
.LBB1_2: # bb12
movl %edi, %
--
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.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs