[llvm-bugs] [Bug 30621] New: Code generation for __atomic_and_fetch() contains duplicates
via llvm-bugs
llvm-bugs at lists.llvm.org
Wed Oct 5 19:16:58 PDT 2016
https://llvm.org/bugs/show_bug.cgi?id=30621
Bug ID: 30621
Summary: Code generation for __atomic_and_fetch() contains
duplicates
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Common Code Generator Code
Assignee: unassignedbugs at nondot.org
Reporter: Yunzhong_Gao at playstation.sony.com
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
I was testing with trunk r283366.
Here is the test program (atomic.c)
short test(short *ptr, short val, int model) {
return __atomic_and_fetch(ptr, val, model);
}
=========================================
Here is the code generated by GCC 4.8.4
test:
movzwl (%rdi), %eax
movzwl %si, %esi
.L2:
movl %eax, %edx
andl %esi, %edx
lock cmpxchgw %dx, (%rdi)
jne .L2
movl %edx, %eax
ret
=========================================
Here is the code generated by clang:
test: # @test
decl %edx
cmpl $4, %edx
ja .LBB0_2
jmpq *.LJTI0_0(,%rdx,8)
.LBB0_4: # %acquire
movw (%rdi), %ax
.p2align 4, 0x90
.LBB0_5: # %atomicrmw.start6
# =>This Inner Loop Header: Depth=1
movl %eax, %ecx
andl %esi, %ecx
# kill: %AX<def> %AX<kill> %EAX<kill>
lock cmpxchgw %cx, (%rdi)
# kill: %AX<def> %AX<kill> %EAX<def>
jne .LBB0_5
jmp .LBB0_12
.LBB0_2: # %monotonic
movw (%rdi), %ax
.p2align 4, 0x90
.LBB0_3: # %atomicrmw.start
# =>This Inner Loop Header: Depth=1
movl %eax, %ecx
andl %esi, %ecx
# kill: %AX<def> %AX<kill> %EAX<kill>
lock cmpxchgw %cx, (%rdi)
# kill: %AX<def> %AX<kill> %EAX<def>
jne .LBB0_3
jmp .LBB0_12
.LBB0_6: # %release
movw (%rdi), %ax
.p2align 4, 0x90
.LBB0_7: # %atomicrmw.start12
# =>This Inner Loop Header: Depth=1
movl %eax, %ecx
andl %esi, %ecx
# kill: %AX<def> %AX<kill> %EAX<kill>
lock cmpxchgw %cx, (%rdi)
# kill: %AX<def> %AX<kill> %EAX<def>
jne .LBB0_7
jmp .LBB0_12
.LBB0_8: # %acqrel
movw (%rdi), %ax
.p2align 4, 0x90
.LBB0_9: # %atomicrmw.start18
# =>This Inner Loop Header: Depth=1
movl %eax, %ecx
andl %esi, %ecx
# kill: %AX<def> %AX<kill> %EAX<kill>
lock cmpxchgw %cx, (%rdi)
# kill: %AX<def> %AX<kill> %EAX<def>
jne .LBB0_9
jmp .LBB0_12
.LBB0_10: # %seqcst
movw (%rdi), %ax
.p2align 4, 0x90
.LBB0_11: # %atomicrmw.start24
# =>This Inner Loop Header: Depth=1
movl %eax, %ecx
andl %esi, %ecx
# kill: %AX<def> %AX<kill> %EAX<kill>
lock cmpxchgw %cx, (%rdi)
# kill: %AX<def> %AX<kill> %EAX<def>
jne .LBB0_11
.LBB0_12: # %atomic.continue
andl %esi, %eax
retq
It looks to me that many of these loop bodies are identical and can
be merged? For example, the .LBB0_5 block, the .LBB0_3 block, the
.LBB0_7 block, the .LBB0_9 block and the .LBB0_11 block.
Using a size optimization switch like -Os or -Oz does not seem to help.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20161006/92d10d6e/attachment-0001.html>
More information about the llvm-bugs
mailing list