[PATCH] D29542: [TargetInfo] Adjust x86-32 atomic support to the CPU used

Dimitry Andric via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 6 11:51:58 PST 2017


dim added a comment.

There's still something strange here.  If I compile the following on i386-freebsd12, with `clang -march=i486 -O2 -S`:

  _Atomic(long long) ll;
  
  void f(void)
  {
    ++ll;
  }

the result is:

  	.globl	f
  	.p2align	4, 0x90
  	.type	f, at function
  f:                                      # @f
  # BB#0:                                 # %entry
  	pushl	%ebp
  	movl	%esp, %ebp
  	pushl	%ebx
  	movl	ll+4, %edx
  	movl	ll, %eax
  	.p2align	4, 0x90
  .LBB0_1:                                # %atomicrmw.start
                                          # =>This Inner Loop Header: Depth=1
  	movl	%eax, %ebx
  	addl	$1, %ebx
  	movl	%edx, %ecx
  	adcl	$0, %ecx
  	lock		cmpxchg8b	ll
  	jne	.LBB0_1
  # BB#2:                                 # %atomicrmw.end
  	popl	%ebx
  	popl	%ebp
  	retl
  .Lfunc_end0:
  	.size	f, .Lfunc_end0-f
  
  	.type	ll, at object              # @ll
  	.comm	ll,8,4

So what gives?  It's still inserting a `cmpxchg8b`!  AFAIK it should now insert a call to `__atomic_fetch_add_8` instead.

Note that this changes if you use C++ atomics, e.g.:

  #include <atomic>
  
  void f(std::atomic<long long>& x)
  {
    ++x;
  }

compiles to:

  	.globl	_Z1fRNSt3__16atomicIxEE
  	.p2align	4, 0x90
  	.type	_Z1fRNSt3__16atomicIxEE, at function
  _Z1fRNSt3__16atomicIxEE:                # @_Z1fRNSt3__16atomicIxEE
  .Lfunc_begin0:
  	.cfi_sections .debug_frame
  	.cfi_startproc
  	.cfi_personality 0, __gxx_personality_v0
  	.cfi_lsda 0, .Lexception0
  # BB#0:                                 # %entry
  	pushl	%ebp
  	movl	%esp, %ebp
  	subl	$16, %esp
  	movl	8(%ebp), %eax
  .Ltmp0:
  	movl	%eax, (%esp)
  	movl	$5, 12(%esp)
  	movl	$0, 8(%esp)
  	movl	$1, 4(%esp)
  	calll	__atomic_fetch_add_8
  .Ltmp1:
  # BB#1:                                 # %_ZNSt3__113__atomic_baseIxLb1EEppEv.exit
  	addl	$16, %esp
  	popl	%ebp
  	retl
  .LBB0_2:                                # %lpad.i.i
  .Ltmp2:
  	movl	%eax, (%esp)
  	calll	__cxa_call_unexpected
  	subl	$4, %esp
  .Lfunc_end0:
  	.size	_Z1fRNSt3__16atomicIxEE, .Lfunc_end0-_Z1fRNSt3__16atomicIxEE
  	.cfi_endproc


https://reviews.llvm.org/D29542





More information about the cfe-commits mailing list