Home | History | Annotate | Download | only in ObjCARC
      1 ; This file consists of various tests which ensure that the objc-arc-annotations
      2 ; are working correctly. In the future, I will use this in other lit tests to
      3 ; check the data flow analysis of ARC.
      4 
      5 ; REQUIRES: asserts
      6 ; RUN: opt -S -objc-arc -enable-objc-arc-annotations < %s | FileCheck %s
      7 
      8 declare i8* @objc_retain(i8*)
      9 declare i8* @objc_retainAutoreleasedReturnValue(i8*)
     10 declare void @objc_release(i8*)
     11 declare i8* @objc_autorelease(i8*)
     12 declare i8* @objc_autoreleaseReturnValue(i8*)
     13 declare void @objc_autoreleasePoolPop(i8*)
     14 declare i8* @objc_autoreleasePoolPush()
     15 declare i8* @objc_retainBlock(i8*)
     16 
     17 declare i8* @objc_retainedObject(i8*)
     18 declare i8* @objc_unretainedObject(i8*)
     19 declare i8* @objc_unretainedPointer(i8*)
     20 
     21 declare void @use_pointer(i8*)
     22 declare void @callee()
     23 declare void @callee_fnptr(void ()*)
     24 declare void @invokee()
     25 declare i8* @returner()
     26 
     27 ; Simple retain+release pair deletion, with some intervening control
     28 ; flow and harmless instructions.
     29 
     30 ; CHECK-LABEL: define void @test0(
     31 ; CHECK: entry:
     32 ; CHECK:   call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_None)
     33 ; CHECK:   %0 = tail call i8* @objc_retain(i8* %a) #0, !llvm.arc.annotation.bottomup ![[ANN0:[0-9]+]], !llvm.arc.annotation.topdown ![[ANN1:[0-9]+]]
     34 ; CHECK:   call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Use)
     35 ; CHECK:   call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain)
     36 ; CHECK: t:
     37 ; CHECK:   call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain)
     38 ; CHECK:   call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use)
     39 ; CHECK:   store float 2.000000e+00, float* %b, !llvm.arc.annotation.bottomup ![[ANN2:[0-9]+]]
     40 ; CHECK:   call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release)
     41 ; CHECK:   call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain)
     42 ; CHECK: f:
     43 ; CHECK:   call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain)
     44 ; CHECK:   call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Use)
     45 ; CHECK:   store i32 7, i32* %x, !llvm.arc.annotation.bottomup ![[ANN2]]
     46 ; CHECK:   call void @llvm.arc.annotation.bottomup.bbend(i8** @x, i8** @S_Release)
     47 ; CHECK:   call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_Retain)
     48 ; CHECK: return:
     49 ; CHECK:   call void @llvm.arc.annotation.topdown.bbstart(i8** @x, i8** @S_Retain)
     50 ; CHECK:   call void @llvm.arc.annotation.bottomup.bbstart(i8** @x, i8** @S_Release)
     51 ; CHECK:   call void @objc_release(i8* %c) #0, !llvm.arc.annotation.bottomup ![[ANN3:[0-9]+]], !llvm.arc.annotation.topdown ![[ANN4:[0-9]+]]
     52 ; CHECK:   call void @llvm.arc.annotation.topdown.bbend(i8** @x, i8** @S_None)
     53 ; CHECK: }
     54 define void @test0(i32* %x, i1 %p) nounwind {
     55 entry:
     56   %a = bitcast i32* %x to i8*
     57   %0 = call i8* @objc_retain(i8* %a) nounwind
     58   br i1 %p, label %t, label %f
     59 
     60 t:
     61   store i8 3, i8* %a
     62   %b = bitcast i32* %x to float*
     63   store float 2.0, float* %b
     64   br label %return
     65 
     66 f:
     67   store i32 7, i32* %x
     68   br label %return
     69 
     70 return:
     71   %c = bitcast i32* %x to i8*
     72   call void @objc_release(i8* %c) nounwind
     73   ret void
     74 }
     75 
     76 !0 = metadata !{}
     77 
     78 ; CHECK: ![[ANN0]] = metadata !{metadata !"(test0,%x)", metadata !"S_Use", metadata !"S_None"}
     79 ; CHECK: ![[ANN1]] = metadata !{metadata !"(test0,%x)", metadata !"S_None", metadata !"S_Retain"}
     80 ; CHECK: ![[ANN2]] = metadata !{metadata !"(test0,%x)", metadata !"S_Release", metadata !"S_Use"}
     81 ; CHECK: ![[ANN3]] = metadata !{metadata !"(test0,%x)", metadata !"S_None", metadata !"S_Release"}
     82 ; CHECK: ![[ANN4]] = metadata !{metadata !"(test0,%x)", metadata !"S_Retain", metadata !"S_None"}
     83 
     84