• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt -S -objc-arc -objc-arc-contract < %s | FileCheck %s
2
3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4declare i8* @objc_unretainedObject(i8*)
5declare i8* @objc_retainAutoreleasedReturnValue(i8*)
6declare i8* @objc_autoreleaseReturnValue(i8*)
7declare i8* @objc_msgSend(i8*, i8*, ...)
8declare void @objc_release(i8*)
9
10; Test that the optimizer can create an objc_retainAutoreleaseReturnValue
11; declaration even if no objc_retain declaration exists.
12; rdar://9401303
13
14; CHECK:      define i8* @test0(i8* %p) {
15; CHECK-NEXT: entry:
16; CHECK-NEXT:   %0 = tail call i8* @objc_retainAutoreleaseReturnValue(i8* %p) [[NUW:#[0-9]+]]
17; CHECK-NEXT:   ret i8* %0
18; CHECK-NEXT: }
19
20define i8* @test0(i8* %p) {
21entry:
22  %call = tail call i8* @objc_unretainedObject(i8* %p)
23  %0 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind
24  %1 = tail call i8* @objc_autoreleaseReturnValue(i8* %call) nounwind
25  ret i8* %call
26}
27
28; Properly create the @objc_retain declaration when it doesn't already exist.
29; rdar://9825114
30
31; CHECK-LABEL: @test1(
32; CHECK: @objc_retain(
33; CHECK: @objc_retainAutoreleasedReturnValue(
34; CHECK: @objc_release(
35; CHECK: @objc_release(
36; CHECK: }
37define void @test1(i8* %call88) nounwind personality i32 (...)* @__gxx_personality_v0 {
38entry:
39  %tmp1 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call88) nounwind
40  %call94 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*)*)(i8* %tmp1)
41          to label %invoke.cont93 unwind label %lpad91
42
43invoke.cont93:                                    ; preds = %entry
44  %tmp2 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call94) nounwind
45  call void @objc_release(i8* %tmp1) nounwind
46  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %tmp2)
47          to label %invoke.cont102 unwind label %lpad100
48
49invoke.cont102:                                   ; preds = %invoke.cont93
50  call void @objc_release(i8* %tmp2) nounwind, !clang.imprecise_release !0
51  unreachable
52
53lpad91:                                           ; preds = %entry
54  %exn91 = landingpad {i8*, i32}
55              cleanup
56  unreachable
57
58lpad100:                                          ; preds = %invoke.cont93
59  %exn100 = landingpad {i8*, i32}
60              cleanup
61  call void @objc_release(i8* %tmp2) nounwind, !clang.imprecise_release !0
62  unreachable
63}
64
65declare i32 @__gxx_personality_v0(...)
66
67!0 = !{}
68
69; CHECK: attributes [[NUW]] = { nounwind }
70