ARC injects unneeded retain/release on void function

Originator:robnapier
Number:rdar://10002493 Date Originated:22-Aug-2011 05:46 PM
Status:Behaves correctly Resolved:30-Jan-2012 03:28 PM
Product: Product Version:
Classification: Reproducible:
 
22-Aug-2011 05:46 PM Rob Napier:
'main.m' was successfully uploaded

22-Aug-2011 05:46 PM Rob Napier:
Summary:

When calling an IMP in a void context, ARC injects an extra _objc_retainAutoreleasedReturnValue and _objc_release, even though the result is thrown away. When using normal ObjC [foo bar], ARC correctly avoids this.

Steps to Reproduce:

See attached test program. Starred assembly should not be needed since the result is a void.

    for (count = 0; count < kTotalCount; ++count) {
      setStringMethod(string, selector, @"stuff");
    }

LBB0_5:                                 ## =>This Inner Loop Header: Depth=1
	cmpq	$100000000, -48(%rbp)   ## imm = 0x5F5E100
	jae	LBB0_8
## BB#6:                                ##   in Loop: Header=BB0_5 Depth=1
	leaq	L__unnamed_cfstring_(%rip), %rax
	.loc	1 35 7                  ## /Users/rnapier/src/TestIMP/TestIMP/main.m:35:7
Ltmp11:
	movq	-64(%rbp), %rcx
	movq	-24(%rbp), %rdx
	movq	-56(%rbp), %rsi
	movq	%rdx, %rdi
	movq	%rax, %rdx
	movb	$0, %al
	callq	*%rcx
*	movq	%rax, %rdi
*	callq	_objc_retainAutoreleasedReturnValue
*	movq	%rax, %rdi
*	callq	_objc_release
Ltmp12:
## BB#7:                                ##   in Loop: Header=BB0_5 Depth=1
	.loc	1 34 42                 ## /Users/rnapier/src/TestIMP/TestIMP/main.m:34:42
	movq	-48(%rbp), %rax
	addq	$1, %rax
	movq	%rax, -48(%rbp)
	jmp	LBB0_5



Expected Results:

The starred assembly should be optimized out as it is for the objc_msgSend case:

  for (count = 0; count < kTotalCount; ++count) {
    [string setString:@"stuff"];
  }

LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
	cmpq	$100000000, -48(%rbp)   ## imm = 0x5F5E100
	jae	LBB0_4
## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
	leaq	L__unnamed_cfstring_(%rip), %rax
	.loc	1 23 7                  ## /Users/rnapier/src/TestIMP/TestIMP/main.m:23:7
Ltmp8:
	movq	-24(%rbp), %rcx
	movq	L_OBJC_SELECTOR_REFERENCES_5(%rip), %rsi
	movq	%rcx, %rdi
	movq	%rax, %rdx
	callq	_objc_msgSend
Ltmp9:
## BB#3:                                ##   in Loop: Header=BB0_1 Depth=1
	.loc	1 22 42                 ## /Users/rnapier/src/TestIMP/TestIMP/main.m:22:42
	movq	-48(%rbp), %rax
	addq	$1, %rax
	movq	%rax, -48(%rbp)
	jmp	LBB0_1


Actual Results:

Regression:

Notes:

Comments


Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!