[llvm] 01e4f41 - ObjCARC: Update tests to use opaque pointers

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 12 19:46:47 PST 2022


Author: Matt Arsenault
Date: 2022-12-12T22:46:26-05:00
New Revision: 01e4f41b43b57dee751146fde9992c660bd7c714

URL: https://github.com/llvm/llvm-project/commit/01e4f41b43b57dee751146fde9992c660bd7c714
DIFF: https://github.com/llvm/llvm-project/commit/01e4f41b43b57dee751146fde9992c660bd7c714.diff

LOG: ObjCARC: Update tests to use opaque pointers

escape.ll needed a simple manual check line update.

contract-storestrong.ll:test12 is kind of contrived now. The comment
says it's for testing bitcasts of pointers, which don't really matter
anymore. Leaves identity ptr to ptr bitcasts (which I thought were
illegal).

Added: 
    

Modified: 
    llvm/test/Transforms/ObjCARC/allocas.ll
    llvm/test/Transforms/ObjCARC/apelim.ll
    llvm/test/Transforms/ObjCARC/basic.ll
    llvm/test/Transforms/ObjCARC/cfg-hazards.ll
    llvm/test/Transforms/ObjCARC/clang-arc-use-barrier.ll
    llvm/test/Transforms/ObjCARC/code-motion.ll
    llvm/test/Transforms/ObjCARC/comdat-ipo.ll
    llvm/test/Transforms/ObjCARC/contract-attached-call-no-marker.ll
    llvm/test/Transforms/ObjCARC/contract-catchswitch.ll
    llvm/test/Transforms/ObjCARC/contract-end-of-use-list.ll
    llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll
    llvm/test/Transforms/ObjCARC/contract-marker.ll
    llvm/test/Transforms/ObjCARC/contract-replace-arg-use.ll
    llvm/test/Transforms/ObjCARC/contract-rv-attr.ll
    llvm/test/Transforms/ObjCARC/contract-storestrong-funclet.ll
    llvm/test/Transforms/ObjCARC/contract-storestrong-ivar.ll
    llvm/test/Transforms/ObjCARC/contract-storestrong.ll
    llvm/test/Transforms/ObjCARC/contract-testcases.ll
    llvm/test/Transforms/ObjCARC/contract.ll
    llvm/test/Transforms/ObjCARC/empty-block.ll
    llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll
    llvm/test/Transforms/ObjCARC/escape.ll
    llvm/test/Transforms/ObjCARC/expand.ll
    llvm/test/Transforms/ObjCARC/funclet.ll
    llvm/test/Transforms/ObjCARC/gvn.ll
    llvm/test/Transforms/ObjCARC/inert-global.ll
    llvm/test/Transforms/ObjCARC/inlined-autorelease-return-value.ll
    llvm/test/Transforms/ObjCARC/intrinsic-use-isolated.ll
    llvm/test/Transforms/ObjCARC/intrinsic-use.ll
    llvm/test/Transforms/ObjCARC/invoke-2.ll
    llvm/test/Transforms/ObjCARC/invoke.ll
    llvm/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll
    llvm/test/Transforms/ObjCARC/move-and-merge-autorelease.ll
    llvm/test/Transforms/ObjCARC/nested.ll
    llvm/test/Transforms/ObjCARC/opt-catchswitch.ll
    llvm/test/Transforms/ObjCARC/opt-max-ptr-states.ll
    llvm/test/Transforms/ObjCARC/path-overflow.ll
    llvm/test/Transforms/ObjCARC/pointer-types.ll
    llvm/test/Transforms/ObjCARC/post-inlining.ll
    llvm/test/Transforms/ObjCARC/pr12270.ll
    llvm/test/Transforms/ObjCARC/provenance.ll
    llvm/test/Transforms/ObjCARC/related-check.ll
    llvm/test/Transforms/ObjCARC/retain-block-side-effects.ll
    llvm/test/Transforms/ObjCARC/retain-not-declared.ll
    llvm/test/Transforms/ObjCARC/rle-s2l.ll
    llvm/test/Transforms/ObjCARC/rv.ll
    llvm/test/Transforms/ObjCARC/split-backedge.ll
    llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
    llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll
    llvm/test/Transforms/ObjCARC/weak-contract.ll
    llvm/test/Transforms/ObjCARC/weak-copies.ll
    llvm/test/Transforms/ObjCARC/weak-dce.ll
    llvm/test/Transforms/ObjCARC/weak.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/ObjCARC/allocas.ll b/llvm/test/Transforms/ObjCARC/allocas.ll
index 7399bfd89484..be829882ae37 100644
--- a/llvm/test/Transforms/ObjCARC/allocas.ll
+++ b/llvm/test/Transforms/ObjCARC/allocas.ll
@@ -1,31 +1,31 @@
 ; RUN: opt -passes=objc-arc -S < %s | FileCheck %s
 
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare void @llvm.objc.autoreleasePoolPop(i8*)
-declare i8* @llvm.objc.autoreleasePoolPush()
-declare i8* @llvm.objc.retainBlock(i8*)
-
-declare i8* @objc_retainedObject(i8*)
-declare i8* @objc_unretainedObject(i8*)
-declare i8* @objc_unretainedPointer(i8*)
-
-declare void @use_pointer(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare void @llvm.objc.release(ptr)
+declare ptr @llvm.objc.autorelease(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare void @llvm.objc.autoreleasePoolPop(ptr)
+declare ptr @llvm.objc.autoreleasePoolPush()
+declare ptr @llvm.objc.retainBlock(ptr)
+
+declare ptr @objc_retainedObject(ptr)
+declare ptr @objc_unretainedObject(ptr)
+declare ptr @objc_unretainedPointer(ptr)
+
+declare void @use_pointer(ptr)
 declare void @callee()
-declare void @callee_fnptr(void ()*)
+declare void @callee_fnptr(ptr)
 declare void @invokee()
-declare i8* @returner()
-declare i8* @returner1()
-declare i8* @returner2()
-declare void @bar(i32 ()*)
-declare void @use_alloca(i8**)
+declare ptr @returner()
+declare ptr @returner1()
+declare ptr @returner2()
+declare void @bar(ptr)
+declare void @use_alloca(ptr)
 
 declare void @llvm.dbg.value(metadata, metadata, metadata)
 
-declare i8* @objc_msgSend(i8*, i8*, ...)
+declare ptr @objc_msgSend(ptr, ptr, ...)
 
 
 ; In the presence of allocas, unconditionally remove retain/release pairs only
@@ -43,159 +43,157 @@ declare i8* @objc_msgSend(i8*, i8*, ...)
 ;
 ; rdar://13750319
 
-; CHECK: define void @test1a(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test1a(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test1a(i8* %x) {
+define void @test1a(ptr %x) {
 entry:
-  %A = alloca i8*
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  store i8* %x, i8** %A, align 8
-  %y = load i8*, i8** %A
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  %A = alloca ptr
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  store ptr %x, ptr %A, align 8
+  %y = load ptr, ptr %A
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
-; CHECK: define void @test1b(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test1b(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test1b(i8* %x) {
+define void @test1b(ptr %x) {
 entry:
-  %A = alloca i8*
-  %gep = getelementptr i8*, i8** %A, i32 0
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  store i8* %x, i8** %gep, align 8
-  %y = load i8*, i8** %A
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  %A = alloca ptr
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  store ptr %x, ptr %A, align 8
+  %y = load ptr, ptr %A
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
 
-; CHECK: define void @test1c(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test1c(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test1c(i8* %x) {
+define void @test1c(ptr %x) {
 entry:
-  %A = alloca i8*, i32 3
-  %gep = getelementptr i8*, i8** %A, i32 2
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  store i8* %x, i8** %gep, align 8
-  %y = load i8*, i8** %gep
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  %A = alloca ptr, i32 3
+  %gep = getelementptr ptr, ptr %A, i32 2
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  store ptr %x, ptr %gep, align 8
+  %y = load ptr, ptr %gep
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
 
-; CHECK: define void @test1d(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test1d(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test1d(i8* %x) {
+define void @test1d(ptr %x) {
 entry:
   br i1 undef, label %use_allocaA, label %use_allocaB
 
 use_allocaA:
-  %allocaA = alloca i8*
+  %allocaA = alloca ptr
   br label %exit
 
 use_allocaB:
-  %allocaB = alloca i8*
+  %allocaB = alloca ptr
   br label %exit
 
 exit:
-  %A = phi i8** [ %allocaA, %use_allocaA ], [ %allocaB, %use_allocaB ]
-  %gep = getelementptr i8*, i8** %A, i32 0
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  store i8* %x, i8** %gep, align 8
-  %y = load i8*, i8** %gep
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  %A = phi ptr [ %allocaA, %use_allocaA ], [ %allocaB, %use_allocaB ]
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  store ptr %x, ptr %A, align 8
+  %y = load ptr, ptr %A
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
-; CHECK: define void @test1e(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test1e(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test1e(i8* %x) {
+define void @test1e(ptr %x) {
 entry:
   br i1 undef, label %use_allocaA, label %use_allocaB
 
 use_allocaA:
-  %allocaA = alloca i8*, i32 4
+  %allocaA = alloca ptr, i32 4
   br label %exit
 
 use_allocaB:
-  %allocaB = alloca i8*, i32 4
+  %allocaB = alloca ptr, i32 4
   br label %exit
 
 exit:
-  %A = phi i8** [ %allocaA, %use_allocaA ], [ %allocaB, %use_allocaB ]
-  %gep = getelementptr i8*, i8** %A, i32 2
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  store i8* %x, i8** %gep, align 8
-  %y = load i8*, i8** %gep
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  %A = phi ptr [ %allocaA, %use_allocaA ], [ %allocaB, %use_allocaB ]
+  %gep = getelementptr ptr, ptr %A, i32 2
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  store ptr %x, ptr %gep, align 8
+  %y = load ptr, ptr %gep
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
-; CHECK: define void @test1f(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test1f(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test1f(i8* %x) {
+define void @test1f(ptr %x) {
 entry:
-  %allocaOne = alloca i8*
-  %allocaTwo = alloca i8*
-  %A = select i1 undef, i8** %allocaOne, i8** %allocaTwo
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  store i8* %x, i8** %A, align 8
-  %y = load i8*, i8** %A
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  %allocaOne = alloca ptr
+  %allocaTwo = alloca ptr
+  %A = select i1 undef, ptr %allocaOne, ptr %allocaTwo
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  store ptr %x, ptr %A, align 8
+  %y = load ptr, ptr %A
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
@@ -203,18 +201,18 @@ entry:
 ; conservatively.
 
 
-; CHECK: define void @test2a(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test2a(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test2a(i8* %x) {
+define void @test2a(ptr %x) {
 entry:
-  %A = alloca i8*
-  store i8* %x, i8** %A, align 8
-  %y = load i8*, i8** %A
+  %A = alloca ptr
+  store ptr %x, ptr %A, align 8
+  %y = load ptr, ptr %A
   br label %bb1
 
 bb1:
@@ -224,29 +222,27 @@ bb2:
   br label %bb3
 
 bb3:
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
-; CHECK: define void @test2b(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test2b(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test2b(i8* %x) {
+define void @test2b(ptr %x) {
 entry:
-  %A = alloca i8*
-  %gep1 = getelementptr i8*, i8** %A, i32 0
-  store i8* %x, i8** %gep1, align 8
-  %gep2 = getelementptr i8*, i8** %A, i32 0
-  %y = load i8*, i8** %gep2
+  %A = alloca ptr
+  store ptr %x, ptr %A, align 8
+  %y = load ptr, ptr %A
   br label %bb1
 
 bb1:
@@ -256,30 +252,30 @@ bb2:
   br label %bb3
 
 bb3:
-  tail call i8* @llvm.objc.retain(i8* %x)
-  tail call i8* @llvm.objc.retain(i8* %x)
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  tail call ptr @llvm.objc.retain(ptr %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
-; CHECK: define void @test2c(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test2c(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test2c(i8* %x) {
+define void @test2c(ptr %x) {
 entry:
-  %A = alloca i8*, i32 3
-  %gep1 = getelementptr i8*, i8** %A, i32 2
-  store i8* %x, i8** %gep1, align 8
-  %gep2 = getelementptr i8*, i8** %A, i32 2
-  %y = load i8*, i8** %gep2
-  tail call i8* @llvm.objc.retain(i8* %x)
+  %A = alloca ptr, i32 3
+  %gep1 = getelementptr ptr, ptr %A, i32 2
+  store ptr %x, ptr %gep1, align 8
+  %gep2 = getelementptr ptr, ptr %A, i32 2
+  %y = load ptr, ptr %gep2
+  tail call ptr @llvm.objc.retain(ptr %x)
   br label %bb1
 
 bb1:
@@ -289,50 +285,50 @@ bb2:
   br label %bb3
 
 bb3:
-  tail call i8* @llvm.objc.retain(i8* %x)
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  tail call ptr @llvm.objc.retain(ptr %x)
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
-; CHECK: define void @test2d(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %y)
-; CHECK: @llvm.objc.release(i8* %x)
+; CHECK: define void @test2d(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %y)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: ret void
 ; CHECK: }
-define void @test2d(i8* %x) {
+define void @test2d(ptr %x) {
 entry:
-  tail call i8* @llvm.objc.retain(i8* %x)
+  tail call ptr @llvm.objc.retain(ptr %x)
   br label %bb1
 
 bb1:
-  %Abb1 = alloca i8*, i32 3
-  %gepbb11 = getelementptr i8*, i8** %Abb1, i32 2
-  store i8* %x, i8** %gepbb11, align 8
-  %gepbb12 = getelementptr i8*, i8** %Abb1, i32 2
-  %ybb1 = load i8*, i8** %gepbb12
+  %Abb1 = alloca ptr, i32 3
+  %gepbb11 = getelementptr ptr, ptr %Abb1, i32 2
+  store ptr %x, ptr %gepbb11, align 8
+  %gepbb12 = getelementptr ptr, ptr %Abb1, i32 2
+  %ybb1 = load ptr, ptr %gepbb12
   br label %bb3
 
 bb2:
-  %Abb2 = alloca i8*, i32 4
-  %gepbb21 = getelementptr i8*, i8** %Abb2, i32 2
-  store i8* %x, i8** %gepbb21, align 8
-  %gepbb22 = getelementptr i8*, i8** %Abb2, i32 2
-  %ybb2 = load i8*, i8** %gepbb22
+  %Abb2 = alloca ptr, i32 4
+  %gepbb21 = getelementptr ptr, ptr %Abb2, i32 2
+  store ptr %x, ptr %gepbb21, align 8
+  %gepbb22 = getelementptr ptr, ptr %Abb2, i32 2
+  %ybb2 = load ptr, ptr %gepbb22
   br label %bb3
 
 bb3:
-  %A = phi i8** [ %Abb1, %bb1 ], [ %Abb2, %bb2 ]
-  %y = phi i8* [ %ybb1, %bb1 ], [ %ybb2, %bb2 ]
-  tail call i8* @llvm.objc.retain(i8* %x)
-  call void @use_alloca(i8** %A)
-  call void @llvm.objc.release(i8* %y), !clang.imprecise_release !0
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+  %A = phi ptr [ %Abb1, %bb1 ], [ %Abb2, %bb2 ]
+  %y = phi ptr [ %ybb1, %bb1 ], [ %ybb2, %bb2 ]
+  tail call ptr @llvm.objc.retain(ptr %x)
+  call void @use_alloca(ptr %A)
+  call void @llvm.objc.release(ptr %y), !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
@@ -363,55 +359,51 @@ bb3:
 ; CHECK: }
 define void @test3a() {
 entry:
-  %keys = alloca [2 x i8*], align 16
-  %objs = alloca [2 x i8*], align 16
+  %keys = alloca [2 x ptr], align 16
+  %objs = alloca [2 x ptr], align 16
   
-  %call1 = call i8* @returner()
-  %tmp0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1)
-
-  %objs.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
-  tail call i8* @llvm.objc.retain(i8* %call1)
-  store i8* %call1, i8** %objs.begin, align 8
-  %objs.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 1
-  tail call i8* @llvm.objc.retain(i8* %call1)
-  store i8* %call1, i8** %objs.elt
-
-  %call2 = call i8* @returner1()
-  %call3 = call i8* @returner2()
-  %keys.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
-  tail call i8* @llvm.objc.retain(i8* %call2)
-  store i8* %call2, i8** %keys.begin, align 8
-  %keys.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 1
-  tail call i8* @llvm.objc.retain(i8* %call3)
-  store i8* %call3, i8** %keys.elt  
+  %call1 = call ptr @returner()
+  %tmp0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call1)
+
+  tail call ptr @llvm.objc.retain(ptr %call1)
+  store ptr %call1, ptr %objs, align 8
+  %objs.elt = getelementptr inbounds [2 x ptr], ptr %objs, i64 0, i64 1
+  tail call ptr @llvm.objc.retain(ptr %call1)
+  store ptr %call1, ptr %objs.elt
+
+  %call2 = call ptr @returner1()
+  %call3 = call ptr @returner2()
+  tail call ptr @llvm.objc.retain(ptr %call2)
+  store ptr %call2, ptr %keys, align 8
+  %keys.elt = getelementptr inbounds [2 x ptr], ptr %keys, i64 0, i64 1
+  tail call ptr @llvm.objc.retain(ptr %call3)
+  store ptr %call3, ptr %keys.elt  
   
-  %gep = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 2
+  %gep = getelementptr inbounds [2 x ptr], ptr %objs, i64 0, i64 2
   br label %arraydestroy.body
 
 arraydestroy.body:
-  %arraydestroy.elementPast = phi i8** [ %gep, %entry ], [ %arraydestroy.element, %arraydestroy.body ]
-  %arraydestroy.element = getelementptr inbounds i8*, i8** %arraydestroy.elementPast, i64 -1
-  %destroy_tmp = load i8*, i8** %arraydestroy.element, align 8
-  call void @llvm.objc.release(i8* %destroy_tmp), !clang.imprecise_release !0
-  %objs_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
-  %arraydestroy.cmp = icmp eq i8** %arraydestroy.element, %objs_ptr
+  %arraydestroy.elementPast = phi ptr [ %gep, %entry ], [ %arraydestroy.element, %arraydestroy.body ]
+  %arraydestroy.element = getelementptr inbounds ptr, ptr %arraydestroy.elementPast, i64 -1
+  %destroy_tmp = load ptr, ptr %arraydestroy.element, align 8
+  call void @llvm.objc.release(ptr %destroy_tmp), !clang.imprecise_release !0
+  %arraydestroy.cmp = icmp eq ptr %arraydestroy.element, %objs
   br i1 %arraydestroy.cmp, label %arraydestroy.done, label %arraydestroy.body
 
 arraydestroy.done:
-  %gep1 = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 2
+  %gep1 = getelementptr inbounds [2 x ptr], ptr %keys, i64 0, i64 2
   br label %arraydestroy.body1
 
 arraydestroy.body1:
-  %arraydestroy.elementPast1 = phi i8** [ %gep1, %arraydestroy.done ], [ %arraydestroy.element1, %arraydestroy.body1 ]
-  %arraydestroy.element1 = getelementptr inbounds i8*, i8** %arraydestroy.elementPast1, i64 -1
-  %destroy_tmp1 = load i8*, i8** %arraydestroy.element1, align 8
-  call void @llvm.objc.release(i8* %destroy_tmp1), !clang.imprecise_release !0
-  %keys_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
-  %arraydestroy.cmp1 = icmp eq i8** %arraydestroy.element1, %keys_ptr
+  %arraydestroy.elementPast1 = phi ptr [ %gep1, %arraydestroy.done ], [ %arraydestroy.element1, %arraydestroy.body1 ]
+  %arraydestroy.element1 = getelementptr inbounds ptr, ptr %arraydestroy.elementPast1, i64 -1
+  %destroy_tmp1 = load ptr, ptr %arraydestroy.element1, align 8
+  call void @llvm.objc.release(ptr %destroy_tmp1), !clang.imprecise_release !0
+  %arraydestroy.cmp1 = icmp eq ptr %arraydestroy.element1, %keys
   br i1 %arraydestroy.cmp1, label %arraydestroy.done1, label %arraydestroy.body1
 
 arraydestroy.done1:
-  call void @llvm.objc.release(i8* %call1), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %call1), !clang.imprecise_release !0
   ret void
 }
 
@@ -441,57 +433,53 @@ arraydestroy.done1:
 ; CHECK: }
 define void @test3b() {
 entry:
-  %keys = alloca [2 x i8*], align 16
-  %objs = alloca [2 x i8*], align 16
+  %keys = alloca [2 x ptr], align 16
+  %objs = alloca [2 x ptr], align 16
   
-  %call1 = call i8* @returner()
-  %tmp0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1)
-  %tmp1 = tail call i8* @llvm.objc.retain(i8* %call1)
-
-  %objs.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
-  tail call i8* @llvm.objc.retain(i8* %call1)
-  store i8* %call1, i8** %objs.begin, align 8
-  %objs.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 1
-  tail call i8* @llvm.objc.retain(i8* %call1)
-  store i8* %call1, i8** %objs.elt
-
-  %call2 = call i8* @returner1()
-  %call3 = call i8* @returner2()
-  %keys.begin = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
-  tail call i8* @llvm.objc.retain(i8* %call2)
-  store i8* %call2, i8** %keys.begin, align 8
-  %keys.elt = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 1
-  tail call i8* @llvm.objc.retain(i8* %call3)
-  store i8* %call3, i8** %keys.elt  
+  %call1 = call ptr @returner()
+  %tmp0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call1)
+  %tmp1 = tail call ptr @llvm.objc.retain(ptr %call1)
+
+  tail call ptr @llvm.objc.retain(ptr %call1)
+  store ptr %call1, ptr %objs, align 8
+  %objs.elt = getelementptr inbounds [2 x ptr], ptr %objs, i64 0, i64 1
+  tail call ptr @llvm.objc.retain(ptr %call1)
+  store ptr %call1, ptr %objs.elt
+
+  %call2 = call ptr @returner1()
+  %call3 = call ptr @returner2()
+  tail call ptr @llvm.objc.retain(ptr %call2)
+  store ptr %call2, ptr %keys, align 8
+  %keys.elt = getelementptr inbounds [2 x ptr], ptr %keys, i64 0, i64 1
+  tail call ptr @llvm.objc.retain(ptr %call3)
+  store ptr %call3, ptr %keys.elt  
   
-  %gep = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 2
+  %gep = getelementptr inbounds [2 x ptr], ptr %objs, i64 0, i64 2
   br label %arraydestroy.body
 
 arraydestroy.body:
-  %arraydestroy.elementPast = phi i8** [ %gep, %entry ], [ %arraydestroy.element, %arraydestroy.body ]
-  %arraydestroy.element = getelementptr inbounds i8*, i8** %arraydestroy.elementPast, i64 -1
-  %destroy_tmp = load i8*, i8** %arraydestroy.element, align 8
-  call void @llvm.objc.release(i8* %destroy_tmp), !clang.imprecise_release !0
-  %objs_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %objs, i64 0, i64 0
-  %arraydestroy.cmp = icmp eq i8** %arraydestroy.element, %objs_ptr
+  %arraydestroy.elementPast = phi ptr [ %gep, %entry ], [ %arraydestroy.element, %arraydestroy.body ]
+  %arraydestroy.element = getelementptr inbounds ptr, ptr %arraydestroy.elementPast, i64 -1
+  %destroy_tmp = load ptr, ptr %arraydestroy.element, align 8
+  call void @llvm.objc.release(ptr %destroy_tmp), !clang.imprecise_release !0
+  %arraydestroy.cmp = icmp eq ptr %arraydestroy.element, %objs
   br i1 %arraydestroy.cmp, label %arraydestroy.done, label %arraydestroy.body
 
 arraydestroy.done:
-  %gep1 = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 2
+  %gep1 = getelementptr inbounds [2 x ptr], ptr %keys, i64 0, i64 2
   br label %arraydestroy.body1
 
 arraydestroy.body1:
-  %arraydestroy.elementPast1 = phi i8** [ %gep1, %arraydestroy.done ], [ %arraydestroy.element1, %arraydestroy.body1 ]
-  %arraydestroy.element1 = getelementptr inbounds i8*, i8** %arraydestroy.elementPast1, i64 -1
-  %destroy_tmp1 = load i8*, i8** %arraydestroy.element1, align 8
-  call void @llvm.objc.release(i8* %destroy_tmp1), !clang.imprecise_release !0
-  %keys_ptr = getelementptr inbounds [2 x i8*], [2 x i8*]* %keys, i64 0, i64 0
-  %arraydestroy.cmp1 = icmp eq i8** %arraydestroy.element1, %keys_ptr
+  %arraydestroy.elementPast1 = phi ptr [ %gep1, %arraydestroy.done ], [ %arraydestroy.element1, %arraydestroy.body1 ]
+  %arraydestroy.element1 = getelementptr inbounds ptr, ptr %arraydestroy.elementPast1, i64 -1
+  %destroy_tmp1 = load ptr, ptr %arraydestroy.element1, align 8
+  call void @llvm.objc.release(ptr %destroy_tmp1), !clang.imprecise_release !0
+  %arraydestroy.cmp1 = icmp eq ptr %arraydestroy.element1, %keys
   br i1 %arraydestroy.cmp1, label %arraydestroy.done1, label %arraydestroy.body1
 
 arraydestroy.done1:
-  call void @llvm.objc.release(i8* %call1), !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %call1), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %call1), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %call1), !clang.imprecise_release !0
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/apelim.ll b/llvm/test/Transforms/ObjCARC/apelim.ll
index 947f44534457..2ac5d15d0df8 100644
--- a/llvm/test/Transforms/ObjCARC/apelim.ll
+++ b/llvm/test/Transforms/ObjCARC/apelim.ll
@@ -1,7 +1,7 @@
 ; RUN: opt -S -passes=objc-arc-apelim < %s | FileCheck %s
 ; rdar://10227311
 
- at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_x, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_y, i8* null }]
+ at llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_x, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_y, ptr null }]
 
 @x = global i32 0
 
@@ -15,14 +15,14 @@ entry:
 define internal void @__cxx_global_var_init() {
 entry:
   %call = call i32 @foo()
-  store i32 %call, i32* @x, align 4
+  store i32 %call, ptr @x, align 4
   ret void
 }
 
 define internal void @__dxx_global_var_init() {
 entry:
   %call = call i32 @bar()
-  store i32 %call, i32* @x, align 4
+  store i32 %call, ptr @x, align 4
   ret void
 }
 
@@ -31,25 +31,25 @@ entry:
 ; CHECK: }
 define internal void @_GLOBAL__I_x() {
 entry:
-  %0 = call i8* @llvm.objc.autoreleasePoolPush() nounwind
+  %0 = call ptr @llvm.objc.autoreleasePoolPush() nounwind
   call void @__cxx_global_var_init()
-  call void @llvm.objc.autoreleasePoolPop(i8* %0) nounwind
+  call void @llvm.objc.autoreleasePoolPop(ptr %0) nounwind
   ret void
 }
 
 ; CHECK: define internal void @_GLOBAL__I_y() {
-; CHECK: %0 = call i8* @llvm.objc.autoreleasePoolPush() [[NUW:#[0-9]+]]
-; CHECK: call void @llvm.objc.autoreleasePoolPop(i8* %0) [[NUW]]
+; CHECK: %0 = call ptr @llvm.objc.autoreleasePoolPush() [[NUW:#[0-9]+]]
+; CHECK: call void @llvm.objc.autoreleasePoolPop(ptr %0) [[NUW]]
 ; CHECK: }
 define internal void @_GLOBAL__I_y() {
 entry:
-  %0 = call i8* @llvm.objc.autoreleasePoolPush() nounwind
+  %0 = call ptr @llvm.objc.autoreleasePoolPush() nounwind
   call void @__dxx_global_var_init()
-  call void @llvm.objc.autoreleasePoolPop(i8* %0) nounwind
+  call void @llvm.objc.autoreleasePoolPop(ptr %0) nounwind
   ret void
 }
 
-declare i8* @llvm.objc.autoreleasePoolPush()
-declare void @llvm.objc.autoreleasePoolPop(i8*)
+declare ptr @llvm.objc.autoreleasePoolPush()
+declare void @llvm.objc.autoreleasePoolPop(ptr)
 
 ; CHECK: attributes #0 = { nounwind }

diff  --git a/llvm/test/Transforms/ObjCARC/basic.ll b/llvm/test/Transforms/ObjCARC/basic.ll
index a0a207c2e0b2..51382145a8e6 100644
--- a/llvm/test/Transforms/ObjCARC/basic.ll
+++ b/llvm/test/Transforms/ObjCARC/basic.ll
@@ -2,83 +2,77 @@
 
 target datalayout = "e-p:64:64:64"
 
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare void @llvm.objc.autoreleasePoolPop(i8*)
-declare i8* @llvm.objc.autoreleasePoolPush()
-declare i8* @llvm.objc.retainBlock(i8*)
-
-declare i8* @llvm.objc.retainedObject(i8*)
-declare i8* @llvm.objc.unretainedObject(i8*)
-declare i8* @llvm.objc.unretainedPointer(i8*)
-
-declare void @use_pointer(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)
+declare void @llvm.objc.release(ptr)
+declare ptr @llvm.objc.autorelease(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare void @llvm.objc.autoreleasePoolPop(ptr)
+declare ptr @llvm.objc.autoreleasePoolPush()
+declare ptr @llvm.objc.retainBlock(ptr)
+
+declare ptr @llvm.objc.retainedObject(ptr)
+declare ptr @llvm.objc.unretainedObject(ptr)
+declare ptr @llvm.objc.unretainedPointer(ptr)
+
+declare void @use_pointer(ptr)
 declare void @callee()
-declare void @callee2(i8*, i8*)
-declare void @callee_fnptr(void ()*)
+declare void @callee2(ptr, ptr)
+declare void @callee_fnptr(ptr)
 declare void @invokee()
-declare i8* @returner()
-declare void @bar(i32 ()*)
+declare ptr @returner()
+declare void @bar(ptr)
 
 declare void @llvm.dbg.value(metadata, metadata, metadata)
 
-declare i8* @objc_msgSend(i8*, i8*, ...)
+declare ptr @objc_msgSend(ptr, ptr, ...)
 
 ; Simple retain+release pair deletion, with some intervening control
 ; flow and harmless instructions.
 
-; CHECK: define void @test0_precise(i32* %x, i1 %p) [[NUW:#[0-9]+]] {
+; CHECK: define void @test0_precise(ptr %x, i1 %p) [[NUW:#[0-9]+]] {
 ; CHECK: @llvm.objc.retain
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test0_precise(i32* %x, i1 %p) nounwind {
+define void @test0_precise(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   br label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
-; CHECK: define void @test0_imprecise(i32* %x, i1 %p) [[NUW]] {
+; CHECK: define void @test0_imprecise(ptr %x, i1 %p) [[NUW]] {
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test0_imprecise(i32* %x, i1 %p) nounwind {
+define void @test0_imprecise(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   br label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -87,60 +81,54 @@ return:
 
 ; TODO: Make the llvm.objc.release's argument be %0.
 
-; CHECK: define void @test1_precise(i32* %x, i1 %p, i1 %q) [[NUW]] {
-; CHECK: @llvm.objc.retain(i8* %a)
-; CHECK: @llvm.objc.release
+; CHECK: define void @test1_precise(ptr %x, i1 %p, i1 %q) [[NUW]] {
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %x)
 ; CHECK: {{^}}}
-define void @test1_precise(i32* %x, i1 %p, i1 %q) nounwind {
+define void @test1_precise(ptr %x, i1 %p, i1 %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   call void @callee()
   br i1 %q, label %return, label %alt_return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 
 alt_return:
   ret void
 }
 
-; CHECK: define void @test1_imprecise(i32* %x, i1 %p, i1 %q) [[NUW]] {
-; CHECK: @llvm.objc.retain(i8* %a)
+; CHECK: define void @test1_imprecise(ptr %x, i1 %p, i1 %q) [[NUW]] {
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test1_imprecise(i32* %x, i1 %p, i1 %q) nounwind {
+define void @test1_imprecise(ptr %x, i1 %p, i1 %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   call void @callee()
   br i1 %q, label %return, label %alt_return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 
 alt_return:
@@ -150,17 +138,17 @@ alt_return:
 
 ; Don't do partial elimination into two 
diff erent CFG diamonds.
 
-; CHECK: define void @test1b_precise(i8* %x, i1 %p, i1 %q) {
+; CHECK: define void @test1b_precise(ptr %x, i1 %p, i1 %q) {
 ; CHECK: entry:
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: if.end5:
-; CHECK:   tail call void @llvm.objc.release(i8* %x) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %x) [[NUW]]
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test1b_precise(i8* %x, i1 %p, i1 %q) {
+define void @test1b_precise(ptr %x, i1 %p, i1 %q) {
 entry:
-  tail call i8* @llvm.objc.retain(i8* %x) nounwind
+  tail call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %if.then, label %if.end
 
 if.then:                                          ; preds = %entry
@@ -171,25 +159,25 @@ if.end:                                           ; preds = %if.then, %entry
   br i1 %q, label %if.then3, label %if.end5
 
 if.then3:                                         ; preds = %if.end
-  tail call void @use_pointer(i8* %x)
+  tail call void @use_pointer(ptr %x)
   br label %if.end5
 
 if.end5:                                          ; preds = %if.then3, %if.end
-  tail call void @llvm.objc.release(i8* %x) nounwind
+  tail call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test1b_imprecise(
 ; CHECK: entry:
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %x) [[NUW:#[0-9]+]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %x) [[NUW:#[0-9]+]]
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: if.end5:
-; CHECK:   tail call void @llvm.objc.release(i8* %x) [[NUW]], !clang.imprecise_release ![[RELEASE:[0-9]+]]
+; CHECK:   tail call void @llvm.objc.release(ptr %x) [[NUW]], !clang.imprecise_release ![[RELEASE:[0-9]+]]
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test1b_imprecise(i8* %x, i1 %p, i1 %q) {
+define void @test1b_imprecise(ptr %x, i1 %p, i1 %q) {
 entry:
-  tail call i8* @llvm.objc.retain(i8* %x) nounwind
+  tail call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %if.then, label %if.end
 
 if.then:                                          ; preds = %entry
@@ -200,11 +188,11 @@ if.end:                                           ; preds = %if.then, %entry
   br i1 %q, label %if.then3, label %if.end5
 
 if.then3:                                         ; preds = %if.end
-  tail call void @use_pointer(i8* %x)
+  tail call void @use_pointer(ptr %x)
   br label %if.end5
 
 if.end5:                                          ; preds = %if.then3, %if.end
-  tail call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -213,60 +201,52 @@ if.end5:                                          ; preds = %if.then3, %if.end
 ; so the optimization is not safe.
 
 ; CHECK-LABEL: define void @test2_precise(
-; CHECK: @llvm.objc.retain(i8* %a)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test2_precise(i32* %x, i1 %p) nounwind {
+define void @test2_precise(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  store i32 7, i32* %x
-  call void @use_pointer(i8* %0)
-  %d = bitcast i32* %x to float*
-  store float 3.0, float* %d
+  store i32 7, ptr %x
+  call void @use_pointer(ptr %0)
+  store float 3.0, ptr %x
   br label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test2_imprecise(
-; CHECK: @llvm.objc.retain(i8* %a)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test2_imprecise(i32* %x, i1 %p) nounwind {
+define void @test2_imprecise(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  store i32 7, i32* %x
-  call void @use_pointer(i8* %0)
-  %d = bitcast i32* %x to float*
-  store float 3.0, float* %d
+  store i32 7, ptr %x
+  call void @use_pointer(ptr %0)
+  store float 3.0, ptr %x
   br label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -276,19 +256,17 @@ return:
 ; TODO: For now, assume this can't happen.
 
 ; CHECK-LABEL: define void @test3_precise(
-; TODO: @llvm.objc.retain(i8* %a)
+; TODO: @llvm.objc.retain(ptr %a)
 ; TODO: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test3_precise(i32* %x, i1* %q) nounwind {
+define void @test3_precise(ptr %x, ptr %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %loop
 
 loop:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
-  %j = load volatile i1, i1* %q
+  call void @llvm.objc.release(ptr %x) nounwind
+  %j = load volatile i1, ptr %q
   br i1 %j, label %loop, label %return
 
 return:
@@ -296,19 +274,17 @@ return:
 }
 
 ; CHECK-LABEL: define void @test3_imprecise(
-; TODO: @llvm.objc.retain(i8* %a)
+; TODO: @llvm.objc.retain(ptr %a)
 ; TODO: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test3_imprecise(i32* %x, i1* %q) nounwind {
+define void @test3_imprecise(ptr %x, ptr %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %loop
 
 loop:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind, !clang.imprecise_release !0
-  %j = load volatile i1, i1* %q
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
+  %j = load volatile i1, ptr %q
   br i1 %j, label %loop, label %return
 
 return:
@@ -322,42 +298,38 @@ return:
 ; so the optimization is not safe.
 
 ; CHECK-LABEL: define void @test4_precise(
-; TODO: @llvm.objc.retain(i8* %a)
+; TODO: @llvm.objc.retain(ptr %a)
 ; TODO: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test4_precise(i32* %x, i1* %q) nounwind {
+define void @test4_precise(ptr %x, ptr %q) nounwind {
 entry:
   br label %loop
 
 loop:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  %j = load volatile i1, i1* %q
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %j = load volatile i1, ptr %q
   br i1 %j, label %loop, label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test4_imprecise(
-; TODO: @llvm.objc.retain(i8* %a)
+; TODO: @llvm.objc.retain(ptr %a)
 ; TODO: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test4_imprecise(i32* %x, i1* %q) nounwind {
+define void @test4_imprecise(ptr %x, ptr %q) nounwind {
 entry:
   br label %loop
 
 loop:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  %j = load volatile i1, i1* %q
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %j = load volatile i1, ptr %q
   br i1 %j, label %loop, label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -366,34 +338,30 @@ return:
 ; so the optimization is not safe.
 
 ; CHECK-LABEL: define void @test5a(
-; CHECK: @llvm.objc.retain(i8*
+; CHECK: @llvm.objc.retain(ptr
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test5a(i32* %x, i1 %q, i8* %y) nounwind {
+define void @test5a(ptr %x, i1 %q, ptr %y) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  %s = select i1 %q, i8* %y, i8* %0
-  call void @use_pointer(i8* %s)
-  store i32 7, i32* %x
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %s = select i1 %q, ptr %y, ptr %0
+  call void @use_pointer(ptr %s)
+  store i32 7, ptr %x
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test5b(
-; CHECK: @llvm.objc.retain(i8*
+; CHECK: @llvm.objc.retain(ptr
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test5b(i32* %x, i1 %q, i8* %y) nounwind {
+define void @test5b(ptr %x, i1 %q, ptr %y) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  %s = select i1 %q, i8* %y, i8* %0
-  call void @use_pointer(i8* %s)
-  store i32 7, i32* %x
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind, !clang.imprecise_release !0
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %s = select i1 %q, ptr %y, ptr %0
+  call void @use_pointer(ptr %s)
+  store i32 7, ptr %x
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -403,32 +371,28 @@ entry:
 
 ; CHECK-LABEL: define void @test6a(
 ; CHECK: entry:
-; CHECK:   tail call i8* @llvm.objc.retain
+; CHECK:   tail call ptr @llvm.objc.retain
 ; CHECK: t:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: f:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: return:
 ; CHECK: {{^}}}
-define void @test6a(i32* %x, i1 %p) nounwind {
+define void @test6a(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
-  %ct = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %ct) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   call void @callee()
-  %cf = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cf) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 return:
@@ -438,25 +402,21 @@ return:
 ; CHECK-LABEL: define void @test6b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test6b(i32* %x, i1 %p) nounwind {
+define void @test6b(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
-  %ct = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %ct) nounwind, !clang.imprecise_release !0
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   call void @callee()
-  %cf = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cf) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 return:
@@ -465,32 +425,28 @@ return:
 
 ; CHECK-LABEL: define void @test6c(
 ; CHECK: entry:
-; CHECK:   tail call i8* @llvm.objc.retain
+; CHECK:   tail call ptr @llvm.objc.retain
 ; CHECK: t:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: f:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: return:
 ; CHECK: {{^}}}
-define void @test6c(i32* %x, i1 %p) nounwind {
+define void @test6c(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
-  %ct = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %ct) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   call void @callee()
-  %cf = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cf) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 return:
@@ -499,32 +455,28 @@ return:
 
 ; CHECK-LABEL: define void @test6d(
 ; CHECK: entry:
-; CHECK:   tail call i8* @llvm.objc.retain
+; CHECK:   tail call ptr @llvm.objc.retain
 ; CHECK: t:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: f:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: return:
 ; CHECK: {{^}}}
-define void @test6d(i32* %x, i1 %p) nounwind {
+define void @test6d(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %p, label %t, label %f
 
 t:
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
-  %ct = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %ct) nounwind, !clang.imprecise_release !0
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 f:
-  store i32 7, i32* %x
+  store i32 7, ptr %x
   call void @callee()
-  %cf = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cf) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 return:
@@ -539,60 +491,54 @@ return:
 ; CHECK:     entry:
 ; CHECK-NOT:   llvm.objc.
 ; CHECK:     t:
-; CHECK:       call i8* @llvm.objc.retain
+; CHECK:       call ptr @llvm.objc.retain
 ; CHECK:     f:
-; CHECK:       call i8* @llvm.objc.retain
+; CHECK:       call ptr @llvm.objc.retain
 ; CHECK:     return:
 ; CHECK:       call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test7(i32* %x, i1 %p) nounwind {
+define void @test7(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
   br i1 %p, label %t, label %f
 
 t:
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  %1 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i32 7, i32* %x
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i32 7, ptr %x
   call void @callee()
   br label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test7b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test7b(i32* %x, i1 %p) nounwind {
+define void @test7b(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
   br i1 %p, label %t, label %f
 
 t:
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  %1 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i32 7, i32* %x
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i32 7, ptr %x
   call void @callee()
   br label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -600,33 +546,30 @@ return:
 
 ; CHECK-LABEL: define void @test7c(
 ; CHECK: t:
-; CHECK:   call i8* @llvm.objc.retainBlock
+; CHECK:   call ptr @llvm.objc.retainBlock
 ; CHECK: f:
-; CHECK:   call i8* @llvm.objc.retain
+; CHECK:   call ptr @llvm.objc.retain
 ; CHECK: return:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test7c(i32* %x, i1 %p) nounwind {
+define void @test7c(ptr %x, i1 %p) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
   br i1 %p, label %t, label %f
 
 t:
-  %0 = call i8* @llvm.objc.retainBlock(i8* %a) nounwind
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  %0 = call ptr @llvm.objc.retainBlock(ptr %x) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %return
 
 f:
-  %1 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i32 7, i32* %x
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i32 7, ptr %x
   call void @callee()
   br label %return
 
 return:
-  %c = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %c) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -646,21 +589,19 @@ return:
 ; CHECK:   @llvm.objc.release
 ; CHECK: return:
 ; CHECK: {{^}}}
-define void @test8a(i32* %x, i1 %p, i1 %q) nounwind {
+define void @test8a(ptr %x, i1 %p, i1 %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
   br i1 %p, label %t, label %f
 
 t:
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %mid
 
 f:
-  %1 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i32 7, i32* %x
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i32 7, ptr %x
   br label %mid
 
 mid:
@@ -668,13 +609,11 @@ mid:
 
 u:
   call void @callee()
-  %cu = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cu) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 g:
-  %cg = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cg) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 return:
@@ -684,21 +623,19 @@ return:
 ; CHECK-LABEL: define void @test8b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test8b(i32* %x, i1 %p, i1 %q) nounwind {
+define void @test8b(ptr %x, i1 %p, i1 %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
   br i1 %p, label %t, label %f
 
 t:
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %mid
 
 f:
-  %1 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i32 7, i32* %x
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i32 7, ptr %x
   br label %mid
 
 mid:
@@ -706,13 +643,11 @@ mid:
 
 u:
   call void @callee()
-  %cu = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cu) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 g:
-  %cg = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cg) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 return:
@@ -733,21 +668,19 @@ return:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: return:
 ; CHECK: {{^}}}
-define void @test8c(i32* %x, i1 %p, i1 %q) nounwind {
+define void @test8c(ptr %x, i1 %p, i1 %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
   br i1 %p, label %t, label %f
 
 t:
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %mid
 
 f:
-  %1 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i32 7, i32* %x
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i32 7, ptr %x
   br label %mid
 
 mid:
@@ -755,13 +688,11 @@ mid:
 
 u:
   call void @callee()
-  %cu = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cu) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 g:
-  %cg = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cg) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 return:
@@ -781,21 +712,19 @@ return:
 ; CHECK:   @llvm.objc.release
 ; CHECK: return:
 ; CHECK: {{^}}}
-define void @test8d(i32* %x, i1 %p, i1 %q) nounwind {
+define void @test8d(ptr %x, i1 %p, i1 %q) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
   br i1 %p, label %t, label %f
 
 t:
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i8 3, i8* %a
-  %b = bitcast i32* %x to float*
-  store float 2.0, float* %b
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i8 3, ptr %x
+  store float 2.0, ptr %x
   br label %mid
 
 f:
-  %1 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i32 7, i32* %x
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  store i32 7, ptr %x
   br label %mid
 
 mid:
@@ -803,13 +732,11 @@ mid:
 
 u:
   call void @callee()
-  %cu = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cu) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %return
 
 g:
-  %cg = bitcast i32* %x to i8*
-  call void @llvm.objc.release(i8* %cg) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %return
 
 return:
@@ -821,41 +748,41 @@ return:
 ; CHECK-LABEL: define void @test9(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test9(i8* %x) nounwind {
+define void @test9(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %0) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %0) nounwind
   ret void
 }
 
 ; Retain+release pair, but on an unknown pointer relationship. Don't delete!
 
 ; CHECK-LABEL: define void @test9b(
-; CHECK: @llvm.objc.retain(i8* %x)
-; CHECK: @llvm.objc.release(i8* %s)
+; CHECK: @llvm.objc.retain(ptr %x)
+; CHECK: @llvm.objc.release(ptr %s)
 ; CHECK: {{^}}}
-define void @test9b(i8* %x, i1 %j, i8* %p) nounwind {
+define void @test9b(ptr %x, i1 %j, ptr %p) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %s = select i1 %j, i8* %x, i8* %p
-  call void @llvm.objc.release(i8* %s) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %s = select i1 %j, ptr %x, ptr %p
+  call void @llvm.objc.release(ptr %s) nounwind
   ret void
 }
 
 ; Trivial retain+release pair with intervening calls - don't delete!
 
 ; CHECK-LABEL: define void @test10(
-; CHECK: @llvm.objc.retain(i8* %x)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK: @callee
 ; CHECK: @use_pointer
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test10(i8* %x) nounwind {
+define void @test10(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
   call void @callee()
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %0) nounwind
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %0) nounwind
   ret void
 }
 
@@ -864,14 +791,14 @@ entry:
 ; a stack argument.
 
 ; CHECK-LABEL: define void @test11(
-; CHECK: tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK: call i8* @llvm.objc.autorelease(i8* %0) [[NUW]]
+; CHECK: tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK: call ptr @llvm.objc.autorelease(ptr %0) [[NUW]]
 ; CHECK: {{^}}}
-define void @test11(i8* %x) nounwind {
+define void @test11(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.autorelease(i8* %0) nounwind
-  call void @use_pointer(i8* %x)
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.autorelease(ptr %0) nounwind
+  call void @use_pointer(ptr %x)
   ret void
 }
 
@@ -881,10 +808,10 @@ entry:
 ; CHECK: entry:
 ; CHECK-NEXT: ret void
 ; CHECK: {{^}}}
-define void @test11a(i8* %x) nounwind {
+define void @test11a(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.autorelease(i8* %0) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.autorelease(ptr %0) nounwind
   ret void
 }
 
@@ -892,15 +819,15 @@ entry:
 ; since if the frontend emitted code for an __autoreleasing variable, we may
 ; want it to be in the autorelease pool.
 
-; CHECK-LABEL: define i8* @test11b(
-; CHECK: tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK: call i8* @llvm.objc.autorelease(i8* %0) [[NUW]]
+; CHECK-LABEL: define ptr @test11b(
+; CHECK: tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK: call ptr @llvm.objc.autorelease(ptr %0) [[NUW]]
 ; CHECK: {{^}}}
-define i8* @test11b(i8* %x) nounwind {
+define ptr @test11b(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.autorelease(i8* %0) nounwind
-  ret i8* %x
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.autorelease(ptr %0) nounwind
+  ret ptr %x
 }
 
 ; We can not delete this retain, release since we do not have a post-dominating
@@ -908,34 +835,34 @@ entry:
 
 ; CHECK-LABEL: define void @test12(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: @llvm.objc.retain(i8* %x)
+; CHECK-NEXT: @llvm.objc.retain(ptr %x)
 ; CHECK-NEXT: @llvm.objc.retain
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test12(i8* %x, i64 %n) {
+define void @test12(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; Trivial retain,autorelease pair. Don't delete!
 
 ; CHECK-LABEL: define void @test13(
-; CHECK: tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK: tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK: @use_pointer(i8* %x)
-; CHECK: call i8* @llvm.objc.autorelease(i8* %x) [[NUW]]
+; CHECK: tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK: tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK: @use_pointer(ptr %x)
+; CHECK: call ptr @llvm.objc.autorelease(ptr %x) [[NUW]]
 ; CHECK: {{^}}}
-define void @test13(i8* %x, i64 %n) {
+define void @test13(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call i8* @llvm.objc.autorelease(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call ptr @llvm.objc.autorelease(ptr %x) nounwind
   ret void
 }
 
@@ -943,22 +870,22 @@ entry:
 
 ; CHECK-LABEL: define void @test13b(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: @llvm.objc.retain(i8* %x)
+; CHECK-NEXT: @llvm.objc.retain(ptr %x)
 ; CHECK-NEXT: @use_pointer
 ; CHECK-NEXT: @use_pointer
 ; CHECK-NEXT: @use_pointer
 ; CHECK-NEXT: @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test13b(i8* %x, i64 %n) {
+define void @test13b(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -966,20 +893,20 @@ entry:
 ; autoreleasePoolPop in the way.
 
 ; CHECK-LABEL: define void @test13c(
-; CHECK: @llvm.objc.retain(i8* %x)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK: @llvm.objc.autoreleasePoolPop
-; CHECK: @llvm.objc.retain(i8* %x)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK: @use_pointer
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test13c(i8* %x, i64 %n) {
+define void @test13c(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @llvm.objc.autoreleasePoolPop(i8* undef)
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @llvm.objc.autoreleasePoolPop(ptr undef)
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -988,7 +915,7 @@ entry:
 
 ; CHECK-LABEL: define void @test13d(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: @llvm.objc.retain(i8* %x)
+; CHECK-NEXT: @llvm.objc.retain(ptr %x)
 ; CHECK-NEXT: @llvm.objc.autoreleasePoolPush
 ; CHECK-NEXT: @use_pointer
 ; CHECK-NEXT: @use_pointer
@@ -996,16 +923,16 @@ entry:
 ; CHECK-NEXT: @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test13d(i8* %x, i64 %n) {
+define void @test13d(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.autoreleasePoolPush()
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.autoreleasePoolPush()
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -1022,13 +949,13 @@ entry:
 ; CHECK-NEXT: @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test14(i8* %x, i64 %n) {
+define void @test14(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -1037,18 +964,18 @@ entry:
 
 ; CHECK-LABEL: define void @test15(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: @llvm.objc.retain(i8* %x)
+; CHECK-NEXT: @llvm.objc.retain(ptr %x)
 ; CHECK-NEXT: @use_pointer
-; CHECK-NEXT: @llvm.objc.autorelease(i8* %x)
+; CHECK-NEXT: @llvm.objc.autorelease(ptr %x)
 ; CHECK-NEXT: @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test15(i8* %x, i64 %n) {
+define void @test15(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -1062,11 +989,11 @@ entry:
 ; CHECK-NEXT: @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test15b(i8* %x, i64 %n) {
+define void @test15b(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -1075,163 +1002,163 @@ entry:
 ; CHECK-NEXT: @llvm.objc.autorelease
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test15c(i8* %x, i64 %n) {
+define void @test15c(ptr %x, i64 %n) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Retain+release pairs in diamonds, all dominated by a retain.
 
 ; CHECK-LABEL: define void @test16a(
-; CHECK: @llvm.objc.retain(i8* %x)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK-NOT: @objc
 ; CHECK: purple:
 ; CHECK: @use_pointer
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test16a(i1 %a, i1 %b, i8* %x) {
+define void @test16a(i1 %a, i1 %b, ptr %x) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %a, label %red, label %orange
 
 red:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 orange:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 yellow:
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
   br i1 %b, label %green, label %blue
 
 green:
-  call void @llvm.objc.release(i8* %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %purple
 
 blue:
-  call void @llvm.objc.release(i8* %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %purple
 
 purple:
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test16b(
-; CHECK: @llvm.objc.retain(i8* %x)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK-NOT: @objc
 ; CHECK: purple:
 ; CHECK-NEXT: @use_pointer
 ; CHECK-NEXT: @use_pointer
 ; CHECK-NEXT: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test16b(i1 %a, i1 %b, i8* %x) {
+define void @test16b(i1 %a, i1 %b, ptr %x) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %a, label %red, label %orange
 
 red:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 orange:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 yellow:
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
   br i1 %b, label %green, label %blue
 
 green:
-  call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %purple
 
 blue:
-  call void @llvm.objc.release(i8* %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %purple
 
 purple:
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test16c(
-; CHECK: @llvm.objc.retain(i8* %x)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK-NOT: @objc
 ; CHECK: purple:
 ; CHECK: @use_pointer
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test16c(i1 %a, i1 %b, i8* %x) {
+define void @test16c(i1 %a, i1 %b, ptr %x) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %a, label %red, label %orange
 
 red:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 orange:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 yellow:
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
   br i1 %b, label %green, label %blue
 
 green:
-  call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %purple
 
 blue:
-  call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %purple
 
 purple:
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; CHECK-LABEL: define void @test16d(
-; CHECK: @llvm.objc.retain(i8* %x)
+; CHECK: @llvm.objc.retain(ptr %x)
 ; CHECK: @llvm.objc
 ; CHECK: {{^}}}
-define void @test16d(i1 %a, i1 %b, i8* %x) {
+define void @test16d(i1 %a, i1 %b, ptr %x) {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br i1 %a, label %red, label %orange
 
 red:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 orange:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
   br label %yellow
 
 yellow:
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
   br i1 %b, label %green, label %blue
 
 green:
-  call void @llvm.objc.release(i8* %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   br label %purple
 
 blue:
-  call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   br label %purple
 
 purple:
@@ -1244,9 +1171,9 @@ purple:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
 define void @test18() {
-  call i8* @llvm.objc.retain(i8* null)
-  call void @llvm.objc.release(i8* null)
-  call i8* @llvm.objc.autorelease(i8* null)
+  call ptr @llvm.objc.retain(ptr null)
+  call void @llvm.objc.release(ptr null)
+  call ptr @llvm.objc.autorelease(ptr null)
   ret void
 }
 
@@ -1256,46 +1183,40 @@ define void @test18() {
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
 define void @test18b() {
-  call i8* @llvm.objc.retain(i8* undef)
-  call void @llvm.objc.release(i8* undef)
-  call i8* @llvm.objc.autorelease(i8* undef)
+  call ptr @llvm.objc.retain(ptr undef)
+  call void @llvm.objc.release(ptr undef)
+  call ptr @llvm.objc.autorelease(ptr undef)
   ret void
 }
 
 ; Replace uses of arguments with uses of return values, to reduce
 ; register pressure.
 
-; CHECK: define void @test19(i32* %y) {
-; CHECK:   %z = bitcast i32* %y to i8*
-; CHECK:   %0 = bitcast i32* %y to i8*
-; CHECK:   %1 = tail call i8* @llvm.objc.retain(i8* %0)
-; CHECK:   call void @use_pointer(i8* %z)
-; CHECK:   call void @use_pointer(i8* %z)
-; CHECK:   %2 = bitcast i32* %y to i8*
-; CHECK:   call void @llvm.objc.release(i8* %2)
+; CHECK: define void @test19(ptr %y) {
+; CHECK:   %0 = tail call ptr @llvm.objc.retain(ptr %y)
+; CHECK:   call void @use_pointer(ptr %y)
+; CHECK:   call void @use_pointer(ptr %y)
+; CHECK:   call void @llvm.objc.release(ptr %y)
 ; CHECK:   ret void
 ; CHECK: {{^}}}
-define void @test19(i32* %y) {
+define void @test19(ptr %y) {
 entry:
-  %x = bitcast i32* %y to i8*
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %z = bitcast i32* %y to i8*
-  call void @use_pointer(i8* %z)
-  call void @use_pointer(i8* %z)
-  call void @llvm.objc.release(i8* %x)
+  %0 = call ptr @llvm.objc.retain(ptr %y) nounwind
+  call void @use_pointer(ptr %y)
+  call void @use_pointer(ptr %y)
+  call void @llvm.objc.release(ptr %y)
   ret void
 }
 
 ; Bitcast insertion
 
 ; CHECK-LABEL: define void @test20(
-; CHECK: %tmp1 = tail call i8* @llvm.objc.retain(i8* %tmp) [[NUW]]
+; CHECK: %tmp1 = tail call ptr @llvm.objc.retain(ptr %self) [[NUW]]
 ; CHECK-NEXT: invoke
 ; CHECK: {{^}}}
-define void @test20(double* %self) personality i32 (...)* @__gxx_personality_v0 {
+define void @test20(ptr %self) personality ptr @__gxx_personality_v0 {
 if.then12:
-  %tmp = bitcast double* %self to i8*
-  %tmp1 = call i8* @llvm.objc.retain(i8* %tmp) nounwind
+  %tmp1 = call ptr @llvm.objc.retain(ptr %self) nounwind
   invoke void @invokee()
           to label %invoke.cont23 unwind label %lpad20
 
@@ -1304,8 +1225,8 @@ invoke.cont23:                                    ; preds = %if.then12
           to label %if.end unwind label %lpad20
 
 lpad20:                                           ; preds = %invoke.cont23, %if.then12
-  %tmp502 = phi double* [ undef, %invoke.cont23 ], [ %self, %if.then12 ]
-  %exn = landingpad {i8*, i32}
+  %tmp502 = phi ptr [ undef, %invoke.cont23 ], [ %self, %if.then12 ]
+  %exn = landingpad {ptr, i32}
            cleanup
   unreachable
 
@@ -1316,72 +1237,68 @@ if.end:                                           ; preds = %invoke.cont23
 ; Delete a redundant retain,autorelease when forwaring a call result
 ; directly to a return value.
 
-; CHECK-LABEL: define i8* @test21(
-; CHECK: call i8* @returner()
-; CHECK-NEXT: ret i8* %call
+; CHECK-LABEL: define ptr @test21(
+; CHECK: call ptr @returner()
+; CHECK-NEXT: ret ptr %call
 ; CHECK-NEXT: }
-define i8* @test21() {
+define ptr @test21() {
 entry:
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retain(i8* %call) nounwind
-  %1 = call i8* @llvm.objc.autorelease(i8* %0) nounwind
-  ret i8* %1
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retain(ptr %call) nounwind
+  %1 = call ptr @llvm.objc.autorelease(ptr %0) nounwind
+  ret ptr %1
 }
 
 ; Move an objc call up through a phi that has null operands.
 
 ; CHECK-LABEL: define void @test22(
 ; CHECK: B:
-; CHECK:   %1 = bitcast double* %p to i8*
-; CHECK:   call void @llvm.objc.release(i8* %1)
+; CHECK:   call void @llvm.objc.release(ptr %p)
 ; CHECK:   br label %C
 ; CHECK: C:                                                ; preds = %B, %A
 ; CHECK-NOT: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test22(double* %p, i1 %a) {
+define void @test22(ptr %p, i1 %a) {
   br i1 %a, label %A, label %B
 A:
   br label %C
 B:
   br label %C
 C:
-  %h = phi double* [ null, %A ], [ %p, %B ]
-  %c = bitcast double* %h to i8*
-  call void @llvm.objc.release(i8* %c), !clang.imprecise_release !0
+  %h = phi ptr [ null, %A ], [ %p, %B ]
+  call void @llvm.objc.release(ptr %h), !clang.imprecise_release !0
   ret void
 }
 
 ; Do not move an llvm.objc.release that doesn't have the clang.imprecise_release tag.
 
 ; CHECK-LABEL: define void @test22_precise(
-; CHECK: %[[P0:.*]] = phi double*
-; CHECK: %[[V0:.*]] = bitcast double* %[[P0]] to i8*
-; CHECK: call void @llvm.objc.release(i8* %[[V0]])
+; CHECK: %[[P0:.*]] = phi ptr
+; CHECK: call void @llvm.objc.release(ptr %[[P0]])
 ; CHECK: ret void
-define void @test22_precise(double* %p, i1 %a) {
+define void @test22_precise(ptr %p, i1 %a) {
   br i1 %a, label %A, label %B
 A:
   br label %C
 B:
   br label %C
 C:
-  %h = phi double* [ null, %A ], [ %p, %B ]
-  %c = bitcast double* %h to i8*
-  call void @llvm.objc.release(i8* %c)
+  %h = phi ptr [ null, %A ], [ %p, %B ]
+  call void @llvm.objc.release(ptr %h)
   ret void
 }
 
 ; Any call can decrement a retain count.
 
 ; CHECK-LABEL: define void @test24(
-; CHECK: @llvm.objc.retain(i8* %a)
+; CHECK: @llvm.objc.retain(ptr %a)
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test24(i8* %r, i8* %a) {
-  call i8* @llvm.objc.retain(i8* %a)
-  call void @use_pointer(i8* %r)
-  %q = load i8, i8* %a
-  call void @llvm.objc.release(i8* %a)
+define void @test24(ptr %r, ptr %a) {
+  call ptr @llvm.objc.retain(ptr %a)
+  call void @use_pointer(ptr %r)
+  %q = load i8, ptr %a
+  call void @llvm.objc.release(ptr %a)
   ret void
 }
 
@@ -1390,23 +1307,23 @@ define void @test24(i8* %r, i8* %a) {
 
 ; CHECK-LABEL: define void @test25(
 ; CHECK: entry:
-; CHECK:   call i8* @llvm.objc.retain(i8* %p)
+; CHECK:   call ptr @llvm.objc.retain(ptr %p)
 ; CHECK: true:
 ; CHECK: done:
-; CHECK:   call void @llvm.objc.release(i8* %p)
+; CHECK:   call void @llvm.objc.release(ptr %p)
 ; CHECK: {{^}}}
-define void @test25(i8* %p, i1 %x) {
+define void @test25(ptr %p, i1 %x) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
   br i1 %x, label %true, label %done
 
 true:
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br label %done
 
 done:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1415,14 +1332,14 @@ done:
 
 ; CHECK-LABEL: define void @test26(
 ; CHECK: entry:
-; CHECK:   call i8* @llvm.objc.retain(i8* %p)
+; CHECK:   call ptr @llvm.objc.retain(ptr %p)
 ; CHECK: true:
 ; CHECK: done:
-; CHECK:   call void @llvm.objc.release(i8* %p)
+; CHECK:   call void @llvm.objc.release(ptr %p)
 ; CHECK: {{^}}}
-define void @test26(i8* %p, i1 %x) {
+define void @test26(ptr %p, i1 %x) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
@@ -1430,8 +1347,8 @@ true:
   br label %done
 
 done:
-  store i8 0, i8* %p
-  call void @llvm.objc.release(i8* %p)
+  store i8 0, ptr %p
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1439,24 +1356,24 @@ done:
 
 ; CHECK-LABEL: define void @test27(
 ; CHECK: entry:
-; CHECK: call i8* @llvm.objc.retain(i8* %p)
+; CHECK: call ptr @llvm.objc.retain(ptr %p)
 ; CHECK: loop:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: done:
 ; CHECK: call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test27(i8* %p, i1 %x, i1 %y) {
+define void @test27(ptr %p, i1 %x, i1 %y) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %loop, label %done
 
 loop:
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br i1 %y, label %done, label %loop
 
 done:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1465,25 +1382,25 @@ done:
 ; CHECK-LABEL: define void @test28(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: true:
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: call void @callee()
 ; CHECK: store
 ; CHECK: call void @llvm.objc.release
 ; CHECK: done:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test28(i8* %p, i1 %x) {
+define void @test28(ptr %p, i1 %x) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br label %done
 
 done:
-  call void @llvm.objc.release(i8* %p), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -1491,7 +1408,7 @@ done:
 ; unrelated memory references!
 
 ; CHECK-LABEL: define void @test28b(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: true:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: call void @callee()
@@ -1501,19 +1418,19 @@ done:
 ; CHECK: done:
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test28b(i8* %p, i1 %x, i8* noalias %t) {
+define void @test28b(ptr %p, i1 %x, ptr noalias %t) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br label %done
 
 done:
-  store i8 0, i8* %t
-  call void @llvm.objc.release(i8* %p)
+  store i8 0, ptr %t
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1523,33 +1440,33 @@ done:
 ; CHECK-LABEL: define void @test28c(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: true:
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: call void @callee()
 ; CHECK: store
-; CHECK: call void @llvm.objc.release(i8* %p) [[NUW]], !clang.imprecise_release
+; CHECK: call void @llvm.objc.release(ptr %p) [[NUW]], !clang.imprecise_release
 ; CHECK: done:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test28c(i8* %p, i1 %x, i8* noalias %t) {
+define void @test28c(ptr %p, i1 %x, ptr noalias %t) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br label %done
 
 done:
-  store i8 0, i8* %t
-  call void @llvm.objc.release(i8* %p), !clang.imprecise_release !0
+  store i8 0, ptr %t
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
 ; Like test28. but with two releases.
 
 ; CHECK-LABEL: define void @test29(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: true:
 ; CHECK: call void @callee()
 ; CHECK: store
@@ -1558,22 +1475,22 @@ done:
 ; CHECK: ohno:
 ; CHECK: call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test29(i8* %p, i1 %x, i1 %y) {
+define void @test29(ptr %p, i1 %x, i1 %y) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br i1 %y, label %done, label %ohno
 
 done:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 
 ohno:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1581,7 +1498,7 @@ ohno:
 ; with an extra release.
 
 ; CHECK-LABEL: define void @test30(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: true:
 ; CHECK: call void @callee()
 ; CHECK: store
@@ -1591,32 +1508,32 @@ ohno:
 ; CHECK: ohno:
 ; CHECK: call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test30(i8* %p, i1 %x, i1 %y, i1 %z) {
+define void @test30(ptr %p, i1 %x, i1 %y, i1 %z) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %false
 
 true:
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br i1 %y, label %done, label %ohno
 
 false:
   br i1 %z, label %done, label %ohno
 
 done:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 
 ohno:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; Basic case with a mergeable release.
 
 ; CHECK-LABEL: define void @test31(
-; CHECK: call i8* @llvm.objc.retain(i8* %p)
+; CHECK: call ptr @llvm.objc.retain(ptr %p)
 ; CHECK: call void @callee()
 ; CHECK: store
 ; CHECK: true:
@@ -1625,71 +1542,67 @@ ohno:
 ; CHECK: call void @llvm.objc.release
 ; CHECK: ret void
 ; CHECK: {{^}}}
-define void @test31(i8* %p, i1 %x) {
+define void @test31(ptr %p, i1 %x) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br i1 %x, label %true, label %false
 true:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 false:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; Don't consider bitcasts or getelementptrs direct uses.
 
 ; CHECK-LABEL: define void @test32(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: true:
 ; CHECK: call void @callee()
 ; CHECK: store
 ; CHECK: done:
 ; CHECK: call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test32(i8* %p, i1 %x) {
+define void @test32(ptr %p, i1 %x) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
   call void @callee()
-  store i8 0, i8* %p
+  store i8 0, ptr %p
   br label %done
 
 done:
-  %g = bitcast i8* %p to i8*
-  %h = getelementptr i8, i8* %g, i64 0
-  call void @llvm.objc.release(i8* %g)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; Do consider icmps to be direct uses.
 
 ; CHECK-LABEL: define void @test33(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: true:
 ; CHECK: call void @callee()
 ; CHECK: icmp
 ; CHECK: done:
 ; CHECK: call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test33(i8* %p, i1 %x, i8* %y) {
+define void @test33(ptr %p, i1 %x, ptr %y) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
   call void @callee()
-  %v = icmp eq i8* %p, %y
+  %v = icmp eq ptr %p, %y
   br label %done
 
 done:
-  %g = bitcast i8* %p to i8*
-  %h = getelementptr i8, i8* %g, i64 0
-  call void @llvm.objc.release(i8* %g)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1697,14 +1610,14 @@ done:
 ; releases.
 
 ; CHECK-LABEL: define void @test34a(
-; CHECK:   call i8* @llvm.objc.retain
+; CHECK:   call ptr @llvm.objc.retain
 ; CHECK: true:
 ; CHECK: done:
 ; CHECK: call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test34a(i8* %p, i1 %x, i8* %y) {
+define void @test34a(ptr %p, i1 %x, ptr %y) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
@@ -1712,18 +1625,16 @@ true:
   br label %done
 
 done:
-  %g = bitcast i8* %p to i8*
-  %h = getelementptr i8, i8* %g, i64 0
-  call void @llvm.objc.release(i8* %g)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; CHECK-LABEL: define void @test34b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test34b(i8* %p, i1 %x, i8* %y) {
+define void @test34b(ptr %p, i1 %x, ptr %y) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
@@ -1731,9 +1642,7 @@ true:
   br label %done
 
 done:
-  %g = bitcast i8* %p to i8*
-  %h = getelementptr i8, i8* %g, i64 0
-  call void @llvm.objc.release(i8* %g), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -1744,24 +1653,22 @@ done:
 ; Precise.
 ; CHECK-LABEL: define void @test35a(
 ; CHECK: entry:
-; CHECK:   call i8* @llvm.objc.retain
+; CHECK:   call ptr @llvm.objc.retain
 ; CHECK: true:
 ; CHECK: done:
 ; CHECK:   call void @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test35a(i8* %p, i1 %x, i8* %y) {
+define void @test35a(ptr %p, i1 %x, ptr %y) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
-  %v = icmp eq i8* %p, %y
+  %v = icmp eq ptr %p, %y
   br label %done
 
 done:
-  %g = bitcast i8* %p to i8*
-  %h = getelementptr i8, i8* %g, i64 0
-  call void @llvm.objc.release(i8* %g)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1769,19 +1676,17 @@ done:
 ; CHECK-LABEL: define void @test35b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test35b(i8* %p, i1 %x, i8* %y) {
+define void @test35b(ptr %p, i1 %x, ptr %y) {
 entry:
-  %f0 = call i8* @llvm.objc.retain(i8* %p)
+  %f0 = call ptr @llvm.objc.retain(ptr %p)
   br i1 %x, label %true, label %done
 
 true:
-  %v = icmp eq i8* %p, %y
+  %v = icmp eq ptr %p, %y
   br label %done
 
 done:
-  %g = bitcast i8* %p to i8*
-  %h = getelementptr i8, i8* %g, i64 0
-  call void @llvm.objc.release(i8* %g), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -1794,12 +1699,12 @@ done:
 ; CHECK: call void @callee()
 ; CHECK: @llvm.objc.release
 ; CHECK: {{^}}}
-define void @test36a(i8* %p) {
+define void @test36a(ptr %p) {
 entry:
-  call i8* @llvm.objc.retain(i8* %p)
+  call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
   call void @callee()
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1808,12 +1713,12 @@ entry:
 ; CHECK-LABEL: define void @test36b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test36b(i8* %p) {
+define void @test36b(ptr %p) {
 entry:
-  call i8* @llvm.objc.retain(i8* %p)
+  call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
   call void @callee()
-  call void @llvm.objc.release(i8* %p), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -1822,9 +1727,9 @@ entry:
 ; CHECK-LABEL: define void @test38(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test38(i8* %p, i1 %u, i1 %m, i8* %z, i8* %y, i8* %x, i8* %w) {
+define void @test38(ptr %p, i1 %u, i1 %m, ptr %z, ptr %y, ptr %x, ptr %w) {
 entry:
-  call i8* @llvm.objc.retain(i8* %p)
+  call ptr @llvm.objc.retain(ptr %p)
   br i1 %u, label %true, label %false
 true:
   br i1 %m, label %a, label %b
@@ -1839,15 +1744,15 @@ c:
 d:
   br label %f
 e:
-  %j = phi i8* [ %z, %a ], [ %y, %b ]
+  %j = phi ptr [ %z, %a ], [ %y, %b ]
   br label %g
 f:
-  %k = phi i8* [ %w, %c ], [ %x, %d ]
+  %k = phi ptr [ %w, %c ], [ %x, %d ]
   br label %g
 g:
-  %h = phi i8* [ %j, %e ], [ %k, %f ]
-  call void @use_pointer(i8* %h)
-  call void @llvm.objc.release(i8* %p), !clang.imprecise_release !0
+  %h = phi ptr [ %j, %e ], [ %k, %f ]
+  call void @use_pointer(ptr %h)
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -1856,16 +1761,16 @@ g:
 ; CHECK-LABEL: define void @test39(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test39(i8* %p) {
+define void @test39(ptr %p) {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %p)
+  %0 = call ptr @llvm.objc.retain(ptr %p)
   br label %loop
 
 loop:                                             ; preds = %loop, %entry
   br i1 undef, label %loop, label %exit
 
 exit:                                             ; preds = %loop
-  call void @llvm.objc.release(i8* %0), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0), !clang.imprecise_release !0
   ret void
 }
 
@@ -1874,17 +1779,17 @@ exit:                                             ; preds = %loop
 ; CHECK-LABEL: define void @test39b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test39b(i8* %p) {
+define void @test39b(ptr %p) {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %p)
+  %0 = call ptr @llvm.objc.retain(ptr %p)
   br label %loop
 
 loop:                                             ; preds = %loop, %entry
-  store i8 0, i8* %0
+  store i8 0, ptr %0
   br i1 undef, label %loop, label %exit
 
 exit:                                             ; preds = %loop
-  call void @llvm.objc.release(i8* %0), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0), !clang.imprecise_release !0
   ret void
 }
 
@@ -1893,17 +1798,17 @@ exit:                                             ; preds = %loop
 ; CHECK-LABEL: define void @test39c(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test39c(i8* %p) {
+define void @test39c(ptr %p) {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %p)
+  %0 = call ptr @llvm.objc.retain(ptr %p)
   br label %loop
 
 loop:                                             ; preds = %loop, %entry
-  call void @use_pointer(i8* %0)
+  call void @use_pointer(ptr %0)
   br i1 undef, label %loop, label %exit
 
 exit:                                             ; preds = %loop
-  call void @llvm.objc.release(i8* %0), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0), !clang.imprecise_release !0
   ret void
 }
 
@@ -1913,17 +1818,17 @@ exit:                                             ; preds = %loop
 ; CHECK-LABEL: define void @test40(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test40(i8* %p) {
+define void @test40(ptr %p) {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %p)
+  %0 = call ptr @llvm.objc.retain(ptr %p)
   br label %loop
 
 loop:                                             ; preds = %loop, %entry
-  call void @use_pointer(i8* %0)
+  call void @use_pointer(ptr %0)
   br i1 undef, label %exit, label %loop
 
 exit:                                             ; preds = %loop
-  call void @llvm.objc.release(i8* %0), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0), !clang.imprecise_release !0
   ret void
 }
 
@@ -1932,26 +1837,26 @@ exit:                                             ; preds = %loop
 
 ; CHECK-LABEL: define void @test42(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.autorelease(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call void @llvm.objc.release(i8* %p)
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.autorelease(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call void @llvm.objc.release(ptr %p)
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test42(i8* %p) {
+define void @test42(ptr %p) {
 entry:
-  call i8* @llvm.objc.retain(i8* %p)
-  call i8* @llvm.objc.autorelease(i8* %p)
-  call i8* @llvm.objc.retain(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @llvm.objc.release(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @llvm.objc.release(i8* %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  call ptr @llvm.objc.autorelease(ptr %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @llvm.objc.release(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1960,24 +1865,24 @@ entry:
 
 ; CHECK-LABEL: define void @test43(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.autorelease(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.retain
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call void @llvm.objc.autoreleasePoolPop(i8* undef)
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.autorelease(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.retain
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call void @llvm.objc.autoreleasePoolPop(ptr undef)
 ; CHECK-NEXT: call void @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test43(i8* %p) {
+define void @test43(ptr %p) {
 entry:
-  call i8* @llvm.objc.retain(i8* %p)
-  call i8* @llvm.objc.autorelease(i8* %p)
-  call i8* @llvm.objc.retain(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @llvm.objc.autoreleasePoolPop(i8* undef)
-  call void @llvm.objc.release(i8* %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  call ptr @llvm.objc.autorelease(ptr %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @llvm.objc.autoreleasePoolPop(ptr undef)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -1986,26 +1891,26 @@ entry:
 
 ; CHECK-LABEL: define void @test43b(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.autorelease(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.autoreleasePoolPush()
-; CHECK-NEXT: call void @use_pointer(i8* %p)
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.autorelease(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.autoreleasePoolPush()
+; CHECK-NEXT: call void @use_pointer(ptr %p)
 ; CHECK-NEXT: call void @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test43b(i8* %p) {
+define void @test43b(ptr %p) {
 entry:
-  call i8* @llvm.objc.retain(i8* %p)
-  call i8* @llvm.objc.autorelease(i8* %p)
-  call i8* @llvm.objc.retain(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @use_pointer(i8* %p)
-  call i8* @llvm.objc.autoreleasePoolPush()
-  call void @llvm.objc.release(i8* %p)
-  call void @use_pointer(i8* %p)
-  call void @llvm.objc.release(i8* %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  call ptr @llvm.objc.autorelease(ptr %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @use_pointer(ptr %p)
+  call ptr @llvm.objc.autoreleasePoolPush()
+  call void @llvm.objc.release(ptr %p)
+  call void @use_pointer(ptr %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -2014,10 +1919,10 @@ entry:
 ; CHECK-LABEL: define void @test44(
 ; CHECK-NOT: llvm.objc.
 ; CHECK: {{^}}}
-define void @test44(i8** %pp) {
-  %p = load i8*, i8** %pp
-  %q = call i8* @llvm.objc.retain(i8* %p)
-  call void @llvm.objc.release(i8* %q)
+define void @test44(ptr %pp) {
+  %p = load ptr, ptr %pp
+  %q = call ptr @llvm.objc.retain(ptr %p)
+  call void @llvm.objc.release(ptr %q)
   ret void
 }
 
@@ -2025,36 +1930,36 @@ define void @test44(i8** %pp) {
 ; may-alias llvm.objc.release between them.
 
 ; CHECK-LABEL: define void @test45(
-; CHECK: call i8* @llvm.objc.retain(i8* %p)
-; CHECK: call void @llvm.objc.release(i8* %q)
-; CHECK: call void @use_pointer(i8* %p)
-; CHECK: call void @llvm.objc.release(i8* %p)
+; CHECK: call ptr @llvm.objc.retain(ptr %p)
+; CHECK: call void @llvm.objc.release(ptr %q)
+; CHECK: call void @use_pointer(ptr %p)
+; CHECK: call void @llvm.objc.release(ptr %p)
 ; CHECK: {{^}}}
-define void @test45(i8** %pp, i8** %qq) {
-  %p = load i8*, i8** %pp
-  %q = load i8*, i8** %qq
-  call i8* @llvm.objc.retain(i8* %p)
-  call void @llvm.objc.release(i8* %q)
-  call void @use_pointer(i8* %p)
-  call void @llvm.objc.release(i8* %p)
+define void @test45(ptr %pp, ptr %qq) {
+  %p = load ptr, ptr %pp
+  %q = load ptr, ptr %qq
+  call ptr @llvm.objc.retain(ptr %p)
+  call void @llvm.objc.release(ptr %q)
+  call void @use_pointer(ptr %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; Don't delete retain and autorelease here.
 
 ; CHECK-LABEL: define void @test46(
-; CHECK: tail call i8* @llvm.objc.retain(i8* %p) [[NUW]]
+; CHECK: tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
 ; CHECK: true:
-; CHECK: call i8* @llvm.objc.autorelease(i8* %p) [[NUW]]
+; CHECK: call ptr @llvm.objc.autorelease(ptr %p) [[NUW]]
 ; CHECK: {{^}}}
-define void @test46(i8* %p, i1 %a) {
+define void @test46(ptr %p, i1 %a) {
 entry:
-  call i8* @llvm.objc.retain(i8* %p)
+  call ptr @llvm.objc.retain(ptr %p)
   br i1 %a, label %true, label %false
 
 true:
-  call i8* @llvm.objc.autorelease(i8* %p)
-  call void @use_pointer(i8* %p)
+  call ptr @llvm.objc.autorelease(ptr %p)
+  call void @use_pointer(ptr %p)
   ret void
 
 false:
@@ -2063,63 +1968,63 @@ false:
 
 ; Delete no-op cast calls.
 
-; CHECK-LABEL: define i8* @test47(
+; CHECK-LABEL: define ptr @test47(
 ; CHECK-NOT: call
-; CHECK: ret i8* %p
+; CHECK: ret ptr %p
 ; CHECK: {{^}}}
-define i8* @test47(i8* %p) nounwind {
-  %x = call i8* @llvm.objc.retainedObject(i8* %p)
-  ret i8* %x
+define ptr @test47(ptr %p) nounwind {
+  %x = call ptr @llvm.objc.retainedObject(ptr %p)
+  ret ptr %x
 }
 
 ; Delete no-op cast calls.
 
-; CHECK-LABEL: define i8* @test48(
+; CHECK-LABEL: define ptr @test48(
 ; CHECK-NOT: call
-; CHECK: ret i8* %p
+; CHECK: ret ptr %p
 ; CHECK: {{^}}}
-define i8* @test48(i8* %p) nounwind {
-  %x = call i8* @llvm.objc.unretainedObject(i8* %p)
-  ret i8* %x
+define ptr @test48(ptr %p) nounwind {
+  %x = call ptr @llvm.objc.unretainedObject(ptr %p)
+  ret ptr %x
 }
 
 ; Delete no-op cast calls.
 
-; CHECK-LABEL: define i8* @test49(
+; CHECK-LABEL: define ptr @test49(
 ; CHECK-NOT: call
-; CHECK: ret i8* %p
+; CHECK: ret ptr %p
 ; CHECK: {{^}}}
-define i8* @test49(i8* %p) nounwind {
-  %x = call i8* @llvm.objc.unretainedPointer(i8* %p)
-  ret i8* %x
+define ptr @test49(ptr %p) nounwind {
+  %x = call ptr @llvm.objc.unretainedPointer(ptr %p)
+  ret ptr %x
 }
 
 ; Do delete retain+release with intervening stores of the address value if we
 ; have imprecise release attached to llvm.objc.release.
 
 ; CHECK-LABEL:      define void @test50a(
-; CHECK-NEXT:   call i8* @llvm.objc.retain
+; CHECK-NEXT:   call ptr @llvm.objc.retain
 ; CHECK-NEXT:   call void @callee
 ; CHECK-NEXT:   store
 ; CHECK-NEXT:   call void @llvm.objc.release
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test50a(i8* %p, i8** %pp) {
-  call i8* @llvm.objc.retain(i8* %p)
+define void @test50a(ptr %p, ptr %pp) {
+  call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  store i8* %p, i8** %pp
-  call void @llvm.objc.release(i8* %p)
+  store ptr %p, ptr %pp
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; CHECK-LABEL: define void @test50b(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test50b(i8* %p, i8** %pp) {
-  call i8* @llvm.objc.retain(i8* %p)
+define void @test50b(ptr %p, ptr %pp) {
+  call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  store i8* %p, i8** %pp
-  call void @llvm.objc.release(i8* %p), !clang.imprecise_release !0
+  store ptr %p, ptr %pp
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -2128,28 +2033,28 @@ define void @test50b(i8* %p, i8** %pp) {
 ; address value.
 
 ; CHECK-LABEL: define void @test51a(
-; CHECK: call i8* @llvm.objc.retain(i8* %p)
-; CHECK: call void @llvm.objc.release(i8* %p)
+; CHECK: call ptr @llvm.objc.retain(ptr %p)
+; CHECK: call void @llvm.objc.release(ptr %p)
 ; CHECK: ret void
 ; CHECK: {{^}}}
-define void @test51a(i8* %p) {
-  call i8* @llvm.objc.retain(i8* %p)
+define void @test51a(ptr %p) {
+  call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  store i8 0, i8* %p
-  call void @llvm.objc.release(i8* %p)
+  store i8 0, ptr %p
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; CHECK-LABEL: define void @test51b(
-; CHECK: call i8* @llvm.objc.retain(i8* %p)
-; CHECK: call void @llvm.objc.release(i8* %p)
+; CHECK: call ptr @llvm.objc.retain(ptr %p)
+; CHECK: call void @llvm.objc.release(ptr %p)
 ; CHECK: ret void
 ; CHECK: {{^}}}
-define void @test51b(i8* %p) {
-  call i8* @llvm.objc.retain(i8* %p)
+define void @test51b(ptr %p) {
+  call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  store i8 0, i8* %p
-  call void @llvm.objc.release(i8* %p), !clang.imprecise_release !0
+  store i8 0, ptr %p
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -2157,36 +2062,36 @@ define void @test51b(i8* %p) {
 ; unknown provenance.
 
 ; CHECK-LABEL: define void @test52a(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: call void @callee()
-; CHECK: call void @use_pointer(i8* %z)
+; CHECK: call void @use_pointer(ptr %z)
 ; CHECK: call void @llvm.objc.release
 ; CHECK: ret void
 ; CHECK: {{^}}}
-define void @test52a(i8** %zz, i8** %pp) {
-  %p = load i8*, i8** %pp
-  %1 = call i8* @llvm.objc.retain(i8* %p)
+define void @test52a(ptr %zz, ptr %pp) {
+  %p = load ptr, ptr %pp
+  %1 = call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  %z = load i8*, i8** %zz
-  call void @use_pointer(i8* %z)
-  call void @llvm.objc.release(i8* %p)
+  %z = load ptr, ptr %zz
+  call void @use_pointer(ptr %z)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; CHECK-LABEL: define void @test52b(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: call void @callee()
-; CHECK: call void @use_pointer(i8* %z)
+; CHECK: call void @use_pointer(ptr %z)
 ; CHECK: call void @llvm.objc.release
 ; CHECK: ret void
 ; CHECK: {{^}}}
-define void @test52b(i8** %zz, i8** %pp) {
-  %p = load i8*, i8** %pp
-  %1 = call i8* @llvm.objc.retain(i8* %p)
+define void @test52b(ptr %zz, ptr %pp) {
+  %p = load ptr, ptr %pp
+  %1 = call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  %z = load i8*, i8** %zz
-  call void @use_pointer(i8* %z)
-  call void @llvm.objc.release(i8* %p), !clang.imprecise_release !0
+  %z = load ptr, ptr %zz
+  call void @use_pointer(ptr %z)
+  call void @llvm.objc.release(ptr %p), !clang.imprecise_release !0
   ret void
 }
 
@@ -2198,26 +2103,26 @@ define void @test52b(i8** %zz, i8** %pp) {
 ; CHECK-LABEL: define void @test53(
 ; CHECK: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test53(void ()** %zz, i8** %pp) {
-  %p = load i8*, i8** %pp
-  %1 = call i8* @llvm.objc.retain(i8* %p)
+define void @test53(ptr %zz, ptr %pp) {
+  %p = load ptr, ptr %pp
+  %1 = call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
-  %z = load void ()*, void ()** %zz
-  call void @callee_fnptr(void ()* %z)
-  call void @llvm.objc.release(i8* %p)
+  %z = load ptr, ptr %zz
+  call void @callee_fnptr(ptr %z)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
 ; Convert autorelease to release if the value is unused.
 
 ; CHECK-LABEL: define void @test54(
-; CHECK: call i8* @returner()
-; CHECK-NEXT: call void @llvm.objc.release(i8* %t) [[NUW]], !clang.imprecise_release ![[RELEASE]]
+; CHECK: call ptr @returner()
+; CHECK-NEXT: call void @llvm.objc.release(ptr %t) [[NUW]], !clang.imprecise_release ![[RELEASE]]
 ; CHECK-NEXT: ret void
 ; CHECK: {{^}}}
 define void @test54() {
-  %t = call i8* @returner()
-  call i8* @llvm.objc.autorelease(i8* %t)
+  %t = call ptr @returner()
+  call ptr @llvm.objc.autorelease(ptr %t)
   ret void
 }
 
@@ -2226,12 +2131,12 @@ define void @test54() {
 ; CHECK-LABEL: define void @test55(
 ; CHECK-NOT: @objc
 ; CHECK: {{^}}}
-define void @test55(i8* %x) {
+define void @test55(ptr %x) {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %1 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %1 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -2243,30 +2148,30 @@ entry:
 ; CHECK-LABEL: define void @test56(
 ; CHECK-NOT: @objc
 ; CHECK: if.then:
-; CHECK-NEXT: %0 = tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK-NEXT: tail call void @use_pointer(i8* %x)
-; CHECK-NEXT: tail call void @use_pointer(i8* %x)
-; CHECK-NEXT: tail call void @llvm.objc.release(i8* %x) [[NUW]], !clang.imprecise_release ![[RELEASE]]
+; CHECK-NEXT: %0 = tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK-NEXT: tail call void @use_pointer(ptr %x)
+; CHECK-NEXT: tail call void @use_pointer(ptr %x)
+; CHECK-NEXT: tail call void @llvm.objc.release(ptr %x) [[NUW]], !clang.imprecise_release ![[RELEASE]]
 ; CHECK-NEXT: br label %if.end
 ; CHECK-NOT: @objc
 ; CHECK: {{^}}}
-define void @test56(i8* %x, i32 %n) {
+define void @test56(ptr %x, i32 %n) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %x) nounwind
-  %1 = tail call i8* @llvm.objc.retain(i8* %0) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %x) nounwind
+  %1 = tail call ptr @llvm.objc.retain(ptr %0) nounwind
   %tobool = icmp eq i32 %n, 0
   br i1 %tobool, label %if.end, label %if.then
 
 if.then:                                          ; preds = %entry
-  %2 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
-  tail call void @use_pointer(i8* %2)
-  tail call void @use_pointer(i8* %2)
-  tail call void @llvm.objc.release(i8* %2) nounwind, !clang.imprecise_release !0
+  %2 = tail call ptr @llvm.objc.retain(ptr %1) nounwind
+  tail call void @use_pointer(ptr %2)
+  tail call void @use_pointer(ptr %2)
+  tail call void @llvm.objc.release(ptr %2) nounwind, !clang.imprecise_release !0
   br label %if.end
 
 if.end:                                           ; preds = %entry, %if.then
-  tail call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
-  tail call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %1) nounwind, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -2276,26 +2181,26 @@ if.end:                                           ; preds = %entry, %if.then
 
 ; CHECK-LABEL:      define void @test57(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
-; CHECK-NEXT:   tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
-; CHECK-NEXT:   call void @llvm.objc.release(i8* %x) [[NUW]]
+; CHECK-NEXT:   tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
+; CHECK-NEXT:   tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
+; CHECK-NEXT:   call void @llvm.objc.release(ptr %x) [[NUW]]
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test57(i8* %x) nounwind {
+define void @test57(ptr %x) nounwind {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -2305,19 +2210,19 @@ entry:
 ; CHECK-LABEL:      define void @test58(
 ; CHECK-NEXT: entry:
 ; CHECK-NEXT:   @llvm.objc.retain
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test58(i8* %x) nounwind {
+define void @test58(ptr %x) nounwind {
 entry:
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
-  call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
+  call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -2325,58 +2230,58 @@ entry:
 
 ; CHECK-LABEL:      define void @test59(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %0 = tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
-; CHECK-NEXT:   call void @llvm.objc.release(i8* %x) [[NUW]]
+; CHECK-NEXT:   %0 = tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
+; CHECK-NEXT:   call void @llvm.objc.release(ptr %x) [[NUW]]
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test59(i8* %x) nounwind {
+define void @test59(ptr %x) nounwind {
 entry:
-  %a = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
-  %b = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call void @use_pointer(i8* %x)
-  call void @llvm.objc.release(i8* %x) nounwind
+  %a = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
+  %b = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call void @use_pointer(ptr %x)
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; Constant pointers to objects don't need reference counting.
 
- at constptr = external constant i8*
- at something = external global i8*
+ at constptr = external constant ptr
+ at something = external global ptr
 
 ; We have a precise lifetime retain/release here. We can not remove them since
 ; @something is not constant.
 
 ; CHECK-LABEL: define void @test60a(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: call void @llvm.objc.release
 ; CHECK: {{^}}}
 define void @test60a() {
-  %t = load i8*, i8** @constptr
-  %s = load i8*, i8** @something
-  call i8* @llvm.objc.retain(i8* %s)
+  %t = load ptr, ptr @constptr
+  %s = load ptr, ptr @something
+  call ptr @llvm.objc.retain(ptr %s)
   call void @callee()
-  call void @use_pointer(i8* %t)
-  call void @llvm.objc.release(i8* %s)
+  call void @use_pointer(ptr %t)
+  call void @llvm.objc.release(ptr %s)
   ret void
 }
 
 ; CHECK-LABEL: define void @test60b(
-; CHECK: call i8* @llvm.objc.retain
-; CHECK-NOT: call i8* @llvm.objc.retain
-; CHECK-NOT: call i8* @llvm.objc.release
+; CHECK: call ptr @llvm.objc.retain
+; CHECK-NOT: call ptr @llvm.objc.retain
+; CHECK-NOT: call ptr @llvm.objc.release
 ; CHECK: {{^}}}
 define void @test60b() {
-  %t = load i8*, i8** @constptr
-  %s = load i8*, i8** @something
-  call i8* @llvm.objc.retain(i8* %t)
-  call i8* @llvm.objc.retain(i8* %t)
+  %t = load ptr, ptr @constptr
+  %s = load ptr, ptr @something
+  call ptr @llvm.objc.retain(ptr %t)
+  call ptr @llvm.objc.retain(ptr %t)
   call void @callee()
-  call void @use_pointer(i8* %s)
-  call void @llvm.objc.release(i8* %t)
+  call void @use_pointer(ptr %s)
+  call void @llvm.objc.release(ptr %t)
   ret void
 }
 
@@ -2384,12 +2289,12 @@ define void @test60b() {
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
 define void @test60c() {
-  %t = load i8*, i8** @constptr
-  %s = load i8*, i8** @something
-  call i8* @llvm.objc.retain(i8* %t)
+  %t = load ptr, ptr @constptr
+  %s = load ptr, ptr @something
+  call ptr @llvm.objc.retain(ptr %t)
   call void @callee()
-  call void @use_pointer(i8* %s)
-  call void @llvm.objc.release(i8* %t), !clang.imprecise_release !0
+  call void @use_pointer(ptr %s)
+  call void @llvm.objc.release(ptr %t), !clang.imprecise_release !0
   ret void
 }
 
@@ -2397,12 +2302,12 @@ define void @test60c() {
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
 define void @test60d() {
-  %t = load i8*, i8** @constptr
-  %s = load i8*, i8** @something
-  call i8* @llvm.objc.retain(i8* %t)
+  %t = load ptr, ptr @constptr
+  %s = load ptr, ptr @something
+  call ptr @llvm.objc.retain(ptr %t)
   call void @callee()
-  call void @use_pointer(i8* %s)
-  call void @llvm.objc.release(i8* %t)
+  call void @use_pointer(ptr %s)
+  call void @llvm.objc.release(ptr %t)
   ret void
 }
 
@@ -2410,12 +2315,12 @@ define void @test60d() {
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
 define void @test60e() {
-  %t = load i8*, i8** @constptr
-  %s = load i8*, i8** @something
-  call i8* @llvm.objc.retain(i8* %t)
+  %t = load ptr, ptr @constptr
+  %s = load ptr, ptr @something
+  call ptr @llvm.objc.retain(ptr %t)
   call void @callee()
-  call void @use_pointer(i8* %s)
-  call void @llvm.objc.release(i8* %t), !clang.imprecise_release !0
+  call void @use_pointer(ptr %s)
+  call void @llvm.objc.release(ptr %t), !clang.imprecise_release !0
   ret void
 }
 
@@ -2426,11 +2331,11 @@ define void @test60e() {
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
 define void @test61() {
-  %t = load i8*, i8** @constptr
-  call i8* @llvm.objc.retain(i8* %t)
+  %t = load ptr, ptr @constptr
+  call ptr @llvm.objc.retain(ptr %t)
   call void @callee()
-  call void @use_pointer(i8* %t)
-  call void @llvm.objc.release(i8* %t)
+  call void @use_pointer(ptr %t)
+  call void @llvm.objc.release(ptr %t)
   ret void
 }
 
@@ -2440,21 +2345,21 @@ define void @test61() {
 ; CHECK-LABEL: define void @test62(
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: {{^}}}
-define void @test62(i8* %x, i1* %p) nounwind {
+define void @test62(ptr %x, ptr %p) nounwind {
 entry:
   br label %loop
 
 loop:
-  call i8* @llvm.objc.retain(i8* %x)
-  %q = load i1, i1* %p
+  call ptr @llvm.objc.retain(ptr %x)
+  %q = load i1, ptr %p
   br i1 %q, label %loop.more, label %exit
 
 loop.more:
-  call void @llvm.objc.release(i8* %x)
+  call void @llvm.objc.release(ptr %x)
   br label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %x)
+  call void @llvm.objc.release(ptr %x)
   ret void
 }
 
@@ -2463,21 +2368,21 @@ exit:
 
 ; CHECK-LABEL: define void @test63(
 ; CHECK: loop:
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %x)
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %x)
 ; CHECK: loop.more:
-; CHECK:   call void @llvm.objc.release(i8* %x)
+; CHECK:   call void @llvm.objc.release(ptr %x)
 ; CHECK: {{^}}}
-define void @test63(i8* %x, i1* %p) nounwind {
+define void @test63(ptr %x, ptr %p) nounwind {
 entry:
   br label %loop
 
 loop:
-  call i8* @llvm.objc.retain(i8* %x)
-  %q = load i1, i1* %p
+  call ptr @llvm.objc.retain(ptr %x)
+  %q = load i1, ptr %p
   br i1 %q, label %loop.more, label %exit
 
 loop.more:
-  call void @llvm.objc.release(i8* %x)
+  call void @llvm.objc.release(ptr %x)
   br label %loop
 
 exit:
@@ -2489,130 +2394,130 @@ exit:
 
 ; CHECK-LABEL: define void @test64(
 ; CHECK: loop:
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %x)
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %x)
 ; CHECK: exit:
-; CHECK:   call void @llvm.objc.release(i8* %x)
+; CHECK:   call void @llvm.objc.release(ptr %x)
 ; CHECK: {{^}}}
-define void @test64(i8* %x, i1* %p) nounwind {
+define void @test64(ptr %x, ptr %p) nounwind {
 entry:
   br label %loop
 
 loop:
-  call i8* @llvm.objc.retain(i8* %x)
-  %q = load i1, i1* %p
+  call ptr @llvm.objc.retain(ptr %x)
+  %q = load i1, ptr %p
   br i1 %q, label %loop.more, label %exit
 
 loop.more:
   br label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %x)
+  call void @llvm.objc.release(ptr %x)
   ret void
 }
 
 ; Move an autorelease past a phi with a null.
 
-; CHECK-LABEL: define i8* @test65(
+; CHECK-LABEL: define ptr @test65(
 ; CHECK: if.then:
-; CHECK:   call i8* @llvm.objc.autorelease(
+; CHECK:   call ptr @llvm.objc.autorelease(
 ; CHECK: return:
 ; CHECK-NOT: @llvm.objc.autorelease
 ; CHECK: {{^}}}
-define i8* @test65(i1 %x) {
+define ptr @test65(i1 %x) {
 entry:
   br i1 %x, label %return, label %if.then
 
 if.then:                                          ; preds = %entry
-  %c = call i8* @returner()
-  %s = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %c) nounwind
+  %c = call ptr @returner()
+  %s = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %c) nounwind
   br label %return
 
 return:                                           ; preds = %if.then, %entry
-  %retval = phi i8* [ %s, %if.then ], [ null, %entry ]
-  %q = call i8* @llvm.objc.autorelease(i8* %retval) nounwind
-  ret i8* %retval
+  %retval = phi ptr [ %s, %if.then ], [ null, %entry ]
+  %q = call ptr @llvm.objc.autorelease(ptr %retval) nounwind
+  ret ptr %retval
 }
 
 ; Don't move an autorelease past an autorelease pool boundary.
 
-; CHECK-LABEL: define i8* @test65b(
+; CHECK-LABEL: define ptr @test65b(
 ; CHECK: if.then:
 ; CHECK-NOT: @llvm.objc.autorelease
 ; CHECK: return:
-; CHECK:   call i8* @llvm.objc.autorelease(
+; CHECK:   call ptr @llvm.objc.autorelease(
 ; CHECK: {{^}}}
-define i8* @test65b(i1 %x) {
+define ptr @test65b(i1 %x) {
 entry:
-  %t = call i8* @llvm.objc.autoreleasePoolPush()
+  %t = call ptr @llvm.objc.autoreleasePoolPush()
   br i1 %x, label %return, label %if.then
 
 if.then:                                          ; preds = %entry
-  %c = call i8* @returner()
-  %s = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %c) nounwind
+  %c = call ptr @returner()
+  %s = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %c) nounwind
   br label %return
 
 return:                                           ; preds = %if.then, %entry
-  %retval = phi i8* [ %s, %if.then ], [ null, %entry ]
-  call void @llvm.objc.autoreleasePoolPop(i8* %t)
-  %q = call i8* @llvm.objc.autorelease(i8* %retval) nounwind
-  ret i8* %retval
+  %retval = phi ptr [ %s, %if.then ], [ null, %entry ]
+  call void @llvm.objc.autoreleasePoolPop(ptr %t)
+  %q = call ptr @llvm.objc.autorelease(ptr %retval) nounwind
+  ret ptr %retval
 }
 
 ; Don't move an autoreleaseReuturnValue, which would break
 ; the RV optimization.
 
-; CHECK-LABEL: define i8* @test65c(
+; CHECK-LABEL: define ptr @test65c(
 ; CHECK: if.then:
 ; CHECK-NOT: @llvm.objc.autorelease
 ; CHECK: return:
-; CHECK:   call i8* @llvm.objc.autoreleaseReturnValue(
+; CHECK:   call ptr @llvm.objc.autoreleaseReturnValue(
 ; CHECK: {{^}}}
-define i8* @test65c(i1 %x) {
+define ptr @test65c(i1 %x) {
 entry:
   br i1 %x, label %return, label %if.then
 
 if.then:                                          ; preds = %entry
-  %c = call i8* @returner()
-  %s = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %c) nounwind
+  %c = call ptr @returner()
+  %s = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %c) nounwind
   br label %return
 
 return:                                           ; preds = %if.then, %entry
-  %retval = phi i8* [ %s, %if.then ], [ null, %entry ]
-  %q = call i8* @llvm.objc.autoreleaseReturnValue(i8* %retval) nounwind
-  ret i8* %retval
+  %retval = phi ptr [ %s, %if.then ], [ null, %entry ]
+  %q = call ptr @llvm.objc.autoreleaseReturnValue(ptr %retval) nounwind
+  ret ptr %retval
 }
 
-; CHECK-LABEL: define i8* @test65d(
+; CHECK-LABEL: define ptr @test65d(
 ; CHECK: if.then:
 ; CHECK-NOT: @llvm.objc.autorelease
 ; CHECK: return:
-; CHECK:   call i8* @llvm.objc.autoreleaseReturnValue(
+; CHECK:   call ptr @llvm.objc.autoreleaseReturnValue(
 ; CHECK: {{^}}}
-define i8* @test65d(i1 %x) {
+define ptr @test65d(i1 %x) {
 entry:
   br i1 %x, label %return, label %if.then
 
 if.then:                                          ; preds = %entry
-  %c = call i8* @returner()
-  %s = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %c) nounwind
+  %c = call ptr @returner()
+  %s = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %c) nounwind
   br label %return
 
 return:                                           ; preds = %if.then, %entry
-  %retval = phi i8* [ %s, %if.then ], [ null, %entry ]
-  %q = call i8* @llvm.objc.autoreleaseReturnValue(i8* %retval) nounwind
-  ret i8* %retval
+  %retval = phi ptr [ %s, %if.then ], [ null, %entry ]
+  %q = call ptr @llvm.objc.autoreleaseReturnValue(ptr %retval) nounwind
+  ret ptr %retval
 }
 
 ; An llvm.objc.retain can serve as a may-use for a 
diff erent pointer.
 ; rdar://11931823
 
 ; CHECK-LABEL: define void @test66a(
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %cond) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %call) [[NUW]]
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %tmp8) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %cond) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %cond) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %call) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %tmp8) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %cond) [[NUW]]
 ; CHECK: {{^}}}
-define void @test66a(i8* %tmp5, i8* %bar, i1 %tobool, i1 %tobool1, i8* %call) {
+define void @test66a(ptr %tmp5, ptr %bar, i1 %tobool, i1 %tobool1, ptr %call) {
 entry:
   br i1 %tobool, label %cond.true, label %cond.end
 
@@ -2620,22 +2525,22 @@ cond.true:
   br label %cond.end
 
 cond.end:                                         ; preds = %cond.true, %entry
-  %cond = phi i8* [ %tmp5, %cond.true ], [ %call, %entry ]
-  %tmp7 = tail call i8* @llvm.objc.retain(i8* %cond) nounwind
-  tail call void @llvm.objc.release(i8* %call) nounwind
-  %tmp8 = select i1 %tobool1, i8* %cond, i8* %bar
-  %tmp9 = tail call i8* @llvm.objc.retain(i8* %tmp8) nounwind
-  tail call void @llvm.objc.release(i8* %cond) nounwind
+  %cond = phi ptr [ %tmp5, %cond.true ], [ %call, %entry ]
+  %tmp7 = tail call ptr @llvm.objc.retain(ptr %cond) nounwind
+  tail call void @llvm.objc.release(ptr %call) nounwind
+  %tmp8 = select i1 %tobool1, ptr %cond, ptr %bar
+  %tmp9 = tail call ptr @llvm.objc.retain(ptr %tmp8) nounwind
+  tail call void @llvm.objc.release(ptr %cond) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test66b(
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %cond) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %call) [[NUW]]
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %tmp8) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %cond) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %cond) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %call) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %tmp8) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %cond) [[NUW]]
 ; CHECK: {{^}}}
-define void @test66b(i8* %tmp5, i8* %bar, i1 %tobool, i1 %tobool1, i8* %call) {
+define void @test66b(ptr %tmp5, ptr %bar, i1 %tobool, i1 %tobool1, ptr %call) {
 entry:
   br i1 %tobool, label %cond.true, label %cond.end
 
@@ -2643,22 +2548,22 @@ cond.true:
   br label %cond.end
 
 cond.end:                                         ; preds = %cond.true, %entry
-  %cond = phi i8* [ %tmp5, %cond.true ], [ %call, %entry ]
-  %tmp7 = tail call i8* @llvm.objc.retain(i8* %cond) nounwind
-  tail call void @llvm.objc.release(i8* %call) nounwind, !clang.imprecise_release !0
-  %tmp8 = select i1 %tobool1, i8* %cond, i8* %bar
-  %tmp9 = tail call i8* @llvm.objc.retain(i8* %tmp8) nounwind
-  tail call void @llvm.objc.release(i8* %cond) nounwind
+  %cond = phi ptr [ %tmp5, %cond.true ], [ %call, %entry ]
+  %tmp7 = tail call ptr @llvm.objc.retain(ptr %cond) nounwind
+  tail call void @llvm.objc.release(ptr %call) nounwind, !clang.imprecise_release !0
+  %tmp8 = select i1 %tobool1, ptr %cond, ptr %bar
+  %tmp9 = tail call ptr @llvm.objc.retain(ptr %tmp8) nounwind
+  tail call void @llvm.objc.release(ptr %cond) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test66c(
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %cond) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %call) [[NUW]]
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %tmp8) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %cond) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %cond) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %call) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %tmp8) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %cond) [[NUW]]
 ; CHECK: {{^}}}
-define void @test66c(i8* %tmp5, i8* %bar, i1 %tobool, i1 %tobool1, i8* %call) {
+define void @test66c(ptr %tmp5, ptr %bar, i1 %tobool, i1 %tobool1, ptr %call) {
 entry:
   br i1 %tobool, label %cond.true, label %cond.end
 
@@ -2666,22 +2571,22 @@ cond.true:
   br label %cond.end
 
 cond.end:                                         ; preds = %cond.true, %entry
-  %cond = phi i8* [ %tmp5, %cond.true ], [ %call, %entry ]
-  %tmp7 = tail call i8* @llvm.objc.retain(i8* %cond) nounwind
-  tail call void @llvm.objc.release(i8* %call) nounwind
-  %tmp8 = select i1 %tobool1, i8* %cond, i8* %bar
-  %tmp9 = tail call i8* @llvm.objc.retain(i8* %tmp8) nounwind, !clang.imprecise_release !0
-  tail call void @llvm.objc.release(i8* %cond) nounwind
+  %cond = phi ptr [ %tmp5, %cond.true ], [ %call, %entry ]
+  %tmp7 = tail call ptr @llvm.objc.retain(ptr %cond) nounwind
+  tail call void @llvm.objc.release(ptr %call) nounwind
+  %tmp8 = select i1 %tobool1, ptr %cond, ptr %bar
+  %tmp9 = tail call ptr @llvm.objc.retain(ptr %tmp8) nounwind, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %cond) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test66d(
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %cond) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %call) [[NUW]]
-; CHECK:   tail call i8* @llvm.objc.retain(i8* %tmp8) [[NUW]]
-; CHECK:   tail call void @llvm.objc.release(i8* %cond) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %cond) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %call) [[NUW]]
+; CHECK:   tail call ptr @llvm.objc.retain(ptr %tmp8) [[NUW]]
+; CHECK:   tail call void @llvm.objc.release(ptr %cond) [[NUW]]
 ; CHECK: {{^}}}
-define void @test66d(i8* %tmp5, i8* %bar, i1 %tobool, i1 %tobool1, i8* %call) {
+define void @test66d(ptr %tmp5, ptr %bar, i1 %tobool, i1 %tobool1, ptr %call) {
 entry:
   br i1 %tobool, label %cond.true, label %cond.end
 
@@ -2689,12 +2594,12 @@ cond.true:
   br label %cond.end
 
 cond.end:                                         ; preds = %cond.true, %entry
-  %cond = phi i8* [ %tmp5, %cond.true ], [ %call, %entry ]
-  %tmp7 = tail call i8* @llvm.objc.retain(i8* %cond) nounwind
-  tail call void @llvm.objc.release(i8* %call) nounwind, !clang.imprecise_release !0
-  %tmp8 = select i1 %tobool1, i8* %cond, i8* %bar
-  %tmp9 = tail call i8* @llvm.objc.retain(i8* %tmp8) nounwind
-  tail call void @llvm.objc.release(i8* %cond) nounwind, !clang.imprecise_release !0
+  %cond = phi ptr [ %tmp5, %cond.true ], [ %call, %entry ]
+  %tmp7 = tail call ptr @llvm.objc.retain(ptr %cond) nounwind
+  tail call void @llvm.objc.release(ptr %call) nounwind, !clang.imprecise_release !0
+  %tmp8 = select i1 %tobool1, ptr %cond, ptr %bar
+  %tmp9 = tail call ptr @llvm.objc.retain(ptr %tmp8) nounwind
+  tail call void @llvm.objc.release(ptr %cond) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -2702,50 +2607,42 @@ cond.end:                                         ; preds = %cond.true, %entry
 
 @.str4 = private unnamed_addr constant [33 x i8] c"-[A z] = { %f, %f, { %f, %f } }\0A\00"
 @"OBJC_IVAR_$_A.myZ" = global i64 20, section "__DATA, __objc_const", align 8
-declare i32 @printf(i8* nocapture, ...) nounwind
-declare i32 @puts(i8* nocapture) nounwind
+declare i32 @printf(ptr nocapture, ...) nounwind
+declare i32 @puts(ptr nocapture) nounwind
 @str = internal constant [16 x i8] c"-[ Top0 _getX ]\00"
 
 ; FIXME: Should be able to eliminate the retain and release
-; CHECK-LABEL: define { <2 x float>, <2 x float> } @"\01-[A z]"({}* %self, i8* nocapture %_cmd)
-; CHECK: [[SELF_CAST0:%[0-9]+]] = bitcast {}* %self to i8*
-; CHECK: tail call i8* @llvm.objc.retain(i8* [[SELF_CAST0]])
-; CHECK-NEXT: %call = tail call i32 (i8*, ...) @printf(
-; CHECK: [[SELF_CAST1:%[0-9]+]] = bitcast {}* %self to i8*
-; CHECK: tail call void @llvm.objc.release(i8* [[SELF_CAST1]])
-; CHECK: {{^}}}
-define { <2 x float>, <2 x float> } @"\01-[A z]"({}* %self, i8* nocapture %_cmd) nounwind {
+; CHECK-LABEL: define { <2 x float>, <2 x float> } @"\01-[A z]"(ptr %self, ptr nocapture %_cmd)
+; CHECK: tail call ptr @llvm.objc.retain(ptr %self)
+; CHECK-NEXT: %call = tail call i32 (ptr, ...) @printf(
+; CHECK: tail call void @llvm.objc.release(ptr %self)
+; CHECK: {{^}}}
+define { <2 x float>, <2 x float> } @"\01-[A z]"(ptr %self, ptr nocapture %_cmd) nounwind {
 invoke.cont:
-  %i = bitcast {}* %self to i8*
-  %i1 = tail call i8* @llvm.objc.retain(i8* %i) nounwind
-  tail call void @llvm.dbg.value(metadata {}* %self, metadata !DILocalVariable(scope: !2), metadata !DIExpression()), !dbg !DILocation(scope: !2)
-  tail call void @llvm.dbg.value(metadata {}* %self, metadata !DILocalVariable(scope: !2), metadata !DIExpression()), !dbg !DILocation(scope: !2)
-  %ivar = load i64, i64* @"OBJC_IVAR_$_A.myZ", align 8
-  %add.ptr = getelementptr i8, i8* %i, i64 %ivar
-  %tmp1 = bitcast i8* %add.ptr to float*
-  %tmp2 = load float, float* %tmp1, align 4
+  %i1 = tail call ptr @llvm.objc.retain(ptr %self) nounwind
+  tail call void @llvm.dbg.value(metadata ptr %self, metadata !DILocalVariable(scope: !2), metadata !DIExpression()), !dbg !DILocation(scope: !2)
+  tail call void @llvm.dbg.value(metadata ptr %self, metadata !DILocalVariable(scope: !2), metadata !DIExpression()), !dbg !DILocation(scope: !2)
+  %ivar = load i64, ptr @"OBJC_IVAR_$_A.myZ", align 8
+  %add.ptr = getelementptr i8, ptr %self, i64 %ivar
+  %tmp2 = load float, ptr %add.ptr, align 4
   %conv = fpext float %tmp2 to double
   %add.ptr.sum = add i64 %ivar, 4
-  %tmp6 = getelementptr inbounds i8, i8* %i, i64 %add.ptr.sum
-  %i2 = bitcast i8* %tmp6 to float*
-  %tmp7 = load float, float* %i2, align 4
+  %tmp6 = getelementptr inbounds i8, ptr %self, i64 %add.ptr.sum
+  %tmp7 = load float, ptr %tmp6, align 4
   %conv8 = fpext float %tmp7 to double
   %add.ptr.sum36 = add i64 %ivar, 8
-  %tmp12 = getelementptr inbounds i8, i8* %i, i64 %add.ptr.sum36
-  %arrayidx = bitcast i8* %tmp12 to float*
-  %tmp13 = load float, float* %arrayidx, align 4
+  %tmp12 = getelementptr inbounds i8, ptr %self, i64 %add.ptr.sum36
+  %tmp13 = load float, ptr %tmp12, align 4
   %conv14 = fpext float %tmp13 to double
   %tmp12.sum = add i64 %ivar, 12
-  %arrayidx19 = getelementptr inbounds i8, i8* %i, i64 %tmp12.sum
-  %i3 = bitcast i8* %arrayidx19 to float*
-  %tmp20 = load float, float* %i3, align 4
+  %arrayidx19 = getelementptr inbounds i8, ptr %self, i64 %tmp12.sum
+  %tmp20 = load float, ptr %arrayidx19, align 4
   %conv21 = fpext float %tmp20 to double
-  %call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str4, i64 0, i64 0), double %conv, double %conv8, double %conv14, double %conv21)
-  %ivar23 = load i64, i64* @"OBJC_IVAR_$_A.myZ", align 8
-  %add.ptr24 = getelementptr i8, i8* %i, i64 %ivar23
-  %i4 = bitcast i8* %add.ptr24 to i128*
-  %srcval = load i128, i128* %i4, align 4
-  tail call void @llvm.objc.release(i8* %i) nounwind
+  %call = tail call i32 (ptr, ...) @printf(ptr @.str4, double %conv, double %conv8, double %conv14, double %conv21)
+  %ivar23 = load i64, ptr @"OBJC_IVAR_$_A.myZ", align 8
+  %add.ptr24 = getelementptr i8, ptr %self, i64 %ivar23
+  %srcval = load i128, ptr %add.ptr24, align 4
+  tail call void @llvm.objc.release(ptr %self) nounwind
   %tmp29 = trunc i128 %srcval to i64
   %tmp30 = bitcast i64 %tmp29 to <2 x float>
   %tmp31 = insertvalue { <2 x float>, <2 x float> } undef, <2 x float> %tmp30, 0
@@ -2757,296 +2654,273 @@ invoke.cont:
 }
 
 ; FIXME: Should be able to eliminate the retain and release
-; CHECK-LABEL: @"\01-[Top0 _getX]"({}* %self, i8* nocapture %_cmd)
-; CHECK: %i = bitcast {}* %self to i8*
-; CHECK: tail call i8* @llvm.objc.retain(i8* %i)
+; CHECK-LABEL: @"\01-[Top0 _getX]"(ptr %self, ptr nocapture %_cmd)
+; CHECK: tail call ptr @llvm.objc.retain(ptr %self)
 ; CHECK: %puts = tail call i32 @puts
-; CHECK: tail call void @llvm.objc.release(i8* %i)
-define i32 @"\01-[Top0 _getX]"({}* %self, i8* nocapture %_cmd) nounwind {
+; CHECK: tail call void @llvm.objc.release(ptr %self)
+define i32 @"\01-[Top0 _getX]"(ptr %self, ptr nocapture %_cmd) nounwind {
 invoke.cont:
-  %i = bitcast {}* %self to i8*
-  %i1 = tail call i8* @llvm.objc.retain(i8* %i) nounwind
-  %puts = tail call i32 @puts(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @str, i64 0, i64 0))
-  tail call void @llvm.objc.release(i8* %i) nounwind
+  %i1 = tail call ptr @llvm.objc.retain(ptr %self) nounwind
+  %puts = tail call i32 @puts(ptr @str)
+  tail call void @llvm.objc.release(ptr %self) nounwind
   ret i32 0
 }
 
-@"\01L_OBJC_METH_VAR_NAME_" = internal global [5 x i8] c"frob\00", section "__TEXT,__cstring,cstring_literals", align 1@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i64 0, i64 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_METH_VAR_NAME_" = internal global [5 x i8] c"frob\00", section "__TEXT,__cstring,cstring_literals", align 1@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global ptr @"\01L_OBJC_METH_VAR_NAME_", section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
 @"\01L_OBJC_IMAGE_INFO" = internal constant [2 x i32] [i32 0, i32 16], section "__DATA, __objc_imageinfo, regular, no_dead_strip"
- at llvm.used = appending global [3 x i8*] [i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_" to i8*), i8* bitcast ([2 x i32]* @"\01L_OBJC_IMAGE_INFO" to i8*)], section "llvm.metadata"
+ at llvm.used = appending global [3 x ptr] [ptr @"\01L_OBJC_METH_VAR_NAME_", ptr @"\01L_OBJC_SELECTOR_REFERENCES_", ptr @"\01L_OBJC_IMAGE_INFO"], section "llvm.metadata"
 
 ; A simple loop. Eliminate the retain and release inside of it!
 
-; CHECK: define void @loop(i8* %x, i64 %n) {
+; CHECK: define void @loop(ptr %x, i64 %n) {
 ; CHECK: for.body:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: @objc_msgSend
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: for.end:
 ; CHECK: {{^}}}
-define void @loop(i8* %x, i64 %n) {
+define void @loop(ptr %x, i64 %n) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %x) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %x) nounwind
   %cmp9 = icmp sgt i64 %n, 0
   br i1 %cmp9, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.body
   %i.010 = phi i64 [ %inc, %for.body ], [ 0, %entry ]
-  %1 = tail call i8* @llvm.objc.retain(i8* %x) nounwind
-  %tmp5 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call = tail call i8* (i8*, i8*, ...) @objc_msgSend(i8* %1, i8* %tmp5)
-  tail call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
+  %1 = tail call ptr @llvm.objc.retain(ptr %x) nounwind
+  %tmp5 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call = tail call ptr (ptr, ptr, ...) @objc_msgSend(ptr %1, ptr %tmp5)
+  tail call void @llvm.objc.release(ptr %1) nounwind, !clang.imprecise_release !0
   %inc = add nsw i64 %i.010, 1
   %exitcond = icmp eq i64 %inc, %n
   br i1 %exitcond, label %for.end, label %for.body
 
 for.end:                                          ; preds = %for.body, %entry
-  tail call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; ObjCARCOpt can delete the retain,release on self.
 
-; CHECK: define void @TextEditTest(%2* %self, %3* %pboard) {
-; CHECK-NOT: call i8* @llvm.objc.retain(i8* %tmp7)
+; CHECK: define void @TextEditTest(ptr %self, ptr %pboard) {
+; CHECK-NOT: call ptr @llvm.objc.retain(ptr %tmp7)
 ; CHECK: {{^}}}
 
-%0 = type { i8* (i8*, %struct._message_ref_t*, ...)*, i8* }
+%0 = type { ptr, ptr }
 %1 = type opaque
 %2 = type opaque
 %3 = type opaque
 %4 = type opaque
 %5 = type opaque
-%struct.NSConstantString = type { i32*, i32, i8*, i64 }
+%struct.NSConstantString = type { ptr, i32, ptr, i64 }
 %struct._NSRange = type { i64, i64 }
 %struct.__CFString = type opaque
 %struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] }
-%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* }
-%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* }
+%struct._class_ro_t = type { i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
+%struct._class_t = type { ptr, ptr, ptr, ptr, ptr }
 %struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] }
-%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 }
-%struct._message_ref_t = type { i8*, i8* }
+%struct._ivar_t = type { ptr, ptr, ptr, i32, i32 }
+%struct._message_ref_t = type { ptr, ptr }
 %struct._objc_cache = type opaque
-%struct._objc_method = type { i8*, i8*, i8* }
-%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] }
+%struct._objc_method = type { ptr, ptr, ptr }
+%struct._objc_protocol_list = type { i64, [0 x ptr] }
 %struct._prop_list_t = type { i32, i32, [0 x %struct._message_ref_t] }
-%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32 }
-
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_17" = external hidden global %struct._class_t*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
- at kUTTypePlainText = external constant %struct.__CFString*
-@"\01L_OBJC_SELECTOR_REFERENCES_19" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_21" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_23" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_25" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_26" = external hidden global %struct._class_t*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_28" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_29" = external hidden global %struct._class_t*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_31" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_33" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_35" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_37" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_38" = external hidden global %struct._class_t*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_40" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_42" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+%struct._protocol_t = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32 }
+
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_17" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+ at kUTTypePlainText = external constant ptr
+@"\01L_OBJC_SELECTOR_REFERENCES_19" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_21" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_23" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_25" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_26" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_28" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_29" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_31" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_33" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_35" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_37" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_38" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_40" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_42" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
 @_unnamed_cfstring_44 = external hidden constant %struct.NSConstantString, section "__DATA,__cfstring"
-@"\01L_OBJC_SELECTOR_REFERENCES_46" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_48" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_46" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_48" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
 @"\01l_objc_msgSend_fixup_isEqual_" = external hidden global %0, section "__DATA, __objc_msgrefs, coalesced", align 16
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_50" = external hidden global %struct._class_t*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
- at NSCocoaErrorDomain = external constant %1*
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_51" = external hidden global %struct._class_t*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
- at NSFilePathErrorKey = external constant %1*
-@"\01L_OBJC_SELECTOR_REFERENCES_53" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_55" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_56" = external hidden global %struct._class_t*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_58" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_60" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-
-declare %1* @truncatedString(%1*, i64)
-define void @TextEditTest(%2* %self, %3* %pboard) {
-entry:
-  %err = alloca %4*, align 8
-  %tmp7 = bitcast %2* %self to i8*
-  %tmp8 = call i8* @llvm.objc.retain(i8* %tmp7) nounwind
-  store %4* null, %4** %err, align 8
-  %tmp1 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_17", align 8
-  %tmp2 = load %struct.__CFString*, %struct.__CFString** @kUTTypePlainText, align 8
-  %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_19", align 8
-  %tmp4 = bitcast %struct._class_t* %tmp1 to i8*
-  %call5 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp4, i8* %tmp3, %struct.__CFString* %tmp2)
-  %tmp5 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_21", align 8
-  %tmp6 = bitcast %3* %pboard to i8*
-  %call76 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp6, i8* %tmp5, i8* %call5)
-  %tmp9 = call i8* @llvm.objc.retain(i8* %call76) nounwind
-  %tobool = icmp eq i8* %tmp9, null
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_50" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+ at NSCocoaErrorDomain = external constant ptr
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_51" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+ at NSFilePathErrorKey = external constant ptr
+@"\01L_OBJC_SELECTOR_REFERENCES_53" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_55" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_56" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_58" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_60" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+
+declare ptr @truncatedString(ptr, i64)
+define void @TextEditTest(ptr %self, ptr %pboard) {
+entry:
+  %err = alloca ptr, align 8
+  %tmp8 = call ptr @llvm.objc.retain(ptr %self) nounwind
+  store ptr null, ptr %err, align 8
+  %tmp1 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_17", align 8
+  %tmp2 = load ptr, ptr @kUTTypePlainText, align 8
+  %tmp3 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_19", align 8
+  %call5 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp1, ptr %tmp3, ptr %tmp2)
+  %tmp5 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_21", align 8
+  %call76 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %pboard, ptr %tmp5, ptr %call5)
+  %tmp9 = call ptr @llvm.objc.retain(ptr %call76) nounwind
+  %tobool = icmp eq ptr %tmp9, null
   br i1 %tobool, label %end, label %land.lhs.true
 
 land.lhs.true:                                    ; preds = %entry
-  %tmp11 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_23", align 8
-  %call137 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp6, i8* %tmp11, i8* %tmp9)
-  %tmp = bitcast i8* %call137 to %1*
-  %tmp10 = call i8* @llvm.objc.retain(i8* %call137) nounwind
-  call void @llvm.objc.release(i8* null) nounwind
-  %tmp12 = call i8* @llvm.objc.retain(i8* %call137) nounwind
-  call void @llvm.objc.release(i8* null) nounwind
-  %tobool16 = icmp eq i8* %call137, null
+  %tmp11 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_23", align 8
+  %call137 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %pboard, ptr %tmp11, ptr %tmp9)
+  %tmp10 = call ptr @llvm.objc.retain(ptr %call137) nounwind
+  call void @llvm.objc.release(ptr null) nounwind
+  %tmp12 = call ptr @llvm.objc.retain(ptr %call137) nounwind
+  call void @llvm.objc.release(ptr null) nounwind
+  %tobool16 = icmp eq ptr %call137, null
   br i1 %tobool16, label %end, label %if.then
 
 if.then:                                          ; preds = %land.lhs.true
-  %tmp19 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_25", align 8
-  %call21 = call signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*)*)(i8* %call137, i8* %tmp19)
+  %tmp19 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_25", align 8
+  %call21 = call signext i8 @objc_msgSend(ptr %call137, ptr %tmp19)
   %tobool22 = icmp eq i8 %call21, 0
   br i1 %tobool22, label %if.then44, label %land.lhs.true23
 
 land.lhs.true23:                                  ; preds = %if.then
-  %tmp24 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_26", align 8
-  %tmp26 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_28", align 8
-  %tmp27 = bitcast %struct._class_t* %tmp24 to i8*
-  %call2822 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp27, i8* %tmp26, i8* %call137)
-  %tmp13 = bitcast i8* %call2822 to %5*
-  %tmp14 = call i8* @llvm.objc.retain(i8* %call2822) nounwind
-  call void @llvm.objc.release(i8* null) nounwind
-  %tobool30 = icmp eq i8* %call2822, null
+  %tmp24 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_26", align 8
+  %tmp26 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_28", align 8
+  %call2822 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp24, ptr %tmp26, ptr %call137)
+  %tmp14 = call ptr @llvm.objc.retain(ptr %call2822) nounwind
+  call void @llvm.objc.release(ptr null) nounwind
+  %tobool30 = icmp eq ptr %call2822, null
   br i1 %tobool30, label %if.then44, label %if.end
 
 if.end:                                           ; preds = %land.lhs.true23
-  %tmp32 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_29", align 8
-  %tmp33 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_31", align 8
-  %tmp34 = bitcast %struct._class_t* %tmp32 to i8*
-  %call35 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp34, i8* %tmp33)
-  %tmp37 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_33", align 8
-  %call3923 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %call35, i8* %tmp37, i8* %call2822, i32 signext 1, %4** %err)
-  %cmp = icmp eq i8* %call3923, null
+  %tmp32 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_29", align 8
+  %tmp33 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_31", align 8
+  %call35 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp32, ptr %tmp33)
+  %tmp37 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_33", align 8
+  %call3923 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %call35, ptr %tmp37, ptr %call2822, i32 signext 1, ptr %err)
+  %cmp = icmp eq ptr %call3923, null
   br i1 %cmp, label %if.then44, label %end
 
 if.then44:                                        ; preds = %if.end, %land.lhs.true23, %if.then
-  %url.025 = phi %5* [ %tmp13, %if.end ], [ %tmp13, %land.lhs.true23 ], [ null, %if.then ]
-  %tmp49 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_35", align 8
-  %call51 = call %struct._NSRange bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %struct._NSRange (i8*, i8*, i64, i64)*)(i8* %call137, i8* %tmp49, i64 0, i64 0)
+  %url.025 = phi ptr [ %call2822, %if.end ], [ %call2822, %land.lhs.true23 ], [ null, %if.then ]
+  %tmp49 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_35", align 8
+  %call51 = call %struct._NSRange @objc_msgSend(ptr %call137, ptr %tmp49, i64 0, i64 0)
   %call513 = extractvalue %struct._NSRange %call51, 0
   %call514 = extractvalue %struct._NSRange %call51, 1
-  %tmp52 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_37", align 8
-  %call548 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %call137, i8* %tmp52, i64 %call513, i64 %call514)
-  %tmp55 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_38", align 8
-  %tmp56 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_40", align 8
-  %tmp57 = bitcast %struct._class_t* %tmp55 to i8*
-  %call58 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp57, i8* %tmp56)
-  %tmp59 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_42", align 8
-  %call6110 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %call548, i8* %tmp59, i8* %call58)
-  %tmp15 = call i8* @llvm.objc.retain(i8* %call6110) nounwind
-  call void @llvm.objc.release(i8* %call137) nounwind
-  %tmp64 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_46", align 8
-  %call66 = call signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, %1*)*)(i8* %call6110, i8* %tmp64, %1* bitcast (%struct.NSConstantString* @_unnamed_cfstring_44 to %1*))
+  %tmp52 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_37", align 8
+  %call548 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %call137, ptr %tmp52, i64 %call513, i64 %call514)
+  %tmp55 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_38", align 8
+  %tmp56 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_40", align 8
+  %call58 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp55, ptr %tmp56)
+  %tmp59 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_42", align 8
+  %call6110 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %call548, ptr %tmp59, ptr %call58)
+  %tmp15 = call ptr @llvm.objc.retain(ptr %call6110) nounwind
+  call void @llvm.objc.release(ptr %call137) nounwind
+  %tmp64 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_46", align 8
+  %call66 = call signext i8 @objc_msgSend(ptr %call6110, ptr %tmp64, ptr @_unnamed_cfstring_44)
   %tobool67 = icmp eq i8 %call66, 0
   br i1 %tobool67, label %if.end74, label %if.then68
 
 if.then68:                                        ; preds = %if.then44
-  %tmp70 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_48", align 8
-  %call7220 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %call6110, i8* %tmp70)
-  %tmp16 = call i8* @llvm.objc.retain(i8* %call7220) nounwind
-  call void @llvm.objc.release(i8* %call6110) nounwind
+  %tmp70 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_48", align 8
+  %call7220 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %call6110, ptr %tmp70)
+  %tmp16 = call ptr @llvm.objc.retain(ptr %call7220) nounwind
+  call void @llvm.objc.release(ptr %call6110) nounwind
   br label %if.end74
 
 if.end74:                                         ; preds = %if.then68, %if.then44
-  %filename.0.in = phi i8* [ %call7220, %if.then68 ], [ %call6110, %if.then44 ]
-  %filename.0 = bitcast i8* %filename.0.in to %1*
-  %tmp17 = load i8*, i8** bitcast (%0* @"\01l_objc_msgSend_fixup_isEqual_" to i8**), align 16
-  %tmp18 = bitcast i8* %tmp17 to i8 (i8*, %struct._message_ref_t*, i8*, ...)*
-  %call78 = call signext i8 (i8*, %struct._message_ref_t*, i8*, ...) %tmp18(i8* %call137, %struct._message_ref_t* bitcast (%0* @"\01l_objc_msgSend_fixup_isEqual_" to %struct._message_ref_t*), i8* %filename.0.in)
+  %filename.0.in = phi ptr [ %call7220, %if.then68 ], [ %call6110, %if.then44 ]
+  %tmp17 = load ptr, ptr @"\01l_objc_msgSend_fixup_isEqual_", align 16
+  %call78 = call signext i8 (ptr, ptr, ptr, ...) %tmp17(ptr %call137, ptr @"\01l_objc_msgSend_fixup_isEqual_", ptr %filename.0.in)
   %tobool79 = icmp eq i8 %call78, 0
   br i1 %tobool79, label %land.lhs.true80, label %if.then109
 
 land.lhs.true80:                                  ; preds = %if.end74
-  %tmp82 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_25", align 8
-  %call84 = call signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*)*)(i8* %filename.0.in, i8* %tmp82)
+  %tmp82 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_25", align 8
+  %call84 = call signext i8 @objc_msgSend(ptr %filename.0.in, ptr %tmp82)
   %tobool86 = icmp eq i8 %call84, 0
   br i1 %tobool86, label %if.then109, label %if.end106
 
 if.end106:                                        ; preds = %land.lhs.true80
-  %tmp88 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_26", align 8
-  %tmp90 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_28", align 8
-  %tmp91 = bitcast %struct._class_t* %tmp88 to i8*
-  %call9218 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp91, i8* %tmp90, i8* %filename.0.in)
-  %tmp20 = bitcast i8* %call9218 to %5*
-  %tmp21 = call i8* @llvm.objc.retain(i8* %call9218) nounwind
-  %tmp22 = bitcast %5* %url.025 to i8*
-  call void @llvm.objc.release(i8* %tmp22) nounwind
-  %tmp94 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_29", align 8
-  %tmp95 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_31", align 8
-  %tmp96 = bitcast %struct._class_t* %tmp94 to i8*
-  %call97 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp96, i8* %tmp95)
-  %tmp99 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_33", align 8
-  %call10119 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %call97, i8* %tmp99, i8* %call9218, i32 signext 1, %4** %err)
-  %phitmp = icmp eq i8* %call10119, null
+  %tmp88 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_26", align 8
+  %tmp90 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_28", align 8
+  %call9218 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp88, ptr %tmp90, ptr %filename.0.in)
+  %tmp21 = call ptr @llvm.objc.retain(ptr %call9218) nounwind
+  call void @llvm.objc.release(ptr %url.025) nounwind
+  %tmp94 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_29", align 8
+  %tmp95 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_31", align 8
+  %call97 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp94, ptr %tmp95)
+  %tmp99 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_33", align 8
+  %call10119 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %call97, ptr %tmp99, ptr %call9218, i32 signext 1, ptr %err)
+  %phitmp = icmp eq ptr %call10119, null
   br i1 %phitmp, label %if.then109, label %end
 
 if.then109:                                       ; preds = %if.end106, %land.lhs.true80, %if.end74
-  %url.129 = phi %5* [ %tmp20, %if.end106 ], [ %url.025, %if.end74 ], [ %url.025, %land.lhs.true80 ]
-  %tmp110 = load %4*, %4** %err, align 8
-  %tobool111 = icmp eq %4* %tmp110, null
+  %url.129 = phi ptr [ %call9218, %if.end106 ], [ %url.025, %if.end74 ], [ %url.025, %land.lhs.true80 ]
+  %tmp110 = load ptr, ptr %err, align 8
+  %tobool111 = icmp eq ptr %tmp110, null
   br i1 %tobool111, label %if.then112, label %if.end125
 
 if.then112:                                       ; preds = %if.then109
-  %tmp113 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_50", align 8
-  %tmp114 = load %1*, %1** @NSCocoaErrorDomain, align 8
-  %tmp115 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_51", align 8
-  %call117 = call %1* @truncatedString(%1* %filename.0, i64 1034)
-  %tmp118 = load %1*, %1** @NSFilePathErrorKey, align 8
-  %tmp119 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_53", align 8
-  %tmp120 = bitcast %struct._class_t* %tmp115 to i8*
-  %call12113 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp120, i8* %tmp119, %1* %call117, %1* %tmp118, i8* null)
-  %tmp122 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_55", align 8
-  %tmp123 = bitcast %struct._class_t* %tmp113 to i8*
-  %call12414 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp123, i8* %tmp122, %1* %tmp114, i64 258, i8* %call12113)
-  %tmp23 = call i8* @llvm.objc.retain(i8* %call12414) nounwind
-  %tmp25 = call i8* @llvm.objc.autorelease(i8* %tmp23) nounwind
-  %tmp28 = bitcast i8* %tmp25 to %4*
-  store %4* %tmp28, %4** %err, align 8
+  %tmp113 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_50", align 8
+  %tmp114 = load ptr, ptr @NSCocoaErrorDomain, align 8
+  %tmp115 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_51", align 8
+  %call117 = call ptr @truncatedString(ptr %filename.0.in, i64 1034)
+  %tmp118 = load ptr, ptr @NSFilePathErrorKey, align 8
+  %tmp119 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_53", align 8
+  %call12113 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp115, ptr %tmp119, ptr %call117, ptr %tmp118, ptr null)
+  %tmp122 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_55", align 8
+  %call12414 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp113, ptr %tmp122, ptr %tmp114, i64 258, ptr %call12113)
+  %tmp23 = call ptr @llvm.objc.retain(ptr %call12414) nounwind
+  %tmp25 = call ptr @llvm.objc.autorelease(ptr %tmp23) nounwind
+  store ptr %tmp25, ptr %err, align 8
   br label %if.end125
 
 if.end125:                                        ; preds = %if.then112, %if.then109
-  %tmp127 = phi %4* [ %tmp110, %if.then109 ], [ %tmp28, %if.then112 ]
-  %tmp126 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_56", align 8
-  %tmp128 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_58", align 8
-  %tmp129 = bitcast %struct._class_t* %tmp126 to i8*
-  %call13015 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %tmp129, i8* %tmp128, %4* %tmp127)
-  %tmp131 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_60", align 8
-  %call13317 = call i8* (i8*, i8*, ...) @objc_msgSend(i8* %call13015, i8* %tmp131)
+  %tmp127 = phi ptr [ %tmp110, %if.then109 ], [ %tmp25, %if.then112 ]
+  %tmp126 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_56", align 8
+  %tmp128 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_58", align 8
+  %call13015 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %tmp126, ptr %tmp128, ptr %tmp127)
+  %tmp131 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_60", align 8
+  %call13317 = call ptr (ptr, ptr, ...) @objc_msgSend(ptr %call13015, ptr %tmp131)
   br label %end
 
 end:                                              ; preds = %if.end125, %if.end106, %if.end, %land.lhs.true, %entry
-  %filename.2 = phi %1* [ %filename.0, %if.end106 ], [ %filename.0, %if.end125 ], [ %tmp, %land.lhs.true ], [ null, %entry ], [ %tmp, %if.end ]
-  %origFilename.0 = phi %1* [ %tmp, %if.end106 ], [ %tmp, %if.end125 ], [ %tmp, %land.lhs.true ], [ null, %entry ], [ %tmp, %if.end ]
-  %url.2 = phi %5* [ %tmp20, %if.end106 ], [ %url.129, %if.end125 ], [ null, %land.lhs.true ], [ null, %entry ], [ %tmp13, %if.end ]
-  call void @llvm.objc.release(i8* %tmp9) nounwind, !clang.imprecise_release !0
-  %tmp29 = bitcast %5* %url.2 to i8*
-  call void @llvm.objc.release(i8* %tmp29) nounwind, !clang.imprecise_release !0
-  %tmp30 = bitcast %1* %origFilename.0 to i8*
-  call void @llvm.objc.release(i8* %tmp30) nounwind, !clang.imprecise_release !0
-  %tmp31 = bitcast %1* %filename.2 to i8*
-  call void @llvm.objc.release(i8* %tmp31) nounwind, !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %tmp7) nounwind, !clang.imprecise_release !0
+  %filename.2 = phi ptr [ %filename.0.in, %if.end106 ], [ %filename.0.in, %if.end125 ], [ %call137, %land.lhs.true ], [ null, %entry ], [ %call137, %if.end ]
+  %origFilename.0 = phi ptr [ %call137, %if.end106 ], [ %call137, %if.end125 ], [ %call137, %land.lhs.true ], [ null, %entry ], [ %call137, %if.end ]
+  %url.2 = phi ptr [ %call9218, %if.end106 ], [ %url.129, %if.end125 ], [ null, %land.lhs.true ], [ null, %entry ], [ %call2822, %if.end ]
+  call void @llvm.objc.release(ptr %tmp9) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %url.2) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %origFilename.0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %filename.2) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %self) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 declare i32 @__gxx_personality_v0(...)
 
-declare i32 @llvm.objc.sync.enter(i8*)
-declare i32 @llvm.objc.sync.exit(i8*)
+declare i32 @llvm.objc.sync.enter(ptr)
+declare i32 @llvm.objc.sync.exit(ptr)
 
 ; Make sure that we understand that objc_sync_{enter,exit} are IC_User not
 ; IC_Call/IC_CallOrUser.
 
 ; CHECK-LABEL:      define void @test67(
-; CHECK-NEXT:   call i32 @llvm.objc.sync.enter(i8* %x)
-; CHECK-NEXT:   call i32 @llvm.objc.sync.exit(i8* %x)
+; CHECK-NEXT:   call i32 @llvm.objc.sync.enter(ptr %x)
+; CHECK-NEXT:   call i32 @llvm.objc.sync.exit(ptr %x)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test67(i8* %x) {
-  call i8* @llvm.objc.retain(i8* %x)
-  call i32 @llvm.objc.sync.enter(i8* %x)
-  call i32 @llvm.objc.sync.exit(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+define void @test67(ptr %x) {
+  call ptr @llvm.objc.retain(ptr %x)
+  call i32 @llvm.objc.sync.enter(ptr %x)
+  call i32 @llvm.objc.sync.exit(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 
@@ -3056,12 +2930,12 @@ define void @test67(i8* %x) {
 ; CHECK-NOT:     call
 ; CHECK:         ret void
 
-define void @test68(i8* %a, i8* %b) {
-  call i8* @llvm.objc.retain(i8* %a)
-  call i8* @llvm.objc.retain(i8* %b)
-  call void @callee2(i8* %a, i8* %b)
-  call void @llvm.objc.release(i8* %b), !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %a), !clang.imprecise_release !0
+define void @test68(ptr %a, ptr %b) {
+  call ptr @llvm.objc.retain(ptr %a)
+  call ptr @llvm.objc.retain(ptr %b)
+  call void @callee2(ptr %a, ptr %b)
+  call void @llvm.objc.release(ptr %b), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a), !clang.imprecise_release !0
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/cfg-hazards.ll b/llvm/test/Transforms/ObjCARC/cfg-hazards.ll
index 8b6d6048fdc0..3e762de689d1 100644
--- a/llvm/test/Transforms/ObjCARC/cfg-hazards.ll
+++ b/llvm/test/Transforms/ObjCARC/cfg-hazards.ll
@@ -5,160 +5,160 @@
 ; Detect loop boundaries and don't move retains and releases
 ; across them.
 
-declare void @use_pointer(i8*)
-declare i8* @llvm.objc.retain(i8*)
-declare void @llvm.objc.release(i8*)
+declare void @use_pointer(ptr)
+declare ptr @llvm.objc.retain(ptr)
+declare void @llvm.objc.release(ptr)
 declare void @callee()
-declare void @block_callee(void ()*)
+declare void @block_callee(ptr)
 
-define void @test0(i8* %digits) {
+define void @test0(ptr %digits) {
 ; CHECK-LABEL: @test0(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8* @llvm.objc.retain(i8* [[DIGITS:%.*]]) #[[ATTR0:[0-9]+]]
-; CHECK-NEXT:    call void @use_pointer(i8* [[DIGITS]])
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call ptr @llvm.objc.retain(ptr [[DIGITS:%.*]]) #[[ATTR0:[0-9]+]]
+; CHECK-NEXT:    call void @use_pointer(ptr [[DIGITS]])
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[UPCDIGITINDEX_01:%.*]] = phi i64 [ 2, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
-; CHECK-NEXT:    call void @use_pointer(i8* [[DIGITS]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[DIGITS]])
 ; CHECK-NEXT:    [[INC]] = add i64 [[UPCDIGITINDEX_01]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[INC]], 12
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
 ; CHECK:       for.end:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[DIGITS]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[DIGITS]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %tmp1 = call i8* @llvm.objc.retain(i8* %digits) nounwind
-  call void @use_pointer(i8* %digits)
+  %tmp1 = call ptr @llvm.objc.retain(ptr %digits) nounwind
+  call void @use_pointer(ptr %digits)
   br label %for.body
 
 for.body:                                         ; preds = %for.body, %entry
   %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
-  call void @use_pointer(i8* %digits)
+  call void @use_pointer(ptr %digits)
   %inc = add i64 %upcDigitIndex.01, 1
   %cmp = icmp ult i64 %inc, 12
   br i1 %cmp, label %for.body, label %for.end
 
 for.end:                                          ; preds = %for.body
-  call void @llvm.objc.release(i8* %digits) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %digits) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test1(i8* %digits) {
+define void @test1(ptr %digits) {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8* @llvm.objc.retain(i8* [[DIGITS:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call ptr @llvm.objc.retain(ptr [[DIGITS:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[UPCDIGITINDEX_01:%.*]] = phi i64 [ 2, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
-; CHECK-NEXT:    call void @use_pointer(i8* [[DIGITS]])
-; CHECK-NEXT:    call void @use_pointer(i8* [[DIGITS]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[DIGITS]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[DIGITS]])
 ; CHECK-NEXT:    [[INC]] = add i64 [[UPCDIGITINDEX_01]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[INC]], 12
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
 ; CHECK:       for.end:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[DIGITS]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[DIGITS]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %tmp1 = call i8* @llvm.objc.retain(i8* %digits) nounwind
+  %tmp1 = call ptr @llvm.objc.retain(ptr %digits) nounwind
   br label %for.body
 
 for.body:                                         ; preds = %for.body, %entry
   %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
-  call void @use_pointer(i8* %digits)
-  call void @use_pointer(i8* %digits)
+  call void @use_pointer(ptr %digits)
+  call void @use_pointer(ptr %digits)
   %inc = add i64 %upcDigitIndex.01, 1
   %cmp = icmp ult i64 %inc, 12
   br i1 %cmp, label %for.body, label %for.end
 
 for.end:                                          ; preds = %for.body
-  call void @llvm.objc.release(i8* %digits) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %digits) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test2(i8* %digits) {
+define void @test2(ptr %digits) {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8* @llvm.objc.retain(i8* [[DIGITS:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call ptr @llvm.objc.retain(ptr [[DIGITS:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[UPCDIGITINDEX_01:%.*]] = phi i64 [ 2, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
-; CHECK-NEXT:    call void @use_pointer(i8* [[DIGITS]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[DIGITS]])
 ; CHECK-NEXT:    [[INC]] = add i64 [[UPCDIGITINDEX_01]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[INC]], 12
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
 ; CHECK:       for.end:
-; CHECK-NEXT:    call void @use_pointer(i8* [[DIGITS]])
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[DIGITS]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @use_pointer(ptr [[DIGITS]])
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[DIGITS]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %tmp1 = call i8* @llvm.objc.retain(i8* %digits) nounwind
+  %tmp1 = call ptr @llvm.objc.retain(ptr %digits) nounwind
   br label %for.body
 
 for.body:                                         ; preds = %for.body, %entry
   %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
-  call void @use_pointer(i8* %digits)
+  call void @use_pointer(ptr %digits)
   %inc = add i64 %upcDigitIndex.01, 1
   %cmp = icmp ult i64 %inc, 12
   br i1 %cmp, label %for.body, label %for.end
 
 for.end:                                          ; preds = %for.body
-  call void @use_pointer(i8* %digits)
-  call void @llvm.objc.release(i8* %digits) nounwind, !clang.imprecise_release !0
+  call void @use_pointer(ptr %digits)
+  call void @llvm.objc.release(ptr %digits) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Delete nested retain+release pairs around loops.
-define void @test3(i8* %a) nounwind {
+define void @test3(ptr %a) nounwind {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUTER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[OUTER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    call void @callee()
-; CHECK-NEXT:    store i8 0, i8* [[A]], align 1
+; CHECK-NEXT:    store i8 0, ptr [[A]], align 1
 ; CHECK-NEXT:    br i1 undef, label [[LOOP]], label [[EXIT:%.*]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
   call void @callee()
-  store i8 0, i8* %a
+  store i8 0, ptr %a
   br i1 undef, label %loop, label %exit
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test4(i8* %a) nounwind {
+define void @test4(ptr %a) nounwind {
 ; CHECK-LABEL: @test4(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUTER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[OUTER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    br label [[MORE:%.*]]
 ; CHECK:       more:
 ; CHECK-NEXT:    call void @callee()
 ; CHECK-NEXT:    call void @callee()
-; CHECK-NEXT:    store i8 0, i8* [[A]], align 1
+; CHECK-NEXT:    store i8 0, ptr [[A]], align 1
 ; CHECK-NEXT:    br i1 undef, label [[LOOP]], label [[EXIT:%.*]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
@@ -167,19 +167,19 @@ loop:
 more:
   call void @callee()
   call void @callee()
-  store i8 0, i8* %a
+  store i8 0, ptr %a
   br i1 undef, label %loop, label %exit
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test5(i8* %a) nounwind {
+define void @test5(ptr %a) nounwind {
 ; CHECK-LABEL: @test5(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUTER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[OUTER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    call void @callee()
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
@@ -189,13 +189,13 @@ define void @test5(i8* %a) nounwind {
 ; CHECK:       more:
 ; CHECK-NEXT:    br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @use_pointer(i8* [[A]])
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @use_pointer(ptr [[A]])
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   call void @callee()
   br label %loop
 
@@ -209,16 +209,16 @@ more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @use_pointer(i8* %a)
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @use_pointer(ptr %a)
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test6(i8* %a) nounwind {
+define void @test6(ptr %a) nounwind {
 ; CHECK-LABEL: @test6(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUTER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[OUTER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    br i1 undef, label [[TRUE:%.*]], label [[MORE:%.*]]
@@ -228,13 +228,13 @@ define void @test6(i8* %a) nounwind {
 ; CHECK:       more:
 ; CHECK-NEXT:    br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @use_pointer(i8* [[A]])
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @use_pointer(ptr [[A]])
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
@@ -248,32 +248,32 @@ more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @use_pointer(i8* %a)
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @use_pointer(ptr %a)
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test7(i8* %a) nounwind {
+define void @test7(ptr %a) nounwind {
 ; CHECK-LABEL: @test7(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUTER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[OUTER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    call void @callee()
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    br i1 undef, label [[TRUE:%.*]], label [[MORE:%.*]]
 ; CHECK:       true:
-; CHECK-NEXT:    call void @use_pointer(i8* [[A]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[A]])
 ; CHECK-NEXT:    br label [[MORE]]
 ; CHECK:       more:
 ; CHECK-NEXT:    br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   call void @callee()
   br label %loop
 
@@ -281,38 +281,38 @@ loop:
   br i1 undef, label %true, label %more
 
 true:
-  call void @use_pointer(i8* %a)
+  call void @use_pointer(ptr %a)
   br label %more
 
 more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test8(i8* %a) nounwind {
+define void @test8(ptr %a) nounwind {
 ; CHECK-LABEL: @test8(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUTER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[OUTER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    br i1 undef, label [[TRUE:%.*]], label [[MORE:%.*]]
 ; CHECK:       true:
 ; CHECK-NEXT:    call void @callee()
-; CHECK-NEXT:    call void @use_pointer(i8* [[A]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[A]])
 ; CHECK-NEXT:    br label [[MORE]]
 ; CHECK:       more:
 ; CHECK-NEXT:    br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
@@ -320,26 +320,26 @@ loop:
 
 true:
   call void @callee()
-  call void @use_pointer(i8* %a)
+  call void @use_pointer(ptr %a)
   br label %more
 
 more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test9(i8* %a) nounwind {
+define void @test9(ptr %a) nounwind {
 ; CHECK-LABEL: @test9(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    br i1 undef, label [[TRUE:%.*]], label [[MORE:%.*]]
 ; CHECK:       true:
-; CHECK-NEXT:    call void @use_pointer(i8* [[A:%.*]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[A:%.*]])
 ; CHECK-NEXT:    br label [[MORE]]
 ; CHECK:       more:
 ; CHECK-NEXT:    br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
@@ -347,27 +347,27 @@ define void @test9(i8* %a) nounwind {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
   br i1 undef, label %true, label %more
 
 true:
-  call void @use_pointer(i8* %a)
+  call void @use_pointer(ptr %a)
   br label %more
 
 more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test10(i8* %a) nounwind {
+define void @test10(ptr %a) nounwind {
 ; CHECK-LABEL: @test10(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -382,8 +382,8 @@ define void @test10(i8* %a) nounwind {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
@@ -397,12 +397,12 @@ more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-define void @test11(i8* %a) nounwind {
+define void @test11(ptr %a) nounwind {
 ; CHECK-LABEL: @test11(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -416,8 +416,8 @@ define void @test11(i8* %a) nounwind {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
@@ -430,18 +430,18 @@ more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Don't delete anything if they're not balanced.
 
-define void @test12(i8* %a) nounwind {
+define void @test12(ptr %a) nounwind {
 ; CHECK-LABEL: @test12(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUTER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
-; CHECK-NEXT:    [[INNER:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A]]) #[[ATTR0]]
+; CHECK-NEXT:    [[OUTER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[INNER:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    br i1 undef, label [[TRUE:%.*]], label [[MORE:%.*]]
@@ -450,13 +450,13 @@ define void @test12(i8* %a) nounwind {
 ; CHECK:       more:
 ; CHECK-NEXT:    br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]]
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]]
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %outer = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  %inner = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
@@ -469,8 +469,8 @@ more:
   br i1 undef, label %exit, label %loop
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -479,50 +479,48 @@ exit:
 ; by an alloca.
 ; rdar://12969722
 
-define void @test13(i8* %a) nounwind {
+define void @test13(ptr %a) nounwind {
 ; CHECK-LABEL: @test13(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[BLOCK:%.*]] = alloca i8*, align 8
-; CHECK-NEXT:    [[A1:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[BLOCK:%.*]] = alloca ptr, align 8
+; CHECK-NEXT:    [[A1:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A:%.*]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
-; CHECK-NEXT:    [[A2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[A]]) #[[ATTR0]]
-; CHECK-NEXT:    store i8* [[A]], i8** [[BLOCK]], align 8
-; CHECK-NEXT:    [[CASTED_BLOCK:%.*]] = bitcast i8** [[BLOCK]] to void ()*
-; CHECK-NEXT:    call void @block_callee(void ()* [[CASTED_BLOCK]])
-; CHECK-NEXT:    [[RELOADED_A:%.*]] = load i8*, i8** [[BLOCK]], align 8
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[RELOADED_A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    [[A2:%.*]] = tail call ptr @llvm.objc.retain(ptr [[A]]) #[[ATTR0]]
+; CHECK-NEXT:    store ptr [[A]], ptr [[BLOCK]], align 8
+; CHECK-NEXT:    call void @block_callee(ptr [[BLOCK]])
+; CHECK-NEXT:    [[RELOADED_A:%.*]] = load ptr, ptr [[BLOCK]], align 8
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[RELOADED_A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    br i1 undef, label [[LOOP]], label [[EXIT:%.*]]
 ; CHECK:       exit:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[A]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[A]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %block = alloca i8*
-  %a1 = tail call i8* @llvm.objc.retain(i8* %a) nounwind
+  %block = alloca ptr
+  %a1 = tail call ptr @llvm.objc.retain(ptr %a) nounwind
   br label %loop
 
 loop:
-  %a2 = tail call i8* @llvm.objc.retain(i8* %a) nounwind
-  store i8* %a, i8** %block, align 8
-  %casted_block = bitcast i8** %block to void ()*
-  call void @block_callee(void ()* %casted_block)
-  %reloaded_a = load i8*, i8** %block, align 8
-  call void @llvm.objc.release(i8* %reloaded_a) nounwind, !clang.imprecise_release !0
+  %a2 = tail call ptr @llvm.objc.retain(ptr %a) nounwind
+  store ptr %a, ptr %block, align 8
+  call void @block_callee(ptr %block)
+  %reloaded_a = load ptr, ptr %block, align 8
+  call void @llvm.objc.release(ptr %reloaded_a) nounwind, !clang.imprecise_release !0
   br i1 undef, label %loop, label %exit
 
 exit:
-  call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %a) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; The retain call in the entry block shouldn't be moved to the loop body.
 
-define void @test14(i8* %val0, i8 %val1) {
+define void @test14(ptr %val0, i8 %val1) {
 ; CHECK-LABEL: @test14(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[V1:%.*]] = tail call i8* @llvm.objc.retain(i8* [[VAL0:%.*]]) #[[ATTR0]]
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8* [[VAL0]], null
+; CHECK-NEXT:    [[V1:%.*]] = tail call ptr @llvm.objc.retain(ptr [[VAL0:%.*]]) #[[ATTR0]]
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr [[VAL0]], null
 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF_END27:%.*]], label [[IF_THEN:%.*]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i8 [[VAL1:%.*]], 1
@@ -540,15 +538,15 @@ define void @test14(i8* %val0, i8 %val1) {
 ; CHECK-NEXT:    br label [[FOR_END]]
 ; CHECK:       for.end:
 ; CHECK-NEXT:    call void @callee()
-; CHECK-NEXT:    call void @use_pointer(i8* [[V1]])
+; CHECK-NEXT:    call void @use_pointer(ptr [[V1]])
 ; CHECK-NEXT:    br label [[IF_END27]]
 ; CHECK:       if.end27:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[V1]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[V1]]) #[[ATTR0]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %v1 = tail call i8* @llvm.objc.retain(i8* %val0)
-  %cmp = icmp eq i8* %val0, null
+  %v1 = tail call ptr @llvm.objc.retain(ptr %val0)
+  %cmp = icmp eq ptr %val0, null
   br i1 %cmp, label %if.end27, label %if.then
 
 if.then:
@@ -572,11 +570,11 @@ for.end.loopexit:
 
 for.end:
   call void @callee()
-  call void @use_pointer(i8* %v1)
+  call void @use_pointer(ptr %v1)
   br label %if.end27
 
 if.end27:
-  call void @llvm.objc.release(i8* %v1) #0, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %v1) #0, !clang.imprecise_release !0
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/clang-arc-use-barrier.ll b/llvm/test/Transforms/ObjCARC/clang-arc-use-barrier.ll
index bb93aceb6307..2581917a3896 100644
--- a/llvm/test/Transforms/ObjCARC/clang-arc-use-barrier.ll
+++ b/llvm/test/Transforms/ObjCARC/clang-arc-use-barrier.ll
@@ -4,42 +4,39 @@
 
 ; Make sure ARC optimizer doesn't sink @obj_retain past @llvm.objc.clang.arc.use.
 
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: call void (...) @llvm.objc.clang.arc.use(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: call void (...) @llvm.objc.clang.arc.use(
 
 define void @runTest() local_unnamed_addr {
-  %1 = alloca %0*, align 8
-  %2 = alloca %0*, align 8
-  %3 = tail call %0* @foo0()
-  %4 = bitcast %0* %3 to i8*
-  %5 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %4)
-  store %0* %3, %0** %1, align 8
-  call void @foo1(%0** nonnull %1)
-  %6 = load %0*, %0** %1, align 8
-  %7 = bitcast %0* %6 to i8*
-  %8 = call i8* @llvm.objc.retain(i8* %7)
-  call void (...) @llvm.objc.clang.arc.use(%0* %3)
-  call void @llvm.objc.release(i8* %4)
-  store %0* %6, %0** %2, align 8
-  call void @foo1(%0** nonnull %2)
-  %9 = load %0*, %0** %2, align 8
-  %10 = bitcast %0* %9 to i8*
-  %11 = call i8* @llvm.objc.retain(i8* %10)
-  call void (...) @llvm.objc.clang.arc.use(%0* %6)
-  %tmp1 = load %0*, %0** %2, align 8
-  call void @llvm.objc.release(i8* %7)
-  call void @foo2(%0* %9)
-  call void @llvm.objc.release(i8* %10)
+  %1 = alloca ptr, align 8
+  %2 = alloca ptr, align 8
+  %3 = tail call ptr @foo0()
+  %4 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %3)
+  store ptr %3, ptr %1, align 8
+  call void @foo1(ptr nonnull %1)
+  %5 = load ptr, ptr %1, align 8
+  %6 = call ptr @llvm.objc.retain(ptr %5)
+  call void (...) @llvm.objc.clang.arc.use(ptr %3)
+  call void @llvm.objc.release(ptr %3)
+  store ptr %5, ptr %2, align 8
+  call void @foo1(ptr nonnull %2)
+  %7 = load ptr, ptr %2, align 8
+  %8 = call ptr @llvm.objc.retain(ptr %7)
+  call void (...) @llvm.objc.clang.arc.use(ptr %5)
+  %tmp1 = load ptr, ptr %2, align 8
+  call void @llvm.objc.release(ptr %5)
+  call void @foo2(ptr %7)
+  call void @llvm.objc.release(ptr %7)
   ret void
 }
 
-declare %0* @foo0() local_unnamed_addr
-declare void @foo1(%0**) local_unnamed_addr
-declare void @foo2(%0*) local_unnamed_addr
+declare ptr @foo0() local_unnamed_addr
+declare void @foo1(ptr) local_unnamed_addr
+declare void @foo2(ptr) local_unnamed_addr
 
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) local_unnamed_addr
-declare i8* @llvm.objc.retain(i8*) local_unnamed_addr
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr) local_unnamed_addr
+declare ptr @llvm.objc.retain(ptr) local_unnamed_addr
 declare void @llvm.objc.clang.arc.use(...) local_unnamed_addr
-declare void @llvm.objc.release(i8*) local_unnamed_addr
+declare void @llvm.objc.release(ptr) local_unnamed_addr

diff  --git a/llvm/test/Transforms/ObjCARC/code-motion.ll b/llvm/test/Transforms/ObjCARC/code-motion.ll
index 11785ac05906..499ee77bc654 100644
--- a/llvm/test/Transforms/ObjCARC/code-motion.ll
+++ b/llvm/test/Transforms/ObjCARC/code-motion.ll
@@ -1,25 +1,25 @@
 ; RUN: opt -passes=objc-arc -S < %s | FileCheck %s
 
 declare void @alterRefCount()
-declare void @use(i8*)
-declare void @readOnlyFunc(i8*, i8*)
+declare void @use(ptr)
+declare void @readOnlyFunc(ptr, ptr)
 
- at g0 = global i8* null, align 8
+ at g0 = global ptr null, align 8
 
 ; Check that ARC optimizer doesn't reverse the order of the retain call and the
 ; release call when there are debug instructions.
 
-; CHECK: call i8* @llvm.objc.retain(i8* %x)
-; CHECK: call void @llvm.objc.release(i8* %x)
+; CHECK: call ptr @llvm.objc.retain(ptr %x)
+; CHECK: call void @llvm.objc.release(ptr %x)
 
-define i32 @test(i8* %x, i8* %y, i8 %z, i32 %i) {
+define i32 @test(ptr %x, ptr %y, i8 %z, i32 %i) {
   %i.addr = alloca i32, align 4
-  store i32 %i, i32* %i.addr, align 4
-  %v1 = tail call i8* @llvm.objc.retain(i8* %x)
-  store i8 %z, i8* %x
-  call void @llvm.dbg.declare(metadata i32* %i.addr, metadata !9, metadata !DIExpression()), !dbg !10
+  store i32 %i, ptr %i.addr, align 4
+  %v1 = tail call ptr @llvm.objc.retain(ptr %x)
+  store i8 %z, ptr %x
+  call void @llvm.dbg.declare(metadata ptr %i.addr, metadata !9, metadata !DIExpression()), !dbg !10
   call void @alterRefCount()
-  tail call void @llvm.objc.release(i8* %x)
+  tail call void @llvm.objc.release(ptr %x)
   ret i32 %i
 }
 
@@ -31,11 +31,11 @@ define i32 @test(i8* %x, i8* %y, i8 %z, i32 %i) {
 ; CHECK: call void @llvm.objc.release(
 
 define void @test2() {
-  %v0 = load i8*, i8** @g0, align 8
-  %v1 = tail call i8* @llvm.objc.retain(i8* %v0)
-  tail call void @use(i8* %v0)
+  %v0 = load ptr, ptr @g0, align 8
+  %v1 = tail call ptr @llvm.objc.retain(ptr %v0)
+  tail call void @use(ptr %v0)
   tail call void @alterRefCount()
-  tail call void @llvm.objc.release(i8* %v0)
+  tail call void @llvm.objc.release(ptr %v0)
   ret void
 }
 
@@ -43,100 +43,100 @@ define void @test2() {
 ; Previously, ARC optimizer would move the release past the retain.
 
 ; if.then:
-;   call void @readOnlyFunc(i8* %obj, i8* null)
-;   call void @llvm.objc.release(i8* %obj) #1, !clang.imprecise_release !2
+;   call void @readOnlyFunc(ptr %obj, ptr null)
+;   call void @llvm.objc.release(ptr %obj) #1, !clang.imprecise_release !2
 ;   %1 = add i32 1, 2
-;   %2 = tail call i8* @llvm.objc.retain(i8* %obj)
+;   %2 = tail call ptr @llvm.objc.retain(ptr %obj)
 ;
 ; Ideally, the retain/release pairs in BB if.then should be removed.
 
-define void @test3(i8* %obj, i1 %cond) {
+define void @test3(ptr %obj, i1 %cond) {
 ; CHECK-LABEL: @test3(
-; CHECK-NEXT:    [[TMP2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ:%.*]])
+; CHECK-NEXT:    [[TMP2:%.*]] = tail call ptr @llvm.objc.retain(ptr [[OBJ:%.*]])
 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    call void @readOnlyFunc(i8* [[OBJ]], i8* null)
+; CHECK-NEXT:    call void @readOnlyFunc(ptr [[OBJ]], ptr null)
 ; CHECK-NEXT:    [[TMP1:%.*]] = add i32 1, 2
 ; CHECK-NEXT:    call void @alterRefCount()
 ; CHECK-NEXT:    br label [[JOIN:%.*]]
 ; CHECK:       if.else:
 ; CHECK-NEXT:    call void @alterRefCount()
-; CHECK-NEXT:    call void @use(i8* [[OBJ]])
+; CHECK-NEXT:    call void @use(ptr [[OBJ]])
 ; CHECK-NEXT:    br label [[JOIN]]
 ; CHECK:       join:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[OBJ]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[OBJ]]) {{.*}}, !clang.imprecise_release !2
 ; CHECK-NEXT:    ret void
 ;
-  %v0 = call i8* @llvm.objc.retain(i8* %obj)
+  %v0 = call ptr @llvm.objc.retain(ptr %obj)
   br i1 %cond, label %if.then, label %if.else
 
 if.then:
-  call void @readOnlyFunc(i8* %obj, i8* null) #0
+  call void @readOnlyFunc(ptr %obj, ptr null) #0
   add i32 1, 2
   call void @alterRefCount()
   br label %join
 
 if.else:
   call void @alterRefCount()
-  call void @use(i8* %obj)
+  call void @use(ptr %obj)
   br label %join
 
 join:
-  call void @llvm.objc.release(i8* %obj), !clang.imprecise_release !9
+  call void @llvm.objc.release(ptr %obj), !clang.imprecise_release !9
   ret void
 }
 
-define void @test4(i8* %obj0, i8* %obj1, i1 %cond) {
+define void @test4(ptr %obj0, ptr %obj1, i1 %cond) {
 ; CHECK-LABEL: @test4(
-; CHECK-NEXT:    [[TMP3:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ0:%.*]])
-; CHECK-NEXT:    [[TMP2:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ1:%.*]])
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call ptr @llvm.objc.retain(ptr [[OBJ0:%.*]])
+; CHECK-NEXT:    [[TMP2:%.*]] = tail call ptr @llvm.objc.retain(ptr [[OBJ1:%.*]])
 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    call void @readOnlyFunc(i8* [[OBJ0]], i8* [[OBJ1]])
+; CHECK-NEXT:    call void @readOnlyFunc(ptr [[OBJ0]], ptr [[OBJ1]])
 ; CHECK-NEXT:    [[TMP1:%.*]] = add i32 1, 2
 ; CHECK-NEXT:    call void @alterRefCount()
 ; CHECK-NEXT:    br label [[JOIN:%.*]]
 ; CHECK:       if.else:
 ; CHECK-NEXT:    call void @alterRefCount()
-; CHECK-NEXT:    call void @use(i8* [[OBJ0]])
-; CHECK-NEXT:    call void @use(i8* [[OBJ1]])
+; CHECK-NEXT:    call void @use(ptr [[OBJ0]])
+; CHECK-NEXT:    call void @use(ptr [[OBJ1]])
 ; CHECK-NEXT:    br label [[JOIN]]
 ; CHECK:       join:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[OBJ0]]) {{.*}}, !clang.imprecise_release !2
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[OBJ1]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[OBJ0]]) {{.*}}, !clang.imprecise_release !2
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[OBJ1]]) {{.*}}, !clang.imprecise_release !2
 ; CHECK-NEXT:    ret void
 ;
-  %v0 = call i8* @llvm.objc.retain(i8* %obj0)
-  %v1 = call i8* @llvm.objc.retain(i8* %obj1)
+  %v0 = call ptr @llvm.objc.retain(ptr %obj0)
+  %v1 = call ptr @llvm.objc.retain(ptr %obj1)
   br i1 %cond, label %if.then, label %if.else
 
 if.then:
-  call void @readOnlyFunc(i8* %obj0, i8* %obj1) #0
+  call void @readOnlyFunc(ptr %obj0, ptr %obj1) #0
   add i32 1, 2
   call void @alterRefCount()
   br label %join
 
 if.else:
   call void @alterRefCount()
-  call void @use(i8* %obj0)
-  call void @use(i8* %obj1)
+  call void @use(ptr %obj0)
+  call void @use(ptr %obj1)
   br label %join
 
 join:
-  call void @llvm.objc.release(i8* %obj0), !clang.imprecise_release !9
-  call void @llvm.objc.release(i8* %obj1), !clang.imprecise_release !9
+  call void @llvm.objc.release(ptr %obj0), !clang.imprecise_release !9
+  call void @llvm.objc.release(ptr %obj1), !clang.imprecise_release !9
   ret void
 }
 
 ; In this test, insertion points for the retain and release calls that could be
 ; eliminated are in 
diff erent blocks (bb1 and if.then).
 
-define void @test5(i8* %obj, i1 %cond0, i1 %cond1) {
+define void @test5(ptr %obj, i1 %cond0, i1 %cond1) {
 ; CHECK-LABEL: @test5(
-; CHECK-NEXT:    [[V0:%.*]] = tail call i8* @llvm.objc.retain(i8* [[OBJ:%.*]])
+; CHECK-NEXT:    [[V0:%.*]] = tail call ptr @llvm.objc.retain(ptr [[OBJ:%.*]])
 ; CHECK-NEXT:    br i1 [[COND0:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    call void @readOnlyFunc(i8* [[OBJ]], i8* null)
+; CHECK-NEXT:    call void @readOnlyFunc(ptr [[OBJ]], ptr null)
 ; CHECK-NEXT:    br i1 [[COND1:%.*]], label [[IF_THEN2:%.*]], label [[IF_ELSE2:%.*]]
 ; CHECK:       if.then2:
 ; CHECK-NEXT:    br label [[BB1:%.*]]
@@ -148,17 +148,17 @@ define void @test5(i8* %obj, i1 %cond0, i1 %cond1) {
 ; CHECK-NEXT:    br label [[JOIN:%.*]]
 ; CHECK:       if.else:
 ; CHECK-NEXT:    call void @alterRefCount()
-; CHECK-NEXT:    call void @use(i8* [[OBJ]])
+; CHECK-NEXT:    call void @use(ptr [[OBJ]])
 ; CHECK-NEXT:    br label [[JOIN]]
 ; CHECK:       join:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* [[OBJ]])
+; CHECK-NEXT:    call void @llvm.objc.release(ptr [[OBJ]])
 ; CHECK-NEXT:    ret void
 ;
-  %v0 = call i8* @llvm.objc.retain(i8* %obj)
+  %v0 = call ptr @llvm.objc.retain(ptr %obj)
   br i1 %cond0, label %if.then, label %if.else
 
 if.then:
-  call void @readOnlyFunc(i8* %obj, i8* null) #0
+  call void @readOnlyFunc(ptr %obj, ptr null) #0
   br i1 %cond1, label %if.then2, label %if.else2
 
 if.then2:
@@ -174,17 +174,17 @@ bb1:
 
 if.else:
   call void @alterRefCount()
-  call void @use(i8* %obj)
+  call void @use(ptr %obj)
   br label %join
 
 join:
-  call void @llvm.objc.release(i8* %obj), !clang.imprecise_release !9
+  call void @llvm.objc.release(ptr %obj), !clang.imprecise_release !9
   ret void
 }
 
 declare void @llvm.dbg.declare(metadata, metadata, metadata)
-declare i8* @llvm.objc.retain(i8*) local_unnamed_addr
-declare void @llvm.objc.release(i8*) local_unnamed_addr
+declare ptr @llvm.objc.retain(ptr) local_unnamed_addr
+declare void @llvm.objc.release(ptr) local_unnamed_addr
 
 attributes #0 = { readonly }
 

diff  --git a/llvm/test/Transforms/ObjCARC/comdat-ipo.ll b/llvm/test/Transforms/ObjCARC/comdat-ipo.ll
index 5881d51b4499..3f91d3bea9f1 100644
--- a/llvm/test/Transforms/ObjCARC/comdat-ipo.ll
+++ b/llvm/test/Transforms/ObjCARC/comdat-ipo.ll
@@ -2,7 +2,7 @@
 
 ; See PR26774
 
- at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_x, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_y, i8* null }]
+ at llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_x, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_y, ptr null }]
 
 @x = global i32 0
 
@@ -16,38 +16,38 @@ entry:
 define internal void @__cxx_global_var_init() {
 entry:
   %call = call i32 @foo()
-  store i32 %call, i32* @x, align 4
+  store i32 %call, ptr @x, align 4
   ret void
 }
 
 define internal void @__dxx_global_var_init() {
 entry:
   %call = call i32 @bar()
-  store i32 %call, i32* @x, align 4
+  store i32 %call, ptr @x, align 4
   ret void
 }
 
 ; CHECK-LABEL: define internal void @_GLOBAL__I_x() {
 define internal void @_GLOBAL__I_x() {
 entry:
-; CHECK:  call i8* @llvm.objc.autoreleasePoolPush()
+; CHECK:  call ptr @llvm.objc.autoreleasePoolPush()
 ; CHECK-NEXT:  call void @__cxx_global_var_init()
-; CHECK-NEXT:  call void @llvm.objc.autoreleasePoolPop(i8* %0)
+; CHECK-NEXT:  call void @llvm.objc.autoreleasePoolPop(ptr %0)
 ; CHECK-NEXT:  ret void
 
-  %0 = call i8* @llvm.objc.autoreleasePoolPush() nounwind
+  %0 = call ptr @llvm.objc.autoreleasePoolPush() nounwind
   call void @__cxx_global_var_init()
-  call void @llvm.objc.autoreleasePoolPop(i8* %0) nounwind
+  call void @llvm.objc.autoreleasePoolPop(ptr %0) nounwind
   ret void
 }
 
 define internal void @_GLOBAL__I_y() {
 entry:
-  %0 = call i8* @llvm.objc.autoreleasePoolPush() nounwind
+  %0 = call ptr @llvm.objc.autoreleasePoolPush() nounwind
   call void @__dxx_global_var_init()
-  call void @llvm.objc.autoreleasePoolPop(i8* %0) nounwind
+  call void @llvm.objc.autoreleasePoolPop(ptr %0) nounwind
   ret void
 }
 
-declare i8* @llvm.objc.autoreleasePoolPush()
-declare void @llvm.objc.autoreleasePoolPop(i8*)
+declare ptr @llvm.objc.autoreleasePoolPush()
+declare void @llvm.objc.autoreleasePoolPop(ptr)

diff  --git a/llvm/test/Transforms/ObjCARC/contract-attached-call-no-marker.ll b/llvm/test/Transforms/ObjCARC/contract-attached-call-no-marker.ll
index 8cac6b2cef16..03bc7a593b46 100644
--- a/llvm/test/Transforms/ObjCARC/contract-attached-call-no-marker.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-attached-call-no-marker.ll
@@ -1,23 +1,23 @@
 ; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s
 
 ; CHECK-LABEL: define void @test0() {
-; CHECK: %[[CALL:.*]] = notail call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+; CHECK: %[[CALL:.*]] = notail call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
 ; CHECK-NEXT: ret void
 
 define void @test0() {
-  %call1 = call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+  %call1 = call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
   ret void
 }
 
 ; CHECK-LABEL: define void @test1() {
-; CHECK: %[[CALL:.*]] = notail call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+; CHECK: %[[CALL:.*]] = notail call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
 ; CHECK-NEXT: ret void
 
 define void @test1() {
-  %call1 = call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+  %call1 = call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
   ret void
 }
 
-declare i8* @foo()
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
+declare ptr @foo()
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)

diff  --git a/llvm/test/Transforms/ObjCARC/contract-catchswitch.ll b/llvm/test/Transforms/ObjCARC/contract-catchswitch.ll
index 620e6101dc05..19fcab55a360 100644
--- a/llvm/test/Transforms/ObjCARC/contract-catchswitch.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-catchswitch.ll
@@ -6,18 +6,17 @@ target triple = "i686--windows-msvc19.11.0"
 %0 = type opaque
 
 declare i32 @__CxxFrameHandler3(...)
-declare dllimport void @llvm.objc.release(i8*) local_unnamed_addr
-declare dllimport i8* @llvm.objc.retain(i8* returned) local_unnamed_addr
+declare dllimport void @llvm.objc.release(ptr) local_unnamed_addr
+declare dllimport ptr @llvm.objc.retain(ptr returned) local_unnamed_addr
 
- at p = global i8* null, align 4
+ at p = global ptr null, align 4
 
 declare void @f() local_unnamed_addr
 
-define void @g() local_unnamed_addr personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define void @g() local_unnamed_addr personality ptr @__CxxFrameHandler3 {
 entry:
-  %tmp = load i8*, i8** @p, align 4
-  %cast = bitcast i8* %tmp to %0*
-  %tmp1 = tail call i8* @llvm.objc.retain(i8* %tmp) #0
+  %tmp = load ptr, ptr @p, align 4
+  %tmp1 = tail call ptr @llvm.objc.retain(ptr %tmp) #0
   ; Split the basic block to ensure bitcast ends up in entry.split.
   br label %entry.split
 
@@ -30,21 +29,20 @@ catch.dispatch:
   %tmp2 = catchswitch within none [label %catch] unwind label %catch.dispatch1
 
 catch:
-  %tmp3 = catchpad within %tmp2 [i8* null, i32 64, i8* null]
+  %tmp3 = catchpad within %tmp2 [ptr null, i32 64, ptr null]
   catchret from %tmp3 to label %invoke.cont
 
 catch.dispatch1:
   %tmp4 = catchswitch within none [label %catch1] unwind label %ehcleanup
 
 catch1:
-  %tmp5 = catchpad within %tmp4 [i8 *null, i32 64, i8* null]
+  %tmp5 = catchpad within %tmp4 [ptr null, i32 64, ptr null]
   catchret from %tmp5 to label %invoke.cont
 
 invoke.cont:
-  %tmp6 = load i8*, i8** @p, align 4
-  %cast1 = bitcast i8* %tmp6 to %0*
-  %tmp7 = tail call i8* @llvm.objc.retain(i8* %tmp6) #0
-  call void @llvm.objc.release(i8* %tmp) #0, !clang.imprecise_release !0
+  %tmp6 = load ptr, ptr @p, align 4
+  %tmp7 = tail call ptr @llvm.objc.retain(ptr %tmp6) #0
+  call void @llvm.objc.release(ptr %tmp) #0, !clang.imprecise_release !0
   ; Split the basic block to ensure bitcast ends up in invoke.cont.split.
   br label %invoke.cont.split
 
@@ -56,25 +54,22 @@ invoke.cont1:
   ret void
 
 ehcleanup:
-  %tmp8 = phi %0* [ %cast, %catch.dispatch1 ], [ %cast1, %invoke.cont.split ]
+  %tmp8 = phi ptr [ %tmp, %catch.dispatch1 ], [ %tmp6, %invoke.cont.split ]
   %tmp9 = cleanuppad within none []
-  %tmp10 = bitcast %0* %tmp8 to i8*
-  call void @llvm.objc.release(i8* %tmp10) #0 [ "funclet"(token %tmp9) ]
+  call void @llvm.objc.release(ptr %tmp8) #0 [ "funclet"(token %tmp9) ]
   cleanupret from %tmp9 unwind to caller
 }
 
 ; CHECK-LABEL: entry.split:
-; CHECK-NEXT:    %0 = bitcast i8* %tmp1 to %0*
 ; CHECK-NEXT:    invoke void @f()
 ; CHECK-NEXT:            to label %invoke.cont unwind label %catch.dispatch
 
 ; CHECK-LABEL: invoke.cont.split:
-; CHECK-NEXT:    %1 = bitcast i8* %tmp7 to %0*
 ; CHECK-NEXT:    invoke void @f()
 ; CHECK-NEXT:            to label %invoke.cont1 unwind label %ehcleanup
 
 ; CHECK-LABEL: ehcleanup:
-; CHECK-NEXT:    %tmp8 = phi %0* [ %0, %catch.dispatch1 ], [ %1, %invoke.cont.split ]
+; CHECK-NEXT:    %tmp8 = phi ptr [ %tmp1, %catch.dispatch1 ], [ %tmp7, %invoke.cont.split ]
 
 attributes #0 = { nounwind }
 

diff  --git a/llvm/test/Transforms/ObjCARC/contract-end-of-use-list.ll b/llvm/test/Transforms/ObjCARC/contract-end-of-use-list.ll
index a967d06a52c6..61637f76002e 100644
--- a/llvm/test/Transforms/ObjCARC/contract-end-of-use-list.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-end-of-use-list.ll
@@ -4,27 +4,27 @@
 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-apple-darwin13.2.0"
 
-%struct = type { i8*, i8* }
+%struct = type { ptr, ptr }
 
 ; CHECK-LABEL: @foo() {
-define internal i8* @foo() {
+define internal ptr @foo() {
 entry:
-  %call = call i8* @bar()
-; CHECK: %retained1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call)
-  %retained1 = call i8* @llvm.objc.retain(i8* %call)
-  %isnull = icmp eq i8* %retained1, null
+  %call = call ptr @bar()
+; CHECK: %retained1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call)
+  %retained1 = call ptr @llvm.objc.retain(ptr %call)
+  %isnull = icmp eq ptr %retained1, null
   br i1 %isnull, label %cleanup, label %if.end
 
 if.end:
-; CHECK: %retained2 = call i8* @llvm.objc.retain(i8* %retained1)
-  %retained2 = call i8* @llvm.objc.retain(i8* %retained1)
+; CHECK: %retained2 = call ptr @llvm.objc.retain(ptr %retained1)
+  %retained2 = call ptr @llvm.objc.retain(ptr %retained1)
   br label %cleanup
 
 cleanup:
-  %retval = phi i8* [ %retained2, %if.end ], [ null, %entry ]
-  ret i8* %retval
+  %retval = phi ptr [ %retained2, %if.end ], [ null, %entry ]
+  ret ptr %retval
 }
 
-declare i8* @bar()
+declare ptr @bar()
 
-declare extern_weak i8* @llvm.objc.retain(i8*)
+declare extern_weak ptr @llvm.objc.retain(ptr)

diff  --git a/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll b/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll
index b2e856d4a723..4fea0319bf57 100644
--- a/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll
@@ -20,70 +20,70 @@
 ; CHECK-LABEL: invoke.cont
 ; CHECK: call void asm sideeffect "movl{{.*}}%ebp, %ebp{{.*}}", ""(){{$}}
 
-define void @"\01?g@@YAXXZ"() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define void @"\01?g@@YAXXZ"() personality ptr @__CxxFrameHandler3 {
 entry:
-  %call = invoke i8* @"\01?f@@YAPAUobjc_object@@XZ"()
+  %call = invoke ptr @"\01?f@@YAPAUobjc_object@@XZ"()
           to label %invoke.cont unwind label %catch.dispatch
 
 catch.dispatch:                                   ; preds = %entry
   %0 = catchswitch within none [label %catch] unwind to caller
 
 catch:                                            ; preds = %catch.dispatch
-  %1 = catchpad within %0 [i8* null, i32 64, i8* null]
-  %call1 = call i8* @"\01?f@@YAPAUobjc_object@@XZ"() [ "funclet"(token %1) ]
-  %2 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) [ "funclet"(token %1) ]
-  call void @llvm.objc.release(i8* %2) [ "funclet"(token %1) ]
+  %1 = catchpad within %0 [ptr null, i32 64, ptr null]
+  %call1 = call ptr @"\01?f@@YAPAUobjc_object@@XZ"() [ "funclet"(token %1) ]
+  %2 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call1) [ "funclet"(token %1) ]
+  call void @llvm.objc.release(ptr %2) [ "funclet"(token %1) ]
   br label %catch.1
 
 catch.1:                                          ; preds = %catch
-  %call2 = call i8* @"\01?f@@YAPAUobjc_object@@XZ"() [ "funclet"(token %1) ]
-  %3 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call2) [ "funclet"(token %1) ]
-  call void @llvm.objc.release(i8* %3) [ "funclet"(token %1) ]
+  %call2 = call ptr @"\01?f@@YAPAUobjc_object@@XZ"() [ "funclet"(token %1) ]
+  %3 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call2) [ "funclet"(token %1) ]
+  call void @llvm.objc.release(ptr %3) [ "funclet"(token %1) ]
   catchret from %1 to label %catchret.dest
 
 catchret.dest:                                    ; preds = %catch.1
   ret void
 
 invoke.cont:                                      ; preds = %entry
-  %4 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call)
-  call void @llvm.objc.release(i8* %4)
+  %4 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call)
+  call void @llvm.objc.release(ptr %4)
   ret void
 }
 
 ; CHECK-LABEL: define dso_local void @"?test_attr_claimRV@@YAXXZ"()
-; CHECK: %[[CALL4:.*]] = notail call i8* @"?noexcept_func@@YAPAUobjc_object@@XZ"() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+; CHECK: %[[CALL4:.*]] = notail call ptr @"?noexcept_func@@YAPAUobjc_object@@XZ"() [ "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
 ; CHECK-NEXT: ret void
 
 ; CHECK: %[[V1:.*]] = cleanuppad
-; CHECK: %[[CALL:.*]] = notail call i8* @"?noexcept_func@@YAPAUobjc_object@@XZ"() [ "funclet"(token %[[V1]]), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+; CHECK: %[[CALL:.*]] = notail call ptr @"?noexcept_func@@YAPAUobjc_object@@XZ"() [ "funclet"(token %[[V1]]), "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
 ; CHECK-NEXT: cleanupret from %[[V1]] unwind to caller
 
-define dso_local void @"?test_attr_claimRV@@YAXXZ"() local_unnamed_addr #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define dso_local void @"?test_attr_claimRV@@YAXXZ"() local_unnamed_addr #0 personality ptr @__CxxFrameHandler3 {
 entry:
   invoke void @"?foo@@YAXXZ"()
           to label %invoke.cont unwind label %ehcleanup
 
 invoke.cont:                                      ; preds = %entry
-  %call.i4 = tail call i8* @"?noexcept_func@@YAPAUobjc_object@@XZ"() #2 [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+  %call.i4 = tail call ptr @"?noexcept_func@@YAPAUobjc_object@@XZ"() #2 [ "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
   ret void
 
 ehcleanup:                                        ; preds = %entry
   %0 = cleanuppad within none []
-  %call.i = call i8* @"?noexcept_func@@YAPAUobjc_object@@XZ"() #2 [ "funclet"(token %0), "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+  %call.i = call ptr @"?noexcept_func@@YAPAUobjc_object@@XZ"() #2 [ "funclet"(token %0), "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
   cleanupret from %0 unwind to caller
 }
 
-declare i8* @"\01?f@@YAPAUobjc_object@@XZ"()
+declare ptr @"\01?f@@YAPAUobjc_object@@XZ"()
 
 declare i32 @__CxxFrameHandler3(...)
 
 declare void @"?foo@@YAXXZ"()
-declare i8* @"?noexcept_func@@YAPAUobjc_object@@XZ"()
+declare ptr @"?noexcept_func@@YAPAUobjc_object@@XZ"()
 
-declare dllimport i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
+declare dllimport ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)
 
-declare dllimport void @llvm.objc.release(i8*)
+declare dllimport void @llvm.objc.release(ptr)
 
 !llvm.module.flags = !{!0}
 

diff  --git a/llvm/test/Transforms/ObjCARC/contract-marker.ll b/llvm/test/Transforms/ObjCARC/contract-marker.ll
index d3706def9112..8f1ec6d7cde9 100644
--- a/llvm/test/Transforms/ObjCARC/contract-marker.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-marker.ll
@@ -1,62 +1,58 @@
 ; RUN: opt -S -passes=objc-arc-contract < %s | FileCheck %s
 
 ; CHECK-LABEL: define void @foo() {
-; CHECK:      %call = tail call i32* @qux()
-; CHECK-NEXT: %tcall = bitcast i32* %call to i8*
+; CHECK:      %call = tail call ptr @qux()
 ; CHECK-NEXT: call void asm sideeffect "mov\09r7, r7\09\09@ marker for return value optimization", ""()
-; CHECK-NEXT: %0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %tcall) [[NUW:#[0-9]+]]
+; CHECK-NEXT: %0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) [[NUW:#[0-9]+]]
 ; CHECK: }
 
 define void @foo() {
 entry:
-  %call = tail call i32* @qux()
-  %tcall = bitcast i32* %call to i8*
-  %0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %tcall) nounwind
-  tail call void @bar(i8* %0)
+  %call = tail call ptr @qux()
+  %0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  tail call void @bar(ptr %0)
   ret void
 }
 
 ; CHECK-LABEL: define void @foo2() {
-; CHECK:      %call = tail call i32* @qux()
-; CHECK-NEXT: %tcall = bitcast i32* %call to i8*
+; CHECK:      %call = tail call ptr @qux()
 ; CHECK-NEXT: call void asm sideeffect "mov\09r7, r7\09\09@ marker for return value optimization", ""()
-; CHECK-NEXT: %0 = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %tcall) [[NUW:#[0-9]+]]
+; CHECK-NEXT: %0 = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %call) [[NUW:#[0-9]+]]
 ; CHECK: }
 
 define void @foo2() {
 entry:
-  %call = tail call i32* @qux()
-  %tcall = bitcast i32* %call to i8*
-  %0 = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %tcall) nounwind
-  tail call void @bar(i8* %0)
+  %call = tail call ptr @qux()
+  %0 = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %call) nounwind
+  tail call void @bar(ptr %0)
   ret void
 }
 
-; CHECK-LABEL: define i8* @foo3(
-; CHECK: call i8* @returnsArg(
+; CHECK-LABEL: define ptr @foo3(
+; CHECK: call ptr @returnsArg(
 ; CHECK-NEXT: call void asm sideeffect
 
-define i8* @foo3(i8* %a) {
-  %call = call i8* @returnsArg(i8* %a)
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call)
-  ret i8* %call
+define ptr @foo3(ptr %a) {
+  %call = call ptr @returnsArg(ptr %a)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call)
+  ret ptr %call
 }
 
-; CHECK-LABEL: define i8* @foo4(
-; CHECK: call i8* @returnsArg(
+; CHECK-LABEL: define ptr @foo4(
+; CHECK: call ptr @returnsArg(
 ; CHECK-NEXT: call void asm sideeffect
 
-define i8* @foo4(i8* %a) {
-  %call = call i8* @returnsArg(i8* %a)
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %a)
-  ret i8* %call
+define ptr @foo4(ptr %a) {
+  %call = call ptr @returnsArg(ptr %a)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %a)
+  ret ptr %call
 }
 
-declare i32* @qux()
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
-declare void @bar(i8*)
-declare i8* @returnsArg(i8* returned)
+declare ptr @qux()
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)
+declare void @bar(ptr)
+declare ptr @returnsArg(ptr returned)
 
 !llvm.module.flags = !{!0}
 

diff  --git a/llvm/test/Transforms/ObjCARC/contract-replace-arg-use.ll b/llvm/test/Transforms/ObjCARC/contract-replace-arg-use.ll
index d9c76b94a928..47a88925bdb3 100644
--- a/llvm/test/Transforms/ObjCARC/contract-replace-arg-use.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-replace-arg-use.ll
@@ -1,46 +1,41 @@
 ; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s
 
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @foo1()
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @foo1()
 
 ; Check that ARC contraction replaces the function return with the value
 ; returned by @llvm.objc.autoreleaseReturnValue.
 
-; CHECK-LABEL: define i32* @autoreleaseRVTailCall(
-; CHECK: %[[V0:[0-9]+]] = tail call i8* @llvm.objc.autoreleaseReturnValue(
-; CHECK: %[[V1:[0-9]+]] = bitcast i8* %[[V0]] to i32*
-; CHECK: ret i32* %[[V1]]
+; CHECK-LABEL: define ptr @autoreleaseRVTailCall(
+; CHECK: %[[V0:[0-9]+]] = tail call ptr @llvm.objc.autoreleaseReturnValue(
+; CHECK: ret ptr %[[V0]]
 
-define i32* @autoreleaseRVTailCall() {
-  %1 = call i8* @foo1()
-  %2 = bitcast i8* %1 to i32*
-  %3 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1)
-  ret i32* %2
+define ptr @autoreleaseRVTailCall() {
+  %1 = call ptr @foo1()
+  %2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %1)
+  ret ptr %1
 }
 
-declare i32* @foo2(i32);
+declare ptr @foo2(i32);
 
-; CHECK-LABEL: define i32* @autoreleaseRVTailCallPhi(
-; CHECK: %[[PHIVAL:.*]] = phi i8* [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
-; CHECK: %[[RETVAL:.*]] = phi i32* [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
-; CHECK: %[[V4:.*]] = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %[[PHIVAL]])
-; CHECK: %[[V0:.*]] = bitcast i8* %[[V4]] to i32*
-; CHECK: ret i32* %[[V0]]
+; CHECK-LABEL: define ptr @autoreleaseRVTailCallPhi(
+; CHECK: %[[PHIVAL:.*]] = phi ptr [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
+; CHECK: %[[RETVAL:.*]] = phi ptr [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
+; CHECK: %[[V4:.*]] = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %[[PHIVAL]])
+; CHECK: ret ptr %[[V4]]
 
-define i32* @autoreleaseRVTailCallPhi(i1 %cond) {
+define ptr @autoreleaseRVTailCallPhi(i1 %cond) {
 entry:
   br i1 %cond, label %bb1, label %bb2
 bb1:
-  %v0 = call i32* @foo2(i32 1)
-  %v1 = bitcast i32* %v0 to i8*
+  %v0 = call ptr @foo2(i32 1)
   br label %bb3
 bb2:
-  %v2 = call i32* @foo2(i32 2)
-  %v3 = bitcast i32* %v2 to i8*
+  %v2 = call ptr @foo2(i32 2)
   br label %bb3
 bb3:
-  %phival = phi i8* [ %v1, %bb1 ], [ %v3, %bb2 ]
-  %retval = phi i32* [ %v0, %bb1 ], [ %v2, %bb2 ]
-  %v4 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %phival)
-  ret i32* %retval
+  %phival = phi ptr [ %v0, %bb1 ], [ %v2, %bb2 ]
+  %retval = phi ptr [ %v0, %bb1 ], [ %v2, %bb2 ]
+  %v4 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %phival)
+  ret ptr %retval
 }

diff  --git a/llvm/test/Transforms/ObjCARC/contract-rv-attr.ll b/llvm/test/Transforms/ObjCARC/contract-rv-attr.ll
index b120a95188cc..1a8c1873c1c5 100644
--- a/llvm/test/Transforms/ObjCARC/contract-rv-attr.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-rv-attr.ll
@@ -1,74 +1,74 @@
 ; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s
 
 ; CHECK-LABEL: define void @test0() {
-; CHECK: %[[CALL:.*]] = notail call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
-; CHECK-NOT: call i8* @llvm.objc.retainAutoreleasedReturnValue(
+; CHECK: %[[CALL:.*]] = notail call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
+; CHECK-NOT: call ptr @llvm.objc.retainAutoreleasedReturnValue(
 
 define void @test0() {
-  %call1 = call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+  %call1 = call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
   ret void
 }
 
 ; CHECK-LABEL: define void @test1() {
-; CHECK: %[[CALL:.*]] = notail call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
-; CHECK-NOT: call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(
+; CHECK: %[[CALL:.*]] = notail call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+; CHECK-NOT: call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(
 
 define void @test1() {
-  %call1 = call i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
+  %call1 = call ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue) ]
   ret void
 }
 
-; CHECK-LABEL:define i8* @test2(
-; CHECK: %[[V0:.*]] = invoke i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+; CHECK-LABEL:define ptr @test2(
+; CHECK: %[[V0:.*]] = invoke ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
 
-; CHECK-NOT: = call i8* @llvm.objc.retainAutoreleasedReturnValue(
+; CHECK-NOT: = call ptr @llvm.objc.retainAutoreleasedReturnValue(
 ; CHECK: br
 
-; CHECK: %[[V2:.*]] = invoke i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+; CHECK: %[[V2:.*]] = invoke ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
 
-; CHECK-NOT: = call i8* @llvm.objc.retainAutoreleasedReturnValue(
+; CHECK-NOT: = call ptr @llvm.objc.retainAutoreleasedReturnValue(
 ; CHECK: br
 
-; CHECK: %[[RETVAL:.*]] = phi i8* [ %[[V0]], {{.*}} ], [ %[[V2]], {{.*}} ]
-; CHECK: ret i8* %[[RETVAL]]
+; CHECK: %[[RETVAL:.*]] = phi ptr [ %[[V0]], {{.*}} ], [ %[[V2]], {{.*}} ]
+; CHECK: ret ptr %[[RETVAL]]
 
-define i8* @test2(i1 zeroext %b) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+define ptr @test2(i1 zeroext %b) personality ptr @__gxx_personality_v0 {
 entry:
   br i1 %b, label %if.then, label %if.end
 
 if.then:
-  %call1 = invoke i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+  %call1 = invoke ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
           to label %cleanup unwind label %lpad
 
 lpad:
-  %0 = landingpad { i8*, i32 }
+  %0 = landingpad { ptr, i32 }
           cleanup
-  resume { i8*, i32 } undef
+  resume { ptr, i32 } undef
 
 if.end:
-  %call3 = invoke i8* @foo() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+  %call3 = invoke ptr @foo() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
           to label %cleanup unwind label %lpad
 
 cleanup:
-  %retval.0 = phi i8* [ %call1, %if.then ], [ %call3, %if.end ]
-  ret i8* %retval.0
+  %retval.0 = phi ptr [ %call1, %if.then ], [ %call3, %if.end ]
+  ret ptr %retval.0
 }
 
 ; "clang.arc.attachedcall" is ignored if the return type of the called function is void.
 ; CHECK-LABEL: define void @test3(
-; CHECK: call void @foo2() #[[ATTR1:.*]] [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+; CHECK: call void @foo2() #[[ATTR1:.*]] [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
 ; CHECK-NEXT: ret void
 
 define void @test3() {
-  call void @foo2() #0 [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
+  call void @foo2() #0 [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
   ret void
 }
 
-declare i8* @foo()
+declare ptr @foo()
 declare void @foo2()
 declare i32 @__gxx_personality_v0(...)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)
 
 !llvm.module.flags = !{!0}
 

diff  --git a/llvm/test/Transforms/ObjCARC/contract-storestrong-funclet.ll b/llvm/test/Transforms/ObjCARC/contract-storestrong-funclet.ll
index 1bbb312e89d0..5aa9b8b66c86 100644
--- a/llvm/test/Transforms/ObjCARC/contract-storestrong-funclet.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-storestrong-funclet.ll
@@ -3,38 +3,38 @@
 
 declare void @f()
 declare i32 @__CxxFrameHandler3(...)
-declare dllimport i8* @llvm.objc.retain(i8*)
-declare dllimport i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare dllimport void @llvm.objc.release(i8*)
+declare dllimport ptr @llvm.objc.retain(ptr)
+declare dllimport ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare dllimport void @llvm.objc.release(ptr)
 
- at x = external global i8*
+ at x = external global ptr
 
-define void @g(i8* %p) personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define void @g(ptr %p) personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @g(
 ; CHECK-NEXT:    invoke void @f()
 ; CHECK-NEXT:    to label [[INVOKE_CONT:%.*]] unwind label [[EHCLEANUP:%.*]]
 ; CHECK:       invoke.cont:
-; CHECK-NEXT:    tail call void @llvm.objc.storeStrong(i8** @x, i8* [[P:%.*]]) #[[ATTR0:[0-9]+]]
+; CHECK-NEXT:    tail call void @llvm.objc.storeStrong(ptr @x, ptr [[P:%.*]]) #[[ATTR0:[0-9]+]]
 ; CHECK-NEXT:    ret void
 ; CHECK:       ehcleanup:
 ; CHECK-NEXT:    [[TMP1:%.*]] = cleanuppad within none []
-; CHECK-NEXT:    tail call void @llvm.objc.storeStrong(i8** @x, i8* [[P]]) #[[ATTR0]] [ "funclet"(token [[TMP1]]) ]
+; CHECK-NEXT:    tail call void @llvm.objc.storeStrong(ptr @x, ptr [[P]]) #[[ATTR0]] [ "funclet"(token [[TMP1]]) ]
 ; CHECK-NEXT:    cleanupret from [[TMP1]] unwind to caller
 ;
   invoke void @f() to label %invoke.cont unwind label %ehcleanup
 
 invoke.cont:
-  %call = tail call i8* @llvm.objc.retain(i8* %p) nounwind
-  %tmp = load i8*, i8** @x, align 4
-  store i8* %call, i8** @x, align 4
-  tail call void @llvm.objc.release(i8* %tmp) nounwind
+  %call = tail call ptr @llvm.objc.retain(ptr %p) nounwind
+  %tmp = load ptr, ptr @x, align 4
+  store ptr %call, ptr @x, align 4
+  tail call void @llvm.objc.release(ptr %tmp) nounwind
   ret void
 
 ehcleanup:
   %1 = cleanuppad within none []
-  %call1 = tail call i8* @llvm.objc.retain(i8* %p) nounwind [ "funclet"(token %1) ]
-  %tmp1 = load i8*, i8** @x, align 4
-  store i8* %call1, i8** @x, align 4
-  tail call void @llvm.objc.release(i8* %tmp1) nounwind [ "funclet"(token %1) ]
+  %call1 = tail call ptr @llvm.objc.retain(ptr %p) nounwind [ "funclet"(token %1) ]
+  %tmp1 = load ptr, ptr @x, align 4
+  store ptr %call1, ptr @x, align 4
+  tail call void @llvm.objc.release(ptr %tmp1) nounwind [ "funclet"(token %1) ]
   cleanupret from %1 unwind to caller
 }

diff  --git a/llvm/test/Transforms/ObjCARC/contract-storestrong-ivar.ll b/llvm/test/Transforms/ObjCARC/contract-storestrong-ivar.ll
index 6be0381ef7e2..c94101714e95 100644
--- a/llvm/test/Transforms/ObjCARC/contract-storestrong-ivar.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-storestrong-ivar.ll
@@ -1,6 +1,6 @@
 ; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s
 
-; CHECK: tail call void @llvm.objc.storeStrong(i8**
+; CHECK: tail call void @llvm.objc.storeStrong(ptr
 
 target 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"
 target triple = "x86_64-apple-darwin11.0.0"
@@ -10,22 +10,17 @@ target triple = "x86_64-apple-darwin11.0.0"
 
 @"OBJC_IVAR_$_Controller.preferencesController" = external global i64, section "__DATA, __objc_const", align 8
 
-declare i8* @llvm.objc.retain(i8*)
+declare ptr @llvm.objc.retain(ptr)
 
-declare void @llvm.objc.release(i8*)
+declare void @llvm.objc.release(ptr)
 
-define hidden void @y(%0* nocapture %self, %1* %preferencesController) nounwind {
+define hidden void @y(ptr nocapture %self, ptr %preferencesController) nounwind {
 entry:
-  %ivar = load i64, i64* @"OBJC_IVAR_$_Controller.preferencesController", align 8
-  %tmp = bitcast %0* %self to i8*
-  %add.ptr = getelementptr inbounds i8, i8* %tmp, i64 %ivar
-  %tmp1 = bitcast i8* %add.ptr to %1**
-  %tmp2 = load %1*, %1** %tmp1, align 8
-  %tmp3 = bitcast %1* %preferencesController to i8*
-  %tmp4 = tail call i8* @llvm.objc.retain(i8* %tmp3) nounwind
-  %tmp5 = bitcast %1* %tmp2 to i8*
-  tail call void @llvm.objc.release(i8* %tmp5) nounwind
-  %tmp6 = bitcast i8* %tmp4 to %1*
-  store %1* %tmp6, %1** %tmp1, align 8
+  %ivar = load i64, ptr @"OBJC_IVAR_$_Controller.preferencesController", align 8
+  %add.ptr = getelementptr inbounds i8, ptr %self, i64 %ivar
+  %tmp2 = load ptr, ptr %add.ptr, align 8
+  %tmp4 = tail call ptr @llvm.objc.retain(ptr %preferencesController) nounwind
+  tail call void @llvm.objc.release(ptr %tmp2) nounwind
+  store ptr %tmp4, ptr %add.ptr, align 8
   ret void
 }

diff  --git a/llvm/test/Transforms/ObjCARC/contract-storestrong.ll b/llvm/test/Transforms/ObjCARC/contract-storestrong.ll
index f132dbf0fe43..945811e08f8a 100644
--- a/llvm/test/Transforms/ObjCARC/contract-storestrong.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-storestrong.ll
@@ -2,136 +2,136 @@
 
 target datalayout = "e-p:64:64:64"
 
-declare i8* @llvm.objc.retain(i8*)
-declare void @llvm.objc.release(i8*)
-declare void @use_pointer(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare void @llvm.objc.release(ptr)
+declare void @use_pointer(ptr)
 
- at x = external global i8*
+ at x = external global ptr
 
 ; CHECK-LABEL: define void @test0(
 ; CHECK: entry:
-; CHECK-NEXT: tail call void @llvm.objc.storeStrong(i8** @x, i8* %p) [[NUW:#[0-9]+]]
+; CHECK-NEXT: tail call void @llvm.objc.storeStrong(ptr @x, ptr %p) [[NUW:#[0-9]+]]
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test0(i8* %p) {
+define void @test0(ptr %p) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %p) nounwind
-  %tmp = load i8*, i8** @x, align 8
-  store i8* %0, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %tmp) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %p) nounwind
+  %tmp = load ptr, ptr @x, align 8
+  store ptr %0, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %tmp) nounwind
   ret void
 }
 
 ; Don't do this if the load is volatile.
 
-; CHECK-LABEL: define void @test1(i8* %p) {
+; CHECK-LABEL: define void @test1(ptr %p) {
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %0 = tail call i8* @llvm.objc.retain(i8* %p) [[NUW]]
-; CHECK-NEXT:   %tmp = load volatile i8*, i8** @x, align 8
-; CHECK-NEXT:   store i8* %0, i8** @x, align 8
-; CHECK-NEXT:   tail call void @llvm.objc.release(i8* %tmp) [[NUW]]
+; CHECK-NEXT:   %0 = tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
+; CHECK-NEXT:   %tmp = load volatile ptr, ptr @x, align 8
+; CHECK-NEXT:   store ptr %0, ptr @x, align 8
+; CHECK-NEXT:   tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test1(i8* %p) {
+define void @test1(ptr %p) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %p) nounwind
-  %tmp = load volatile i8*, i8** @x, align 8
-  store i8* %0, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %tmp) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %p) nounwind
+  %tmp = load volatile ptr, ptr @x, align 8
+  store ptr %0, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %tmp) nounwind
   ret void
 }
 
 ; Don't do this if the store is volatile.
 
-; CHECK-LABEL: define void @test2(i8* %p) {
+; CHECK-LABEL: define void @test2(ptr %p) {
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %0 = tail call i8* @llvm.objc.retain(i8* %p) [[NUW]]
-; CHECK-NEXT:   %tmp = load i8*, i8** @x, align 8
-; CHECK-NEXT:   store volatile i8* %0, i8** @x, align 8
-; CHECK-NEXT:   tail call void @llvm.objc.release(i8* %tmp) [[NUW]]
+; CHECK-NEXT:   %0 = tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
+; CHECK-NEXT:   %tmp = load ptr, ptr @x, align 8
+; CHECK-NEXT:   store volatile ptr %0, ptr @x, align 8
+; CHECK-NEXT:   tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test2(i8* %p) {
+define void @test2(ptr %p) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %p) nounwind
-  %tmp = load i8*, i8** @x, align 8
-  store volatile i8* %0, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %tmp) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %p) nounwind
+  %tmp = load ptr, ptr @x, align 8
+  store volatile ptr %0, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %tmp) nounwind
   ret void
 }
 
 ; Don't do this if there's a use of the old pointer value between the store
 ; and the release.
 
-; CHECK-LABEL: define void @test3(i8* %newValue) {
+; CHECK-LABEL: define void @test3(ptr %newValue) {
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) [[NUW]]
-; CHECK-NEXT:    %x1 = load i8*, i8** @x, align 8
-; CHECK-NEXT:    store i8* %x0, i8** @x, align 8
-; CHECK-NEXT:    tail call void @use_pointer(i8* %x1), !clang.arc.no_objc_arc_exceptions !0
-; CHECK-NEXT:    tail call void @llvm.objc.release(i8* %x1) [[NUW]], !clang.imprecise_release !0
+; CHECK-NEXT:    %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) [[NUW]]
+; CHECK-NEXT:    %x1 = load ptr, ptr @x, align 8
+; CHECK-NEXT:    store ptr %x0, ptr @x, align 8
+; CHECK-NEXT:    tail call void @use_pointer(ptr %x1), !clang.arc.no_objc_arc_exceptions !0
+; CHECK-NEXT:    tail call void @llvm.objc.release(ptr %x1) [[NUW]], !clang.imprecise_release !0
 ; CHECK-NEXT:    ret void
 ; CHECK-NEXT:  }
-define void @test3(i8* %newValue) {
+define void @test3(ptr %newValue) {
 entry:
-  %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) nounwind
-  %x1 = load i8*, i8** @x, align 8
-  store i8* %newValue, i8** @x, align 8
-  tail call void @use_pointer(i8* %x1), !clang.arc.no_objc_arc_exceptions !0
-  tail call void @llvm.objc.release(i8* %x1) nounwind, !clang.imprecise_release !0
+  %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) nounwind
+  %x1 = load ptr, ptr @x, align 8
+  store ptr %newValue, ptr @x, align 8
+  tail call void @use_pointer(ptr %x1), !clang.arc.no_objc_arc_exceptions !0
+  tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Like test3, but with an icmp use instead of a call, for good measure.
 
-; CHECK-LABEL:  define i1 @test4(i8* %newValue, i8* %foo) {
+; CHECK-LABEL:  define i1 @test4(ptr %newValue, ptr %foo) {
 ; CHECK-NEXT:   entry:
-; CHECK-NEXT:     %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) [[NUW]]
-; CHECK-NEXT:     %x1 = load i8*, i8** @x, align 8
-; CHECK-NEXT:     store i8* %x0, i8** @x, align 8
-; CHECK-NEXT:     %t = icmp eq i8* %x1, %foo
-; CHECK-NEXT:     tail call void @llvm.objc.release(i8* %x1) [[NUW]], !clang.imprecise_release !0
+; CHECK-NEXT:     %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) [[NUW]]
+; CHECK-NEXT:     %x1 = load ptr, ptr @x, align 8
+; CHECK-NEXT:     store ptr %x0, ptr @x, align 8
+; CHECK-NEXT:     %t = icmp eq ptr %x1, %foo
+; CHECK-NEXT:     tail call void @llvm.objc.release(ptr %x1) [[NUW]], !clang.imprecise_release !0
 ; CHECK-NEXT:     ret i1 %t
 ; CHECK-NEXT:   }
-define i1 @test4(i8* %newValue, i8* %foo) {
+define i1 @test4(ptr %newValue, ptr %foo) {
 entry:
-  %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) nounwind
-  %x1 = load i8*, i8** @x, align 8
-  store i8* %newValue, i8** @x, align 8
-  %t = icmp eq i8* %x1, %foo
-  tail call void @llvm.objc.release(i8* %x1) nounwind, !clang.imprecise_release !0
+  %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) nounwind
+  %x1 = load ptr, ptr @x, align 8
+  store ptr %newValue, ptr @x, align 8
+  %t = icmp eq ptr %x1, %foo
+  tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
   ret i1 %t
 }
 
 ; Do form an llvm.objc.storeStrong here, because the use is before the store.
 
-; CHECK-LABEL: define i1 @test5(i8* %newValue, i8* %foo) {
-; CHECK: %t = icmp eq i8* %x1, %foo
-; CHECK: tail call void @llvm.objc.storeStrong(i8** @x, i8* %newValue) [[NUW]]
+; CHECK-LABEL: define i1 @test5(ptr %newValue, ptr %foo) {
+; CHECK: %t = icmp eq ptr %x1, %foo
+; CHECK: tail call void @llvm.objc.storeStrong(ptr @x, ptr %newValue) [[NUW]]
 ; CHECK: }
-define i1 @test5(i8* %newValue, i8* %foo) {
+define i1 @test5(ptr %newValue, ptr %foo) {
 entry:
-  %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) nounwind
-  %x1 = load i8*, i8** @x, align 8
-  %t = icmp eq i8* %x1, %foo
-  store i8* %newValue, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %x1) nounwind, !clang.imprecise_release !0
+  %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) nounwind
+  %x1 = load ptr, ptr @x, align 8
+  %t = icmp eq ptr %x1, %foo
+  store ptr %newValue, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
   ret i1 %t
 }
 
 ; Like test5, but the release is before the store.
 
-; CHECK-LABEL: define i1 @test6(i8* %newValue, i8* %foo) {
-; CHECK: %t = icmp eq i8* %x1, %foo
-; CHECK: tail call void @llvm.objc.storeStrong(i8** @x, i8* %newValue) [[NUW]]
+; CHECK-LABEL: define i1 @test6(ptr %newValue, ptr %foo) {
+; CHECK: %t = icmp eq ptr %x1, %foo
+; CHECK: tail call void @llvm.objc.storeStrong(ptr @x, ptr %newValue) [[NUW]]
 ; CHECK: }
-define i1 @test6(i8* %newValue, i8* %foo) {
+define i1 @test6(ptr %newValue, ptr %foo) {
 entry:
-  %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) nounwind
-  %x1 = load i8*, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %x1) nounwind, !clang.imprecise_release !0
-  %t = icmp eq i8* %x1, %foo
-  store i8* %newValue, i8** @x, align 8
+  %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) nounwind
+  %x1 = load ptr, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
+  %t = icmp eq ptr %x1, %foo
+  store ptr %newValue, ptr @x, align 8
   ret i1 %t
 }
 
@@ -139,16 +139,16 @@ entry:
 
 ; CHECK-LABEL: define void @test7(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %0 = tail call i8* @llvm.objc.retain(i8* %p) [[NUW]]
-; CHECK-NEXT:   %tmp = load i8*, i8** @x, align 8
-; CHECK-NEXT:   tail call void @llvm.objc.release(i8* %tmp) [[NUW]]
+; CHECK-NEXT:   %0 = tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
+; CHECK-NEXT:   %tmp = load ptr, ptr @x, align 8
+; CHECK-NEXT:   tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test7(i8* %p) {
+define void @test7(ptr %p) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %p) nounwind
-  %tmp = load i8*, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %tmp) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %p) nounwind
+  %tmp = load ptr, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %tmp) nounwind
   ret void
 }
 
@@ -156,16 +156,16 @@ entry:
 
 ; CHECK-LABEL: define void @test8(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %tmp = load i8*, i8** @x, align 8
-; CHECK-NEXT:   store i8* %p, i8** @x, align 8
-; CHECK-NEXT:   tail call void @llvm.objc.release(i8* %tmp) [[NUW]]
+; CHECK-NEXT:   %tmp = load ptr, ptr @x, align 8
+; CHECK-NEXT:   store ptr %p, ptr @x, align 8
+; CHECK-NEXT:   tail call void @llvm.objc.release(ptr %tmp) [[NUW]]
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test8(i8* %p) {
+define void @test8(ptr %p) {
 entry:
-  %tmp = load i8*, i8** @x, align 8
-  store i8* %p, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %tmp) nounwind
+  %tmp = load ptr, ptr @x, align 8
+  store ptr %p, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %tmp) nounwind
   ret void
 }
 
@@ -175,45 +175,45 @@ entry:
 ; makes sure that we properly handled a release of an unrelated
 ; pointer.
 ;
-; CHECK-LABEL: define i1 @test9(i8* %newValue, i8* %foo, i8* %unrelated_ptr) {
+; CHECK-LABEL: define i1 @test9(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
 ; CHECK-NOT: llvm.objc.storeStrong
-define i1 @test9(i8* %newValue, i8* %foo, i8* %unrelated_ptr) {
+define i1 @test9(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
 entry:
-  %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) nounwind
-  tail call void @llvm.objc.release(i8* %unrelated_ptr) nounwind, !clang.imprecise_release !0
-  %x1 = load i8*, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %x1) nounwind, !clang.imprecise_release !0
-  %t = icmp eq i8* %x1, %foo
-  store i8* %newValue, i8** @x, align 8
-  ret i1 %t  
+  %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) nounwind
+  tail call void @llvm.objc.release(ptr %unrelated_ptr) nounwind, !clang.imprecise_release !0
+  %x1 = load ptr, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
+  %t = icmp eq ptr %x1, %foo
+  store ptr %newValue, ptr @x, align 8
+  ret i1 %t
 }
 
 ; Make sure that we don't perform the optimization when we just have a call.
 ;
-; CHECK-LABEL: define i1 @test10(i8* %newValue, i8* %foo, i8* %unrelated_ptr) {
+; CHECK-LABEL: define i1 @test10(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
 ; CHECK-NOT: llvm.objc.storeStrong
-define i1 @test10(i8* %newValue, i8* %foo, i8* %unrelated_ptr) {
+define i1 @test10(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
 entry:
-  %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) nounwind
-  call void @use_pointer(i8* %unrelated_ptr)
-  %x1 = load i8*, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %x1) nounwind, !clang.imprecise_release !0
-  %t = icmp eq i8* %x1, %foo
-  store i8* %newValue, i8** @x, align 8
+  %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) nounwind
+  call void @use_pointer(ptr %unrelated_ptr)
+  %x1 = load ptr, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
+  %t = icmp eq ptr %x1, %foo
+  store ptr %newValue, ptr @x, align 8
   ret i1 %t
 }
 
 ; Make sure we form the store strong if the use in between the retain
 ; and the store does not touch reference counts.
-; CHECK-LABEL: define i1 @test11(i8* %newValue, i8* %foo, i8* %unrelated_ptr) {
+; CHECK-LABEL: define i1 @test11(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
 ; CHECK: llvm.objc.storeStrong
-define i1 @test11(i8* %newValue, i8* %foo, i8* %unrelated_ptr) {
+define i1 @test11(ptr %newValue, ptr %foo, ptr %unrelated_ptr) {
 entry:
-  %x0 = tail call i8* @llvm.objc.retain(i8* %newValue) nounwind
-  %t = icmp eq i8* %newValue, %foo
-  %x1 = load i8*, i8** @x, align 8
-  tail call void @llvm.objc.release(i8* %x1) nounwind, !clang.imprecise_release !0
-  store i8* %newValue, i8** @x, align 8
+  %x0 = tail call ptr @llvm.objc.retain(ptr %newValue) nounwind
+  %t = icmp eq ptr %newValue, %foo
+  %x1 = load ptr, ptr @x, align 8
+  tail call void @llvm.objc.release(ptr %x1) nounwind, !clang.imprecise_release !0
+  store ptr %newValue, ptr @x, align 8
   ret i1 %t
 }
 
@@ -221,57 +221,56 @@ entry:
 ; the pointers.
 ; CHECK-LABEL: define void @test12(
 ; CHECK: entry:
-; CHECK-NEXT: %p16 = bitcast i8** @x to i16**
-; CHECK-NEXT: %tmp16 = load i16*, i16** %p16, align 8
-; CHECK-NEXT: %tmp8 = bitcast i16* %tmp16 to i8*
-; CHECK-NEXT: %p32 = bitcast i8** @x to i32**
-; CHECK-NEXT: %v32 = bitcast i8* %p to i32*
-; CHECK-NEXT: %0 = bitcast i16** %p16 to i8**
-; CHECK-NEXT: tail call void @llvm.objc.storeStrong(i8** %0, i8* %p)
+; CHECK-NEXT: %p16 = bitcast ptr @x to ptr
+; CHECK-NEXT: %tmp16 = load ptr, ptr %p16, align 8
+; CHECK-NEXT: %tmp8 = bitcast ptr %tmp16 to ptr
+; CHECK-NEXT: %p32 = bitcast ptr @x to ptr
+; CHECK-NEXT: %v32 = bitcast ptr %p to ptr
+; CHECK-NEXT: tail call void @llvm.objc.storeStrong(ptr %p16, ptr %p)
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test12(i8* %p) {
+define void @test12(ptr %p) {
 entry:
-  %retain = tail call i8* @llvm.objc.retain(i8* %p) nounwind
-  %p16 = bitcast i8** @x to i16**
-  %tmp16 = load i16*, i16** %p16, align 8
-  %tmp8 = bitcast i16* %tmp16 to i8*
-  %p32 = bitcast i8** @x to i32**
-  %v32 = bitcast i8* %retain to i32*
-  store i32* %v32, i32** %p32, align 8
-  tail call void @llvm.objc.release(i8* %tmp8) nounwind
+  %retain = tail call ptr @llvm.objc.retain(ptr %p) nounwind
+  %p16 = bitcast ptr @x to ptr
+  %tmp16 = load ptr, ptr %p16, align 8
+  %tmp8 = bitcast ptr %tmp16 to ptr
+  %p32 = bitcast ptr @x to ptr
+  %v32 = bitcast ptr %retain to ptr
+  store ptr %v32, ptr %p32, align 8
+  tail call void @llvm.objc.release(ptr %tmp8) nounwind
   ret void
 }
 
 ; This used to crash.
-; CHECK-LABEL: define i8* @test13(
-; CHECK: tail call void @llvm.objc.storeStrong(i8** %{{.*}}, i8* %[[NEW:.*]])
-; CHECK-NEXT: ret i8* %[[NEW]]
+; CHECK-LABEL: define ptr @test13(
+; CHECK: tail call void @llvm.objc.storeStrong(ptr %{{.*}}, ptr %[[NEW:.*]])
+; CHECK-NEXT: ret ptr %[[NEW]]
 
-define i8* @test13(i8* %a0, i8* %a1, i8** %addr, i8* %new) {
-  %old = load i8*, i8** %addr, align 8
-  call void @llvm.objc.release(i8* %old)
-  %retained = call i8* @llvm.objc.retain(i8* %new)
-  store i8* %retained, i8** %addr, align 8
-  ret i8* %retained
+define ptr @test13(ptr %a0, ptr %a1, ptr %addr, ptr %new) {
+  %old = load ptr, ptr %addr, align 8
+  call void @llvm.objc.release(ptr %old)
+  %retained = call ptr @llvm.objc.retain(ptr %new)
+  store ptr %retained, ptr %addr, align 8
+  ret ptr %retained
 }
 
 ; Cannot form a storeStrong call because it's unsafe to move the release call to
 ; the store.
 
 ; CHECK-LABEL: define void @test14(
-; CHECK: %[[V0:.*]] = load i8*, i8** %a
-; CHECK: %[[V1:.*]] = call i8* @llvm.objc.retain(i8* %p)
-; CHECK: store i8* %[[V1]], i8** %a
-; CHECK: %[[V2:.*]] = call i8* @llvm.objc.retain(i8* %[[V0]])
-; CHECK: call void @llvm.objc.release(i8* %[[V2]])
+; CHECK: %[[V0:.*]] = load ptr, ptr %a
+; CHECK: %[[V1:.*]] = call ptr @llvm.objc.retain(ptr %p)
+; CHECK: store ptr %[[V1]], ptr %a
+; CHECK: %[[V2:.*]] = call ptr @llvm.objc.retain(ptr %[[V0]])
+; CHECK: call void @llvm.objc.release(ptr %[[V2]])
 
-define void @test14(i8** %a, i8* %p) {
-  %v0 = load i8*, i8** %a, align 8
-  %v1 = call i8* @llvm.objc.retain(i8* %p)
-  store i8* %p, i8** %a, align 8
-  %v2  = call i8* @llvm.objc.retain(i8* %v0)
-  call void @llvm.objc.release(i8* %v0)
+define void @test14(ptr %a, ptr %p) {
+  %v0 = load ptr, ptr %a, align 8
+  %v1 = call ptr @llvm.objc.retain(ptr %p)
+  store ptr %p, ptr %a, align 8
+  %v2  = call ptr @llvm.objc.retain(ptr %v0)
+  call void @llvm.objc.release(ptr %v0)
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/contract-testcases.ll b/llvm/test/Transforms/ObjCARC/contract-testcases.ll
index b88c93678de9..36fe49382e41 100644
--- a/llvm/test/Transforms/ObjCARC/contract-testcases.ll
+++ b/llvm/test/Transforms/ObjCARC/contract-testcases.ll
@@ -6,14 +6,14 @@
 %2 = type { i64, i64 }
 %4 = type opaque
 
-declare %0* @"\01-[NSAttributedString(Terminal) pathAtIndex:effectiveRange:]"(%1*, i8* nocapture, i64, %2*) optsize
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @objc_msgSend_fixup(i8*, i8*, ...)
-declare i8* @objc_msgSend(i8*, i8*, ...)
-declare void @llvm.objc.release(i8*)
+declare ptr @"\01-[NSAttributedString(Terminal) pathAtIndex:effectiveRange:]"(ptr, ptr nocapture, i64, ptr) optsize
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @objc_msgSend_fixup(ptr, ptr, ...)
+declare ptr @objc_msgSend(ptr, ptr, ...)
+declare void @llvm.objc.release(ptr)
 declare %2 @NSUnionRange(i64, i64, i64, i64) optsize
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.autorelease(ptr)
 declare i32 @__gxx_personality_sj0(...)
 
 ; Don't get in trouble on bugpointed code.
@@ -21,8 +21,7 @@ declare i32 @__gxx_personality_sj0(...)
 ; CHECK-LABEL: define void @test0(
 define void @test0() {
 bb:
-  %tmp = bitcast %4* undef to i8*
-  %tmp1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %tmp) nounwind
+  %tmp1 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr undef) nounwind
   br label %bb3
 
 bb3:                                              ; preds = %bb2
@@ -38,7 +37,7 @@ bb5:                                              ; preds = %bb4
   br label %bb6
 
 bb6:                                              ; preds = %bb5, %bb4, %bb4, %bb3
-  %tmp7 = phi %4* [ undef, %bb5 ], [ undef, %bb4 ], [ undef, %bb3 ], [ undef, %bb4 ]
+  %tmp7 = phi ptr [ undef, %bb5 ], [ undef, %bb4 ], [ undef, %bb3 ], [ undef, %bb4 ]
   unreachable
 }
 
@@ -46,20 +45,18 @@ bb6:                                              ; preds = %bb5, %bb4, %bb4, %b
 ; for the same block, use the exactly same value in each block.
 
 ; CHECK-LABEL: define void @test1(
-; CHECK: %0 = bitcast i8* %tmp3 to %0* 
 ; CHECK: br i1 undef, label %bb7, label %bb7
 ; CHECK: bb7:
-; CHECK: %tmp8 = phi %0* [ %0, %bb ], [ %0, %bb ]
+; CHECK: %tmp8 = phi ptr [ %tmp3, %bb ], [ %tmp3, %bb ]
 ; CHECK: }
 define void @test1() {
 bb:
-  %tmp = tail call %0* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %0* ()*)()
-  %tmp2 = bitcast %0* %tmp to i8*
-  %tmp3 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %tmp2) nounwind
+  %tmp = tail call ptr @objc_msgSend()
+  %tmp3 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %tmp) nounwind
   br i1 undef, label %bb7, label %bb7
 
 bb7:                                              ; preds = %bb6, %bb6, %bb5
-  %tmp8 = phi %0* [ %tmp, %bb ], [ %tmp, %bb ]
+  %tmp8 = phi ptr [ %tmp, %bb ], [ %tmp, %bb ]
   unreachable
 }
 
@@ -67,24 +64,24 @@ bb7:                                              ; preds = %bb6, %bb6, %bb5
 ; call, handle the case where it's an invoke in a 
diff erent basic block.
 ; rdar://11714057
 
-; CHECK: define void @_Z6doTestP8NSString() personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
+; CHECK: define void @_Z6doTestP8NSString() personality ptr @__gxx_personality_sj0 {
 ; CHECK: invoke.cont:                                      ; preds = %entry
 ; CHECK-NEXT: call void asm sideeffect "mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue", ""()
-; CHECK-NEXT: %tmp = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) [[NUW:#[0-9]+]]
+; CHECK-NEXT: %tmp = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) [[NUW:#[0-9]+]]
 ; CHECK: }
-define void @_Z6doTestP8NSString() personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
+define void @_Z6doTestP8NSString() personality ptr @__gxx_personality_sj0 {
 entry:
-  %call = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* ()*)()
+  %call = invoke ptr @objc_msgSend()
           to label %invoke.cont unwind label %lpad
 
 invoke.cont:                                      ; preds = %entry
-  %tmp = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
+  %tmp = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
   unreachable
 
 lpad:                                             ; preds = %entry
-  %tmp1 = landingpad { i8*, i32 }
+  %tmp1 = landingpad { ptr, i32 }
           cleanup
-  resume { i8*, i32 } undef
+  resume { ptr, i32 } undef
 }
 
 !llvm.module.flags = !{!0}

diff  --git a/llvm/test/Transforms/ObjCARC/contract.ll b/llvm/test/Transforms/ObjCARC/contract.ll
index 07a7df0e6b9c..70bd57a0c719 100644
--- a/llvm/test/Transforms/ObjCARC/contract.ll
+++ b/llvm/test/Transforms/ObjCARC/contract.ll
@@ -2,72 +2,72 @@
 
 target datalayout = "e-p:64:64:64"
 
-declare i8* @llvm.objc.retain(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-
-declare void @use_pointer(i8*)
-declare i8* @returner()
+declare ptr @llvm.objc.retain(ptr)
+declare void @llvm.objc.release(ptr)
+declare ptr @llvm.objc.autorelease(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+
+declare void @use_pointer(ptr)
+declare ptr @returner()
 declare void @callee()
 
 ; CHECK-LABEL: define void @test0(
-; CHECK: call void @use_pointer(i8* %0)
+; CHECK: call void @use_pointer(ptr %0)
 ; CHECK: }
-define void @test0(i8* %x) nounwind {
+define void @test0(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
   ret void
 }
 
 ; CHECK-LABEL: define void @test1(
-; CHECK: call void @use_pointer(i8* %0)
+; CHECK: call void @use_pointer(ptr %0)
 ; CHECK: }
-define void @test1(i8* %x) nounwind {
+define void @test1(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
+  %0 = call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
   ret void
 }
 
 ; Merge objc_retain and objc_autorelease into objc_retainAutorelease.
 
 ; CHECK-LABEL: define void @test2(
-; CHECK: tail call i8* @llvm.objc.retainAutorelease(i8* %x) [[NUW:#[0-9]+]]
+; CHECK: tail call ptr @llvm.objc.retainAutorelease(ptr %x) [[NUW:#[0-9]+]]
 ; CHECK: }
-define void @test2(i8* %x) nounwind {
+define void @test2(ptr %x) nounwind {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %x) nounwind
-  call i8* @llvm.objc.autorelease(i8* %0) nounwind
-  call void @use_pointer(i8* %x)
+  %0 = tail call ptr @llvm.objc.retain(ptr %x) nounwind
+  call ptr @llvm.objc.autorelease(ptr %0) nounwind
+  call void @use_pointer(ptr %x)
   ret void
 }
 
 ; Same as test2 but the value is returned. Do an RV optimization.
 
-; CHECK-LABEL: define i8* @test2b(
-; CHECK: tail call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x) [[NUW]]
+; CHECK-LABEL: define ptr @test2b(
+; CHECK: tail call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %x) [[NUW]]
 ; CHECK: }
-define i8* @test2b(i8* %x) nounwind {
+define ptr @test2b(ptr %x) nounwind {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %x) nounwind
-  tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %0) nounwind
-  ret i8* %x
+  %0 = tail call ptr @llvm.objc.retain(ptr %x) nounwind
+  tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %0) nounwind
+  ret ptr %x
 }
 
 ; Merge a retain,autorelease pair around a call.
 
 ; CHECK-LABEL: define void @test3(
-; CHECK: tail call i8* @llvm.objc.retainAutorelease(i8* %x) [[NUW]]
-; CHECK: @use_pointer(i8* %0)
+; CHECK: tail call ptr @llvm.objc.retainAutorelease(ptr %x) [[NUW]]
+; CHECK: @use_pointer(ptr %0)
 ; CHECK: }
-define void @test3(i8* %x, i64 %n) {
+define void @test3(ptr %x, i64 %n) {
 entry:
-  tail call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call i8* @llvm.objc.autorelease(i8* %x) nounwind
+  tail call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call ptr @llvm.objc.autorelease(ptr %x) nounwind
   ret void
 }
 
@@ -76,35 +76,35 @@ entry:
 
 ; CHECK-LABEL: define void @test4(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: @llvm.objc.retainAutorelease(i8* %x) [[NUW]]
+; CHECK-NEXT: @llvm.objc.retainAutorelease(ptr %x) [[NUW]]
 ; CHECK-NEXT: @use_pointer
 ; CHECK-NEXT: @llvm.objc.release
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test4(i8* %x, i64 %n) {
+define void @test4(ptr %x, i64 %n) {
 entry:
-  tail call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %x)
-  call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  tail call void @llvm.objc.release(i8* %x) nounwind
+  tail call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %x)
+  call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  tail call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; Don't merge retain and autorelease if they're not control-equivalent.
 
 ; CHECK-LABEL: define void @test5(
-; CHECK: tail call i8* @llvm.objc.retain(i8* %p) [[NUW]]
+; CHECK: tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
 ; CHECK: true:
-; CHECK: call i8* @llvm.objc.autorelease(i8* %0) [[NUW]]
+; CHECK: call ptr @llvm.objc.autorelease(ptr %0) [[NUW]]
 ; CHECK: }
-define void @test5(i8* %p, i1 %a) {
+define void @test5(ptr %p, i1 %a) {
 entry:
-  tail call i8* @llvm.objc.retain(i8* %p) nounwind
+  tail call ptr @llvm.objc.retain(ptr %p) nounwind
   br i1 %a, label %true, label %false
 
 true:
-  call i8* @llvm.objc.autorelease(i8* %p) nounwind
-  call void @use_pointer(i8* %p)
+  call ptr @llvm.objc.autorelease(ptr %p) nounwind
+  call void @use_pointer(ptr %p)
   ret void
 
 false:
@@ -119,57 +119,57 @@ false:
 ; into objc_retainAutoreleasedReturnValueAutoreleaseReturnValue?
 ; Those entrypoints don't exist yet though.
 
-; CHECK-LABEL: define i8* @test6(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p) [[NUW]]
-; CHECK: %t = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1) [[NUW]]
+; CHECK-LABEL: define ptr @test6(
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p) [[NUW]]
+; CHECK: %t = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %1) [[NUW]]
 ; CHECK: }
-define i8* @test6() {
-  %p = call i8* @returner()
-  tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p) nounwind
-  %t = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %p) nounwind
-  call void @use_pointer(i8* %t)
-  ret i8* %t
+define ptr @test6() {
+  %p = call ptr @returner()
+  tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p) nounwind
+  %t = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %p) nounwind
+  call void @use_pointer(ptr %t)
+  ret ptr %t
 }
 
 ; Don't spoil the RV optimization.
 
-; CHECK: define i8* @test7(i8* %p)
-; CHECK: tail call i8* @llvm.objc.retain(i8* %p)
-; CHECK: call void @use_pointer(i8* %1)
-; CHECK: tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1)
-; CHECK: ret i8* %2
+; CHECK: define ptr @test7(ptr %p)
+; CHECK: tail call ptr @llvm.objc.retain(ptr %p)
+; CHECK: call void @use_pointer(ptr %1)
+; CHECK: tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %1)
+; CHECK: ret ptr %2
 ; CHECK-NEXT: }
-define i8* @test7(i8* %p) {
-  %1 = tail call i8* @llvm.objc.retain(i8* %p)
-  call void @use_pointer(i8* %p)
-  %2 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-  ret i8* %p
+define ptr @test7(ptr %p) {
+  %1 = tail call ptr @llvm.objc.retain(ptr %p)
+  call void @use_pointer(ptr %p)
+  %2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+  ret ptr %p
 }
 
 ; Do the return value substitution for PHI nodes too.
 
-; CHECK-LABEL: define i8* @test8(
-; CHECK: %retval = phi i8* [ %p, %if.then ], [ null, %entry ]
+; CHECK-LABEL: define ptr @test8(
+; CHECK: %retval = phi ptr [ %p, %if.then ], [ null, %entry ]
 ; CHECK: }
-define i8* @test8(i1 %x, i8* %c) {
+define ptr @test8(i1 %x, ptr %c) {
 entry:
   br i1 %x, label %return, label %if.then
 
 if.then:                                          ; preds = %entry
-  %p = call i8* @llvm.objc.retain(i8* %c) nounwind
+  %p = call ptr @llvm.objc.retain(ptr %c) nounwind
   br label %return
 
 return:                                           ; preds = %if.then, %entry
-  %retval = phi i8* [ %c, %if.then ], [ null, %entry ]
-  ret i8* %retval
+  %retval = phi ptr [ %c, %if.then ], [ null, %entry ]
+  ret ptr %retval
 }
 
 ; Kill calls to @llvm.objc.clang.arc.use(...)
 ; CHECK-LABEL: define void @test9(
 ; CHECK-NOT: clang.arc.use
 ; CHECK: }
-define void @test9(i8* %a, i8* %b) {
-  call void (...) @llvm.objc.clang.arc.use(i8* %a, i8* %b) nounwind
+define void @test9(ptr %a, ptr %b) {
+  call void (...) @llvm.objc.clang.arc.use(ptr %a, ptr %b) nounwind
   ret void
 }
 
@@ -178,10 +178,10 @@ define void @test9(i8* %a, i8* %b) {
 ; is a return value.
 
 ; CHECK: define void @test10()
-; CHECK: tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
+; CHECK: tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
 define void @test10() {
-  %p = call i8* @returner()
-  tail call i8* @llvm.objc.retain(i8* %p) nounwind
+  %p = call ptr @returner()
+  tail call ptr @llvm.objc.retain(ptr %p) nounwind
   ret void
 }
 
@@ -189,12 +189,12 @@ define void @test10() {
 ; argument is a return value.
 
 ; CHECK-LABEL: define void @test11(
-; CHECK-NEXT: %y = call i8* @returner()
-; CHECK-NEXT: tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y) [[NUW]]
+; CHECK-NEXT: %y = call ptr @returner()
+; CHECK-NEXT: tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %y) [[NUW]]
 ; CHECK-NEXT: ret void
 define void @test11() {
-  %y = call i8* @returner()
-  tail call i8* @llvm.objc.retain(i8* %y) nounwind
+  %y = call ptr @returner()
+  tail call ptr @llvm.objc.retain(ptr %y) nounwind
   ret void
 }
 
@@ -202,11 +202,11 @@ define void @test11() {
 ; argument is not a return value.
 
 ; CHECK-LABEL: define void @test12(
-; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %y) [[NUW]]
+; CHECK-NEXT: tail call ptr @llvm.objc.retain(ptr %y) [[NUW]]
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test12(i8* %y) {
-  tail call i8* @llvm.objc.retain(i8* %y) nounwind
+define void @test12(ptr %y) {
+  tail call ptr @llvm.objc.retain(ptr %y) nounwind
   ret void
 }
 
@@ -214,23 +214,23 @@ define void @test12(i8* %y) {
 ; isn't next to the call providing its return value.
 
 ; CHECK-LABEL: define void @test13(
-; CHECK-NEXT: %y = call i8* @returner()
+; CHECK-NEXT: %y = call ptr @returner()
 ; CHECK-NEXT: call void @callee()
-; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %y) [[NUW]]
+; CHECK-NEXT: tail call ptr @llvm.objc.retain(ptr %y) [[NUW]]
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
 define void @test13() {
-  %y = call i8* @returner()
+  %y = call ptr @returner()
   call void @callee()
-  tail call i8* @llvm.objc.retain(i8* %y) nounwind
+  tail call ptr @llvm.objc.retain(ptr %y) nounwind
   ret void
 }
 
 ; CHECK-LABEL: define void @test14(
 ; CHECK-NOT: clang.arc.noop.use
 ; CHECK: ret void
-define void @test14(i8* %a, i8* %b) {
-  call void (...) @llvm.objc.clang.arc.noop.use(i8* %a, i8* %b) nounwind
+define void @test14(ptr %a, ptr %b) {
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %a, ptr %b) nounwind
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/empty-block.ll b/llvm/test/Transforms/ObjCARC/empty-block.ll
index 7d7b5db96723..80930812fc7e 100644
--- a/llvm/test/Transforms/ObjCARC/empty-block.ll
+++ b/llvm/test/Transforms/ObjCARC/empty-block.ll
@@ -3,57 +3,55 @@
 
 %0 = type opaque
 
-declare i8* @llvm.objc.retain(i8*)
+declare ptr @llvm.objc.retain(ptr)
 
-declare void @llvm.objc.release(i8*)
+declare void @llvm.objc.release(ptr)
 
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
 
 ; Don't delete the autorelease.
 
-; CHECK-LABEL: define %0* @test0(
+; CHECK-LABEL: define ptr @test0(
 ; CHECK:   @llvm.objc.retain
 ; CHECK: .lr.ph:
 ; CHECK-NOT: @llvm.objc.r
 ; CHECK: @llvm.objc.autoreleaseReturnValue
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: }
-define %0* @test0(%0* %buffer) nounwind {
-  %1 = bitcast %0* %buffer to i8*
-  %2 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
+define ptr @test0(ptr %buffer) nounwind {
+  %1 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind
   br i1 undef, label %.lr.ph, label %._crit_edge
 
 .lr.ph:                                           ; preds = %.lr.ph, %0
   br i1 false, label %.lr.ph, label %._crit_edge
 
 ._crit_edge:                                      ; preds = %.lr.ph, %0
-  %3 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
-  tail call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
-  %4 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1) nounwind
-  ret %0* %buffer
+  %2 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind
+  tail call void @llvm.objc.release(ptr %buffer) nounwind, !clang.imprecise_release !0
+  %3 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %buffer) nounwind
+  ret ptr %buffer
 }
 
 ; Do delete the autorelease, even with the retain in a 
diff erent block.
 
-; CHECK-LABEL: define %0* @test1(
+; CHECK-LABEL: define ptr @test1(
 ; CHECK-NOT: @objc
 ; CHECK: }
-define %0* @test1() nounwind {
-  %buffer = call %0* @foo()
-  %1 = bitcast %0* %buffer to i8*
-  %2 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
+define ptr @test1() nounwind {
+  %buffer = call ptr @foo()
+  %1 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind
   br i1 undef, label %.lr.ph, label %._crit_edge
 
 .lr.ph:                                           ; preds = %.lr.ph, %0
   br i1 false, label %.lr.ph, label %._crit_edge
 
 ._crit_edge:                                      ; preds = %.lr.ph, %0
-  %3 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
-  tail call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
-  %4 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1) nounwind
-  ret %0* %buffer
+  %2 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind
+  tail call void @llvm.objc.release(ptr %buffer) nounwind, !clang.imprecise_release !0
+  %3 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %buffer) nounwind
+  ret ptr %buffer
 }
 
-declare %0* @foo()
+declare ptr @foo()
 
 !0 = !{}

diff  --git a/llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll b/llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll
index a31be0021028..e4c123e02540 100644
--- a/llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll
+++ b/llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll
@@ -6,101 +6,99 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
 target triple = "x86_64-apple-macosx10.9.0"
 
 %0 = type opaque
-%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* }
+%struct._class_t = type { ptr, ptr, ptr, ptr, ptr }
 %struct._objc_cache = type opaque
-%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* }
+%struct._class_ro_t = type { i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
 %struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] }
-%struct._objc_method = type { i8*, i8*, i8* }
-%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] }
-%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8** }
+%struct._objc_method = type { ptr, ptr, ptr }
+%struct._objc_protocol_list = type { i64, [0 x ptr] }
+%struct._protocol_t = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, ptr }
 %struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] }
-%struct._prop_t = type { i8*, i8* }
+%struct._prop_t = type { ptr, ptr }
 %struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] }
-%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 }
-%struct.NSConstantString = type { i32*, i32, i8*, i64 }
+%struct._ivar_t = type { ptr, ptr, ptr, i32, i32 }
+%struct.NSConstantString = type { ptr, i32, ptr, i64 }
 
 @"OBJC_CLASS_$_NSObject" = external global %struct._class_t
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_" = internal global %struct._class_t* @"OBJC_CLASS_$_NSObject", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_" = internal global ptr @"OBJC_CLASS_$_NSObject", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
 @"\01L_OBJC_METH_VAR_NAME_" = internal global [4 x i8] c"new\00", section "__TEXT,__objc_methname,cstring_literals", align 1
-@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i64 0, i64 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global ptr @"\01L_OBJC_METH_VAR_NAME_", section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
 @__CFConstantStringClassReference = external global [0 x i32]
 @.str = private unnamed_addr constant [11 x i8] c"Failed: %@\00", align 1
- at _unnamed_cfstring_ = private constant %struct.NSConstantString { i32* getelementptr inbounds ([0 x i32], [0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), i64 10 }, section "__DATA,__cfstring"
+ at _unnamed_cfstring_ = private constant %struct.NSConstantString { ptr @__CFConstantStringClassReference, i32 1992, ptr @.str, i64 10 }, section "__DATA,__cfstring"
 @"OBJC_CLASS_$_NSException" = external global %struct._class_t
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_1" = internal global %struct._class_t* @"OBJC_CLASS_$_NSException", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_1" = internal global ptr @"OBJC_CLASS_$_NSException", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
 @.str2 = private unnamed_addr constant [4 x i8] c"Foo\00", align 1
- at _unnamed_cfstring_3 = private constant %struct.NSConstantString { i32* getelementptr inbounds ([0 x i32], [0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str2, i32 0, i32 0), i64 3 }, section "__DATA,__cfstring"
+ at _unnamed_cfstring_3 = private constant %struct.NSConstantString { ptr @__CFConstantStringClassReference, i32 1992, ptr @.str2, i64 3 }, section "__DATA,__cfstring"
 @"\01L_OBJC_METH_VAR_NAME_4" = internal global [14 x i8] c"raise:format:\00", section "__TEXT,__objc_methname,cstring_literals", align 1
-@"\01L_OBJC_SELECTOR_REFERENCES_5" = internal global i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_OBJC_METH_VAR_NAME_4", i64 0, i64 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
- at llvm.used = appending global [6 x i8*] [i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_" to i8*), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_" to i8*), i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_1" to i8*), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_OBJC_METH_VAR_NAME_4", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_5" to i8*)], section "llvm.metadata"
+@"\01L_OBJC_SELECTOR_REFERENCES_5" = internal global ptr @"\01L_OBJC_METH_VAR_NAME_4", section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+ at llvm.used = appending global [6 x ptr] [ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_", ptr @"\01L_OBJC_METH_VAR_NAME_", ptr @"\01L_OBJC_SELECTOR_REFERENCES_", ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_1", ptr @"\01L_OBJC_METH_VAR_NAME_4", ptr @"\01L_OBJC_SELECTOR_REFERENCES_5"], section "llvm.metadata"
 
-define i32 @main() uwtable ssp personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) !dbg !5 {
+define i32 @main() uwtable ssp personality ptr @__objc_personality_v0 !dbg !5 {
 entry:
-  %tmp = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_", align 8, !dbg !37
-  %tmp1 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8, !dbg !37, !invariant.load !38
-  %tmp2 = bitcast %struct._class_t* %tmp to i8*, !dbg !37
-; CHECK: call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp2, i8* %tmp1)
-  %call = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp2, i8* %tmp1), !dbg !37, !clang.arc.no_objc_arc_exceptions !38
-  call void @llvm.dbg.value(metadata i8* %call, metadata !25, metadata !DIExpression()), !dbg !37
-; CHECK: call i8* @llvm.objc.retain(i8* %call) [[NUW:#[0-9]+]]
-  %tmp3 = call i8* @llvm.objc.retain(i8* %call) nounwind, !dbg !39
-  call void @llvm.dbg.value(metadata i8* %call, metadata !25, metadata !DIExpression()), !dbg !39
-  invoke fastcc void @ThrowFunc(i8* %call)
+  %tmp = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_", align 8, !dbg !37
+  %tmp1 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8, !dbg !37, !invariant.load !38
+; CHECK: call ptr @objc_msgSend(ptr %tmp, ptr %tmp1)
+  %call = call ptr @objc_msgSend(ptr %tmp, ptr %tmp1), !dbg !37, !clang.arc.no_objc_arc_exceptions !38
+  call void @llvm.dbg.value(metadata ptr %call, metadata !25, metadata !DIExpression()), !dbg !37
+; CHECK: call ptr @llvm.objc.retain(ptr %call) [[NUW:#[0-9]+]]
+  %tmp3 = call ptr @llvm.objc.retain(ptr %call) nounwind, !dbg !39
+  call void @llvm.dbg.value(metadata ptr %call, metadata !25, metadata !DIExpression()), !dbg !39
+  invoke fastcc void @ThrowFunc(ptr %call)
           to label %eh.cont unwind label %lpad, !dbg !40, !clang.arc.no_objc_arc_exceptions !38
 
 eh.cont:                                          ; preds = %entry
-; CHECK: call void @llvm.objc.release(i8* %call)
-  call void @llvm.objc.release(i8* %call) nounwind, !dbg !42, !clang.imprecise_release !38
+; CHECK: call void @llvm.objc.release(ptr %call)
+  call void @llvm.objc.release(ptr %call) nounwind, !dbg !42, !clang.imprecise_release !38
   br label %if.end, !dbg !43
 
 lpad:                                             ; preds = %entry
-  %tmp4 = landingpad { i8*, i32 }
-          catch i8* null, !dbg !40
-  %tmp5 = extractvalue { i8*, i32 } %tmp4, 0, !dbg !40
-  %exn.adjusted = call i8* @llvm.objc.begin_catch(i8* %tmp5) nounwind, !dbg !44
+  %tmp4 = landingpad { ptr, i32 }
+          catch ptr null, !dbg !40
+  %tmp5 = extractvalue { ptr, i32 } %tmp4, 0, !dbg !40
+  %exn.adjusted = call ptr @llvm.objc.begin_catch(ptr %tmp5) nounwind, !dbg !44
   call void @llvm.dbg.value(metadata i8 0, metadata !21, metadata !DIExpression()), !dbg !46
   call void @llvm.objc.end_catch(), !dbg !49, !clang.arc.no_objc_arc_exceptions !38
-; CHECK: call void @llvm.objc.release(i8* %call)
-  call void @llvm.objc.release(i8* %call) nounwind, !dbg !42, !clang.imprecise_release !38
-  call void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring_ to i8*), i8* %call), !dbg !50, !clang.arc.no_objc_arc_exceptions !38
+; CHECK: call void @llvm.objc.release(ptr %call)
+  call void @llvm.objc.release(ptr %call) nounwind, !dbg !42, !clang.imprecise_release !38
+  call void (ptr, ...) @NSLog(ptr @_unnamed_cfstring_, ptr %call), !dbg !50, !clang.arc.no_objc_arc_exceptions !38
   br label %if.end, !dbg !52
 
 if.end:                                           ; preds = %lpad, %eh.cont
-  call void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring_ to i8*), i8* %call), !dbg !53, !clang.arc.no_objc_arc_exceptions !38
-; CHECK: call void @llvm.objc.release(i8* %call)
-  call void @llvm.objc.release(i8* %call) nounwind, !dbg !54, !clang.imprecise_release !38
+  call void (ptr, ...) @NSLog(ptr @_unnamed_cfstring_, ptr %call), !dbg !53, !clang.arc.no_objc_arc_exceptions !38
+; CHECK: call void @llvm.objc.release(ptr %call)
+  call void @llvm.objc.release(ptr %call) nounwind, !dbg !54, !clang.imprecise_release !38
   ret i32 0, !dbg !54
 }
 
 declare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone
 
-declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind
+declare ptr @objc_msgSend(ptr, ptr, ...) nonlazybind
 
-declare i8* @llvm.objc.retain(i8*) nonlazybind
+declare ptr @llvm.objc.retain(ptr) nonlazybind
 
-declare i8* @llvm.objc.begin_catch(i8*)
+declare ptr @llvm.objc.begin_catch(ptr)
 
 declare void @llvm.objc.end_catch()
 
 declare void @llvm.objc.exception_rethrow()
 
-define internal fastcc void @ThrowFunc(i8* %obj) uwtable noinline ssp !dbg !27 {
+define internal fastcc void @ThrowFunc(ptr %obj) uwtable noinline ssp !dbg !27 {
 entry:
-  %tmp = call i8* @llvm.objc.retain(i8* %obj) nounwind
-  call void @llvm.dbg.value(metadata i8* %obj, metadata !32, metadata !DIExpression()), !dbg !55
-  %tmp1 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_1", align 8, !dbg !56
-  %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_5", align 8, !dbg !56, !invariant.load !38
-  %tmp3 = bitcast %struct._class_t* %tmp1 to i8*, !dbg !56
-  call void (i8*, i8*, %0*, %0*, ...) bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %0*, %0*, ...)*)(i8* %tmp3, i8* %tmp2, %0* bitcast (%struct.NSConstantString* @_unnamed_cfstring_3 to %0*), %0* bitcast (%struct.NSConstantString* @_unnamed_cfstring_3 to %0*)), !dbg !56, !clang.arc.no_objc_arc_exceptions !38
-  call void @llvm.objc.release(i8* %obj) nounwind, !dbg !58, !clang.imprecise_release !38
+  %tmp = call ptr @llvm.objc.retain(ptr %obj) nounwind
+  call void @llvm.dbg.value(metadata ptr %obj, metadata !32, metadata !DIExpression()), !dbg !55
+  %tmp1 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_1", align 8, !dbg !56
+  %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_5", align 8, !dbg !56, !invariant.load !38
+  call void (ptr, ptr, ptr, ptr, ...) @objc_msgSend(ptr %tmp1, ptr %tmp2, ptr @_unnamed_cfstring_3, ptr @_unnamed_cfstring_3), !dbg !56, !clang.arc.no_objc_arc_exceptions !38
+  call void @llvm.objc.release(ptr %obj) nounwind, !dbg !58, !clang.imprecise_release !38
   ret void, !dbg !58
 }
 
 declare i32 @__objc_personality_v0(...)
 
-declare void @llvm.objc.release(i8*) nonlazybind
+declare void @llvm.objc.release(ptr) nonlazybind
 
-declare void @NSLog(i8*, ...)
+declare void @NSLog(ptr, ...)
 
 declare void @llvm.dbg.value(metadata, metadata, metadata) nounwind readnone
 

diff  --git a/llvm/test/Transforms/ObjCARC/escape.ll b/llvm/test/Transforms/ObjCARC/escape.ll
index 62afe5d28728..5e608e00070b 100644
--- a/llvm/test/Transforms/ObjCARC/escape.ll
+++ b/llvm/test/Transforms/ObjCARC/escape.ll
@@ -3,62 +3,55 @@
 
 target 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-S128"
 
-%struct.__block_byref_weakLogNTimes = type { i8*, %struct.__block_byref_weakLogNTimes*, i32, i32, i8*, i8*, void (...)* }
+%struct.__block_byref_weakLogNTimes = type { ptr, ptr, i32, i32, ptr, ptr, ptr }
 %struct.__block_descriptor = type { i64, i64 }
 
 ; Don't optimize away the retainBlock, because the object's address "escapes"
 ; with the objc_storeWeak call.
 
 ; CHECK-LABEL: define void @test0(
-; CHECK: %tmp7 = call i8* @llvm.objc.retainBlock(i8* %tmp6) [[NUW:#[0-9]+]], !clang.arc.copy_on_escape !0
-; CHECK: call void @llvm.objc.release(i8* %tmp7) [[NUW]], !clang.imprecise_release !0
+; CHECK: %tmp7 = call ptr @llvm.objc.retainBlock(ptr %block) [[NUW:#[0-9]+]], !clang.arc.copy_on_escape !0
+; CHECK: call void @llvm.objc.release(ptr %tmp7) [[NUW]], !clang.imprecise_release !0
 ; CHECK: }
 define void @test0() nounwind {
 entry:
   %weakLogNTimes = alloca %struct.__block_byref_weakLogNTimes, align 8
-  %block = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, align 8
-  %byref.isa = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 0
-  store i8* null, i8** %byref.isa, align 8
-  %byref.forwarding = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 1
-  store %struct.__block_byref_weakLogNTimes* %weakLogNTimes, %struct.__block_byref_weakLogNTimes** %byref.forwarding, align 8
-  %byref.flags = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 2
-  store i32 33554432, i32* %byref.flags, align 8
-  %byref.size = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 3
-  store i32 48, i32* %byref.size, align 4
-  %tmp1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 4
-  store i8* bitcast (void (i8*, i8*)* @__Block_byref_object_copy_ to i8*), i8** %tmp1, align 8
-  %tmp2 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 5
-  store i8* bitcast (void (i8*)* @__Block_byref_object_dispose_ to i8*), i8** %tmp2, align 8
-  %weakLogNTimes1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 6
-  %tmp3 = bitcast void (...)** %weakLogNTimes1 to i8**
-  %tmp4 = call i8* @llvm.objc.initWeak(i8** %tmp3, i8* null) nounwind
-  %block.isa = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 0
-  store i8* null, i8** %block.isa, align 8
-  %block.flags = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 1
-  store i32 1107296256, i32* %block.flags, align 8
-  %block.reserved = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 2
-  store i32 0, i32* %block.reserved, align 4
-  %block.invoke = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 3
-  store i8* bitcast (void (i8*, i32)* @__main_block_invoke_0 to i8*), i8** %block.invoke, align 8
-  %block.descriptor = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 4
-  store %struct.__block_descriptor* null, %struct.__block_descriptor** %block.descriptor, align 8
-  %block.captured = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 5
-  %tmp5 = bitcast %struct.__block_byref_weakLogNTimes* %weakLogNTimes to i8*
-  store i8* %tmp5, i8** %block.captured, align 8
-  %tmp6 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block to i8*
-  %tmp7 = call i8* @llvm.objc.retainBlock(i8* %tmp6) nounwind, !clang.arc.copy_on_escape !0
-  %tmp8 = load %struct.__block_byref_weakLogNTimes*, %struct.__block_byref_weakLogNTimes** %byref.forwarding, align 8
-  %weakLogNTimes3 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %tmp8, i64 0, i32 6
-  %tmp9 = bitcast void (...)** %weakLogNTimes3 to i8**
-  %tmp10 = call i8* @llvm.objc.storeWeak(i8** %tmp9, i8* %tmp7) nounwind
-  %tmp11 = getelementptr inbounds i8, i8* %tmp7, i64 16
-  %tmp12 = bitcast i8* %tmp11 to i8**
-  %tmp13 = load i8*, i8** %tmp12, align 8
-  %tmp14 = bitcast i8* %tmp13 to void (i8*, i32)*
-  call void %tmp14(i8* %tmp7, i32 10) nounwind, !clang.arc.no_objc_arc_exceptions !0
-  call void @llvm.objc.release(i8* %tmp7) nounwind, !clang.imprecise_release !0
-  call void @_Block_object_dispose(i8* %tmp5, i32 8) nounwind
-  call void @llvm.objc.destroyWeak(i8** %tmp3) nounwind
+  %block = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>, align 8
+  store ptr null, ptr %weakLogNTimes, align 8
+  %byref.forwarding = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 1
+  store ptr %weakLogNTimes, ptr %byref.forwarding, align 8
+  %byref.flags = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 2
+  store i32 33554432, ptr %byref.flags, align 8
+  %byref.size = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 3
+  store i32 48, ptr %byref.size, align 4
+  %tmp1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 4
+  store ptr @__Block_byref_object_copy_, ptr %tmp1, align 8
+  %tmp2 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 5
+  store ptr @__Block_byref_object_dispose_, ptr %tmp2, align 8
+  %weakLogNTimes1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 6
+  %tmp4 = call ptr @llvm.objc.initWeak(ptr %weakLogNTimes1, ptr null) nounwind
+  %block.isa = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 0
+  store ptr null, ptr %block.isa, align 8
+  %block.flags = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 1
+  store i32 1107296256, ptr %block.flags, align 8
+  %block.reserved = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 2
+  store i32 0, ptr %block.reserved, align 4
+  %block.invoke = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 3
+  store ptr @__main_block_invoke_0, ptr %block.invoke, align 8
+  %block.descriptor = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 4
+  store ptr null, ptr %block.descriptor, align 8
+  %block.captured = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 5
+  store ptr %weakLogNTimes, ptr %block.captured, align 8
+  %tmp7 = call ptr @llvm.objc.retainBlock(ptr %block) nounwind, !clang.arc.copy_on_escape !0
+  %tmp8 = load ptr, ptr %byref.forwarding, align 8
+  %weakLogNTimes3 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %tmp8, i64 0, i32 6
+  %tmp10 = call ptr @llvm.objc.storeWeak(ptr %weakLogNTimes3, ptr %tmp7) nounwind
+  %tmp11 = getelementptr inbounds i8, ptr %tmp7, i64 16
+  %tmp13 = load ptr, ptr %tmp11, align 8
+  call void %tmp13(ptr %tmp7, i32 10) nounwind, !clang.arc.no_objc_arc_exceptions !0
+  call void @llvm.objc.release(ptr %tmp7) nounwind, !clang.imprecise_release !0
+  call void @_Block_object_dispose(ptr %weakLogNTimes, i32 8) nounwind
+  call void @llvm.objc.destroyWeak(ptr %weakLogNTimes1) nounwind
   ret void
 }
 
@@ -71,62 +64,55 @@ entry:
 define void @test1() nounwind {
 entry:
   %weakLogNTimes = alloca %struct.__block_byref_weakLogNTimes, align 8
-  %block = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, align 8
-  %byref.isa = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 0
-  store i8* null, i8** %byref.isa, align 8
-  %byref.forwarding = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 1
-  store %struct.__block_byref_weakLogNTimes* %weakLogNTimes, %struct.__block_byref_weakLogNTimes** %byref.forwarding, align 8
-  %byref.flags = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 2
-  store i32 33554432, i32* %byref.flags, align 8
-  %byref.size = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 3
-  store i32 48, i32* %byref.size, align 4
-  %tmp1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 4
-  store i8* bitcast (void (i8*, i8*)* @__Block_byref_object_copy_ to i8*), i8** %tmp1, align 8
-  %tmp2 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 5
-  store i8* bitcast (void (i8*)* @__Block_byref_object_dispose_ to i8*), i8** %tmp2, align 8
-  %weakLogNTimes1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %weakLogNTimes, i64 0, i32 6
-  %tmp3 = bitcast void (...)** %weakLogNTimes1 to i8**
-  %tmp4 = call i8* @llvm.objc.initWeak(i8** %tmp3, i8* null) nounwind
-  %block.isa = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 0
-  store i8* null, i8** %block.isa, align 8
-  %block.flags = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 1
-  store i32 1107296256, i32* %block.flags, align 8
-  %block.reserved = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 2
-  store i32 0, i32* %block.reserved, align 4
-  %block.invoke = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 3
-  store i8* bitcast (void (i8*, i32)* @__main_block_invoke_0 to i8*), i8** %block.invoke, align 8
-  %block.descriptor = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 4
-  store %struct.__block_descriptor* null, %struct.__block_descriptor** %block.descriptor, align 8
-  %block.captured = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block, i64 0, i32 5
-  %tmp5 = bitcast %struct.__block_byref_weakLogNTimes* %weakLogNTimes to i8*
-  store i8* %tmp5, i8** %block.captured, align 8
-  %tmp6 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>* %block to i8*
-  %tmp7 = call i8* @llvm.objc.retainBlock(i8* %tmp6) nounwind, !clang.arc.copy_on_escape !0
-  %tmp8 = load %struct.__block_byref_weakLogNTimes*, %struct.__block_byref_weakLogNTimes** %byref.forwarding, align 8
-  %weakLogNTimes3 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, %struct.__block_byref_weakLogNTimes* %tmp8, i64 0, i32 6
-  %tmp9 = bitcast void (...)** %weakLogNTimes3 to i8**
-  %tmp10 = call i8* @not_really_objc_storeWeak(i8** %tmp9, i8* %tmp7) nounwind
-  %tmp11 = getelementptr inbounds i8, i8* %tmp7, i64 16
-  %tmp12 = bitcast i8* %tmp11 to i8**
-  %tmp13 = load i8*, i8** %tmp12, align 8
-  %tmp14 = bitcast i8* %tmp13 to void (i8*, i32)*
-  call void %tmp14(i8* %tmp7, i32 10) nounwind, !clang.arc.no_objc_arc_exceptions !0
-  call void @llvm.objc.release(i8* %tmp7) nounwind, !clang.imprecise_release !0
-  call void @_Block_object_dispose(i8* %tmp5, i32 8) nounwind
-  call void @llvm.objc.destroyWeak(i8** %tmp3) nounwind
+  %block = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>, align 8
+  store ptr null, ptr %weakLogNTimes, align 8
+  %byref.forwarding = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 1
+  store ptr %weakLogNTimes, ptr %byref.forwarding, align 8
+  %byref.flags = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 2
+  store i32 33554432, ptr %byref.flags, align 8
+  %byref.size = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 3
+  store i32 48, ptr %byref.size, align 4
+  %tmp1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 4
+  store ptr @__Block_byref_object_copy_, ptr %tmp1, align 8
+  %tmp2 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 5
+  store ptr @__Block_byref_object_dispose_, ptr %tmp2, align 8
+  %weakLogNTimes1 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %weakLogNTimes, i64 0, i32 6
+  %tmp4 = call ptr @llvm.objc.initWeak(ptr %weakLogNTimes1, ptr null) nounwind
+  %block.isa = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 0
+  store ptr null, ptr %block.isa, align 8
+  %block.flags = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 1
+  store i32 1107296256, ptr %block.flags, align 8
+  %block.reserved = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 2
+  store i32 0, ptr %block.reserved, align 4
+  %block.invoke = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 3
+  store ptr @__main_block_invoke_0, ptr %block.invoke, align 8
+  %block.descriptor = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 4
+  store ptr null, ptr %block.descriptor, align 8
+  %block.captured = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 5
+  store ptr %weakLogNTimes, ptr %block.captured, align 8
+  %tmp7 = call ptr @llvm.objc.retainBlock(ptr %block) nounwind, !clang.arc.copy_on_escape !0
+  %tmp8 = load ptr, ptr %byref.forwarding, align 8
+  %weakLogNTimes3 = getelementptr inbounds %struct.__block_byref_weakLogNTimes, ptr %tmp8, i64 0, i32 6
+  %tmp10 = call ptr @not_really_objc_storeWeak(ptr %weakLogNTimes3, ptr %tmp7) nounwind
+  %tmp11 = getelementptr inbounds i8, ptr %tmp7, i64 16
+  %tmp13 = load ptr, ptr %tmp11, align 8
+  call void %tmp13(ptr %tmp7, i32 10) nounwind, !clang.arc.no_objc_arc_exceptions !0
+  call void @llvm.objc.release(ptr %tmp7) nounwind, !clang.imprecise_release !0
+  call void @_Block_object_dispose(ptr %weakLogNTimes, i32 8) nounwind
+  call void @llvm.objc.destroyWeak(ptr %weakLogNTimes1) nounwind
   ret void
 }
 
-declare void @__Block_byref_object_copy_(i8*, i8*) nounwind
-declare void @__Block_byref_object_dispose_(i8*) nounwind
-declare void @llvm.objc.destroyWeak(i8**)
-declare i8* @llvm.objc.initWeak(i8**, i8*)
-declare void @__main_block_invoke_0(i8* nocapture, i32) nounwind ssp
-declare void @_Block_object_dispose(i8*, i32)
-declare i8* @llvm.objc.retainBlock(i8*)
-declare i8* @llvm.objc.storeWeak(i8**, i8*)
-declare i8* @not_really_objc_storeWeak(i8**, i8*)
-declare void @llvm.objc.release(i8*)
+declare void @__Block_byref_object_copy_(ptr, ptr) nounwind
+declare void @__Block_byref_object_dispose_(ptr) nounwind
+declare void @llvm.objc.destroyWeak(ptr)
+declare ptr @llvm.objc.initWeak(ptr, ptr)
+declare void @__main_block_invoke_0(ptr nocapture, i32) nounwind ssp
+declare void @_Block_object_dispose(ptr, i32)
+declare ptr @llvm.objc.retainBlock(ptr)
+declare ptr @llvm.objc.storeWeak(ptr, ptr)
+declare ptr @not_really_objc_storeWeak(ptr, ptr)
+declare void @llvm.objc.release(ptr)
 
 !0 = !{}
 

diff  --git a/llvm/test/Transforms/ObjCARC/expand.ll b/llvm/test/Transforms/ObjCARC/expand.ll
index e56f0bba10a8..d07ed7cfbef1 100644
--- a/llvm/test/Transforms/ObjCARC/expand.ll
+++ b/llvm/test/Transforms/ObjCARC/expand.ll
@@ -2,79 +2,79 @@
 
 target datalayout = "e-p:64:64:64"
 
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.retainAutorelease(i8*)
-declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.retainBlock(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare ptr @llvm.objc.autorelease(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.retainAutorelease(ptr)
+declare ptr @llvm.objc.retainAutoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.retainBlock(ptr)
 
-declare void @use_pointer(i8*)
+declare void @use_pointer(ptr)
 
-; CHECK: define void @test_retain(i8* %x) [[NUW:#[0-9]+]] {
-; CHECK: call i8* @llvm.objc.retain(i8* %x)
-; CHECK: call void @use_pointer(i8* %x)
+; CHECK: define void @test_retain(ptr %x) [[NUW:#[0-9]+]] {
+; CHECK: call ptr @llvm.objc.retain(ptr %x)
+; CHECK: call void @use_pointer(ptr %x)
 ; CHECK: }
-define void @test_retain(i8* %x) nounwind {
+define void @test_retain(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  call void @use_pointer(i8* %0)
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  call void @use_pointer(ptr %0)
   ret void
 }
 
-; CHECK: define void @test_retainAutoreleasedReturnValue(i8* %x) [[NUW]] {
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x)
-; CHECK: call void @use_pointer(i8* %x)
+; CHECK: define void @test_retainAutoreleasedReturnValue(ptr %x) [[NUW]] {
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x)
+; CHECK: call void @use_pointer(ptr %x)
 ; CHECK: }
-define void @test_retainAutoreleasedReturnValue(i8* %x) nounwind {
+define void @test_retainAutoreleasedReturnValue(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x) nounwind
-  call void @use_pointer(i8* %0)
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x) nounwind
+  call void @use_pointer(ptr %0)
   ret void
 }
 
-; CHECK: define void @test_retainAutorelease(i8* %x) [[NUW]] {
-; CHECK: call i8* @llvm.objc.retainAutorelease(i8* %x)
-; CHECK: call void @use_pointer(i8* %x)
+; CHECK: define void @test_retainAutorelease(ptr %x) [[NUW]] {
+; CHECK: call ptr @llvm.objc.retainAutorelease(ptr %x)
+; CHECK: call void @use_pointer(ptr %x)
 ; CHECK: }
-define void @test_retainAutorelease(i8* %x) nounwind {
+define void @test_retainAutorelease(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retainAutorelease(i8* %x) nounwind
-  call void @use_pointer(i8* %0)
+  %0 = call ptr @llvm.objc.retainAutorelease(ptr %x) nounwind
+  call void @use_pointer(ptr %0)
   ret void
 }
 
-; CHECK: define void @test_retainAutoreleaseReturnValue(i8* %x) [[NUW]] {
-; CHECK: call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x)
-; CHECK: call void @use_pointer(i8* %x)
+; CHECK: define void @test_retainAutoreleaseReturnValue(ptr %x) [[NUW]] {
+; CHECK: call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %x)
+; CHECK: call void @use_pointer(ptr %x)
 ; CHECK: }
-define void @test_retainAutoreleaseReturnValue(i8* %x) nounwind {
+define void @test_retainAutoreleaseReturnValue(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x) nounwind
-  call void @use_pointer(i8* %0)
+  %0 = call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %x) nounwind
+  call void @use_pointer(ptr %0)
   ret void
 }
 
-; CHECK: define void @test_autorelease(i8* %x) [[NUW]] {
-; CHECK: call i8* @llvm.objc.autorelease(i8* %x)
-; CHECK: call void @use_pointer(i8* %x)
+; CHECK: define void @test_autorelease(ptr %x) [[NUW]] {
+; CHECK: call ptr @llvm.objc.autorelease(ptr %x)
+; CHECK: call void @use_pointer(ptr %x)
 ; CHECK: }
-define void @test_autorelease(i8* %x) nounwind {
+define void @test_autorelease(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  call void @use_pointer(i8* %0)
+  %0 = call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  call void @use_pointer(ptr %0)
   ret void
 }
 
-; CHECK: define void @test_autoreleaseReturnValue(i8* %x) [[NUW]] {
-; CHECK: call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
-; CHECK: call void @use_pointer(i8* %x)
+; CHECK: define void @test_autoreleaseReturnValue(ptr %x) [[NUW]] {
+; CHECK: call ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
+; CHECK: call void @use_pointer(ptr %x)
 ; CHECK: }
-define void @test_autoreleaseReturnValue(i8* %x) nounwind {
+define void @test_autoreleaseReturnValue(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  call void @use_pointer(i8* %0)
+  %0 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  call void @use_pointer(ptr %0)
   ret void
 }
 
@@ -82,13 +82,13 @@ entry:
 ; RetainBlock is not strictly forwarding. Do not touch it. ;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-; CHECK: define void @test_retainBlock(i8* %x) [[NUW]] {
-; CHECK: call i8* @llvm.objc.retainBlock(i8* %x)
-; CHECK: call void @use_pointer(i8* %0)
+; CHECK: define void @test_retainBlock(ptr %x) [[NUW]] {
+; CHECK: call ptr @llvm.objc.retainBlock(ptr %x)
+; CHECK: call void @use_pointer(ptr %0)
 ; CHECK: }
-define void @test_retainBlock(i8* %x) nounwind {
+define void @test_retainBlock(ptr %x) nounwind {
 entry:
-  %0 = call i8* @llvm.objc.retainBlock(i8* %x) nounwind
-  call void @use_pointer(i8* %0)
+  %0 = call ptr @llvm.objc.retainBlock(ptr %x) nounwind
+  call void @use_pointer(ptr %0)
   ret void
 }

diff  --git a/llvm/test/Transforms/ObjCARC/funclet.ll b/llvm/test/Transforms/ObjCARC/funclet.ll
index 610c84ffd9df..3075a2e4acd6 100644
--- a/llvm/test/Transforms/ObjCARC/funclet.ll
+++ b/llvm/test/Transforms/ObjCARC/funclet.ll
@@ -12,14 +12,14 @@
 ; }
 
 declare zeroext i1 @"\01?g@@YA_NXZ"() local_unnamed_addr
-declare i8* @"\01?h@@YAPEAUobjc_object@@XZ"() local_unnamed_addr
+declare ptr @"\01?h@@YAPEAUobjc_object@@XZ"() local_unnamed_addr
 
-declare dllimport void @llvm.objc.release(i8*) local_unnamed_addr
-declare dllimport i8* @llvm.objc.retainAutoreleasedReturnValue(i8* returned) local_unnamed_addr
+declare dllimport void @llvm.objc.release(ptr) local_unnamed_addr
+declare dllimport ptr @llvm.objc.retainAutoreleasedReturnValue(ptr returned) local_unnamed_addr
 
 declare i32 @__CxxFrameHandler3(...)
 
-define void @"\01?f@@YAXXZ"() local_unnamed_addr personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define void @"\01?f@@YAXXZ"() local_unnamed_addr personality ptr @__CxxFrameHandler3 {
 entry:
   %call = invoke zeroext i1 @"\01?g@@YA_NXZ"()
           to label %invoke.cont unwind label %ehcleanup6
@@ -28,41 +28,41 @@ invoke.cont:                                      ; preds = %entry
   br i1 %call, label %if.then, label %if.end
 
 if.then:                                          ; preds = %invoke.cont
-  %call2 = invoke i8* @"\01?h@@YAPEAUobjc_object@@XZ"()
+  %call2 = invoke ptr @"\01?h@@YAPEAUobjc_object@@XZ"()
           to label %invoke.cont1 unwind label %ehcleanup6
 
 invoke.cont1:                                     ; preds = %if.then
-  %0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call2)
-  tail call void @llvm.objc.release(i8* null), !clang.imprecise_release !1
+  %0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call2)
+  tail call void @llvm.objc.release(ptr null), !clang.imprecise_release !1
   br label %if.end
 
 if.end:                                           ; preds = %invoke.cont1, %invoke.cont
-  %a.0 = phi i8* [ %call2, %invoke.cont1 ], [ null, %invoke.cont ]
+  %a.0 = phi ptr [ %call2, %invoke.cont1 ], [ null, %invoke.cont ]
   %call4 = invoke zeroext i1 @"\01?g@@YA_NXZ"()
           to label %invoke.cont3 unwind label %ehcleanup
 
 invoke.cont3:                                     ; preds = %if.end
-  tail call void @llvm.objc.release(i8* null), !clang.imprecise_release !1
-  tail call void @llvm.objc.release(i8* %a.0), !clang.imprecise_release !1
+  tail call void @llvm.objc.release(ptr null), !clang.imprecise_release !1
+  tail call void @llvm.objc.release(ptr %a.0), !clang.imprecise_release !1
   ret void
 
 ehcleanup:                                        ; preds = %if.end
   %1 = cleanuppad within none []
-  call void @llvm.objc.release(i8* null) [ "funclet"(token %1) ], !clang.imprecise_release !1
+  call void @llvm.objc.release(ptr null) [ "funclet"(token %1) ], !clang.imprecise_release !1
   cleanupret from %1 unwind label %ehcleanup6
 
 ehcleanup6:                                       ; preds = %ehcleanup, %if.then, %entry
-  %a.1 = phi i8* [ %a.0, %ehcleanup ], [ null, %if.then ], [ null, %entry ]
+  %a.1 = phi ptr [ %a.0, %ehcleanup ], [ null, %if.then ], [ null, %entry ]
   %2 = cleanuppad within none []
-  call void @llvm.objc.release(i8* %a.1) [ "funclet"(token %2) ], !clang.imprecise_release !1
+  call void @llvm.objc.release(ptr %a.1) [ "funclet"(token %2) ], !clang.imprecise_release !1
   cleanupret from %2 unwind to caller
 }
 
 ; CHECK-LABEL: ?f@@YAXXZ
-; CHECK: call void @llvm.objc.release(i8* {{.*}}) {{.*}}[ "funclet"(token %1) ]
-; CHECK-NOT: call void @llvm.objc.release(i8* {{.*}}) {{.*}}[ "funclet"(token %2) ]
+; CHECK: call void @llvm.objc.release(ptr {{.*}}) {{.*}}[ "funclet"(token %1) ]
+; CHECK-NOT: call void @llvm.objc.release(ptr {{.*}}) {{.*}}[ "funclet"(token %2) ]
 
-define void @"\01?i@@YAXXZ"() local_unnamed_addr personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define void @"\01?i@@YAXXZ"() local_unnamed_addr personality ptr @__CxxFrameHandler3 {
 entry:
   %call = invoke zeroext i1 @"\01?g@@YA_NXZ"()
           to label %invoke.cont unwind label %ehcleanup6
@@ -71,42 +71,42 @@ invoke.cont:                                      ; preds = %entry
   br i1 %call, label %if.then, label %if.end
 
 if.then:                                          ; preds = %invoke.cont
-  %call2 = invoke i8* @"\01?h@@YAPEAUobjc_object@@XZ"()
+  %call2 = invoke ptr @"\01?h@@YAPEAUobjc_object@@XZ"()
           to label %invoke.cont1 unwind label %ehcleanup6
 
 invoke.cont1:                                     ; preds = %if.then
-  %0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call2)
-  tail call void @llvm.objc.release(i8* null), !clang.imprecise_release !1
+  %0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call2)
+  tail call void @llvm.objc.release(ptr null), !clang.imprecise_release !1
   br label %if.end
 
 if.end:                                           ; preds = %invoke.cont1, %invoke.cont
-  %a.0 = phi i8* [ %call2, %invoke.cont1 ], [ null, %invoke.cont ]
+  %a.0 = phi ptr [ %call2, %invoke.cont1 ], [ null, %invoke.cont ]
   %call4 = invoke zeroext i1 @"\01?g@@YA_NXZ"()
           to label %invoke.cont3 unwind label %ehcleanup
 
 invoke.cont3:                                     ; preds = %if.end
-  tail call void @llvm.objc.release(i8* null), !clang.imprecise_release !1
-  tail call void @llvm.objc.release(i8* %a.0), !clang.imprecise_release !1
+  tail call void @llvm.objc.release(ptr null), !clang.imprecise_release !1
+  tail call void @llvm.objc.release(ptr %a.0), !clang.imprecise_release !1
   ret void
 
 ehcleanup:                                        ; preds = %if.end
   %1 = cleanuppad within none []
-  call void @llvm.objc.release(i8* null) [ "funclet"(token %1) ], !clang.imprecise_release !1
+  call void @llvm.objc.release(ptr null) [ "funclet"(token %1) ], !clang.imprecise_release !1
   br label %ehcleanup.1
 
 ehcleanup.1:
   cleanupret from %1 unwind label %ehcleanup6
 
 ehcleanup6:                                       ; preds = %ehcleanup, %if.then, %entry
-  %a.1 = phi i8* [ %a.0, %ehcleanup.1 ], [ null, %if.then ], [ null, %entry ]
+  %a.1 = phi ptr [ %a.0, %ehcleanup.1 ], [ null, %if.then ], [ null, %entry ]
   %2 = cleanuppad within none []
-  call void @llvm.objc.release(i8* %a.1) [ "funclet"(token %2) ], !clang.imprecise_release !1
+  call void @llvm.objc.release(ptr %a.1) [ "funclet"(token %2) ], !clang.imprecise_release !1
   cleanupret from %2 unwind to caller
 }
 
 ; CHECK-LABEL: ?i@@YAXXZ
-; CHECK: call void @llvm.objc.release(i8* {{.*}}) {{.*}}[ "funclet"(token %1) ]
-; CHECK-NOT: call void @llvm.objc.release(i8* {{.*}}) {{.*}}[ "funclet"(token %2) ]
+; CHECK: call void @llvm.objc.release(ptr {{.*}}) {{.*}}[ "funclet"(token %1) ]
+; CHECK-NOT: call void @llvm.objc.release(ptr {{.*}}) {{.*}}[ "funclet"(token %2) ]
 
 !1 = !{}
 

diff  --git a/llvm/test/Transforms/ObjCARC/gvn.ll b/llvm/test/Transforms/ObjCARC/gvn.ll
index 67f88d7930c8..c385f33e63e2 100644
--- a/llvm/test/Transforms/ObjCARC/gvn.ll
+++ b/llvm/test/Transforms/ObjCARC/gvn.ll
@@ -1,41 +1,41 @@
 ; RUN: opt -S -aa-pipeline=basic-aa,objc-arc-aa -passes=gvn < %s | FileCheck %s
 
- at x = common global i8* null, align 8
+ at x = common global ptr null, align 8
 
-declare i8* @llvm.objc.retain(i8*)
-declare i32 @llvm.objc.sync.enter(i8*)
-declare i32 @llvm.objc.sync.exit(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare i32 @llvm.objc.sync.enter(ptr)
+declare i32 @llvm.objc.sync.exit(ptr)
 
 ; GVN should be able to eliminate this redundant load, with ARC-specific
 ; alias analysis.
 
-; CHECK: define i8* @test0(i32 %n)
+; CHECK: define ptr @test0(i32 %n)
 ; CHECK-NEXT: entry:
-; CHECK-NEXT: %s = load i8*, i8** @x
+; CHECK-NEXT: %s = load ptr, ptr @x
 ; CHECK-NOT: load
-; CHECK: ret i8* %s
+; CHECK: ret ptr %s
 ; CHECK-NEXT: }
-define i8* @test0(i32 %n) nounwind {
+define ptr @test0(i32 %n) nounwind {
 entry:
-  %s = load i8*, i8** @x
-  %0 = tail call i8* @llvm.objc.retain(i8* %s) nounwind
-  %t = load i8*, i8** @x
-  ret i8* %t
+  %s = load ptr, ptr @x
+  %0 = tail call ptr @llvm.objc.retain(ptr %s) nounwind
+  %t = load ptr, ptr @x
+  ret ptr %t
 }
 
 ; GVN should not be able to eliminate this redundant load, with ARC-specific
 ; alias analysis.
 
-; CHECK-LABEL: define i8* @test1(
+; CHECK-LABEL: define ptr @test1(
 ; CHECK: load
 ; CHECK: load
-; CHECK: ret i8* %t
+; CHECK: ret ptr %t
 ; CHECK: }
-define i8* @test1(i32 %n) nounwind {
+define ptr @test1(i32 %n) nounwind {
 entry:
-  %s = load i8*, i8** @x
-  %0 = call i32 @llvm.objc.sync.enter(i8* %s)
-  %t = load i8*, i8** @x
-  %1 = call i32 @llvm.objc.sync.exit(i8* %s)
-  ret i8* %t
+  %s = load ptr, ptr @x
+  %0 = call i32 @llvm.objc.sync.enter(ptr %s)
+  %t = load ptr, ptr @x
+  %1 = call i32 @llvm.objc.sync.exit(ptr %s)
+  ret ptr %t
 }

diff  --git a/llvm/test/Transforms/ObjCARC/inert-global.ll b/llvm/test/Transforms/ObjCARC/inert-global.ll
index 6069854892a6..93592c528169 100644
--- a/llvm/test/Transforms/ObjCARC/inert-global.ll
+++ b/llvm/test/Transforms/ObjCARC/inert-global.ll
@@ -1,71 +1,67 @@
 ; RUN: opt -passes=objc-arc -S < %s | FileCheck %s
 
 %0 = type opaque
-%struct.__NSConstantString_tag = type { i32*, i32, i8*, i64 }
+%struct.__NSConstantString_tag = type { ptr, i32, ptr, i64 }
 %struct.__block_descriptor = type { i64, i64 }
 
 @__CFConstantStringClassReference = external global [0 x i32]
 @.str = private unnamed_addr constant [4 x i8] c"abc\00", section "__TEXT,__cstring,cstring_literals", align 1
 @.str1 = private unnamed_addr constant [4 x i8] c"def\00", section "__TEXT,__cstring,cstring_literals", align 1
- at _unnamed_cfstring_ = private global %struct.__NSConstantString_tag { i32* getelementptr inbounds ([0 x i32], [0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 3 }, section "__DATA,__cfstring", align 8 #0
- at _unnamed_cfstring_.1 = private global %struct.__NSConstantString_tag { i32* getelementptr inbounds ([0 x i32], [0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i32 0, i32 0), i64 3 }, section "__DATA,__cfstring", align 8 #0
- at _unnamed_cfstring_wo_attr = private global %struct.__NSConstantString_tag { i32* getelementptr inbounds ([0 x i32], [0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i32 0, i32 0), i64 3 }, section "__DATA,__cfstring", align 8
- at _NSConcreteGlobalBlock = external global i8*
+ at _unnamed_cfstring_ = private global %struct.__NSConstantString_tag { ptr @__CFConstantStringClassReference, i32 1992, ptr @.str, i64 3 }, section "__DATA,__cfstring", align 8 #0
+ at _unnamed_cfstring_.1 = private global %struct.__NSConstantString_tag { ptr @__CFConstantStringClassReference, i32 1992, ptr @.str1, i64 3 }, section "__DATA,__cfstring", align 8 #0
+ at _unnamed_cfstring_wo_attr = private global %struct.__NSConstantString_tag { ptr @__CFConstantStringClassReference, i32 1992, ptr @.str1, i64 3 }, section "__DATA,__cfstring", align 8
+ at _NSConcreteGlobalBlock = external global ptr
 @.str.1 = private unnamed_addr constant [6 x i8] c"v8@?0\00", align 1
-@"__block_descriptor_32_e5_v8@?0l" = linkonce_odr hidden unnamed_addr constant { i64, i64, i8*, i8* } { i64 0, i64 32, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* null }, align 8
- at __block_literal_global = internal constant { i8**, i32, i32, i8*, %struct.__block_descriptor* } { i8** @_NSConcreteGlobalBlock, i32 1342177280, i32 0, i8* bitcast (void (i8*)* @__globalBlock_block_invoke to i8*), %struct.__block_descriptor* bitcast ({ i64, i64, i8*, i8* }* @"__block_descriptor_32_e5_v8@?0l" to %struct.__block_descriptor*) }, align 8 #0
+@"__block_descriptor_32_e5_v8@?0l" = linkonce_odr hidden unnamed_addr constant { i64, i64, ptr, ptr } { i64 0, i64 32, ptr @.str.1, ptr null }, align 8
+ at __block_literal_global = internal constant { ptr, i32, i32, ptr, ptr } { ptr @_NSConcreteGlobalBlock, i32 1342177280, i32 0, ptr @__globalBlock_block_invoke, ptr @"__block_descriptor_32_e5_v8@?0l" }, align 8 #0
 
-; CHECK-LABEL: define %0* @stringLiteral()
+; CHECK-LABEL: define ptr @stringLiteral()
 ; CHECK-NOT: call
-; CHECK: ret %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %0*)
+; CHECK: ret ptr @_unnamed_cfstring_
 
-define %0* @stringLiteral() {
-  %1 = tail call i8* @llvm.objc.retain(i8* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to i8*))
-  %2 = call i8* @llvm.objc.autorelease(i8* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to i8*))
-  ret %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %0*)
+define ptr @stringLiteral() {
+  %1 = tail call ptr @llvm.objc.retain(ptr @_unnamed_cfstring_)
+  %2 = call ptr @llvm.objc.autorelease(ptr @_unnamed_cfstring_)
+  ret ptr @_unnamed_cfstring_
 }
 
-; CHECK-LABEL: define %0* @stringLiteral1()
-; CHECK-NEXT: call i8* @llvm.objc.retain(
-; CHECK-NEXT: call i8* @llvm.objc.autorelease(
-; CHECK-NEXT: ret %0*
+; CHECK-LABEL: define ptr @stringLiteral1()
+; CHECK-NEXT: call ptr @llvm.objc.retain(
+; CHECK-NEXT: call ptr @llvm.objc.autorelease(
+; CHECK-NEXT: ret ptr
 
-define %0* @stringLiteral1() {
-  %1 = tail call i8* @llvm.objc.retain(i8* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_wo_attr to i8*))
-  %2 = call i8* @llvm.objc.autorelease(i8* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_wo_attr to i8*))
-  ret %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_wo_attr to %0*)
+define ptr @stringLiteral1() {
+  %1 = tail call ptr @llvm.objc.retain(ptr @_unnamed_cfstring_wo_attr)
+  %2 = call ptr @llvm.objc.autorelease(ptr @_unnamed_cfstring_wo_attr)
+  ret ptr @_unnamed_cfstring_wo_attr
 }
 
-; CHECK-LABEL: define void (...)* @globalBlock()
+; CHECK-LABEL: define ptr @globalBlock()
 ; CHECK-NOT: call
-; CHECK: %[[V1:.*]] = bitcast i8* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor* }* @__block_literal_global to i8*) to void (...)*
-; CHECK-NEXT: ret void (...)* %[[V1]]
-
-define void (...)* @globalBlock() {
-  %1 = tail call i8* @llvm.objc.retainBlock(i8* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor* }* @__block_literal_global to i8*))
-  %2 = tail call i8* @llvm.objc.retainBlock(i8* %1)
-  %3 = bitcast i8* %2 to void (...)*
-  tail call void @llvm.objc.release(i8* %1)
-  %4 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %2)
-  ret void (...)* %3
+; CHECK-NEXT: ret ptr @__block_literal_global
+
+define ptr @globalBlock() {
+  %1 = tail call ptr @llvm.objc.retainBlock(ptr @__block_literal_global)
+  %2 = tail call ptr @llvm.objc.retainBlock(ptr %1)
+  tail call void @llvm.objc.release(ptr %1)
+  %3 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %2)
+  ret ptr %2
 }
 
-define internal void @__globalBlock_block_invoke(i8* nocapture readnone) {
+define internal void @__globalBlock_block_invoke(ptr nocapture readnone) {
   tail call void @foo()
   ret void
 }
 
-; CHECK: define %[[V0:.*]]* @test_conditional0(
-; CHECK: %[[PHI0:.*]] = phi %[[V0]]* [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %[[V0]]*), %{{.*}} ], [ null, %{{.*}} ]
+; CHECK: define ptr @test_conditional0(
+; CHECK: %[[PHI0:.*]] = phi ptr [ @_unnamed_cfstring_, %{{.*}} ], [ null, %{{.*}} ]
 
-; CHECK: %[[PHI1:.*]] = phi %[[V0]]* [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %[[V0]]*), %{{.*}} ], [ %[[PHI0]], %{{.*}} ]
-; CHECK-NEXT: %[[PHI2:.*]] = phi %[[V0]]* [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %[[V0]]*), %{{.*}} ], [ %{{.*}}, %{{.*}} ]
-; CHECK-NEXT: %[[V2:.*]] = bitcast %[[V0]]* %[[PHI1]] to i8*
-; CHECK-NEXT: %[[V4:.*]] = bitcast %[[V0]]* %[[PHI2]] to i8*
-; CHECK-NEXT: %[[V5:.*]] = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %[[V4]])
-; CHECK-NEXT: ret %[[V0]]* %[[PHI2]]
+; CHECK: %[[PHI1:.*]] = phi ptr [ @_unnamed_cfstring_, %{{.*}} ], [ %[[PHI0]], %{{.*}} ]
+; CHECK-NEXT: %[[PHI2:.*]] = phi ptr [ @_unnamed_cfstring_, %{{.*}} ], [ %{{.*}}, %{{.*}} ]
+; CHECK-NEXT: %[[V5:.*]] = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %[[PHI2]])
+; CHECK-NEXT: ret ptr %[[PHI2]]
 
-define %0* @test_conditional0(i32 %i, %0* %b) {
+define ptr @test_conditional0(i32 %i, ptr %b) {
 entry:
   %v0 = icmp eq i32 %i, 1
   br i1 %v0, label %bb2, label %bb1
@@ -75,17 +71,15 @@ bb1:
   br i1 %v1, label %bb2, label %return
 
 bb2:
-  %phi0 = phi %0* [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %0*), %entry ], [ null, %bb1 ]
+  %phi0 = phi ptr [ @_unnamed_cfstring_, %entry ], [ null, %bb1 ]
   br label %return
 
 return:
-  %phi1 = phi %0* [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %0*), %bb1 ], [ %phi0, %bb2 ]
-  %phi2 = phi %0* [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %0*), %bb1 ], [ %b, %bb2 ]
-  %v2 = bitcast %0* %phi1 to i8*
-  %v3 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %v2)
-  %v4 = bitcast %0* %phi2 to i8*
-  %v5 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %v4)
-  ret %0* %phi2
+  %phi1 = phi ptr [ @_unnamed_cfstring_, %bb1 ], [ %phi0, %bb2 ]
+  %phi2 = phi ptr [ @_unnamed_cfstring_, %bb1 ], [ %b, %bb2 ]
+  %v3 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %phi1)
+  %v5 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %phi2)
+  ret ptr %phi2
 }
 
 ; CHECK-LABEL: define void @test_conditional1(
@@ -100,34 +94,34 @@ entry:
 
 while.body:
   %v1 = phi i32 [ %v5, %if.end ], [ %v0, %entry ]
-  %v2 = phi i8* [ %v4, %if.end ], [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.1 to i8*), %entry ]
-  %v3 = tail call i8* @llvm.objc.retain(i8* %v2)
+  %v2 = phi ptr [ %v4, %if.end ], [ @_unnamed_cfstring_.1, %entry ]
+  %v3 = tail call ptr @llvm.objc.retain(ptr %v2)
   %cmp = icmp eq i32 %v1, 2
   br i1 %cmp, label %if.then, label %if.end
 
 if.then:
-  call void @llvm.objc.release(i8* %v2)
+  call void @llvm.objc.release(ptr %v2)
   br label %if.end
 
 if.end:
-  %v4 = phi i8* [ bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to i8*), %if.then ], [ %v2, %while.body ]
-  call void @llvm.objc.release(i8* %v2)
+  %v4 = phi ptr [ @_unnamed_cfstring_, %if.then ], [ %v2, %while.body ]
+  call void @llvm.objc.release(ptr %v2)
   %v5 = add nsw i32 %v1, -1
   %tobool = icmp eq i32 %v5, 0
   br i1 %tobool, label %while.end, label %while.body
 
 while.end:
-  %v6 = phi i8* [ null, %entry ], [ %v4, %if.end ]
-  call void @llvm.objc.release(i8* %v6)
+  %v6 = phi ptr [ null, %entry ], [ %v4, %if.end ]
+  call void @llvm.objc.release(ptr %v6)
   ret void
 }
 
 declare void @foo()
 
-declare i8* @llvm.objc.retain(i8*) local_unnamed_addr
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*) local_unnamed_addr
-declare i8* @llvm.objc.retainBlock(i8*) local_unnamed_addr
-declare void @llvm.objc.release(i8*) local_unnamed_addr
-declare i8* @llvm.objc.autorelease(i8*) local_unnamed_addr
+declare ptr @llvm.objc.retain(ptr) local_unnamed_addr
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr) local_unnamed_addr
+declare ptr @llvm.objc.retainBlock(ptr) local_unnamed_addr
+declare void @llvm.objc.release(ptr) local_unnamed_addr
+declare ptr @llvm.objc.autorelease(ptr) local_unnamed_addr
 
 attributes #0 = { "objc_arc_inert" }

diff  --git a/llvm/test/Transforms/ObjCARC/inlined-autorelease-return-value.ll b/llvm/test/Transforms/ObjCARC/inlined-autorelease-return-value.ll
index c992801262f1..60180c4ab017 100644
--- a/llvm/test/Transforms/ObjCARC/inlined-autorelease-return-value.ll
+++ b/llvm/test/Transforms/ObjCARC/inlined-autorelease-return-value.ll
@@ -2,291 +2,285 @@
 
 target datalayout = "e-p:64:64:64"
 
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)
 declare void @opaque()
-declare void @llvm.lifetime.start(i64, i8* nocapture)
-declare void @llvm.lifetime.end(i64, i8* nocapture)
+declare void @llvm.lifetime.start(i64, ptr nocapture)
+declare void @llvm.lifetime.end(i64, ptr nocapture)
 
-; CHECK-LABEL: define i8* @elide_with_retainRV(
+; CHECK-LABEL: define ptr @elide_with_retainRV(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    ret i8* %x
-define i8* @elide_with_retainRV(i8* %x) nounwind {
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_retainRV(ptr %x) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %c
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_bitcast(
+; CHECK-LABEL: define ptr @elide_with_retainRV_bitcast(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    %c = bitcast i32* %x to i8*
-; CHECK-NEXT:    ret i8* %c
-define i8* @elide_with_retainRV_bitcast(i32* %x) nounwind {
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_retainRV_bitcast(ptr %x) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %a) nounwind
-  %c = bitcast i32* %x to i8*
-  %d = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %c) nounwind
-  ret i8* %d
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %d = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_phi(
+; CHECK-LABEL: define ptr @elide_with_retainRV_phi(
 ; CHECK-NOT:   define
 ; CHECK:       phis:
-; CHECK-NEXT:    phi i8*
-; CHECK-NEXT:    ret i8*
-define i8* @elide_with_retainRV_phi(i8* %x) nounwind {
+; CHECK-NEXT:    phi ptr
+; CHECK-NEXT:    ret ptr
+define ptr @elide_with_retainRV_phi(ptr %x) nounwind {
 entry:
   br label %phis
 
 phis:
-  %a = phi i8* [ %x, %entry ]
-  %c = phi i8* [ %x, %entry ]
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %a) nounwind
-  %d = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %c) nounwind
-  ret i8* %d
+  %a = phi ptr [ %x, %entry ]
+  %c = phi ptr [ %x, %entry ]
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %a) nounwind
+  %d = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %c) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_splitByRetain(
+; CHECK-LABEL: define ptr @elide_with_retainRV_splitByRetain(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    %b = call i8* @llvm.objc.autorelease(i8* %x)
-; CHECK-NEXT:    tail call i8* @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:    tail call i8* @llvm.objc.retain(i8* %b)
-define i8* @elide_with_retainRV_splitByRetain(i8* %x) nounwind {
+; CHECK-NEXT:    %b = call ptr @llvm.objc.autorelease(ptr %x)
+; CHECK-NEXT:    tail call ptr @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:    tail call ptr @llvm.objc.retain(ptr %b)
+define ptr @elide_with_retainRV_splitByRetain(ptr %x) nounwind {
 entry:
   ; Cleanup is blocked by other ARC intrinsics for ease of implementation; we
   ; only delay processing AutoreleaseRV until the very next ARC intrinsic.  In
   ; practice, it would be very strange for this to matter.
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %d = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %d
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %d = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_splitByOpaque(
+; CHECK-LABEL: define ptr @elide_with_retainRV_splitByOpaque(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    %b = call i8* @llvm.objc.autorelease(i8* %x)
+; CHECK-NEXT:    %b = call ptr @llvm.objc.autorelease(ptr %x)
 ; CHECK-NEXT:    call void @opaque()
-; CHECK-NEXT:    %d = tail call i8* @llvm.objc.retain(i8* %b)
-; CHECK-NEXT:    ret i8* %d
-define i8* @elide_with_retainRV_splitByOpaque(i8* %x) nounwind {
+; CHECK-NEXT:    %d = tail call ptr @llvm.objc.retain(ptr %b)
+; CHECK-NEXT:    ret ptr %d
+define ptr @elide_with_retainRV_splitByOpaque(ptr %x) nounwind {
 entry:
   ; Cleanup should get blocked by opaque calls.
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
   call void @opaque() nounwind
-  %d = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %d
+  %d = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_splitByLifetime(
+; CHECK-LABEL: define ptr @elide_with_retainRV_splitByLifetime(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* %x)
-; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* %x)
-; CHECK-NEXT:    ret i8* %x
-define i8* @elide_with_retainRV_splitByLifetime(i8* %x) nounwind {
+; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 8, ptr %x)
+; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 8, ptr %x)
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_retainRV_splitByLifetime(ptr %x) nounwind {
 entry:
   ; Cleanup should skip over lifetime intrinsics.
-  call void @llvm.lifetime.start(i64 8, i8* %x)
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  call void @llvm.lifetime.end(i64 8, i8* %x)
-  %d = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %d
+  call void @llvm.lifetime.start(i64 8, ptr %x)
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  call void @llvm.lifetime.end(i64 8, ptr %x)
+  %d = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_wrongArg(
+; CHECK-LABEL: define ptr @elide_with_retainRV_wrongArg(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* %x)
-; CHECK-NEXT:    tail call i8* @llvm.objc.retain(i8* %y)
-define i8* @elide_with_retainRV_wrongArg(i8* %x, i8* %y) nounwind {
+; CHECK-NEXT:    call void @llvm.objc.release(ptr %x)
+; CHECK-NEXT:    tail call ptr @llvm.objc.retain(ptr %y)
+define ptr @elide_with_retainRV_wrongArg(ptr %x, ptr %y) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y) nounwind
-  ret i8* %c
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %y) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_wrongBB(
+; CHECK-LABEL: define ptr @elide_with_retainRV_wrongBB(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    call i8* @llvm.objc.autorelease(i8* %x)
+; CHECK-NEXT:    call ptr @llvm.objc.autorelease(ptr %x)
 ; CHECK-NEXT:    br label %next
 ; CHECK:       next:
-; CHECK-NEXT:    tail call i8* @llvm.objc.retain(
-; CHECK-NEXT:    ret i8*
-define i8* @elide_with_retainRV_wrongBB(i8* %x) nounwind {
+; CHECK-NEXT:    tail call ptr @llvm.objc.retain(
+; CHECK-NEXT:    ret ptr
+define ptr @elide_with_retainRV_wrongBB(ptr %x) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
   br label %next
 
 next:
-  %c = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %c
+  %c = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_beforeAutoreleaseRV(
+; CHECK-LABEL: define ptr @elide_with_retainRV_beforeAutoreleaseRV(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
-; CHECK-NEXT:    ret i8* %x
-define i8* @elide_with_retainRV_beforeAutoreleaseRV(i8* %x) nounwind {
+; CHECK-NEXT:    tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_retainRV_beforeAutoreleaseRV(ptr %x) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %b) nounwind
-  %d = call i8* @llvm.objc.autoreleaseReturnValue(i8* %c) nounwind
-  ret i8* %c
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %b) nounwind
+  %d = call ptr @llvm.objc.autoreleaseReturnValue(ptr %c) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_retainRV_afterRetain(
+; CHECK-LABEL: define ptr @elide_with_retainRV_afterRetain(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    tail call i8* @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:    ret i8* %a
-define i8* @elide_with_retainRV_afterRetain(i8* %x) nounwind {
+; CHECK-NEXT:    tail call ptr @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:    ret ptr %a
+define ptr @elide_with_retainRV_afterRetain(ptr %x) nounwind {
 entry:
-  %a = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %a) nounwind
-  %c = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %c
+  %a = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %a) nounwind
+  %c = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV(
+; CHECK-LABEL: define ptr @elide_with_claimRV(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    tail call void @llvm.objc.release(i8* %x)
-; CHECK-NEXT:    ret i8* %x
-define i8* @elide_with_claimRV(i8* %x) nounwind {
+; CHECK-NEXT:    tail call void @llvm.objc.release(ptr %x)
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_claimRV(ptr %x) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %c
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_bitcast(
+; CHECK-LABEL: define ptr @elide_with_claimRV_bitcast(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    %c = bitcast i32* %x to i8*
-; CHECK-NEXT:    tail call void @llvm.objc.release(i8* %c)
-; CHECK-NEXT:    ret i8* %c
-define i8* @elide_with_claimRV_bitcast(i32* %x) nounwind {
+; CHECK-NEXT:    tail call void @llvm.objc.release(ptr %x)
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_claimRV_bitcast(ptr %x) nounwind {
 entry:
-  %a = bitcast i32* %x to i8*
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %a) nounwind
-  %c = bitcast i32* %x to i8*
-  %d = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %c) nounwind
-  ret i8* %d
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %d = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %x) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_phi(
+; CHECK-LABEL: define ptr @elide_with_claimRV_phi(
 ; CHECK-NOT:   define
 ; CHECK:       phis:
-; CHECK-NEXT:    %c = phi i8*
-; CHECK-NEXT:    tail call void @llvm.objc.release(i8* %c)
-; CHECK-NEXT:    ret i8* %c
-define i8* @elide_with_claimRV_phi(i8* %x) nounwind {
+; CHECK-NEXT:    %c = phi ptr
+; CHECK-NEXT:    tail call void @llvm.objc.release(ptr %c)
+; CHECK-NEXT:    ret ptr %c
+define ptr @elide_with_claimRV_phi(ptr %x) nounwind {
 entry:
   br label %phis
 
 phis:
-  %a = phi i8* [ %x, %entry ]
-  %c = phi i8* [ %x, %entry ]
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %a) nounwind
-  %d = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %c) nounwind
-  ret i8* %d
+  %a = phi ptr [ %x, %entry ]
+  %c = phi ptr [ %x, %entry ]
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %a) nounwind
+  %d = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %c) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_splitByRetain(
+; CHECK-LABEL: define ptr @elide_with_claimRV_splitByRetain(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    %b = call i8* @llvm.objc.autorelease(i8* %x)
-; CHECK-NEXT:    tail call i8* @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:    tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b)
-define i8* @elide_with_claimRV_splitByRetain(i8* %x) nounwind {
+; CHECK-NEXT:    %b = call ptr @llvm.objc.autorelease(ptr %x)
+; CHECK-NEXT:    tail call ptr @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:    tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b)
+define ptr @elide_with_claimRV_splitByRetain(ptr %x) nounwind {
 entry:
   ; Cleanup is blocked by other ARC intrinsics for ease of implementation; we
   ; only delay processing AutoreleaseRV until the very next ARC intrinsic.  In
   ; practice, it would be very strange for this to matter.
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %d = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %d
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %d = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_splitByOpaque(
+; CHECK-LABEL: define ptr @elide_with_claimRV_splitByOpaque(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    %b = call i8* @llvm.objc.autorelease(i8* %x)
+; CHECK-NEXT:    %b = call ptr @llvm.objc.autorelease(ptr %x)
 ; CHECK-NEXT:    call void @opaque()
-; CHECK-NEXT:    %d = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b)
-; CHECK-NEXT:    ret i8* %d
-define i8* @elide_with_claimRV_splitByOpaque(i8* %x) nounwind {
+; CHECK-NEXT:    %d = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b)
+; CHECK-NEXT:    ret ptr %d
+define ptr @elide_with_claimRV_splitByOpaque(ptr %x) nounwind {
 entry:
   ; Cleanup should get blocked by opaque calls.
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
   call void @opaque() nounwind
-  %d = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %d
+  %d = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_splitByLifetime(
+; CHECK-LABEL: define ptr @elide_with_claimRV_splitByLifetime(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* %x)
-; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* %x)
-; CHECK-NEXT:    tail call void @llvm.objc.release(i8* %x)
-; CHECK-NEXT:    ret i8* %x
-define i8* @elide_with_claimRV_splitByLifetime(i8* %x) nounwind {
+; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 8, ptr %x)
+; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 8, ptr %x)
+; CHECK-NEXT:    tail call void @llvm.objc.release(ptr %x)
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_claimRV_splitByLifetime(ptr %x) nounwind {
 entry:
   ; Cleanup should skip over lifetime intrinsics.
-  call void @llvm.lifetime.start(i64 8, i8* %x)
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  call void @llvm.lifetime.end(i64 8, i8* %x)
-  %d = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %d
+  call void @llvm.lifetime.start(i64 8, ptr %x)
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  call void @llvm.lifetime.end(i64 8, ptr %x)
+  %d = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %d
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_wrongArg(
+; CHECK-LABEL: define ptr @elide_with_claimRV_wrongArg(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    call void @llvm.objc.release(i8* %x)
-; CHECK-NEXT:    tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %y)
-define i8* @elide_with_claimRV_wrongArg(i8* %x, i8* %y) nounwind {
+; CHECK-NEXT:    call void @llvm.objc.release(ptr %x)
+; CHECK-NEXT:    tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %y)
+define ptr @elide_with_claimRV_wrongArg(ptr %x, ptr %y) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %y) nounwind
-  ret i8* %c
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %y) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_wrongBB(
+; CHECK-LABEL: define ptr @elide_with_claimRV_wrongBB(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    call i8* @llvm.objc.autorelease(i8* %x)
+; CHECK-NEXT:    call ptr @llvm.objc.autorelease(ptr %x)
 ; CHECK-NEXT:    br label %next
 ; CHECK:       next:
-; CHECK-NEXT:    tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(
-; CHECK-NEXT:    ret i8*
-define i8* @elide_with_claimRV_wrongBB(i8* %x) nounwind {
+; CHECK-NEXT:    tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(
+; CHECK-NEXT:    ret ptr
+define ptr @elide_with_claimRV_wrongBB(ptr %x) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
   br label %next
 
 next:
-  %c = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %c
+  %c = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %c
 }
 
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_beforeAutoreleaseRV(
+; CHECK-LABEL: define ptr @elide_with_claimRV_beforeAutoreleaseRV(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    tail call void @llvm.objc.release(i8* %x)
-; CHECK-NEXT:    tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
-; CHECK-NEXT:    ret i8* %x
-define i8* @elide_with_claimRV_beforeAutoreleaseRV(i8* %x) nounwind {
+; CHECK-NEXT:    tail call void @llvm.objc.release(ptr %x)
+; CHECK-NEXT:    tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_claimRV_beforeAutoreleaseRV(ptr %x) nounwind {
 entry:
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
-  %c = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b) nounwind
-  %d = call i8* @llvm.objc.autoreleaseReturnValue(i8* %c) nounwind
-  ret i8* %c
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
+  %c = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b) nounwind
+  %d = call ptr @llvm.objc.autoreleaseReturnValue(ptr %c) nounwind
+  ret ptr %c
 }
 
-; CHECK-LABEL: define i8* @elide_with_claimRV_afterRetain(
+; CHECK-LABEL: define ptr @elide_with_claimRV_afterRetain(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    ret i8* %x
-define i8* @elide_with_claimRV_afterRetain(i8* %x) nounwind {
+; CHECK-NEXT:    ret ptr %x
+define ptr @elide_with_claimRV_afterRetain(ptr %x) nounwind {
 entry:
-  %a = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %b = call i8* @llvm.objc.autoreleaseReturnValue(i8* %a) nounwind
-  %c = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %b) nounwind
-  ret i8* %c
+  %a = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %b = call ptr @llvm.objc.autoreleaseReturnValue(ptr %a) nounwind
+  %c = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %b) nounwind
+  ret ptr %c
 }

diff  --git a/llvm/test/Transforms/ObjCARC/intrinsic-use-isolated.ll b/llvm/test/Transforms/ObjCARC/intrinsic-use-isolated.ll
index 49437a36a8a7..811cc299c0e2 100644
--- a/llvm/test/Transforms/ObjCARC/intrinsic-use-isolated.ll
+++ b/llvm/test/Transforms/ObjCARC/intrinsic-use-isolated.ll
@@ -9,8 +9,8 @@ declare void @llvm.objc.clang.arc.use(...) nounwind
 ; CHECK-LABEL: define void @test0(
 ; CHECK-NOT: clang.arc.use
 ; CHECK: }
-define void @test0(i8* %a, i8* %b) {
-  call void (...) @llvm.objc.clang.arc.use(i8* %a, i8* %b) nounwind
+define void @test0(ptr %a, ptr %b) {
+  call void (...) @llvm.objc.clang.arc.use(ptr %a, ptr %b) nounwind
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/intrinsic-use.ll b/llvm/test/Transforms/ObjCARC/intrinsic-use.ll
index e9c11eb315d9..884e2ebea735 100644
--- a/llvm/test/Transforms/ObjCARC/intrinsic-use.ll
+++ b/llvm/test/Transforms/ObjCARC/intrinsic-use.ll
@@ -2,111 +2,111 @@
 
 target datalayout = "e-p:64:64:64"
 
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.retainAutorelease(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare ptr @llvm.objc.retainAutorelease(ptr)
+declare void @llvm.objc.release(ptr)
+declare ptr @llvm.objc.autorelease(ptr)
 
 declare void @llvm.objc.clang.arc.use(...)
 declare void @llvm.objc.clang.arc.noop.use(...)
 
-declare void @test0_helper(i8*, i8**)
-declare void @can_release(i8*)
+declare void @test0_helper(ptr, ptr)
+declare void @can_release(ptr)
 
 ; Ensure that we honor clang.arc.use as a use and don't miscompile
 ; the reduced test case from <rdar://13195034>.
 ;
 ; CHECK-LABEL:      define void @test0(
-; CHECK:        @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:   store i8* %y, i8** %temp0
-; CHECK-NEXT:   @llvm.objc.retain(i8* %y)
+; CHECK:        @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:   store ptr %y, ptr %temp0
+; CHECK-NEXT:   @llvm.objc.retain(ptr %y)
 ; CHECK-NEXT:   call void @test0_helper
-; CHECK-NEXT:   [[VAL1:%.*]] = load i8*, i8** %temp0
-; CHECK-NEXT:   @llvm.objc.retain(i8* [[VAL1]])
-; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(i8* %y)
-; CHECK-NEXT:   @llvm.objc.release(i8* %y)
-; CHECK-NEXT:   store i8* [[VAL1]], i8** %temp1
+; CHECK-NEXT:   [[VAL1:%.*]] = load ptr, ptr %temp0
+; CHECK-NEXT:   @llvm.objc.retain(ptr [[VAL1]])
+; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(ptr %y)
+; CHECK-NEXT:   @llvm.objc.release(ptr %y)
+; CHECK-NEXT:   store ptr [[VAL1]], ptr %temp1
 ; CHECK-NEXT:   call void @test0_helper
-; CHECK-NEXT:   [[VAL2:%.*]] = load i8*, i8** %temp1
-; CHECK-NEXT:   @llvm.objc.retain(i8* [[VAL2]])
-; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(i8* [[VAL1]])
-; CHECK-NEXT:   @llvm.objc.release(i8* [[VAL1]])
-; CHECK-NEXT:   @llvm.objc.autorelease(i8* %x)
-; CHECK-NEXT:   store i8* %x, i8** %out
-; CHECK-NEXT:   @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:   @llvm.objc.release(i8* [[VAL2]])
-; CHECK-NEXT:   @llvm.objc.release(i8* %x)
+; CHECK-NEXT:   [[VAL2:%.*]] = load ptr, ptr %temp1
+; CHECK-NEXT:   @llvm.objc.retain(ptr [[VAL2]])
+; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(ptr [[VAL1]])
+; CHECK-NEXT:   @llvm.objc.release(ptr [[VAL1]])
+; CHECK-NEXT:   @llvm.objc.autorelease(ptr %x)
+; CHECK-NEXT:   store ptr %x, ptr %out
+; CHECK-NEXT:   @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:   @llvm.objc.release(ptr [[VAL2]])
+; CHECK-NEXT:   @llvm.objc.release(ptr %x)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test0(i8** %out, i8* %x, i8* %y) {
+define void @test0(ptr %out, ptr %x, ptr %y) {
 entry:
-  %temp0 = alloca i8*, align 8
-  %temp1 = alloca i8*, align 8
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %1 = call i8* @llvm.objc.retain(i8* %y) nounwind
-  store i8* %y, i8** %temp0
-  call void @test0_helper(i8* %x, i8** %temp0)
-  %val1 = load i8*, i8** %temp0
-  %2 = call i8* @llvm.objc.retain(i8* %val1) nounwind
-  call void (...) @llvm.objc.clang.arc.use(i8* %y) nounwind
-  call void @llvm.objc.release(i8* %y) nounwind
-  store i8* %val1, i8** %temp1
-  call void @test0_helper(i8* %x, i8** %temp1)
-  %val2 = load i8*, i8** %temp1
-  %3 = call i8* @llvm.objc.retain(i8* %val2) nounwind
-  call void (...) @llvm.objc.clang.arc.use(i8* %val1) nounwind
-  call void @llvm.objc.release(i8* %val1) nounwind
-  %4 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %5 = call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  store i8* %x, i8** %out
-  call void @llvm.objc.release(i8* %val2) nounwind
-  call void @llvm.objc.release(i8* %x) nounwind
+  %temp0 = alloca ptr, align 8
+  %temp1 = alloca ptr, align 8
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %1 = call ptr @llvm.objc.retain(ptr %y) nounwind
+  store ptr %y, ptr %temp0
+  call void @test0_helper(ptr %x, ptr %temp0)
+  %val1 = load ptr, ptr %temp0
+  %2 = call ptr @llvm.objc.retain(ptr %val1) nounwind
+  call void (...) @llvm.objc.clang.arc.use(ptr %y) nounwind
+  call void @llvm.objc.release(ptr %y) nounwind
+  store ptr %val1, ptr %temp1
+  call void @test0_helper(ptr %x, ptr %temp1)
+  %val2 = load ptr, ptr %temp1
+  %3 = call ptr @llvm.objc.retain(ptr %val2) nounwind
+  call void (...) @llvm.objc.clang.arc.use(ptr %val1) nounwind
+  call void @llvm.objc.release(ptr %val1) nounwind
+  %4 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %5 = call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  store ptr %x, ptr %out
+  call void @llvm.objc.release(ptr %val2) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
 ; CHECK-LABEL:      define void @test0a(
-; CHECK:        @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:   store i8* %y, i8** %temp0
-; CHECK-NEXT:   @llvm.objc.retain(i8* %y)
+; CHECK:        @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:   store ptr %y, ptr %temp0
+; CHECK-NEXT:   @llvm.objc.retain(ptr %y)
 ; CHECK-NEXT:   call void @test0_helper
-; CHECK-NEXT:   [[VAL1:%.*]] = load i8*, i8** %temp0
-; CHECK-NEXT:   @llvm.objc.retain(i8* [[VAL1]])
-; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(i8* %y)
-; CHECK-NEXT:   @llvm.objc.release(i8* %y)
-; CHECK-NEXT:   store i8* [[VAL1]], i8** %temp1
+; CHECK-NEXT:   [[VAL1:%.*]] = load ptr, ptr %temp0
+; CHECK-NEXT:   @llvm.objc.retain(ptr [[VAL1]])
+; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(ptr %y)
+; CHECK-NEXT:   @llvm.objc.release(ptr %y)
+; CHECK-NEXT:   store ptr [[VAL1]], ptr %temp1
 ; CHECK-NEXT:   call void @test0_helper
-; CHECK-NEXT:   [[VAL2:%.*]] = load i8*, i8** %temp1
-; CHECK-NEXT:   @llvm.objc.retain(i8* [[VAL2]])
-; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(i8* [[VAL1]])
-; CHECK-NEXT:   @llvm.objc.release(i8* [[VAL1]])
-; CHECK-NEXT:   @llvm.objc.autorelease(i8* %x)
-; CHECK-NEXT:   @llvm.objc.release(i8* [[VAL2]])
-; CHECK-NEXT:   store i8* %x, i8** %out
+; CHECK-NEXT:   [[VAL2:%.*]] = load ptr, ptr %temp1
+; CHECK-NEXT:   @llvm.objc.retain(ptr [[VAL2]])
+; CHECK-NEXT:   call void (...) @llvm.objc.clang.arc.use(ptr [[VAL1]])
+; CHECK-NEXT:   @llvm.objc.release(ptr [[VAL1]])
+; CHECK-NEXT:   @llvm.objc.autorelease(ptr %x)
+; CHECK-NEXT:   @llvm.objc.release(ptr [[VAL2]])
+; CHECK-NEXT:   store ptr %x, ptr %out
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test0a(i8** %out, i8* %x, i8* %y) {
+define void @test0a(ptr %out, ptr %x, ptr %y) {
 entry:
-  %temp0 = alloca i8*, align 8
-  %temp1 = alloca i8*, align 8
-  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %1 = call i8* @llvm.objc.retain(i8* %y) nounwind
-  store i8* %y, i8** %temp0
-  call void @test0_helper(i8* %x, i8** %temp0)
-  %val1 = load i8*, i8** %temp0
-  %2 = call i8* @llvm.objc.retain(i8* %val1) nounwind
-  call void (...) @llvm.objc.clang.arc.use(i8* %y) nounwind
-  call void @llvm.objc.release(i8* %y) nounwind, !clang.imprecise_release !0
-  store i8* %val1, i8** %temp1
-  call void @test0_helper(i8* %x, i8** %temp1)
-  %val2 = load i8*, i8** %temp1
-  %3 = call i8* @llvm.objc.retain(i8* %val2) nounwind
-  call void (...) @llvm.objc.clang.arc.use(i8* %val1) nounwind
-  call void @llvm.objc.release(i8* %val1) nounwind, !clang.imprecise_release !0
-  %4 = call i8* @llvm.objc.retain(i8* %x) nounwind
-  %5 = call i8* @llvm.objc.autorelease(i8* %x) nounwind
-  store i8* %x, i8** %out
-  call void @llvm.objc.release(i8* %val2) nounwind, !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %x) nounwind, !clang.imprecise_release !0
+  %temp0 = alloca ptr, align 8
+  %temp1 = alloca ptr, align 8
+  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %1 = call ptr @llvm.objc.retain(ptr %y) nounwind
+  store ptr %y, ptr %temp0
+  call void @test0_helper(ptr %x, ptr %temp0)
+  %val1 = load ptr, ptr %temp0
+  %2 = call ptr @llvm.objc.retain(ptr %val1) nounwind
+  call void (...) @llvm.objc.clang.arc.use(ptr %y) nounwind
+  call void @llvm.objc.release(ptr %y) nounwind, !clang.imprecise_release !0
+  store ptr %val1, ptr %temp1
+  call void @test0_helper(ptr %x, ptr %temp1)
+  %val2 = load ptr, ptr %temp1
+  %3 = call ptr @llvm.objc.retain(ptr %val2) nounwind
+  call void (...) @llvm.objc.clang.arc.use(ptr %val1) nounwind
+  call void @llvm.objc.release(ptr %val1) nounwind, !clang.imprecise_release !0
+  %4 = call ptr @llvm.objc.retain(ptr %x) nounwind
+  %5 = call ptr @llvm.objc.autorelease(ptr %x) nounwind
+  store ptr %x, ptr %out
+  call void @llvm.objc.release(ptr %val2) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %x) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -114,15 +114,15 @@ entry:
 ; call to @llvm.objc.clang.arc.noop.use is a no-op.
 
 ; CHECK-LABEL: define void @test_arc_noop_use(
-; CHECK-NEXT:    call void @can_release(i8* %x)
+; CHECK-NEXT:    call void @can_release(ptr %x)
 ; CHECK-NEXT:    call void (...) @llvm.objc.clang.arc.noop.use(
 ; CHECK-NEXT:    ret void
 
-define void @test_arc_noop_use(i8** %out, i8* %x) {
-  call i8* @llvm.objc.retain(i8* %x)
-  call void @can_release(i8* %x)
-  call void (...) @llvm.objc.clang.arc.noop.use(i8* %x)
-  call void @llvm.objc.release(i8* %x), !clang.imprecise_release !0
+define void @test_arc_noop_use(ptr %out, ptr %x) {
+  call ptr @llvm.objc.retain(ptr %x)
+  call void @can_release(ptr %x)
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %x)
+  call void @llvm.objc.release(ptr %x), !clang.imprecise_release !0
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/invoke-2.ll b/llvm/test/Transforms/ObjCARC/invoke-2.ll
index 261ed94029fd..eda66feb8df6 100644
--- a/llvm/test/Transforms/ObjCARC/invoke-2.ll
+++ b/llvm/test/Transforms/ObjCARC/invoke-2.ll
@@ -4,51 +4,51 @@ target triple = "x86_64-unknown-windows-msvc"
 
 declare i32 @__CxxFrameHandler3(...)
 
-declare dllimport i8* @objc_msgSend(i8*, i8*, ...) local_unnamed_addr
+declare dllimport ptr @objc_msgSend(ptr, ptr, ...) local_unnamed_addr
 
-declare dllimport i8* @llvm.objc.retain(i8* returned) local_unnamed_addr
-declare dllimport void @llvm.objc.release(i8*) local_unnamed_addr
-declare dllimport i8* @llvm.objc.retainAutoreleasedReturnValue(i8* returned) local_unnamed_addr
+declare dllimport ptr @llvm.objc.retain(ptr returned) local_unnamed_addr
+declare dllimport void @llvm.objc.release(ptr) local_unnamed_addr
+declare dllimport ptr @llvm.objc.retainAutoreleasedReturnValue(ptr returned) local_unnamed_addr
 
-declare dllimport i8* @llvm.objc.begin_catch(i8*) local_unnamed_addr
+declare dllimport ptr @llvm.objc.begin_catch(ptr) local_unnamed_addr
 declare dllimport void @llvm.objc.end_catch() local_unnamed_addr
 
 @llvm.objc.METH_VAR_NAME_ = private unnamed_addr constant [2 x i8] c"m\00", align 1
- at llvm.objc.SELECTOR_REFERENCES_ = private externally_initialized global i8* getelementptr inbounds ([2 x i8], [2 x i8]* @llvm.objc.METH_VAR_NAME_, i64 0, i64 0), section ".objc_selrefs$B", align 8
+ at llvm.objc.SELECTOR_REFERENCES_ = private externally_initialized global ptr @llvm.objc.METH_VAR_NAME_, section ".objc_selrefs$B", align 8
 
-define void @f(i8* %i) local_unnamed_addr personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define void @f(ptr %i) local_unnamed_addr personality ptr @__CxxFrameHandler3 {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %i)
-  %1 = load i8*, i8** @llvm.objc.SELECTOR_REFERENCES_, align 8, !invariant.load !0
-  %call = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %0, i8* %1)
+  %0 = tail call ptr @llvm.objc.retain(ptr %i)
+  %1 = load ptr, ptr @llvm.objc.SELECTOR_REFERENCES_, align 8, !invariant.load !0
+  %call = invoke ptr @objc_msgSend(ptr %0, ptr %1)
           to label %invoke.cont unwind label %catch.dispatch, !clang.arc.no_objc_arc_exceptions !0
 
 catch.dispatch:                                   ; preds = %entry
   %2 = catchswitch within none [label %catch] unwind to caller
 
 invoke.cont:                                      ; preds = %entry
-  %3 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call)
-  tail call void @llvm.objc.release(i8* %3) #0, !clang.imprecise_release !0
+  %3 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call)
+  tail call void @llvm.objc.release(ptr %3) #0, !clang.imprecise_release !0
   br label %eh.cont
 
 eh.cont:                                          ; preds = %invoke.cont, %catch
-  tail call void @llvm.objc.release(i8* %0) #0, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %0) #0, !clang.imprecise_release !0
   ret void
 
 catch:                                            ; preds = %catch.dispatch
-  %4 = catchpad within %2 [i8* null, i32 0, i8* null]
-  %exn.adjusted = tail call i8* @llvm.objc.begin_catch(i8* undef)
+  %4 = catchpad within %2 [ptr null, i32 0, ptr null]
+  %exn.adjusted = tail call ptr @llvm.objc.begin_catch(ptr undef)
   tail call void @llvm.objc.end_catch(), !clang.arc.no_objc_arc_exceptions !0
   br label %eh.cont
 }
 
 ; CHECK-LABEL: @f
 
-; CHECK-NOT: tail call i8* @llvm.objc.retain(i8* %i)
-; CHECK: load i8*, i8** @llvm.objc.SELECTOR_REFERENCES_, align 8
+; CHECK-NOT: tail call ptr @llvm.objc.retain(ptr %i)
+; CHECK: load ptr, ptr @llvm.objc.SELECTOR_REFERENCES_, align 8
 
 ; CHECK: eh.cont:
-; CHECK-NOT: call void @llvm.objc.release(i8*
+; CHECK-NOT: call void @llvm.objc.release(ptr
 ; CHECK: ret void
 
 attributes #0 = { nounwind }

diff  --git a/llvm/test/Transforms/ObjCARC/invoke.ll b/llvm/test/Transforms/ObjCARC/invoke.ll
index d6c25b91bca2..a792b8e86836 100644
--- a/llvm/test/Transforms/ObjCARC/invoke.ll
+++ b/llvm/test/Transforms/ObjCARC/invoke.ll
@@ -1,38 +1,38 @@
 ; RUN: opt -S -passes=objc-arc < %s | FileCheck %s
 
-declare i8* @llvm.objc.retain(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @objc_msgSend(i8*, i8*, ...)
-declare void @use_pointer(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare void @llvm.objc.release(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @objc_msgSend(ptr, ptr, ...)
+declare void @use_pointer(ptr)
 declare void @callee()
-declare i8* @returner()
+declare ptr @returner()
 
 ; ARCOpt shouldn't try to move the releases to the block containing the invoke.
 
 ; CHECK-LABEL: define void @test0(
 ; CHECK: invoke.cont:
-; CHECK:   call void @llvm.objc.release(i8* %zipFile) [[NUW:#[0-9]+]], !clang.imprecise_release !0
+; CHECK:   call void @llvm.objc.release(ptr %zipFile) [[NUW:#[0-9]+]], !clang.imprecise_release !0
 ; CHECK:   ret void
 ; CHECK: lpad:
-; CHECK:   call void @llvm.objc.release(i8* %zipFile) [[NUW]], !clang.imprecise_release !0
+; CHECK:   call void @llvm.objc.release(ptr %zipFile) [[NUW]], !clang.imprecise_release !0
 ; CHECK:   ret void
 ; CHECK-NEXT: }
-define void @test0(i8* %zipFile) personality i32 (...)* @__gxx_personality_v0 {
+define void @test0(ptr %zipFile) personality ptr @__gxx_personality_v0 {
 entry:
-  call i8* @llvm.objc.retain(i8* %zipFile) nounwind
-  call void @use_pointer(i8* %zipFile)
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile) 
+  call ptr @llvm.objc.retain(ptr %zipFile) nounwind
+  call void @use_pointer(ptr %zipFile)
+  invoke void @objc_msgSend(ptr %zipFile) 
           to label %invoke.cont unwind label %lpad
 
 invoke.cont:                                      ; preds = %entry
-  call void @llvm.objc.release(i8* %zipFile) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %zipFile) nounwind, !clang.imprecise_release !0
   ret void
 
 lpad:                                             ; preds = %entry
-  %exn = landingpad {i8*, i32}
+  %exn = landingpad {ptr, i32}
            cleanup
-  call void @llvm.objc.release(i8* %zipFile) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %zipFile) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -40,21 +40,21 @@ lpad:                                             ; preds = %entry
 
 ; CHECK-LABEL: define void @test1(
 ; CHECK: invoke.cont:
-; CHECK:   call void @llvm.objc.release(i8* %zipFile) [[NUW]], !clang.imprecise_release !0
+; CHECK:   call void @llvm.objc.release(ptr %zipFile) [[NUW]], !clang.imprecise_release !0
 ; CHECK:   call void @callee()
 ; CHECK:   br label %done
 ; CHECK: lpad:
-; CHECK:   call void @llvm.objc.release(i8* %zipFile) [[NUW]], !clang.imprecise_release !0
+; CHECK:   call void @llvm.objc.release(ptr %zipFile) [[NUW]], !clang.imprecise_release !0
 ; CHECK:   call void @callee()
 ; CHECK:   br label %done
 ; CHECK: done:
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test1(i8* %zipFile) personality i32 (...)* @__gxx_personality_v0 {
+define void @test1(ptr %zipFile) personality ptr @__gxx_personality_v0 {
 entry:
-  call i8* @llvm.objc.retain(i8* %zipFile) nounwind
-  call void @use_pointer(i8* %zipFile)
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile)
+  call ptr @llvm.objc.retain(ptr %zipFile) nounwind
+  call void @use_pointer(ptr %zipFile)
+  invoke void @objc_msgSend(ptr %zipFile)
           to label %invoke.cont unwind label %lpad
 
 invoke.cont:                                      ; preds = %entry
@@ -62,22 +62,22 @@ invoke.cont:                                      ; preds = %entry
   br label %done
 
 lpad:                                             ; preds = %entry
-  %exn = landingpad {i8*, i32}
+  %exn = landingpad {ptr, i32}
            cleanup
   call void @callee()
   br label %done
 
 done:
-  call void @llvm.objc.release(i8* %zipFile) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %zipFile) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; The optimizer should ignore invoke unwind paths consistently.
 ; PR12265
 
-; CHECK: define void @test2() personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+; CHECK: define void @test2() personality ptr @__objc_personality_v0 {
 ; CHECK: invoke.cont:
-; CHECK-NEXT: call i8* @llvm.objc.retain
+; CHECK-NEXT: call ptr @llvm.objc.retain
 ; CHECK-NOT: @llvm.objc.r
 ; CHECK: finally.cont:
 ; CHECK-NEXT: call void @llvm.objc.release
@@ -85,24 +85,24 @@ done:
 ; CHECK: finally.rethrow:
 ; CHECK-NOT: @objc
 ; CHECK: }
-define void @test2() personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+define void @test2() personality ptr @__objc_personality_v0 {
 entry:
-  %call = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* ()*)()
+  %call = invoke ptr @objc_msgSend()
           to label %invoke.cont unwind label %finally.rethrow, !clang.arc.no_objc_arc_exceptions !0
 
 invoke.cont:                                      ; preds = %entry
-  %tmp1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void ()*)(), !clang.arc.no_objc_arc_exceptions !0
-  invoke void @use_pointer(i8* %call)
+  %tmp1 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  call void @objc_msgSend(), !clang.arc.no_objc_arc_exceptions !0
+  invoke void @use_pointer(ptr %call)
           to label %finally.cont unwind label %finally.rethrow, !clang.arc.no_objc_arc_exceptions !0
 
 finally.cont:                                     ; preds = %invoke.cont
-  tail call void @llvm.objc.release(i8* %call) nounwind, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %call) nounwind, !clang.imprecise_release !0
   ret void
 
 finally.rethrow:                                  ; preds = %invoke.cont, %entry
-  %tmp2 = landingpad { i8*, i32 }
-          catch i8* null
+  %tmp2 = landingpad { ptr, i32 }
+          catch ptr null
   unreachable
 }
 
@@ -110,30 +110,30 @@ finally.rethrow:                                  ; preds = %invoke.cont, %entry
 
 ; CHECK-LABEL: define void @test3(
 ; CHECK: if.end:
-; CHECK-NEXT: call void @llvm.objc.release(i8* %p) [[NUW]]
+; CHECK-NEXT: call void @llvm.objc.release(ptr %p) [[NUW]]
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test3(i8* %p, i1 %b) personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+define void @test3(ptr %p, i1 %b) personality ptr @__objc_personality_v0 {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %p)
+  %0 = call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
   br i1 %b, label %if.else, label %if.then
 
 if.then:
-  invoke void @use_pointer(i8* %p)
+  invoke void @use_pointer(ptr %p)
           to label %if.end unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
 
 if.else:
-  invoke void @use_pointer(i8* %p)
+  invoke void @use_pointer(ptr %p)
           to label %if.end unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
 
 lpad:
-  %r = landingpad { i8*, i32 }
+  %r = landingpad { ptr, i32 }
        cleanup
   ret void
 
 if.end:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -141,36 +141,36 @@ if.end:
 
 ; CHECK-LABEL: define void @test4(
 ; CHECK: lpad:
-; CHECK-NEXT: %r = landingpad { i8*, i32 }
+; CHECK-NEXT: %r = landingpad { ptr, i32 }
 ; CHECK-NEXT: cleanup
-; CHECK-NEXT: call void @llvm.objc.release(i8* %p) [[NUW]]
+; CHECK-NEXT: call void @llvm.objc.release(ptr %p) [[NUW]]
 ; CHECK-NEXT: ret void
 ; CHECK: if.end:
-; CHECK-NEXT: call void @llvm.objc.release(i8* %p) [[NUW]]
+; CHECK-NEXT: call void @llvm.objc.release(ptr %p) [[NUW]]
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test4(i8* %p, i1 %b) personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+define void @test4(ptr %p, i1 %b) personality ptr @__objc_personality_v0 {
 entry:
-  %0 = call i8* @llvm.objc.retain(i8* %p)
+  %0 = call ptr @llvm.objc.retain(ptr %p)
   call void @callee()
   br i1 %b, label %if.else, label %if.then
 
 if.then:
-  invoke void @use_pointer(i8* %p)
+  invoke void @use_pointer(ptr %p)
           to label %if.end unwind label %lpad
 
 if.else:
-  invoke void @use_pointer(i8* %p)
+  invoke void @use_pointer(ptr %p)
           to label %if.end unwind label %lpad
 
 lpad:
-  %r = landingpad { i8*, i32 }
+  %r = landingpad { ptr, i32 }
        cleanup
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 
 if.end:
-  call void @llvm.objc.release(i8* %p)
+  call void @llvm.objc.release(ptr %p)
   ret void
 }
 
@@ -178,41 +178,41 @@ if.end:
 ; for an invoke which we can assume codegen will put immediately prior.
 
 ; CHECK-LABEL: define void @test5(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z)
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %z)
 ; CHECK: }
-define void @test5() personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+define void @test5() personality ptr @__objc_personality_v0 {
 entry:
-  %z = invoke i8* @returner()
+  %z = invoke ptr @returner()
           to label %if.end unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
 
 lpad:
-  %r13 = landingpad { i8*, i32 }
+  %r13 = landingpad { ptr, i32 }
           cleanup
   ret void
 
 if.end:
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %z)
   ret void
 }
 
 ; Like test5, but there's intervening code.
 
 ; CHECK-LABEL: define void @test6(
-; CHECK: call i8* @llvm.objc.retain(i8* %z)
+; CHECK: call ptr @llvm.objc.retain(ptr %z)
 ; CHECK: }
-define void @test6() personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+define void @test6() personality ptr @__objc_personality_v0 {
 entry:
-  %z = invoke i8* @returner()
+  %z = invoke ptr @returner()
           to label %if.end unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
 
 lpad:
-  %r13 = landingpad { i8*, i32 }
+  %r13 = landingpad { ptr, i32 }
           cleanup
   ret void
 
 if.end:
   call void @callee()
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %z)
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll b/llvm/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll
index 15355c0e7155..b36c095742a5 100644
--- a/llvm/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll
+++ b/llvm/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll
@@ -4,25 +4,25 @@
 ; and various scary looking things and fold it into an objc_retainAutorelease.
 
 ; CHECK: bb57:
-; CHECK: tail call i8* @llvm.objc.retainAutorelease(i8* %tmp71x) [[NUW:#[0-9]+]]
+; CHECK: tail call ptr @llvm.objc.retainAutorelease(ptr %tmp71x) [[NUW:#[0-9]+]]
 ; CHECK: bb99:
 
 target 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"
 target triple = "x86_64-apple-darwin11.0.0"
 
-%0 = type { i8* (i8*, %1*, ...)*, i8* }
-%1 = type { i8*, i8* }
-%2 = type { %2*, %2*, %3*, i8* (i8*, i8*)**, %4* }
+%0 = type { ptr, ptr }
+%1 = type { ptr, ptr }
+%2 = type { ptr, ptr, ptr, ptr, ptr }
 %3 = type opaque
-%4 = type { i32, i32, i32, i8*, i8*, %5*, %7*, %10*, i8*, %9* }
+%4 = type { i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
 %5 = type { i32, i32, [0 x %6] }
-%6 = type { i8*, i8*, i8* }
-%7 = type { i64, [0 x %8*] }
-%8 = type { i8*, i8*, %7*, %5*, %5*, %5*, %5*, %9*, i32, i32 }
+%6 = type { ptr, ptr, ptr }
+%7 = type { i64, [0 x ptr] }
+%8 = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32 }
 %9 = type { i32, i32, [0 x %1] }
 %10 = type { i32, i32, [0 x %11] }
-%11 = type { i64*, i8*, i8*, i32, i32 }
-%12 = type { i32*, i32, i8*, i64 }
+%11 = type { ptr, ptr, ptr, i32, i32 }
+%12 = type { ptr, i32, ptr, i64 }
 %13 = type opaque
 %14 = type opaque
 %15 = type opaque
@@ -38,64 +38,58 @@ target triple = "x86_64-apple-darwin11.0.0"
 %25 = type opaque
 
 @"\01l_objc_msgSend_fixup_alloc" = external hidden global %0, section "__DATA, __objc_msgrefs, coalesced", align 16
-@"\01L_OBJC_SELECTOR_REFERENCES_8" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_3725" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_40" = external hidden global %2*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_4227" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_4631" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_70" = external hidden global %2*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_148" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_159" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_188" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_328" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_8" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_3725" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_40" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_4227" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_4631" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_70" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_148" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_159" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_188" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_328" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
 @"\01l_objc_msgSend_fixup_objectAtIndex_" = external hidden global %0, section "__DATA, __objc_msgrefs, coalesced", align 16
 @_unnamed_cfstring_386 = external hidden constant %12, section "__DATA,__cfstring"
 @"\01l_objc_msgSend_fixup_count" = external hidden global %0, section "__DATA, __objc_msgrefs, coalesced", align 16
-@"\01L_OBJC_SELECTOR_REFERENCES_389" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_391" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_393" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
- at NSPrintHeaderAndFooter = external constant %13*
-@"\01L_OBJC_SELECTOR_REFERENCES_395" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_396" = external hidden global %2*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_398" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_400" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_402" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_404" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_406" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_408" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_CLASSLIST_REFERENCES_$_409" = external hidden global %2*, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
-@"\01L_OBJC_SELECTOR_REFERENCES_411" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_413" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_415" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-
-declare i8* @objc_msgSend(i8*, i8*, ...)
-
-declare i8* @llvm.objc.retain(i8*)
-
-declare void @llvm.objc.release(i8*)
-
-declare i8* @llvm.objc.autorelease(i8*)
-
-declare i8* @llvm.objc.explicit_autorelease(i8*)
-
-define hidden %14* @foo(%15* %arg, %16* %arg2) {
+@"\01L_OBJC_SELECTOR_REFERENCES_389" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_391" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_393" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+ at NSPrintHeaderAndFooter = external constant ptr
+@"\01L_OBJC_SELECTOR_REFERENCES_395" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_396" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_398" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_400" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_402" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_404" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_406" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_408" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_CLASSLIST_REFERENCES_$_409" = external hidden global ptr, section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_411" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_413" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_415" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+
+declare ptr @objc_msgSend(ptr, ptr, ...)
+
+declare ptr @llvm.objc.retain(ptr)
+
+declare void @llvm.objc.release(ptr)
+
+declare ptr @llvm.objc.autorelease(ptr)
+
+declare ptr @llvm.objc.explicit_autorelease(ptr)
+
+define hidden ptr @foo(ptr %arg, ptr %arg2) {
 bb:
-  %tmp = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_3725", align 8
-  %tmp4 = bitcast %15* %arg to i8*
-  %tmp5 = tail call %18* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %18* (i8*, i8*)*)(i8* %tmp4, i8* %tmp)
-  %tmp6 = bitcast %18* %tmp5 to i8*
-  %tmp7 = tail call i8* @llvm.objc.retain(i8* %tmp6) nounwind
-  %tmp8 = load %2*, %2** @"\01L_OBJC_CLASSLIST_REFERENCES_$_40", align 8
-  %tmp9 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_4227", align 8
-  %tmp10 = bitcast %2* %tmp8 to i8*
-  %tmp11 = tail call %19* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %19* (i8*, i8*)*)(i8* %tmp10, i8* %tmp9)
-  %tmp12 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_4631", align 8
-  %tmp13 = bitcast %19* %tmp11 to i8*
-  %tmp14 = tail call signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, %13*)*)(i8* %tmp13, i8* %tmp12, %13* bitcast (%12* @_unnamed_cfstring_386 to %13*))
-  %tmp15 = bitcast %16* %arg2 to i8*
-  %tmp16 = load i8*, i8** bitcast (%0* @"\01l_objc_msgSend_fixup_count" to i8**), align 16
-  %tmp17 = bitcast i8* %tmp16 to i64 (i8*, %1*)*
-  %tmp18 = tail call i64 %tmp17(i8* %tmp15, %1* bitcast (%0* @"\01l_objc_msgSend_fixup_count" to %1*))
+  %tmp = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_3725", align 8
+  %tmp5 = tail call ptr @objc_msgSend(ptr %arg, ptr %tmp)
+  %tmp7 = tail call ptr @llvm.objc.retain(ptr %tmp5) nounwind
+  %tmp8 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_40", align 8
+  %tmp9 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_4227", align 8
+  %tmp11 = tail call ptr @objc_msgSend(ptr %tmp8, ptr %tmp9)
+  %tmp12 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_4631", align 8
+  %tmp14 = tail call signext i8 @objc_msgSend(ptr %tmp11, ptr %tmp12, ptr @_unnamed_cfstring_386)
+  %tmp16 = load ptr, ptr @"\01l_objc_msgSend_fixup_count", align 16
+  %tmp18 = tail call i64 %tmp16(ptr %arg2, ptr @"\01l_objc_msgSend_fixup_count")
   %tmp19 = icmp eq i64 %tmp18, 0
   br i1 %tmp19, label %bb22, label %bb20
 
@@ -104,120 +98,99 @@ bb20:                                             ; preds = %bb
   br label %bb25
 
 bb22:                                             ; preds = %bb
-  %tmp23 = bitcast i8* %tmp7 to %18*
   %tmp24 = icmp eq i8 %tmp14, 0
   br i1 %tmp24, label %bb46, label %bb25
 
 bb25:                                             ; preds = %bb22, %bb20
   %tmp26 = phi i1 [ %tmp21, %bb20 ], [ false, %bb22 ]
-  %tmp27 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_188", align 8
-  %tmp28 = tail call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp7, i8* %tmp27)
-  %tmp29 = tail call i8* @llvm.objc.explicit_autorelease(i8* %tmp28) nounwind
-  %tmp30 = bitcast i8* %tmp29 to %18*
-  tail call void @llvm.objc.release(i8* %tmp7) nounwind
-  %tmp31 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_389", align 8
-  %tmp32 = tail call %20* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %20* (i8*, i8*)*)(i8* %tmp29, i8* %tmp31)
-  %tmp33 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_391", align 8
-  %tmp34 = bitcast %20* %tmp32 to i8*
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %16*)*)(i8* %tmp34, i8* %tmp33, %16* %arg2)
+  %tmp27 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_188", align 8
+  %tmp28 = tail call ptr @objc_msgSend(ptr %tmp7, ptr %tmp27)
+  %tmp29 = tail call ptr @llvm.objc.explicit_autorelease(ptr %tmp28) nounwind
+  tail call void @llvm.objc.release(ptr %tmp7) nounwind
+  %tmp31 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_389", align 8
+  %tmp32 = tail call ptr @objc_msgSend(ptr %tmp29, ptr %tmp31)
+  %tmp33 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_391", align 8
+  tail call void @objc_msgSend(ptr %tmp32, ptr %tmp33, ptr %arg2)
   br i1 %tmp26, label %bb46, label %bb35
 
 bb35:                                             ; preds = %bb25
-  %tmp36 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_389", align 8
-  %tmp37 = tail call %20* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %20* (i8*, i8*)*)(i8* %tmp29, i8* %tmp36)
-  %tmp38 = load %2*, %2** @"\01L_OBJC_CLASSLIST_REFERENCES_$_70", align 8
-  %tmp39 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_393", align 8
-  %tmp40 = bitcast %2* %tmp38 to i8*
-  %tmp41 = tail call %21* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %21* (i8*, i8*, i8)*)(i8* %tmp40, i8* %tmp39, i8 signext 1)
-  %tmp42 = bitcast %21* %tmp41 to i8*
-  %tmp43 = load %13*, %13** @NSPrintHeaderAndFooter, align 8
-  %tmp44 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_159", align 8
-  %tmp45 = bitcast %20* %tmp37 to i8*
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, %13*)*)(i8* %tmp45, i8* %tmp44, i8* %tmp42, %13* %tmp43)
+  %tmp36 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_389", align 8
+  %tmp37 = tail call ptr @objc_msgSend(ptr %tmp29, ptr %tmp36)
+  %tmp38 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_70", align 8
+  %tmp39 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_393", align 8
+  %tmp41 = tail call ptr @objc_msgSend(ptr %tmp38, ptr %tmp39, i8 signext 1)
+  %tmp43 = load ptr, ptr @NSPrintHeaderAndFooter, align 8
+  %tmp44 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_159", align 8
+  tail call void @objc_msgSend(ptr %tmp37, ptr %tmp44, ptr %tmp41, ptr %tmp43)
   br label %bb46
 
 bb46:                                             ; preds = %bb35, %bb25, %bb22
-  %tmp47 = phi %18* [ %tmp30, %bb35 ], [ %tmp30, %bb25 ], [ %tmp23, %bb22 ]
-  %tmp48 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_328", align 8
-  %tmp49 = tail call %22* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %22* (i8*, i8*)*)(i8* %tmp4, i8* %tmp48)
-  %tmp50 = bitcast %22* %tmp49 to i8*
-  %tmp51 = load i8*, i8** bitcast (%0* @"\01l_objc_msgSend_fixup_count" to i8**), align 16
-  %tmp52 = bitcast i8* %tmp51 to i64 (i8*, %1*)*
-  %tmp53 = tail call i64 %tmp52(i8* %tmp50, %1* bitcast (%0* @"\01l_objc_msgSend_fixup_count" to %1*))
+  %tmp47 = phi ptr [ %tmp29, %bb35 ], [ %tmp29, %bb25 ], [ %tmp7, %bb22 ]
+  %tmp48 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_328", align 8
+  %tmp49 = tail call ptr @objc_msgSend(ptr %arg, ptr %tmp48)
+  %tmp51 = load ptr, ptr @"\01l_objc_msgSend_fixup_count", align 16
+  %tmp53 = tail call i64 %tmp51(ptr %tmp49, ptr @"\01l_objc_msgSend_fixup_count")
   %tmp54 = icmp eq i64 %tmp53, 0
   br i1 %tmp54, label %bb55, label %bb57
 
 bb55:                                             ; preds = %bb46
-  %tmp56 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_395", align 8
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* %tmp4, i8* %tmp56)
+  %tmp56 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_395", align 8
+  tail call void @objc_msgSend(ptr %arg, ptr %tmp56)
   br label %bb57
 
 bb57:                                             ; preds = %bb55, %bb46
-  %tmp58 = load %2*, %2** @"\01L_OBJC_CLASSLIST_REFERENCES_$_396", align 8
-  %tmp59 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_328", align 8
-  %tmp60 = tail call %22* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %22* (i8*, i8*)*)(i8* %tmp4, i8* %tmp59)
-  %tmp61 = bitcast %22* %tmp60 to i8*
-  %tmp62 = load i8*, i8** bitcast (%0* @"\01l_objc_msgSend_fixup_objectAtIndex_" to i8**), align 16
-  %tmp63 = bitcast i8* %tmp62 to i8* (i8*, %1*, i64)*
-  %tmp64 = tail call i8* %tmp63(i8* %tmp61, %1* bitcast (%0* @"\01l_objc_msgSend_fixup_objectAtIndex_" to %1*), i64 0)
-  %tmp65 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_398", align 8
-  %tmp66 = tail call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp64, i8* %tmp65)
-  %tmp67 = bitcast i8* %tmp66 to %23*
-  %tmp68 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_400", align 8
-  %tmp69 = bitcast %2* %tmp58 to i8*
-  %tmp70 = tail call %14* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %14* (i8*, i8*, %23*, %18*)*)(i8* %tmp69, i8* %tmp68, %23* %tmp67, %18* %tmp47)
-  %tmp71 = bitcast %14* %tmp70 to i8*
+  %tmp58 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_396", align 8
+  %tmp59 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_328", align 8
+  %tmp60 = tail call ptr @objc_msgSend(ptr %arg, ptr %tmp59)
+  %tmp62 = load ptr, ptr @"\01l_objc_msgSend_fixup_objectAtIndex_", align 16
+  %tmp64 = tail call ptr %tmp62(ptr %tmp60, ptr @"\01l_objc_msgSend_fixup_objectAtIndex_", i64 0)
+  %tmp65 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_398", align 8
+  %tmp66 = tail call ptr @objc_msgSend(ptr %tmp64, ptr %tmp65)
+  %tmp68 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_400", align 8
+  %tmp70 = tail call ptr @objc_msgSend(ptr %tmp58, ptr %tmp68, ptr %tmp66, ptr %tmp47)
   ; hack to prevent the optimize from using objc_retainAutoreleasedReturnValue.
-  %tmp71x = getelementptr i8, i8* %tmp71, i64 1
-  %tmp72 = tail call i8* @llvm.objc.retain(i8* %tmp71x) nounwind
-  %tmp73 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_402", align 8
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8)*)(i8* %tmp72, i8* %tmp73, i8 signext 1)
-  %tmp74 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_404", align 8
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8)*)(i8* %tmp72, i8* %tmp74, i8 signext 1)
-  %tmp75 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_328", align 8
-  %tmp76 = tail call %22* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %22* (i8*, i8*)*)(i8* %tmp4, i8* %tmp75)
-  %tmp77 = bitcast %22* %tmp76 to i8*
-  %tmp78 = load i8*, i8** bitcast (%0* @"\01l_objc_msgSend_fixup_objectAtIndex_" to i8**), align 16
-  %tmp79 = bitcast i8* %tmp78 to i8* (i8*, %1*, i64)*
-  %tmp80 = tail call i8* %tmp79(i8* %tmp77, %1* bitcast (%0* @"\01l_objc_msgSend_fixup_objectAtIndex_" to %1*), i64 0)
-  %tmp81 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_406", align 8
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i64)*)(i8* %tmp80, i8* %tmp81, i64 9223372036854775807)
-  %tmp82 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_408", align 8
-  %tmp83 = tail call %24* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %24* (i8*, i8*)*)(i8* %tmp72, i8* %tmp82)
-  %tmp84 = bitcast %24* %tmp83 to i8*
-  %tmp85 = tail call i8* @llvm.objc.retain(i8* %tmp84) nounwind
-  %tmp86 = load %2*, %2** @"\01L_OBJC_CLASSLIST_REFERENCES_$_409", align 8
-  %tmp87 = bitcast %2* %tmp86 to i8*
-  %tmp88 = load i8*, i8** bitcast (%0* @"\01l_objc_msgSend_fixup_alloc" to i8**), align 16
-  %tmp89 = bitcast i8* %tmp88 to i8* (i8*, %1*)*
-  %tmp90 = tail call i8* %tmp89(i8* %tmp87, %1* bitcast (%0* @"\01l_objc_msgSend_fixup_alloc" to %1*))
-  %tmp91 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_8", align 8
-  %tmp92 = tail call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp90, i8* %tmp91)
-  %tmp93 = tail call i8* @llvm.objc.explicit_autorelease(i8* %tmp92) nounwind
-  %tmp94 = bitcast i8* %tmp93 to %25*
-  %tmp95 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_411", align 8
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %25*)*)(i8* %tmp85, i8* %tmp95, %25* %tmp94)
-  tail call void @llvm.objc.release(i8* %tmp93) nounwind
-  %tmp96 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_148", align 8
-  %tmp97 = tail call signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*)*)(i8* %tmp4, i8* %tmp96)
+  %tmp71x = getelementptr i8, ptr %tmp70, i64 1
+  %tmp72 = tail call ptr @llvm.objc.retain(ptr %tmp71x) nounwind
+  %tmp73 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_402", align 8
+  tail call void @objc_msgSend(ptr %tmp72, ptr %tmp73, i8 signext 1)
+  %tmp74 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_404", align 8
+  tail call void @objc_msgSend(ptr %tmp72, ptr %tmp74, i8 signext 1)
+  %tmp75 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_328", align 8
+  %tmp76 = tail call ptr @objc_msgSend(ptr %arg, ptr %tmp75)
+  %tmp78 = load ptr, ptr @"\01l_objc_msgSend_fixup_objectAtIndex_", align 16
+  %tmp80 = tail call ptr %tmp78(ptr %tmp76, ptr @"\01l_objc_msgSend_fixup_objectAtIndex_", i64 0)
+  %tmp81 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_406", align 8
+  tail call void @objc_msgSend(ptr %tmp80, ptr %tmp81, i64 9223372036854775807)
+  %tmp82 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_408", align 8
+  %tmp83 = tail call ptr @objc_msgSend(ptr %tmp72, ptr %tmp82)
+  %tmp85 = tail call ptr @llvm.objc.retain(ptr %tmp83) nounwind
+  %tmp86 = load ptr, ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_409", align 8
+  %tmp88 = load ptr, ptr @"\01l_objc_msgSend_fixup_alloc", align 16
+  %tmp90 = tail call ptr %tmp88(ptr %tmp86, ptr @"\01l_objc_msgSend_fixup_alloc")
+  %tmp91 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_8", align 8
+  %tmp92 = tail call ptr @objc_msgSend(ptr %tmp90, ptr %tmp91)
+  %tmp93 = tail call ptr @llvm.objc.explicit_autorelease(ptr %tmp92) nounwind
+  %tmp95 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_411", align 8
+  tail call void @objc_msgSend(ptr %tmp85, ptr %tmp95, ptr %tmp93)
+  tail call void @llvm.objc.release(ptr %tmp93) nounwind
+  %tmp96 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_148", align 8
+  %tmp97 = tail call signext i8 @objc_msgSend(ptr %arg, ptr %tmp96)
   %tmp98 = icmp eq i8 %tmp97, 0
   br i1 %tmp98, label %bb99, label %bb104
 
 bb99:                                             ; preds = %bb57
-  %tmp100 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_413", align 8
-  %tmp101 = tail call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*)*)(i8* %tmp85, i8* %tmp100)
+  %tmp100 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_413", align 8
+  %tmp101 = tail call i64 @objc_msgSend(ptr %tmp85, ptr %tmp100)
   %tmp102 = or i64 %tmp101, 12
-  %tmp103 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_415", align 8
-  tail call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i64)*)(i8* %tmp85, i8* %tmp103, i64 %tmp102)
+  %tmp103 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_415", align 8
+  tail call void @objc_msgSend(ptr %tmp85, ptr %tmp103, i64 %tmp102)
   br label %bb104
 
 bb104:                                            ; preds = %bb99, %bb57
-  %tmp105 = call i8* @llvm.objc.autorelease(i8* %tmp72) nounwind
-  %tmp106 = bitcast i8* %tmp105 to %14*
-  tail call void @llvm.objc.release(i8* %tmp85) nounwind
-  %tmp107 = bitcast %18* %tmp47 to i8*
-  tail call void @llvm.objc.release(i8* %tmp107) nounwind
-  ret %14* %tmp106
+  %tmp105 = call ptr @llvm.objc.autorelease(ptr %tmp72) nounwind
+  tail call void @llvm.objc.release(ptr %tmp85) nounwind
+  tail call void @llvm.objc.release(ptr %tmp47) nounwind
+  ret ptr %tmp105
 }
 
 ; CHECK: attributes [[NUW]] = { nounwind }

diff  --git a/llvm/test/Transforms/ObjCARC/move-and-merge-autorelease.ll b/llvm/test/Transforms/ObjCARC/move-and-merge-autorelease.ll
index a8ec6a0bdf1c..757fbf53fc41 100644
--- a/llvm/test/Transforms/ObjCARC/move-and-merge-autorelease.ll
+++ b/llvm/test/Transforms/ObjCARC/move-and-merge-autorelease.ll
@@ -4,7 +4,7 @@
 ; and fold it with the release in bb65.
 
 ; CHECK: bb65:
-; CHECK: call i8* @llvm.objc.retainAutorelease
+; CHECK: call ptr @llvm.objc.retainAutorelease
 ; CHECK: br label %bb76
 
 target 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"
@@ -17,92 +17,77 @@ target triple = "x86_64-apple-darwin11.0.0"
 %4 = type opaque
 %5 = type opaque
 
-@"\01L_OBJC_SELECTOR_REFERENCES_11" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_421455" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_598" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_620" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_622" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_624" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
-@"\01L_OBJC_SELECTOR_REFERENCES_626" = external hidden global i8*, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_11" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_421455" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_598" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_620" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_622" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_624" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+@"\01L_OBJC_SELECTOR_REFERENCES_626" = external hidden global ptr, section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
 
-declare i8* @objc_msgSend(i8*, i8*, ...)
+declare ptr @objc_msgSend(ptr, ptr, ...)
 
-declare i8* @llvm.objc.retain(i8*)
+declare ptr @llvm.objc.retain(ptr)
 
-declare void @llvm.objc.release(i8*)
+declare void @llvm.objc.release(ptr)
 
-declare i8* @llvm.objc.autorelease(i8*)
+declare ptr @llvm.objc.autorelease(ptr)
 
-define hidden %0* @foo(%1* %arg, %3* %arg3) {
+define hidden ptr @foo(ptr %arg, ptr %arg3) {
 bb:
-  %tmp16 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_620", align 8
-  %tmp17 = bitcast %3* %arg3 to i8*
-  %tmp18 = call %4* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %4* (i8*, i8*)*)(i8* %tmp17, i8* %tmp16)
-  %tmp19 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_622", align 8
-  %tmp20 = bitcast %4* %tmp18 to i8*
-  %tmp21 = call %5* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %5* (i8*, i8*)*)(i8* %tmp20, i8* %tmp19)
-  %tmp22 = bitcast %5* %tmp21 to i8*
-  %tmp23 = call i8* @llvm.objc.retain(i8* %tmp22) nounwind
-  %tmp24 = bitcast i8* %tmp23 to %5*
-  %tmp26 = icmp eq i8* %tmp23, null
+  %tmp16 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_620", align 8
+  %tmp18 = call ptr @objc_msgSend(ptr %arg3, ptr %tmp16)
+  %tmp19 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_622", align 8
+  %tmp21 = call ptr @objc_msgSend(ptr %tmp18, ptr %tmp19)
+  %tmp23 = call ptr @llvm.objc.retain(ptr %tmp21) nounwind
+  %tmp26 = icmp eq ptr %tmp23, null
   br i1 %tmp26, label %bb81, label %bb27
 
 bb27:                                             ; preds = %bb
-  %tmp29 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_11", align 8
-  %tmp30 = bitcast %1* %arg to i8*
-  %tmp31 = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %tmp30, i8* %tmp29)
-  %tmp34 = call i8* @llvm.objc.retain(i8* %tmp31) nounwind
-  %tmp37 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_421455", align 8
-  %tmp39 = call %0* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %0* (i8*, i8*)*)(i8* %tmp34, i8* %tmp37)
-  %tmp40 = bitcast %0* %tmp39 to i8*
-  %tmp41 = call i8* @llvm.objc.retain(i8* %tmp40) nounwind
-  %tmp42 = bitcast i8* %tmp41 to %0*
-  %tmp44 = icmp eq i8* %tmp41, null
+  %tmp29 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_11", align 8
+  %tmp31 = call ptr @objc_msgSend(ptr %arg, ptr %tmp29)
+  %tmp34 = call ptr @llvm.objc.retain(ptr %tmp31) nounwind
+  %tmp37 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_421455", align 8
+  %tmp39 = call ptr @objc_msgSend(ptr %tmp34, ptr %tmp37)
+  %tmp41 = call ptr @llvm.objc.retain(ptr %tmp39) nounwind
+  %tmp44 = icmp eq ptr %tmp41, null
   br i1 %tmp44, label %bb45, label %bb55
 
 bb45:                                             ; preds = %bb27
-  %tmp47 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_624", align 8
-  %tmp49 = call %0* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %0* (i8*, i8*)*)(i8* %tmp34, i8* %tmp47)
-  %tmp51 = bitcast %0* %tmp49 to i8*
-  %tmp52 = call i8* @llvm.objc.retain(i8* %tmp51) nounwind
-  call void @llvm.objc.release(i8* %tmp41) nounwind
+  %tmp47 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_624", align 8
+  %tmp49 = call ptr @objc_msgSend(ptr %tmp34, ptr %tmp47)
+  %tmp52 = call ptr @llvm.objc.retain(ptr %tmp49) nounwind
+  call void @llvm.objc.release(ptr %tmp41) nounwind
   br label %bb55
 
 bb55:                                             ; preds = %bb27, %bb45
-  %tmp13.0 = phi %0* [ %tmp42, %bb27 ], [ %tmp49, %bb45 ]
-  %tmp57 = icmp eq %0* %tmp13.0, null
+  %tmp13.0 = phi ptr [ %tmp41, %bb27 ], [ %tmp49, %bb45 ]
+  %tmp57 = icmp eq ptr %tmp13.0, null
   br i1 %tmp57, label %bb76, label %bb58
 
 bb58:                                             ; preds = %bb55
-  %tmp60 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_598", align 8
-  %tmp61 = bitcast %0* %tmp13.0 to i8*
-  %tmp62 = call signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*)*)(i8* %tmp61, i8* %tmp60)
+  %tmp60 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_598", align 8
+  %tmp62 = call signext i8 @objc_msgSend(ptr %tmp13.0, ptr %tmp60)
   %tmp64 = icmp eq i8 %tmp62, 0
   br i1 %tmp64, label %bb76, label %bb65
 
 bb65:                                             ; preds = %bb58
-  %tmp68 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_626", align 8
-  %tmp69 = bitcast %0* %tmp13.0 to i8*
-  %tmp70 = call %0* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %0* (i8*, i8*, %5*)*)(i8* %tmp69, i8* %tmp68, %5* %tmp24)
-  %tmp72 = bitcast %0* %tmp70 to i8*
-  %tmp73 = call i8* @llvm.objc.retain(i8* %tmp72) nounwind
+  %tmp68 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_626", align 8
+  %tmp70 = call ptr @objc_msgSend(ptr %tmp13.0, ptr %tmp68, ptr %tmp23)
+  %tmp73 = call ptr @llvm.objc.retain(ptr %tmp70) nounwind
   br label %bb76
 
 bb76:                                             ; preds = %bb58, %bb55, %bb65
-  %tmp10.0 = phi %0* [ %tmp70, %bb65 ], [ null, %bb58 ], [ null, %bb55 ]
-  %tmp78 = bitcast %0* %tmp13.0 to i8*
-  call void @llvm.objc.release(i8* %tmp78) nounwind
-  call void @llvm.objc.release(i8* %tmp34) nounwind
+  %tmp10.0 = phi ptr [ %tmp70, %bb65 ], [ null, %bb58 ], [ null, %bb55 ]
+  call void @llvm.objc.release(ptr %tmp13.0) nounwind
+  call void @llvm.objc.release(ptr %tmp34) nounwind
   br label %bb81
 
 bb81:                                             ; preds = %bb, %bb76
-  %tmp10.1 = phi %0* [ %tmp10.0, %bb76 ], [ null, %bb ]
-  %tmp83 = bitcast %0* %tmp10.1 to i8*
-  %tmp84 = call i8* @llvm.objc.retain(i8* %tmp83) nounwind
-  call void @llvm.objc.release(i8* %tmp23) nounwind
-  %tmp87 = call i8* @llvm.objc.autorelease(i8* %tmp84) nounwind
-  %tmp88 = bitcast i8* %tmp87 to %0*
-  %tmp92 = bitcast %0* %tmp10.1 to i8*
-  call void @llvm.objc.release(i8* %tmp92) nounwind
-  ret %0* %tmp88
+  %tmp10.1 = phi ptr [ %tmp10.0, %bb76 ], [ null, %bb ]
+  %tmp84 = call ptr @llvm.objc.retain(ptr %tmp10.1) nounwind
+  call void @llvm.objc.release(ptr %tmp23) nounwind
+  %tmp87 = call ptr @llvm.objc.autorelease(ptr %tmp84) nounwind
+  call void @llvm.objc.release(ptr %tmp10.1) nounwind
+  ret ptr %tmp87
 }

diff  --git a/llvm/test/Transforms/ObjCARC/nested.ll b/llvm/test/Transforms/ObjCARC/nested.ll
index cc947717de46..d03cbd5f54e7 100644
--- a/llvm/test/Transforms/ObjCARC/nested.ll
+++ b/llvm/test/Transforms/ObjCARC/nested.ll
@@ -1,52 +1,51 @@
 ; RUN: opt -passes=objc-arc -S < %s | FileCheck %s
 
-%struct.__objcFastEnumerationState = type { i64, i8**, i64*, [5 x i64] }
+%struct.__objcFastEnumerationState = type { i64, ptr, ptr, [5 x i64] }
 
 @"\01L_OBJC_METH_VAR_NAME_" = internal global [43 x i8] c"countByEnumeratingWithState:objects:count:\00", section "__TEXT,__objc_methname,cstring_literals", align 1
-@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global i8* getelementptr inbounds ([43 x i8], [43 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i64 0, i64 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
- at g = common global i8* null, align 8
+@"\01L_OBJC_SELECTOR_REFERENCES_" = internal global ptr @"\01L_OBJC_METH_VAR_NAME_", section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
+ at g = common global ptr null, align 8
 @"\01L_OBJC_IMAGE_INFO" = internal constant [2 x i32] [i32 0, i32 16], section "__DATA, __objc_imageinfo, regular, no_dead_strip"
 
 declare void @callee()
-declare i8* @returner()
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.retain(i8*)
-declare void @llvm.objc.enumerationMutation(i8*)
-declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
-declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind
-declare void @use(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @def()
-declare void @__crasher_block_invoke(i8* nocapture)
-declare i8* @llvm.objc.retainBlock(i8*)
-declare void @__crasher_block_invoke1(i8* nocapture)
+declare ptr @returner()
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.retain(ptr)
+declare void @llvm.objc.enumerationMutation(ptr)
+declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind
+declare ptr @objc_msgSend(ptr, ptr, ...) nonlazybind
+declare void @use(ptr)
+declare void @llvm.objc.release(ptr)
+declare ptr @def()
+declare void @__crasher_block_invoke(ptr nocapture)
+declare ptr @llvm.objc.retainBlock(ptr)
+declare void @__crasher_block_invoke1(ptr nocapture)
 
 !0 = !{}
 
 ; Delete a nested retain+release pair.
 
 ; CHECK-LABEL: define void @test0(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK-NOT: @llvm.objc.retain
 ; CHECK: }
-define void @test0(i8* %a) nounwind {
+define void @test0(ptr %a) nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %0 = call i8* @llvm.objc.retain(i8* %a) nounwind
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %0 = call ptr @llvm.objc.retain(ptr %a) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call = call i64 @objc_msgSend(ptr %1, ptr %tmp2, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
-  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 1
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -57,61 +56,60 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.notmutated ]
-  %mutationsptr3 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr3, align 8
+  %mutationsptr3 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr3, align 8
   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %1)
+  call void @llvm.objc.enumerationMutation(ptr %1)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
-  %stateitems = load i8**, i8*** %stateitems.ptr, align 8
-  %currentitem.ptr = getelementptr i8*, i8** %stateitems, i64 %forcoll.index
-  %3 = load i8*, i8** %currentitem.ptr, align 8
-  call void @use(i8* %3)
+  %stateitems = load ptr, ptr %stateitems.ptr, align 8
+  %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+  %3 = load ptr, ptr %currentitem.ptr, align 8
+  call void @use(ptr %3)
   %4 = add i64 %forcoll.index, 1
   %exitcond = icmp eq i64 %4, %umax
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp5 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call6 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp5, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp5 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call6 = call i64 @objc_msgSend(ptr %1, ptr %tmp5, ptr %state.ptr, ptr %items.ptr, i64 16)
   %5 = icmp eq i64 %call6, 0
   br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %1) nounwind
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %1) nounwind
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Delete a nested retain+release pair.
 
 ; CHECK-LABEL: define void @test2(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
 ; CHECK-NOT: @llvm.objc.retain
 ; CHECK: }
 define void @test2() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call3 = call i64 @objc_msgSend(ptr %1, ptr %tmp2, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call3, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
-  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 1
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -122,61 +120,60 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.notmutated ]
-  %mutationsptr4 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr4, align 8
+  %mutationsptr4 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr4, align 8
   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %1)
+  call void @llvm.objc.enumerationMutation(ptr %1)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
-  %stateitems = load i8**, i8*** %stateitems.ptr, align 8
-  %currentitem.ptr = getelementptr i8*, i8** %stateitems, i64 %forcoll.index
-  %3 = load i8*, i8** %currentitem.ptr, align 8
-  call void @use(i8* %3)
+  %stateitems = load ptr, ptr %stateitems.ptr, align 8
+  %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+  %3 = load ptr, ptr %currentitem.ptr, align 8
+  call void @use(ptr %3)
   %4 = add i64 %forcoll.index, 1
   %exitcond = icmp eq i64 %4, %umax
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %1, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %5 = icmp eq i64 %call7, 0
   br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %1) nounwind
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %1) nounwind
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Delete a nested retain+release pair.
 
 ; CHECK-LABEL: define void @test4(
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK-NOT: @llvm.objc.retain
 ; CHECK: }
 define void @test4() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %tmp = load i8*, i8** @g, align 8
-  %0 = call i8* @llvm.objc.retain(i8* %tmp) nounwind
-  %tmp2 = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp2, i8 0, i64 64, i1 false)
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp4 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp4, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %tmp = load ptr, ptr @g, align 8
+  %0 = call ptr @llvm.objc.retain(ptr %tmp) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp4 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call = call i64 @objc_msgSend(ptr %1, ptr %tmp4, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
-  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 1
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -187,61 +184,60 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.notmutated ]
-  %mutationsptr5 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr5, align 8
+  %mutationsptr5 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr5, align 8
   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %1)
+  call void @llvm.objc.enumerationMutation(ptr %1)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
-  %stateitems = load i8**, i8*** %stateitems.ptr, align 8
-  %currentitem.ptr = getelementptr i8*, i8** %stateitems, i64 %forcoll.index
-  %3 = load i8*, i8** %currentitem.ptr, align 8
-  call void @use(i8* %3)
+  %stateitems = load ptr, ptr %stateitems.ptr, align 8
+  %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+  %3 = load ptr, ptr %currentitem.ptr, align 8
+  call void @use(ptr %3)
   %4 = add i64 %forcoll.index, 1
   %exitcond = icmp eq i64 %4, %umax
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp7 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call8 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp7, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp7 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call8 = call i64 @objc_msgSend(ptr %1, ptr %tmp7, ptr %state.ptr, ptr %items.ptr, i64 16)
   %5 = icmp eq i64 %call8, 0
   br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %1) nounwind
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %1) nounwind
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Delete a nested retain+release pair.
 
 ; CHECK-LABEL: define void @test5(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
 ; CHECK-NOT: @llvm.objc.retain
 ; CHECK: }
 define void @test5() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call3 = call i64 @objc_msgSend(ptr %1, ptr %tmp2, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call3, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
-  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 1
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -252,33 +248,33 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.notmutated ]
-  %mutationsptr4 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr4, align 8
+  %mutationsptr4 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr4, align 8
   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %1)
+  call void @llvm.objc.enumerationMutation(ptr %1)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
-  %stateitems = load i8**, i8*** %stateitems.ptr, align 8
-  %currentitem.ptr = getelementptr i8*, i8** %stateitems, i64 %forcoll.index
-  %3 = load i8*, i8** %currentitem.ptr, align 8
-  call void @use(i8* %3)
+  %stateitems = load ptr, ptr %stateitems.ptr, align 8
+  %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+  %3 = load ptr, ptr %currentitem.ptr, align 8
+  call void @use(ptr %3)
   %4 = add i64 %forcoll.index, 1
   %exitcond = icmp eq i64 %4, %umax
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %1, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %5 = icmp eq i64 %call7, 0
   br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %1) nounwind
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %1) nounwind
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -286,28 +282,27 @@ forcoll.empty:
 ; use.
 ;
 ; CHECK-LABEL: define void @test6(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
 ; CHECK-NOT: @llvm.objc.retain
 ; CHECK: }
 define void @test6() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call3 = call i64 @objc_msgSend(ptr %1, ptr %tmp2, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call3, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
-  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 1
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -318,34 +313,34 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.notmutated ]
-  %mutationsptr4 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr4, align 8
+  %mutationsptr4 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr4, align 8
   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %1)
+  call void @llvm.objc.enumerationMutation(ptr %1)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
-  %stateitems = load i8**, i8*** %stateitems.ptr, align 8
-  %currentitem.ptr = getelementptr i8*, i8** %stateitems, i64 %forcoll.index
-  %3 = load i8*, i8** %currentitem.ptr, align 8
-  call void @use(i8* %3)
+  %stateitems = load ptr, ptr %stateitems.ptr, align 8
+  %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+  %3 = load ptr, ptr %currentitem.ptr, align 8
+  call void @use(ptr %3)
   %4 = add i64 %forcoll.index, 1
   %exitcond = icmp eq i64 %4, %umax
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %1, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %5 = icmp eq i64 %call7, 0
   br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %1) nounwind
+  call void @llvm.objc.release(ptr %1) nounwind
   call void @callee()
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -354,29 +349,28 @@ forcoll.empty:
 ; reasnoning about nesting.
 
 ; CHECK-LABEL: define void @test7(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
 ; CHECK: @llvm.objc.retain
 ; CHECK: }
 define void @test7() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
   call void @callee()
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call3 = call i64 @objc_msgSend(ptr %1, ptr %tmp2, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call3, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
-  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 1
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -387,62 +381,61 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.notmutated ]
-  %mutationsptr4 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr4, align 8
+  %mutationsptr4 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr4, align 8
   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %1)
+  call void @llvm.objc.enumerationMutation(ptr %1)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
-  %stateitems = load i8**, i8*** %stateitems.ptr, align 8
-  %currentitem.ptr = getelementptr i8*, i8** %stateitems, i64 %forcoll.index
-  %3 = load i8*, i8** %currentitem.ptr, align 8
-  call void @use(i8* %3)
+  %stateitems = load ptr, ptr %stateitems.ptr, align 8
+  %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+  %3 = load ptr, ptr %currentitem.ptr, align 8
+  call void @use(ptr %3)
   %4 = add i64 %forcoll.index, 1
   %exitcond = icmp eq i64 %4, %umax
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %1, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %5 = icmp eq i64 %call7, 0
   br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %1) nounwind
+  call void @llvm.objc.release(ptr %1) nounwind
   call void @callee()
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Delete a nested retain+release pair.
 
 ; CHECK-LABEL: define void @test8(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
 ; CHECK-NOT: @llvm.objc.retain
 ; CHECK: }
 define void @test8() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %1 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call3 = call i64 @objc_msgSend(ptr %1, ptr %tmp2, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call3, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
-  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 1
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
+  %stateitems.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 1
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -453,20 +446,20 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ 0, %forcoll.loopbody.outer ], [ %4, %forcoll.next ]
-  %mutationsptr4 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr4, align 8
+  %mutationsptr4 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr4, align 8
   %2 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %2, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %1)
+  call void @llvm.objc.enumerationMutation(ptr %1)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
-  %stateitems = load i8**, i8*** %stateitems.ptr, align 8
-  %currentitem.ptr = getelementptr i8*, i8** %stateitems, i64 %forcoll.index
-  %3 = load i8*, i8** %currentitem.ptr, align 8
-  %tobool = icmp eq i8* %3, null
+  %stateitems = load ptr, ptr %stateitems.ptr, align 8
+  %currentitem.ptr = getelementptr ptr, ptr %stateitems, i64 %forcoll.index
+  %3 = load ptr, ptr %currentitem.ptr, align 8
+  %tobool = icmp eq ptr %3, null
   br i1 %tobool, label %forcoll.next, label %if.then
 
 if.then:
@@ -479,14 +472,14 @@ forcoll.next:
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %1, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %5 = icmp eq i64 %call7, 0
   br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %1) nounwind
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %1) nounwind
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -495,30 +488,29 @@ forcoll.empty:
 ; See test9b for the same testcase without a split backedge.
 
 ; CHECK-LABEL: define void @test9(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: }
 define void @test9() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %call1 = call i8* @returner()
-  %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %2 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  %call1 = call ptr @returner()
+  %1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call1) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %2 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp3 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call4 = call i64 @objc_msgSend(ptr %2, ptr %tmp3, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call4, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -529,13 +521,13 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ %phitmp, %forcoll.notmutated.forcoll.loopbody_crit_edge ], [ 1, %forcoll.loopbody.outer ]
-  %mutationsptr5 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr5, align 8
+  %mutationsptr5 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr5, align 8
   %3 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %3, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %2)
+  call void @llvm.objc.enumerationMutation(ptr %2)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
@@ -547,45 +539,44 @@ forcoll.notmutated.forcoll.loopbody_crit_edge:
   br label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %2, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %4 = icmp eq i64 %call7, 0
   br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %2) nounwind
-  call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %2) nounwind
+  call void @llvm.objc.release(ptr %1) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Like test9, but without a split backedge. TODO: optimize this.
 
 ; CHECK-LABEL: define void @test9b(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
 ; CHECK: @llvm.objc.retain
 ; CHECK: }
 define void @test9b() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %call1 = call i8* @returner()
-  %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %2 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  %call1 = call ptr @returner()
+  %1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call1) nounwind
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %2 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp3 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call4 = call i64 @objc_msgSend(ptr %2, ptr %tmp3, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call4, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -596,13 +587,13 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ %phitmp, %forcoll.notmutated ], [ 0, %forcoll.loopbody.outer ]
-  %mutationsptr5 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr5, align 8
+  %mutationsptr5 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr5, align 8
   %3 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %3, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %2)
+  call void @llvm.objc.enumerationMutation(ptr %2)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
@@ -611,15 +602,15 @@ forcoll.notmutated:
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %2, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %4 = icmp eq i64 %call7, 0
   br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %2) nounwind
-  call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %2) nounwind
+  call void @llvm.objc.release(ptr %1) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -628,31 +619,30 @@ forcoll.empty:
 ; See test10b for the same testcase without a split backedge.
 
 ; CHECK-LABEL: define void @test10(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retain
 ; CHECK: }
 define void @test10() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %call1 = call i8* @returner()
-  %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  %call1 = call ptr @returner()
+  %1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call1) nounwind
   call void @callee()
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %2 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %2 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp3 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call4 = call i64 @objc_msgSend(ptr %2, ptr %tmp3, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call4, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -663,13 +653,13 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ %phitmp, %forcoll.notmutated.forcoll.loopbody_crit_edge ], [ 1, %forcoll.loopbody.outer ]
-  %mutationsptr5 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr5, align 8
+  %mutationsptr5 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr5, align 8
   %3 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %3, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %2)
+  call void @llvm.objc.enumerationMutation(ptr %2)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
@@ -681,46 +671,45 @@ forcoll.notmutated.forcoll.loopbody_crit_edge:
   br label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %2, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %4 = icmp eq i64 %call7, 0
   br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %2) nounwind
-  call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %2) nounwind
+  call void @llvm.objc.release(ptr %1) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Like test10, but without a split backedge. TODO: optimize this.
 
 ; CHECK-LABEL: define void @test10b(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue
 ; CHECK: @llvm.objc.retain
 ; CHECK: }
 define void @test10b() nounwind {
 entry:
   %state.ptr = alloca %struct.__objcFastEnumerationState, align 8
-  %items.ptr = alloca [16 x i8*], align 8
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %call1 = call i8* @returner()
-  %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind
+  %items.ptr = alloca [16 x ptr], align 8
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  %call1 = call ptr @returner()
+  %1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call1) nounwind
   call void @callee()
-  %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8*
-  call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false)
-  %2 = call i8* @llvm.objc.retain(i8* %0) nounwind
-  %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  call void @llvm.memset.p0.i64(ptr align 8 %state.ptr, i8 0, i64 64, i1 false)
+  %2 = call ptr @llvm.objc.retain(ptr %0) nounwind
+  %tmp3 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call4 = call i64 @objc_msgSend(ptr %2, ptr %tmp3, ptr %state.ptr, ptr %items.ptr, i64 16)
   %iszero = icmp eq i64 %call4, 0
   br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit
 
 forcoll.loopinit:
-  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, %struct.__objcFastEnumerationState* %state.ptr, i64 0, i32 2
-  %mutationsptr = load i64*, i64** %mutationsptr.ptr, align 8
-  %forcoll.initial-mutations = load i64, i64* %mutationsptr, align 8
+  %mutationsptr.ptr = getelementptr inbounds %struct.__objcFastEnumerationState, ptr %state.ptr, i64 0, i32 2
+  %mutationsptr = load ptr, ptr %mutationsptr.ptr, align 8
+  %forcoll.initial-mutations = load i64, ptr %mutationsptr, align 8
   br label %forcoll.loopbody.outer
 
 forcoll.loopbody.outer:
@@ -731,13 +720,13 @@ forcoll.loopbody.outer:
 
 forcoll.loopbody:
   %forcoll.index = phi i64 [ %phitmp, %forcoll.notmutated ], [ 0, %forcoll.loopbody.outer ]
-  %mutationsptr5 = load i64*, i64** %mutationsptr.ptr, align 8
-  %statemutations = load i64, i64* %mutationsptr5, align 8
+  %mutationsptr5 = load ptr, ptr %mutationsptr.ptr, align 8
+  %statemutations = load i64, ptr %mutationsptr5, align 8
   %3 = icmp eq i64 %statemutations, %forcoll.initial-mutations
   br i1 %3, label %forcoll.notmutated, label %forcoll.mutated
 
 forcoll.mutated:
-  call void @llvm.objc.enumerationMutation(i8* %2)
+  call void @llvm.objc.enumerationMutation(ptr %2)
   br label %forcoll.notmutated
 
 forcoll.notmutated:
@@ -746,15 +735,15 @@ forcoll.notmutated:
   br i1 %exitcond, label %forcoll.refetch, label %forcoll.loopbody
 
 forcoll.refetch:
-  %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
-  %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16)
+  %tmp6 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", align 8
+  %call7 = call i64 @objc_msgSend(ptr %2, ptr %tmp6, ptr %state.ptr, ptr %items.ptr, i64 16)
   %4 = icmp eq i64 %call7, 0
   br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer
 
 forcoll.empty:
-  call void @llvm.objc.release(i8* %2) nounwind
-  call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %2) nounwind
+  call void @llvm.objc.release(ptr %1) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
@@ -763,59 +752,57 @@ forcoll.empty:
 
 %struct.__block_d = type { i64, i64 }
 
- at _NSConcreteStackBlock = external global i8*
- at __block_d_tmp = external hidden constant { i64, i64, i8*, i8*, i8*, i8* }
- at __block_d_tmp5 = external hidden constant { i64, i64, i8*, i8*, i8*, i8* }
+ at _NSConcreteStackBlock = external global ptr
+ at __block_d_tmp = external hidden constant { i64, i64, ptr, ptr, ptr, ptr }
+ at __block_d_tmp5 = external hidden constant { i64, i64, ptr, ptr, ptr, ptr }
 
 ; CHECK-LABEL: define void @test11(
-; CHECK: tail call i8* @llvm.objc.retain(i8* %call) [[NUW:#[0-9]+]]
-; CHECK: tail call i8* @llvm.objc.retain(i8* %call) [[NUW]]
-; CHECK: call void @llvm.objc.release(i8* %call) [[NUW]], !clang.imprecise_release !0
+; CHECK: tail call ptr @llvm.objc.retain(ptr %call) [[NUW:#[0-9]+]]
+; CHECK: tail call ptr @llvm.objc.retain(ptr %call) [[NUW]]
+; CHECK: call void @llvm.objc.release(ptr %call) [[NUW]], !clang.imprecise_release !0
 ; CHECK: }
 define void @test11() {
 entry:
-  %block = alloca <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, align 8
-  %block9 = alloca <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, align 8
-  %call = call i8* @def(), !clang.arc.no_objc_arc_exceptions !0
-  %foo = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block, i64 0, i32 5
-  %block.isa = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block, i64 0, i32 0
-  store i8* bitcast (i8** @_NSConcreteStackBlock to i8*), i8** %block.isa, align 8
-  %block.flags = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block, i64 0, i32 1
-  store i32 1107296256, i32* %block.flags, align 8
-  %block.reserved = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block, i64 0, i32 2
-  store i32 0, i32* %block.reserved, align 4
-  %block.invoke = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block, i64 0, i32 3
-  store i8* bitcast (void (i8*)* @__crasher_block_invoke to i8*), i8** %block.invoke, align 8
-  %block.d = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block, i64 0, i32 4
-  store %struct.__block_d* bitcast ({ i64, i64, i8*, i8*, i8*, i8* }* @__block_d_tmp to %struct.__block_d*), %struct.__block_d** %block.d, align 8
-  %foo2 = tail call i8* @llvm.objc.retain(i8* %call) nounwind
-  store i8* %foo2, i8** %foo, align 8
-  %foo4 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block to i8*
-  %foo5 = call i8* @llvm.objc.retainBlock(i8* %foo4) nounwind
-  call void @use(i8* %foo5), !clang.arc.no_objc_arc_exceptions !0
-  call void @llvm.objc.release(i8* %foo5) nounwind
-  %strongdestroy = load i8*, i8** %foo, align 8
-  call void @llvm.objc.release(i8* %strongdestroy) nounwind, !clang.imprecise_release !0
-  %foo10 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 5
-  %block.isa11 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 0
-  store i8* bitcast (i8** @_NSConcreteStackBlock to i8*), i8** %block.isa11, align 8
-  %block.flags12 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 1
-  store i32 1107296256, i32* %block.flags12, align 8
-  %block.reserved13 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 2
-  store i32 0, i32* %block.reserved13, align 4
-  %block.invoke14 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 3
-  store i8* bitcast (void (i8*)* @__crasher_block_invoke1 to i8*), i8** %block.invoke14, align 8
-  %block.d15 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 4
-  store %struct.__block_d* bitcast ({ i64, i64, i8*, i8*, i8*, i8* }* @__block_d_tmp5 to %struct.__block_d*), %struct.__block_d** %block.d15, align 8
-  %foo18 = call i8* @llvm.objc.retain(i8* %call) nounwind
-  store i8* %call, i8** %foo10, align 8
-  %foo20 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9 to i8*
-  %foo21 = call i8* @llvm.objc.retainBlock(i8* %foo20) nounwind
-  call void @use(i8* %foo21), !clang.arc.no_objc_arc_exceptions !0
-  call void @llvm.objc.release(i8* %foo21) nounwind
-  %strongdestroy25 = load i8*, i8** %foo10, align 8
-  call void @llvm.objc.release(i8* %strongdestroy25) nounwind, !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %call) nounwind, !clang.imprecise_release !0
+  %block = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>, align 8
+  %block9 = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>, align 8
+  %call = call ptr @def(), !clang.arc.no_objc_arc_exceptions !0
+  %foo = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 5
+  %block.isa = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 0
+  store ptr @_NSConcreteStackBlock, ptr %block.isa, align 8
+  %block.flags = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 1
+  store i32 1107296256, ptr %block.flags, align 8
+  %block.reserved = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 2
+  store i32 0, ptr %block.reserved, align 4
+  %block.invoke = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 3
+  store ptr @__crasher_block_invoke, ptr %block.invoke, align 8
+  %block.d = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block, i64 0, i32 4
+  store ptr @__block_d_tmp, ptr %block.d, align 8
+  %foo2 = tail call ptr @llvm.objc.retain(ptr %call) nounwind
+  store ptr %foo2, ptr %foo, align 8
+  %foo5 = call ptr @llvm.objc.retainBlock(ptr %block) nounwind
+  call void @use(ptr %foo5), !clang.arc.no_objc_arc_exceptions !0
+  call void @llvm.objc.release(ptr %foo5) nounwind
+  %strongdestroy = load ptr, ptr %foo, align 8
+  call void @llvm.objc.release(ptr %strongdestroy) nounwind, !clang.imprecise_release !0
+  %foo10 = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block9, i64 0, i32 5
+  %block.isa11 = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block9, i64 0, i32 0
+  store ptr @_NSConcreteStackBlock, ptr %block.isa11, align 8
+  %block.flags12 = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block9, i64 0, i32 1
+  store i32 1107296256, ptr %block.flags12, align 8
+  %block.reserved13 = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block9, i64 0, i32 2
+  store i32 0, ptr %block.reserved13, align 4
+  %block.invoke14 = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block9, i64 0, i32 3
+  store ptr @__crasher_block_invoke1, ptr %block.invoke14, align 8
+  %block.d15 = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr %block9, i64 0, i32 4
+  store ptr @__block_d_tmp5, ptr %block.d15, align 8
+  %foo18 = call ptr @llvm.objc.retain(ptr %call) nounwind
+  store ptr %call, ptr %foo10, align 8
+  %foo21 = call ptr @llvm.objc.retainBlock(ptr %block9) nounwind
+  call void @use(ptr %foo21), !clang.arc.no_objc_arc_exceptions !0
+  call void @llvm.objc.release(ptr %foo21) nounwind
+  %strongdestroy25 = load ptr, ptr %foo10, align 8
+  call void @llvm.objc.release(ptr %strongdestroy25) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %call) nounwind, !clang.imprecise_release !0
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/opt-catchswitch.ll b/llvm/test/Transforms/ObjCARC/opt-catchswitch.ll
index 015ecbbaf7f1..82c635e64343 100644
--- a/llvm/test/Transforms/ObjCARC/opt-catchswitch.ll
+++ b/llvm/test/Transforms/ObjCARC/opt-catchswitch.ll
@@ -4,62 +4,62 @@
 target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
 target triple = "i686--windows-msvc"
 
-declare i8* @f(i8*, i8*)
+declare ptr @f(ptr, ptr)
 
 declare i32 @__CxxFrameHandler3(...)
 
-declare dllimport i8* @llvm.objc.autoreleaseReturnValue(i8* returned)
-declare dllimport i8* @llvm.objc.retain(i8* returned)
-declare dllimport i8* @llvm.objc.retainAutoreleasedReturnValue(i8* returned)
-declare dllimport void @llvm.objc.release(i8*)
+declare dllimport ptr @llvm.objc.autoreleaseReturnValue(ptr returned)
+declare dllimport ptr @llvm.objc.retain(ptr returned)
+declare dllimport ptr @llvm.objc.retainAutoreleasedReturnValue(ptr returned)
+declare dllimport void @llvm.objc.release(ptr)
 
-define i8* @g(i8* %p, i8* %q) local_unnamed_addr personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+define ptr @g(ptr %p, ptr %q) local_unnamed_addr personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @g(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP0:%.*]] = tail call i8* @llvm.objc.retain(i8* [[P:%.*]]) #[[ATTR0:[0-9]+]]
-; CHECK-NEXT:    [[V1:%.*]] = call i8* @f(i8* null, i8* null)
-; CHECK-NEXT:    [[CALL:%.*]] = invoke i8* @f(i8* [[P]], i8* [[Q:%.*]])
+; CHECK-NEXT:    [[TMP0:%.*]] = tail call ptr @llvm.objc.retain(ptr [[P:%.*]]) #[[ATTR0:[0-9]+]]
+; CHECK-NEXT:    [[V1:%.*]] = call ptr @f(ptr null, ptr null)
+; CHECK-NEXT:    [[CALL:%.*]] = invoke ptr @f(ptr [[P]], ptr [[Q:%.*]])
 ; CHECK-NEXT:    to label [[INVOKE_CONT:%.*]] unwind label [[CATCH_DISPATCH:%.*]], !clang.arc.no_objc_arc_exceptions !0
 ; CHECK:       catch.dispatch:
 ; CHECK-NEXT:    [[TMP1:%.*]] = catchswitch within none [label %catch] unwind to caller
 ; CHECK:       catch:
-; CHECK-NEXT:    [[TMP2:%.*]] = catchpad within [[TMP1]] [i8* null, i32 64, i8* null]
+; CHECK-NEXT:    [[TMP2:%.*]] = catchpad within [[TMP1]] [ptr null, i32 64, ptr null]
 ; CHECK-NEXT:    catchret from [[TMP2]] to label [[CLEANUP:%.*]]
 ; CHECK:       invoke.cont:
-; CHECK-NEXT:    [[TMP3:%.*]] = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* [[CALL]]) #[[ATTR0]]
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr [[CALL]]) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[CLEANUP]]
 ; CHECK:       cleanup:
-; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i8* [ [[CALL]], [[INVOKE_CONT]] ], [ null, [[CATCH:%.*]] ]
-; CHECK-NEXT:    tail call void @llvm.objc.release(i8* [[P]]) #[[ATTR0]], !clang.imprecise_release !0
-; CHECK-NEXT:    [[TMP4:%.*]] = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* [[RETVAL_0]]) #[[ATTR0]]
-; CHECK-NEXT:    ret i8* [[RETVAL_0]]
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi ptr [ [[CALL]], [[INVOKE_CONT]] ], [ null, [[CATCH:%.*]] ]
+; CHECK-NEXT:    tail call void @llvm.objc.release(ptr [[P]]) #[[ATTR0]], !clang.imprecise_release !0
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr [[RETVAL_0]]) #[[ATTR0]]
+; CHECK-NEXT:    ret ptr [[RETVAL_0]]
 ;
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %p) #0
+  %0 = tail call ptr @llvm.objc.retain(ptr %p) #0
   ; the following call prevents ARC optimizer from removing the retain/release
   ; pair on %p
-  %v1 = call i8* @f(i8* null, i8* null)
-  %1 = tail call i8* @llvm.objc.retain(i8* %q) #0
-  %call = invoke i8* @f(i8* %p, i8* %q)
+  %v1 = call ptr @f(ptr null, ptr null)
+  %1 = tail call ptr @llvm.objc.retain(ptr %q) #0
+  %call = invoke ptr @f(ptr %p, ptr %q)
   to label %invoke.cont unwind label %catch.dispatch, !clang.arc.no_objc_arc_exceptions !0
 
 catch.dispatch:
   %2 = catchswitch within none [label %catch] unwind to caller
 
 catch:
-  %3 = catchpad within %2 [i8* null, i32 64, i8* null]
+  %3 = catchpad within %2 [ptr null, i32 64, ptr null]
   catchret from %3 to label %cleanup
 
 invoke.cont:
-  %4 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) #0
+  %4 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) #0
   br label %cleanup
 
 cleanup:
-  %retval.0 = phi i8* [ %call, %invoke.cont ], [ null, %catch ]
-  tail call void @llvm.objc.release(i8* %q) #0, !clang.imprecise_release !0
-  tail call void @llvm.objc.release(i8* %p) #0, !clang.imprecise_release !0
-  %5 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %retval.0) #0
-  ret i8* %retval.0
+  %retval.0 = phi ptr [ %call, %invoke.cont ], [ null, %catch ]
+  tail call void @llvm.objc.release(ptr %q) #0, !clang.imprecise_release !0
+  tail call void @llvm.objc.release(ptr %p) #0, !clang.imprecise_release !0
+  %5 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %retval.0) #0
+  ret ptr %retval.0
 }
 
 attributes #0 = { nounwind }

diff  --git a/llvm/test/Transforms/ObjCARC/opt-max-ptr-states.ll b/llvm/test/Transforms/ObjCARC/opt-max-ptr-states.ll
index 68733b23bd07..8a57a926021d 100644
--- a/llvm/test/Transforms/ObjCARC/opt-max-ptr-states.ll
+++ b/llvm/test/Transforms/ObjCARC/opt-max-ptr-states.ll
@@ -1,26 +1,26 @@
 ; RUN: opt -passes=objc-arc -S < %s | FileCheck -check-prefix=ENABLE -check-prefix=CHECK %s
 ; RUN: opt -passes=objc-arc -arc-opt-max-ptr-states=1 -S < %s | FileCheck -check-prefix=DISABLE -check-prefix=CHECK %s
 
- at g0 = common global i8* null, align 8
+ at g0 = common global ptr null, align 8
 
-; CHECK: call i8* @llvm.objc.retain
-; ENABLE-NOT: call i8* @llvm.objc.retain
-; DISABLE: call i8* @llvm.objc.retain
+; CHECK: call ptr @llvm.objc.retain
+; ENABLE-NOT: call ptr @llvm.objc.retain
+; DISABLE: call ptr @llvm.objc.retain
 ; CHECK: call void @llvm.objc.release
 ; ENABLE-NOT: call void @llvm.objc.release
 ; DISABLE: call void @llvm.objc.release
 
-define void @foo0(i8* %a) {
-  %1 = tail call i8* @llvm.objc.retain(i8* %a)
-  %2 = tail call i8* @llvm.objc.retain(i8* %a)
-  %3 = load i8*, i8** @g0, align 8
-  store i8* %a, i8** @g0, align 8
-  tail call void @llvm.objc.release(i8* %3)
-  tail call void @llvm.objc.release(i8* %a), !clang.imprecise_release !0
+define void @foo0(ptr %a) {
+  %1 = tail call ptr @llvm.objc.retain(ptr %a)
+  %2 = tail call ptr @llvm.objc.retain(ptr %a)
+  %3 = load ptr, ptr @g0, align 8
+  store ptr %a, ptr @g0, align 8
+  tail call void @llvm.objc.release(ptr %3)
+  tail call void @llvm.objc.release(ptr %a), !clang.imprecise_release !0
   ret void
 }
 
-declare i8* @llvm.objc.retain(i8*)
-declare void @llvm.objc.release(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare void @llvm.objc.release(ptr)
 
 !0 = !{}

diff  --git a/llvm/test/Transforms/ObjCARC/path-overflow.ll b/llvm/test/Transforms/ObjCARC/path-overflow.ll
index 3415bb1568e5..eeef70554d11 100644
--- a/llvm/test/Transforms/ObjCARC/path-overflow.ll
+++ b/llvm/test/Transforms/ObjCARC/path-overflow.ll
@@ -12,24 +12,24 @@
 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
 target triple = "thumbv7-apple-ios5.0.0"
 
-%struct.NSConstantString = type { i32*, i32, i8*, i32 }
+%struct.NSConstantString = type { ptr, i32, ptr, i32 }
 %struct.CGPoint = type { float, float }
 
 @_unnamed_cfstring = external constant %struct.NSConstantString, section "__DATA,__cfstring"
 @_unnamed_cfstring_2 = external constant %struct.NSConstantString, section "__DATA,__cfstring"
 
-declare i8* @llvm.objc.retain(i8*) nonlazybind
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) nonlazybind
-declare void @llvm.objc.release(i8*) nonlazybind
-declare i8* @returner()
-declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind
-declare void @NSLog(i8*, ...)
-declare void @objc_msgSend_stret(i8*, i8*, ...)
+declare ptr @llvm.objc.retain(ptr) nonlazybind
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr) nonlazybind
+declare void @llvm.objc.release(ptr) nonlazybind
+declare ptr @returner()
+declare ptr @objc_msgSend(ptr, ptr, ...) nonlazybind
+declare void @NSLog(ptr, ...)
+declare void @objc_msgSend_stret(ptr, ptr, ...)
 declare i32 @__gxx_personality_sj0(...)
 declare i32 @__objc_personality_v0(...)
 
 
-define hidden void @test1() personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
+define hidden void @test1() personality ptr @__gxx_personality_sj0 {
 entry:
   br i1 undef, label %msgSend.nullinit, label %msgSend.call
 
@@ -40,8 +40,7 @@ msgSend.nullinit:                                 ; preds = %entry
   br label %msgSend.cont
 
 msgSend.cont:                                     ; preds = %msgSend.nullinit, %msgSend.call
-  %0 = bitcast %struct.NSConstantString* @_unnamed_cfstring to i8*
-  %1 = call i8* @llvm.objc.retain(i8* %0) nounwind
+  %0 = call ptr @llvm.objc.retain(ptr @_unnamed_cfstring) nounwind
   br i1 undef, label %msgSend.nullinit33, label %msgSend.call32
 
 msgSend.call32:                                   ; preds = %if.end10
@@ -336,12 +335,12 @@ msgSend.nullinit506:                              ; preds = %msgSend.cont501
   br label %msgSend.cont507
 
 msgSend.cont507:                                  ; preds = %msgSend.nullinit506, %msgSend.call505
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr @_unnamed_cfstring) nounwind, !clang.imprecise_release !0
   ret void
 }
 
 ; Function Attrs: optsize ssp uwtable
-define void @test2() unnamed_addr align 2 personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
+define void @test2() unnamed_addr align 2 personality ptr @__gxx_personality_sj0 {
 bb:
   br i1 undef, label %bb3, label %bb2
 
@@ -775,13 +774,13 @@ bb182:                                            ; preds = %bb181, %bb180
   br i1 undef, label %bb184, label %bb30
 
 bb184:                                            ; preds = %bb182
-  %tmp185 = call i8* @returner()
+  %tmp185 = call ptr @returner()
   br i1 undef, label %bb186, label %bb195
 
 bb186:                                            ; preds = %bb184
-  %tmp188 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %tmp185)
-  %tmp189 = call i8* @llvm.objc.retain(i8* %tmp188)
-  call void @llvm.objc.release(i8* %tmp189), !clang.imprecise_release !0
+  %tmp188 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %tmp185)
+  %tmp189 = call ptr @llvm.objc.retain(ptr %tmp188)
+  call void @llvm.objc.release(ptr %tmp189), !clang.imprecise_release !0
   br i1 undef, label %bb197, label %bb190
 
 bb190:                                            ; preds = %bb186
@@ -833,7 +832,7 @@ bb212:                                            ; preds = %bb210
   unreachable
 
 bb213:                                            ; preds = %bb193, %bb30
-  resume { i8*, i32 } undef
+  resume { ptr, i32 } undef
 
 bb214:                                            ; preds = %bb42
   br label %bb219
@@ -864,24 +863,24 @@ bb222:                                            ; preds = %bb20, %bb19
 }
 
 ; Function Attrs: ssp
-define void @test3() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
+define void @test3() #1 personality ptr @__gxx_personality_sj0 {
 entry:
-  %call2 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call2 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont unwind label %lpad
 
 invoke.cont:                                      ; preds = %entry
-  %call5 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call5 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont4 unwind label %lpad3
 
 invoke.cont4:                                     ; preds = %invoke.cont
   br i1 undef, label %land.end, label %land.rhs
 
 land.rhs:                                         ; preds = %invoke.cont4
-  %call7 = invoke i32 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call7 = invoke i32 @objc_msgSend(ptr undef, ptr undef)
           to label %land.end unwind label %lpad3
 
 land.end:                                         ; preds = %land.rhs, %invoke.cont4
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i unwind label %lpad.i
 
 invoke.cont.i:                                    ; preds = %land.end
@@ -891,20 +890,20 @@ if.then.i:                                        ; preds = %invoke.cont.i
   br label %invoke.cont8
 
 lpad.i:                                           ; preds = %land.end
-  %tmp13 = landingpad { i8*, i32 }
+  %tmp13 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont8:                                     ; preds = %if.then.i, %invoke.cont.i
-  %call18 = invoke i8* (i8*, i8*, i8*, ...) bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*, ...)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef)
+  %call18 = invoke ptr (ptr, ptr, ptr, ...) @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring, ptr undef)
           to label %invoke.cont17 unwind label %lpad16
 
 invoke.cont17:                                    ; preds = %invoke.cont8
-  %call22 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call22 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont21 unwind label %lpad20
 
 invoke.cont21:                                    ; preds = %invoke.cont17
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i1980 unwind label %lpad.i1982
 
 invoke.cont.i1980:                                ; preds = %invoke.cont21
@@ -914,23 +913,23 @@ if.then.i1981:                                    ; preds = %invoke.cont.i1980
   br label %invoke.cont24
 
 lpad.i1982:                                       ; preds = %invoke.cont21
-  %tmp28 = landingpad { i8*, i32 }
+  %tmp28 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont24:                                    ; preds = %if.then.i1981, %invoke.cont.i1980
-  %call37 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call37 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont36 unwind label %lpad35
 
 invoke.cont36:                                    ; preds = %invoke.cont24
   br i1 undef, label %land.end43, label %land.rhs39
 
 land.rhs39:                                       ; preds = %invoke.cont36
-  %call41 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call41 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %land.end43 unwind label %lpad35
 
 land.end43:                                       ; preds = %land.rhs39, %invoke.cont36
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i1986 unwind label %lpad.i1988
 
 invoke.cont.i1986:                                ; preds = %land.end43
@@ -940,27 +939,27 @@ if.then.i1987:                                    ; preds = %invoke.cont.i1986
   br label %invoke.cont44
 
 lpad.i1988:                                       ; preds = %land.end43
-  %tmp42 = landingpad { i8*, i32 }
+  %tmp42 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont44:                                    ; preds = %if.then.i1987, %invoke.cont.i1986
-  %call53 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call53 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont52 unwind label %lpad51
 
 invoke.cont52:                                    ; preds = %invoke.cont44
   br i1 undef, label %land.end70, label %land.rhs58
 
 land.rhs58:                                       ; preds = %invoke.cont52
-  %call63 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 42)
+  %call63 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 42)
           to label %invoke.cont62 unwind label %lpad61
 
 invoke.cont62:                                    ; preds = %land.rhs58
-  %call68 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef)
+  %call68 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr undef)
           to label %land.end70 unwind label %lpad66.body.thread
 
 land.end70:                                       ; preds = %invoke.cont62, %invoke.cont52
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i1992 unwind label %lpad66.body
 
 invoke.cont.i1992:                                ; preds = %land.end70
@@ -970,7 +969,7 @@ if.then.i1993:                                    ; preds = %invoke.cont.i1992
   br label %invoke.cont71
 
 invoke.cont71:                                    ; preds = %if.then.i1993, %invoke.cont.i1992
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i1998 unwind label %lpad.i2000
 
 invoke.cont.i1998:                                ; preds = %invoke.cont71
@@ -980,20 +979,20 @@ if.then.i1999:                                    ; preds = %invoke.cont.i1998
   br label %invoke.cont91
 
 lpad.i2000:                                       ; preds = %invoke.cont71
-  %tmp74 = landingpad { i8*, i32 }
+  %tmp74 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup102
 
 invoke.cont91:                                    ; preds = %if.then.i1999, %invoke.cont.i1998
-  %call96 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call96 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont95 unwind label %lpad94
 
 invoke.cont95:                                    ; preds = %invoke.cont91
-  %call98 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* %call96)
+  %call98 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr %call96)
           to label %invoke.cont97 unwind label %lpad94
 
 invoke.cont97:                                    ; preds = %invoke.cont95
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2004 unwind label %lpad.i2006
 
 invoke.cont.i2004:                                ; preds = %invoke.cont97
@@ -1003,16 +1002,16 @@ if.then.i2005:                                    ; preds = %invoke.cont.i2004
   br label %invoke.cont100
 
 lpad.i2006:                                       ; preds = %invoke.cont97
-  %tmp82 = landingpad { i8*, i32 }
+  %tmp82 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont100:                                   ; preds = %if.then.i2005, %invoke.cont.i2004
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont110 unwind label %lpad109
 
 invoke.cont110:                                   ; preds = %invoke.cont100
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2010 unwind label %lpad.i2012
 
 invoke.cont.i2010:                                ; preds = %invoke.cont110
@@ -1022,21 +1021,21 @@ if.then.i2011:                                    ; preds = %invoke.cont.i2010
   br label %invoke.cont117
 
 lpad.i2012:                                       ; preds = %invoke.cont110
-  %tmp98 = landingpad { i8*, i32 }
+  %tmp98 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont117:                                   ; preds = %if.then.i2011, %invoke.cont.i2010
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2022 unwind label %lpad156.body
 
 lpad:                                             ; preds = %entry
-  %tmp118 = landingpad { i8*, i32 }
+  %tmp118 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup
 
 lpad3:                                            ; preds = %land.rhs, %invoke.cont
-  %tmp119 = landingpad { i8*, i32 }
+  %tmp119 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup
 
@@ -1044,12 +1043,12 @@ ehcleanup:                                        ; preds = %lpad3, %lpad
   unreachable
 
 lpad16:                                           ; preds = %invoke.cont8
-  %tmp121 = landingpad { i8*, i32 }
+  %tmp121 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup26
 
 lpad20:                                           ; preds = %invoke.cont17
-  %tmp122 = landingpad { i8*, i32 }
+  %tmp122 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup26
 
@@ -1057,32 +1056,32 @@ ehcleanup26:                                      ; preds = %lpad20, %lpad16
   unreachable
 
 lpad35:                                           ; preds = %land.rhs39, %invoke.cont24
-  %tmp124 = landingpad { i8*, i32 }
+  %tmp124 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad51:                                           ; preds = %invoke.cont44
-  %tmp125 = landingpad { i8*, i32 }
+  %tmp125 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad61:                                           ; preds = %land.rhs58
-  %tmp127 = landingpad { i8*, i32 }
+  %tmp127 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad66.body.thread:                               ; preds = %invoke.cont62
-  %tmp128 = landingpad { i8*, i32 }
+  %tmp128 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad66.body:                                      ; preds = %land.end70
-  %tmp129 = landingpad { i8*, i32 }
+  %tmp129 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad94:                                           ; preds = %invoke.cont95, %invoke.cont91
-  %tmp133 = landingpad { i8*, i32 }
+  %tmp133 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup102
 
@@ -1090,7 +1089,7 @@ ehcleanup102:                                     ; preds = %lpad94, %lpad.i2000
   unreachable
 
 lpad109:                                          ; preds = %invoke.cont100
-  %tmp134 = landingpad { i8*, i32 }
+  %tmp134 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
@@ -1101,7 +1100,7 @@ if.then.i2023:                                    ; preds = %invoke.cont.i2022
   br label %invoke.cont157
 
 invoke.cont157:                                   ; preds = %if.then.i2023, %invoke.cont.i2022
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2028 unwind label %lpad164.body
 
 invoke.cont.i2028:                                ; preds = %invoke.cont157
@@ -1111,15 +1110,15 @@ if.then.i2029:                                    ; preds = %invoke.cont.i2028
   br label %invoke.cont165
 
 invoke.cont165:                                   ; preds = %if.then.i2029, %invoke.cont.i2028
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, void (i8*, i8*)*)*)(i8* undef, i8* undef, void (i8*, i8*)* undef)
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef)
           to label %invoke.cont184 unwind label %lpad183
 
 invoke.cont184:                                   ; preds = %invoke.cont165
-  %call186 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call186 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont185 unwind label %lpad183
 
 invoke.cont185:                                   ; preds = %invoke.cont184
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2034 unwind label %lpad.i2036
 
 invoke.cont.i2034:                                ; preds = %invoke.cont185
@@ -1129,24 +1128,24 @@ if.then.i2035:                                    ; preds = %invoke.cont.i2034
   br label %invoke.cont190
 
 lpad.i2036:                                       ; preds = %invoke.cont185
-  %tmp168 = landingpad { i8*, i32 }
+  %tmp168 = landingpad { ptr, i32 }
           cleanup
   br label %lpad183.body
 
 invoke.cont190:                                   ; preds = %if.then.i2035, %invoke.cont.i2034
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont197 unwind label %lpad196
 
 invoke.cont197:                                   ; preds = %invoke.cont190
-  %call202 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call202 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont201 unwind label %lpad200
 
 invoke.cont201:                                   ; preds = %invoke.cont197
-  %call205 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call205 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont204 unwind label %lpad203
 
 invoke.cont204:                                   ; preds = %invoke.cont201
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2040 unwind label %lpad.i2042
 
 invoke.cont.i2040:                                ; preds = %invoke.cont204
@@ -1156,16 +1155,16 @@ if.then.i2041:                                    ; preds = %invoke.cont.i2040
   br label %invoke.cont207
 
 lpad.i2042:                                       ; preds = %invoke.cont204
-  %tmp181 = landingpad { i8*, i32 }
+  %tmp181 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont207:                                   ; preds = %if.then.i2041, %invoke.cont.i2040
-  %call209 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call209 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont208 unwind label %lpad203
 
 invoke.cont208:                                   ; preds = %invoke.cont207
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2046 unwind label %lpad212.body
 
 invoke.cont.i2046:                                ; preds = %invoke.cont208
@@ -1175,15 +1174,15 @@ if.then.i2047:                                    ; preds = %invoke.cont.i2046
   br label %invoke.cont213
 
 invoke.cont213:                                   ; preds = %if.then.i2047, %invoke.cont.i2046
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont221 unwind label %lpad220
 
 invoke.cont221:                                   ; preds = %invoke.cont213
-  %call229 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call229 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont228 unwind label %lpad227
 
 invoke.cont228:                                   ; preds = %invoke.cont221
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2052 unwind label %lpad.i2054
 
 invoke.cont.i2052:                                ; preds = %invoke.cont228
@@ -1193,16 +1192,16 @@ if.then.i2053:                                    ; preds = %invoke.cont.i2052
   br label %invoke.cont231
 
 lpad.i2054:                                       ; preds = %invoke.cont228
-  %tmp198 = landingpad { i8*, i32 }
+  %tmp198 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont231:                                   ; preds = %if.then.i2053, %invoke.cont.i2052
-  %call233 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call233 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont232 unwind label %lpad227
 
 invoke.cont232:                                   ; preds = %invoke.cont231
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2058 unwind label %lpad236.body
 
 invoke.cont.i2058:                                ; preds = %invoke.cont232
@@ -1212,43 +1211,43 @@ if.then.i2059:                                    ; preds = %invoke.cont.i2058
   br label %invoke.cont237
 
 invoke.cont237:                                   ; preds = %if.then.i2059, %invoke.cont.i2058
-  %call246 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call246 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont245 unwind label %lpad244
 
 invoke.cont245:                                   ; preds = %invoke.cont237
-  %call248 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 13)
+  %call248 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 13)
           to label %invoke.cont247 unwind label %lpad244
 
 invoke.cont247:                                   ; preds = %invoke.cont245
-  %call251 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 2)
+  %call251 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 2)
           to label %invoke.cont250 unwind label %lpad249
 
 invoke.cont250:                                   ; preds = %invoke.cont247
-  %call254 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 7)
+  %call254 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 7)
           to label %invoke.cont253 unwind label %lpad252
 
 invoke.cont253:                                   ; preds = %invoke.cont250
-  %call257 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8**, i32)*)(i8* undef, i8* undef, i8** undef, i32 3)
+  %call257 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr undef, i32 3)
           to label %invoke.cont256 unwind label %lpad255
 
 invoke.cont256:                                   ; preds = %invoke.cont253
-  %call260 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* undef)
+  %call260 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr undef)
           to label %invoke.cont259 unwind label %lpad258
 
 invoke.cont259:                                   ; preds = %invoke.cont256
-  %call267 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call267 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont266 unwind label %lpad265
 
 invoke.cont266:                                   ; preds = %invoke.cont259
-  %call275 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef)
+  %call275 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr undef)
           to label %invoke.cont274 unwind label %lpad273
 
 invoke.cont274:                                   ; preds = %invoke.cont266
-  %call279 = invoke i32 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call279 = invoke i32 @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont278 unwind label %lpad277
 
 invoke.cont278:                                   ; preds = %invoke.cont274
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2064 unwind label %lpad.i2066
 
 invoke.cont.i2064:                                ; preds = %invoke.cont278
@@ -1258,43 +1257,43 @@ if.then.i2065:                                    ; preds = %invoke.cont.i2064
   br label %invoke.cont281
 
 lpad.i2066:                                       ; preds = %invoke.cont278
-  %tmp253 = landingpad { i8*, i32 }
+  %tmp253 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont281:                                   ; preds = %if.then.i2065, %invoke.cont.i2064
-  %call291 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call291 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont290 unwind label %lpad289
 
 invoke.cont290:                                   ; preds = %invoke.cont281
-  %call303 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 8)
+  %call303 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 8)
           to label %invoke.cont302 unwind label %lpad301
 
 invoke.cont302:                                   ; preds = %invoke.cont290
-  %call310 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, double)*)(i8* undef, i8* undef, double 5.000000e-01)
+  %call310 = invoke ptr @objc_msgSend(ptr undef, ptr undef, double 5.000000e-01)
           to label %invoke.cont309 unwind label %lpad308
 
 invoke.cont309:                                   ; preds = %invoke.cont302
-  %call313 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 42)
+  %call313 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 42)
           to label %invoke.cont312 unwind label %lpad311
 
 invoke.cont312:                                   ; preds = %invoke.cont309
-  %call316 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8**, i8**, i32)*)(i8* undef, i8* undef, i8** undef, i8** undef, i32 2)
+  %call316 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr undef, i32 2)
           to label %invoke.cont315 unwind label %lpad314
 
 invoke.cont315:                                   ; preds = %invoke.cont312
-  %call322 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef)
+  %call322 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr undef)
           to label %invoke.cont321 unwind label %lpad320
 
 invoke.cont321:                                   ; preds = %invoke.cont315
   br i1 undef, label %land.end344, label %land.rhs335
 
 land.rhs335:                                      ; preds = %invoke.cont321
-  %call342 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call342 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %land.end344 unwind label %lpad340.body.thread
 
 land.end344:                                      ; preds = %land.rhs335, %invoke.cont321
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2070 unwind label %lpad340.body
 
 invoke.cont.i2070:                                ; preds = %land.end344
@@ -1304,19 +1303,19 @@ if.then.i2071:                                    ; preds = %invoke.cont.i2070
   br label %invoke.cont345
 
 invoke.cont345:                                   ; preds = %if.then.i2071, %invoke.cont.i2070
-  %call362 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef)
+  %call362 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr undef)
           to label %invoke.cont361 unwind label %lpad360
 
 invoke.cont361:                                   ; preds = %invoke.cont345
-  %call365 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call365 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont364 unwind label %lpad363
 
 invoke.cont364:                                   ; preds = %invoke.cont361
-  %call371 = invoke i32 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call371 = invoke i32 @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont370 unwind label %lpad369
 
 invoke.cont370:                                   ; preds = %invoke.cont364
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2076 unwind label %lpad.i2078
 
 invoke.cont.i2076:                                ; preds = %invoke.cont370
@@ -1326,24 +1325,24 @@ if.then.i2077:                                    ; preds = %invoke.cont.i2076
   br label %invoke.cont373
 
 lpad.i2078:                                       ; preds = %invoke.cont370
-  %tmp340 = landingpad { i8*, i32 }
+  %tmp340 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont373:                                   ; preds = %if.then.i2077, %invoke.cont.i2076
-  %call377 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32, i8*)*)(i8* undef, i8* undef, i32 42, i8* undef)
+  %call377 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 42, ptr undef)
           to label %invoke.cont376 unwind label %lpad363
 
 invoke.cont376:                                   ; preds = %invoke.cont373
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i32)*)(i8* undef, i8* undef, i8* undef, i32 5)
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, i32 5)
           to label %invoke.cont382 unwind label %lpad381
 
 invoke.cont382:                                   ; preds = %invoke.cont376
-  %call384 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call384 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont383 unwind label %lpad381
 
 invoke.cont383:                                   ; preds = %invoke.cont382
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2082 unwind label %lpad.i2084
 
 invoke.cont.i2082:                                ; preds = %invoke.cont383
@@ -1353,28 +1352,28 @@ if.then.i2083:                                    ; preds = %invoke.cont.i2082
   br label %invoke.cont392
 
 lpad.i2084:                                       ; preds = %invoke.cont383
-  %tmp360 = landingpad { i8*, i32 }
+  %tmp360 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont392:                                   ; preds = %if.then.i2083, %invoke.cont.i2082
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i32)*)(i8* undef, i8* undef, i8* undef, i32 -2)
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, i32 -2)
           to label %invoke.cont395 unwind label %lpad381
 
 invoke.cont395:                                   ; preds = %invoke.cont392
-  %call397 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call397 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont396 unwind label %lpad381
 
 invoke.cont396:                                   ; preds = %invoke.cont395
-  %call400 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call400 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont399 unwind label %lpad398
 
 invoke.cont399:                                   ; preds = %invoke.cont396
-  %call403 = invoke i32 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call403 = invoke i32 @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont402 unwind label %lpad401
 
 invoke.cont402:                                   ; preds = %invoke.cont399
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2088 unwind label %lpad.i2090
 
 invoke.cont.i2088:                                ; preds = %invoke.cont402
@@ -1384,24 +1383,24 @@ if.then.i2089:                                    ; preds = %invoke.cont.i2088
   br label %invoke.cont405
 
 lpad.i2090:                                       ; preds = %invoke.cont402
-  %tmp370 = landingpad { i8*, i32 }
+  %tmp370 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont405:                                   ; preds = %if.then.i2089, %invoke.cont.i2088
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i32)*)(i8* undef, i8* undef, i8* undef, i32 -1)
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, i32 -1)
           to label %invoke.cont408 unwind label %lpad381
 
 invoke.cont408:                                   ; preds = %invoke.cont405
-  %call410 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call410 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont409 unwind label %lpad381
 
 invoke.cont409:                                   ; preds = %invoke.cont408
-  %call413 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call413 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont412 unwind label %lpad411
 
 invoke.cont412:                                   ; preds = %invoke.cont409
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2094 unwind label %lpad.i2096
 
 invoke.cont.i2094:                                ; preds = %invoke.cont412
@@ -1411,28 +1410,28 @@ if.then.i2095:                                    ; preds = %invoke.cont.i2094
   br label %invoke.cont418
 
 lpad.i2096:                                       ; preds = %invoke.cont412
-  %tmp380 = landingpad { i8*, i32 }
+  %tmp380 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont418:                                   ; preds = %if.then.i2095, %invoke.cont.i2094
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i32)*)(i8* undef, i8* undef, i8* undef, i32 0)
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, i32 0)
           to label %invoke.cont422 unwind label %lpad381
 
 invoke.cont422:                                   ; preds = %invoke.cont418
-  %call424 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call424 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont423 unwind label %lpad381
 
 invoke.cont423:                                   ; preds = %invoke.cont422
-  %call427 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call427 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont426 unwind label %lpad425
 
 invoke.cont426:                                   ; preds = %invoke.cont423
-  %call430 = invoke i32 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call430 = invoke i32 @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont429 unwind label %lpad428
 
 invoke.cont429:                                   ; preds = %invoke.cont426
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2100 unwind label %lpad.i2102
 
 invoke.cont.i2100:                                ; preds = %invoke.cont429
@@ -1442,29 +1441,29 @@ if.then.i2101:                                    ; preds = %invoke.cont.i2100
   br label %invoke.cont432
 
 lpad.i2102:                                       ; preds = %invoke.cont429
-  %tmp390 = landingpad { i8*, i32 }
+  %tmp390 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont432:                                   ; preds = %if.then.i2101, %invoke.cont.i2100
-  %call436 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 0)
+  %call436 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 0)
           to label %invoke.cont435 unwind label %lpad381
 
 invoke.cont435:                                   ; preds = %invoke.cont432
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2106 unwind label %lpad.i2108
 
 invoke.cont.i2106:                                ; preds = %invoke.cont435
-  %call444 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 5)
+  %call444 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 5)
           to label %invoke.cont443 unwind label %lpad381
 
 lpad.i2108:                                       ; preds = %invoke.cont435
-  %tmp396 = landingpad { i8*, i32 }
+  %tmp396 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont443:                                   ; preds = %invoke.cont.i2106
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2112 unwind label %lpad.i2114
 
 invoke.cont.i2112:                                ; preds = %invoke.cont443
@@ -1474,20 +1473,20 @@ if.then.i2113:                                    ; preds = %invoke.cont.i2112
   br label %invoke.cont449
 
 lpad.i2114:                                       ; preds = %invoke.cont443
-  %tmp402 = landingpad { i8*, i32 }
+  %tmp402 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont449:                                   ; preds = %if.then.i2113, %invoke.cont.i2112
-  %call453 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 -2)
+  %call453 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 -2)
           to label %invoke.cont452 unwind label %lpad381
 
 invoke.cont452:                                   ; preds = %invoke.cont449
-  %call456 = invoke i32 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 (i8*, i8*)*)(i8* undef, i8* undef)
+  %call456 = invoke i32 @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont455 unwind label %lpad454
 
 invoke.cont455:                                   ; preds = %invoke.cont452
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2118 unwind label %lpad.i2120
 
 invoke.cont.i2118:                                ; preds = %invoke.cont455
@@ -1497,16 +1496,16 @@ if.then.i2119:                                    ; preds = %invoke.cont.i2118
   br label %invoke.cont458
 
 lpad.i2120:                                       ; preds = %invoke.cont455
-  %tmp408 = landingpad { i8*, i32 }
+  %tmp408 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont458:                                   ; preds = %if.then.i2119, %invoke.cont.i2118
-  %call461 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 -1)
+  %call461 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 -1)
           to label %invoke.cont460 unwind label %lpad381
 
 invoke.cont460:                                   ; preds = %invoke.cont458
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2124 unwind label %lpad.i2126
 
 invoke.cont.i2124:                                ; preds = %invoke.cont460
@@ -1516,16 +1515,16 @@ if.then.i2125:                                    ; preds = %invoke.cont.i2124
   br label %invoke.cont466
 
 lpad.i2126:                                       ; preds = %invoke.cont460
-  %tmp414 = landingpad { i8*, i32 }
+  %tmp414 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup477
 
 invoke.cont466:                                   ; preds = %if.then.i2125, %invoke.cont.i2124
-  %call470 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 0)
+  %call470 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 0)
           to label %invoke.cont469 unwind label %lpad381
 
 invoke.cont469:                                   ; preds = %invoke.cont466
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2130 unwind label %lpad.i2132
 
 invoke.cont.i2130:                                ; preds = %invoke.cont469
@@ -1535,46 +1534,46 @@ if.then.i2131:                                    ; preds = %invoke.cont.i2130
   br label %invoke.cont475
 
 lpad.i2132:                                       ; preds = %invoke.cont469
-  %tmp420 = landingpad { i8*, i32 }
+  %tmp420 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup477
 
 invoke.cont475:                                   ; preds = %if.then.i2131, %invoke.cont.i2130
-  %call491 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 1)
+  %call491 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 1)
           to label %invoke.cont490 unwind label %lpad489
 
 invoke.cont490:                                   ; preds = %invoke.cont475
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont499 unwind label %lpad498
 
 invoke.cont499:                                   ; preds = %invoke.cont490
-  %call504 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call504 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont503 unwind label %lpad489
 
 invoke.cont503:                                   ; preds = %invoke.cont499
-  %call507 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* undef, i8* undef, i32 3)
+  %call507 = invoke ptr @objc_msgSend(ptr undef, ptr undef, i32 3)
           to label %invoke.cont506 unwind label %lpad505
 
 invoke.cont506:                                   ; preds = %invoke.cont503
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont509 unwind label %lpad508
 
 invoke.cont509:                                   ; preds = %invoke.cont506
-  %call513 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call513 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont512 unwind label %lpad489
 
 invoke.cont512:                                   ; preds = %invoke.cont509
   br i1 undef, label %msgSend.null-receiver, label %msgSend.call
 
 msgSend.call:                                     ; preds = %invoke.cont512
-  invoke void bitcast (void (i8*, i8*, ...)* @objc_msgSend_stret to void (%struct.CGPoint*, i8*, i8*)*)(%struct.CGPoint* sret(%struct.CGPoint) undef, i8* undef, i8* undef)
+  invoke void @objc_msgSend_stret(ptr sret(%struct.CGPoint) undef, ptr undef, ptr undef)
           to label %msgSend.cont unwind label %lpad514
 
 msgSend.null-receiver:                            ; preds = %invoke.cont512
   br label %msgSend.cont
 
 msgSend.cont:                                     ; preds = %msgSend.null-receiver, %msgSend.call
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2136 unwind label %lpad.i2138
 
 invoke.cont.i2136:                                ; preds = %msgSend.cont
@@ -1584,24 +1583,24 @@ if.then.i2137:                                    ; preds = %invoke.cont.i2136
   br label %invoke.cont521
 
 lpad.i2138:                                       ; preds = %msgSend.cont
-  %tmp468 = landingpad { i8*, i32 }
+  %tmp468 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont521:                                   ; preds = %if.then.i2137, %invoke.cont.i2136
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef)
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring, ptr undef)
           to label %invoke.cont528 unwind label %lpad527
 
 invoke.cont528:                                   ; preds = %invoke.cont521
-  %call532 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call532 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont531 unwind label %lpad489
 
 invoke.cont531:                                   ; preds = %invoke.cont528
-  %call535 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call535 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont534 unwind label %lpad533
 
 invoke.cont534:                                   ; preds = %invoke.cont531
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2142 unwind label %lpad.i2144
 
 invoke.cont.i2142:                                ; preds = %invoke.cont534
@@ -1611,65 +1610,65 @@ if.then.i2143:                                    ; preds = %invoke.cont.i2142
   br label %invoke.cont540
 
 lpad.i2144:                                       ; preds = %invoke.cont534
-  %tmp486 = landingpad { i8*, i32 }
+  %tmp486 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 invoke.cont540:                                   ; preds = %if.then.i2143, %invoke.cont.i2142
-  %call544 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i32)*)(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef, i32 3)
+  %call544 = invoke ptr @objc_msgSend(ptr @_unnamed_cfstring, ptr undef, i32 3)
           to label %invoke.cont543 unwind label %lpad489
 
 invoke.cont543:                                   ; preds = %invoke.cont540
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* undef)
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring, ptr undef)
           to label %invoke.cont546 unwind label %lpad545
 
 invoke.cont546:                                   ; preds = %invoke.cont543
-  %call549 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call549 = invoke ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont548 unwind label %lpad489
 
 invoke.cont548:                                   ; preds = %invoke.cont546
-  %call555 = invoke signext i8 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8 (i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %call555 = invoke signext i8 @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont554 unwind label %lpad553
 
 invoke.cont554:                                   ; preds = %invoke.cont548
-  %tmp499 = call i8* @llvm.objc.retain(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*)) #3
-  invoke void (i8*, ...) @NSLog(i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i8* %tmp499, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  %tmp499 = call ptr @llvm.objc.retain(ptr @_unnamed_cfstring) #3
+  invoke void (ptr, ...) @NSLog(ptr @_unnamed_cfstring, ptr %tmp499, ptr @_unnamed_cfstring)
           to label %invoke.cont.i2148 unwind label %lpad.i2150
 
 invoke.cont.i2148:                                ; preds = %invoke.cont554
-  call void @llvm.objc.release(i8* %tmp499) #3, !clang.imprecise_release !0
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  call void @llvm.objc.release(ptr %tmp499) #3, !clang.imprecise_release !0
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont566 unwind label %lpad565
 
 lpad.i2150:                                       ; preds = %invoke.cont554
-  %tmp500 = landingpad { i8*, i32 }
+  %tmp500 = landingpad { ptr, i32 }
           cleanup
-  call void @llvm.objc.release(i8* %tmp499) #3, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %tmp499) #3, !clang.imprecise_release !0
   unreachable
 
 invoke.cont566:                                   ; preds = %invoke.cont.i2148
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* undef, i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*))
+  invoke void @objc_msgSend(ptr undef, ptr undef, ptr undef, ptr @_unnamed_cfstring)
           to label %invoke.cont572 unwind label %lpad571
 
 invoke.cont572:                                   ; preds = %invoke.cont566
-  %call582 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* undef, i8* undef)
+  %call582 = invoke ptr @objc_msgSend(ptr undef, ptr undef)
           to label %invoke.cont581 unwind label %lpad580
 
 invoke.cont581:                                   ; preds = %invoke.cont572
   unreachable
 
 lpad156.body:                                     ; preds = %invoke.cont117
-  %tmp1157 = landingpad { i8*, i32 }
+  %tmp1157 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad164.body:                                     ; preds = %invoke.cont157
-  %tmp1158 = landingpad { i8*, i32 }
+  %tmp1158 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad183:                                          ; preds = %invoke.cont184, %invoke.cont165
-  %tmp1159 = landingpad { i8*, i32 }
+  %tmp1159 = landingpad { ptr, i32 }
           cleanup
   br label %lpad183.body
 
@@ -1677,37 +1676,37 @@ lpad183.body:                                     ; preds = %lpad183, %lpad.i203
   unreachable
 
 lpad196:                                          ; preds = %invoke.cont190
-  %tmp1160 = landingpad { i8*, i32 }
+  %tmp1160 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad200:                                          ; preds = %invoke.cont197
-  %tmp1161 = landingpad { i8*, i32 }
+  %tmp1161 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad203:                                          ; preds = %invoke.cont207, %invoke.cont201
-  %tmp1162 = landingpad { i8*, i32 }
+  %tmp1162 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad212.body:                                     ; preds = %invoke.cont208
-  %tmp1163 = landingpad { i8*, i32 }
+  %tmp1163 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad220:                                          ; preds = %invoke.cont213
-  %tmp1164 = landingpad { i8*, i32 }
+  %tmp1164 = landingpad { ptr, i32 }
           cleanup
   br label %eh.resume
 
 lpad227:                                          ; preds = %invoke.cont231, %invoke.cont221
-  %tmp1166 = landingpad { i8*, i32 }
+  %tmp1166 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup239
 
 lpad236.body:                                     ; preds = %invoke.cont232
-  %tmp1167 = landingpad { i8*, i32 }
+  %tmp1167 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup239
 
@@ -1715,27 +1714,27 @@ ehcleanup239:                                     ; preds = %lpad236.body, %lpad
   unreachable
 
 lpad244:                                          ; preds = %invoke.cont245, %invoke.cont237
-  %tmp1168 = landingpad { i8*, i32 }
+  %tmp1168 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad249:                                          ; preds = %invoke.cont247
-  %tmp1169 = landingpad { i8*, i32 }
+  %tmp1169 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad252:                                          ; preds = %invoke.cont250
-  %tmp1170 = landingpad { i8*, i32 }
+  %tmp1170 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup263
 
 lpad255:                                          ; preds = %invoke.cont253
-  %tmp1171 = landingpad { i8*, i32 }
+  %tmp1171 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup263
 
 lpad258:                                          ; preds = %invoke.cont256
-  %tmp1172 = landingpad { i8*, i32 }
+  %tmp1172 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
@@ -1743,107 +1742,107 @@ ehcleanup263:                                     ; preds = %lpad255, %lpad252
   unreachable
 
 lpad265:                                          ; preds = %invoke.cont259
-  %tmp1173 = landingpad { i8*, i32 }
+  %tmp1173 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad273:                                          ; preds = %invoke.cont266
-  %tmp1175 = landingpad { i8*, i32 }
+  %tmp1175 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad277:                                          ; preds = %invoke.cont274
-  %tmp1176 = landingpad { i8*, i32 }
+  %tmp1176 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad289:                                          ; preds = %invoke.cont281
-  %tmp1177 = landingpad { i8*, i32 }
+  %tmp1177 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad301:                                          ; preds = %invoke.cont290
-  %tmp1180 = landingpad { i8*, i32 }
+  %tmp1180 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad308:                                          ; preds = %invoke.cont302
-  %tmp1182 = landingpad { i8*, i32 }
+  %tmp1182 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad311:                                          ; preds = %invoke.cont309
-  %tmp1183 = landingpad { i8*, i32 }
+  %tmp1183 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad314:                                          ; preds = %invoke.cont312
-  %tmp1184 = landingpad { i8*, i32 }
+  %tmp1184 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad320:                                          ; preds = %invoke.cont315
-  %tmp1186 = landingpad { i8*, i32 }
+  %tmp1186 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad340.body.thread:                              ; preds = %land.rhs335
-  %tmp1188 = landingpad { i8*, i32 }
+  %tmp1188 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad340.body:                                     ; preds = %land.end344
-  %tmp1189 = landingpad { i8*, i32 }
+  %tmp1189 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad360:                                          ; preds = %invoke.cont345
-  %tmp1191 = landingpad { i8*, i32 }
+  %tmp1191 = landingpad { ptr, i32 }
           cleanup
   br label %eh.resume
 
 lpad363:                                          ; preds = %invoke.cont373, %invoke.cont361
-  %tmp1192 = landingpad { i8*, i32 }
+  %tmp1192 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad369:                                          ; preds = %invoke.cont364
-  %tmp1194 = landingpad { i8*, i32 }
+  %tmp1194 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad381:                                          ; preds = %invoke.cont466, %invoke.cont458, %invoke.cont449, %invoke.cont.i2106, %invoke.cont432, %invoke.cont422, %invoke.cont418, %invoke.cont408, %invoke.cont405, %invoke.cont395, %invoke.cont392, %invoke.cont382, %invoke.cont376
-  %tmp1196 = landingpad { i8*, i32 }
+  %tmp1196 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup477
 
 lpad398:                                          ; preds = %invoke.cont396
-  %tmp1199 = landingpad { i8*, i32 }
+  %tmp1199 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad401:                                          ; preds = %invoke.cont399
-  %tmp1200 = landingpad { i8*, i32 }
+  %tmp1200 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad411:                                          ; preds = %invoke.cont409
-  %tmp1201 = landingpad { i8*, i32 }
+  %tmp1201 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad425:                                          ; preds = %invoke.cont423
-  %tmp1203 = landingpad { i8*, i32 }
+  %tmp1203 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup477
 
 lpad428:                                          ; preds = %invoke.cont426
-  %tmp1204 = landingpad { i8*, i32 }
+  %tmp1204 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad454:                                          ; preds = %invoke.cont452
-  %tmp1207 = landingpad { i8*, i32 }
+  %tmp1207 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
@@ -1851,47 +1850,47 @@ ehcleanup477:                                     ; preds = %lpad425, %lpad381,
   unreachable
 
 lpad489:                                          ; preds = %invoke.cont546, %invoke.cont540, %invoke.cont528, %invoke.cont509, %invoke.cont499, %invoke.cont475
-  %tmp1211 = landingpad { i8*, i32 }
+  %tmp1211 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup560
 
 lpad498:                                          ; preds = %invoke.cont490
-  %tmp1214 = landingpad { i8*, i32 }
+  %tmp1214 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad505:                                          ; preds = %invoke.cont503
-  %tmp1215 = landingpad { i8*, i32 }
+  %tmp1215 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad508:                                          ; preds = %invoke.cont506
-  %tmp1216 = landingpad { i8*, i32 }
+  %tmp1216 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad514:                                          ; preds = %msgSend.call
-  %tmp1217 = landingpad { i8*, i32 }
+  %tmp1217 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad527:                                          ; preds = %invoke.cont521
-  %tmp1219 = landingpad { i8*, i32 }
+  %tmp1219 = landingpad { ptr, i32 }
           cleanup
   br label %ehcleanup560
 
 lpad533:                                          ; preds = %invoke.cont531
-  %tmp1220 = landingpad { i8*, i32 }
+  %tmp1220 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad545:                                          ; preds = %invoke.cont543
-  %tmp1222 = landingpad { i8*, i32 }
+  %tmp1222 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad553:                                          ; preds = %invoke.cont548
-  %tmp1224 = landingpad { i8*, i32 }
+  %tmp1224 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
@@ -1899,27 +1898,27 @@ ehcleanup560:                                     ; preds = %lpad527, %lpad489
   br label %eh.resume
 
 lpad565:                                          ; preds = %invoke.cont.i2148
-  %tmp1225 = landingpad { i8*, i32 }
+  %tmp1225 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad571:                                          ; preds = %invoke.cont566
-  %tmp1227 = landingpad { i8*, i32 }
+  %tmp1227 = landingpad { ptr, i32 }
           cleanup
   unreachable
 
 lpad580:                                          ; preds = %invoke.cont572
-  %tmp1228 = landingpad { i8*, i32 }
+  %tmp1228 = landingpad { ptr, i32 }
           cleanup
   br label %eh.resume
 
 eh.resume:                                        ; preds = %lpad580, %ehcleanup560, %lpad360, %lpad220
-  resume { i8*, i32 } undef
+  resume { ptr, i32 } undef
 }
 
 @"OBJC_EHTYPE_$_NSException" = external global i8
 
-define void @test4() personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+define void @test4() personality ptr @__objc_personality_v0 {
 entry:
   br i1 undef, label %if.end13, label %if.then10
 
@@ -1927,7 +1926,7 @@ if.then10:                                        ; preds = %entry
   br label %if.end13
 
 if.end13:                                         ; preds = %if.then10, %entry
-  %0 = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, i8*, i64, i8*, i8)*)(i8* undef, i8* undef, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring to i8*), i64 2, i8* bitcast (%struct.NSConstantString* @_unnamed_cfstring_2 to i8*), i8 signext 0), !clang.arc.no_objc_arc_exceptions !0
+  %0 = call ptr @objc_msgSend(ptr undef, ptr undef, ptr @_unnamed_cfstring, i64 2, ptr @_unnamed_cfstring_2, i8 signext 0), !clang.arc.no_objc_arc_exceptions !0
   br i1 undef, label %if.then17, label %if.end18
 
 if.then17:                                        ; preds = %if.end13
@@ -2162,27 +2161,27 @@ if.then398:                                       ; preds = %if.end392
   br label %if.end399
 
 if.end399:                                        ; preds = %if.then398, %if.end392
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* undef, i8* undef)
+  invoke void @objc_msgSend(ptr undef, ptr undef)
           to label %eh.cont unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
 
 eh.cont:                                          ; preds = %if.end399
   br i1 undef, label %if.then430, label %if.end439.critedge
 
 if.then430:                                       ; preds = %eh.cont
-  %1 = call i8* @llvm.objc.retain(i8* %0)
+  %1 = call ptr @llvm.objc.retain(ptr %0)
   br label %if.end439
 
 lpad:                                             ; preds = %if.end399
-  %2 = landingpad { i8*, i32 }
-          catch i8* @"OBJC_EHTYPE_$_NSException"
+  %2 = landingpad { ptr, i32 }
+          catch ptr @"OBJC_EHTYPE_$_NSException"
   unreachable
 
 if.end439.critedge:                               ; preds = %eh.cont
-  %3 = call i8* @llvm.objc.retain(i8* %0)
+  %3 = call ptr @llvm.objc.retain(ptr %0)
   br label %if.end439
 
 if.end439:                                        ; preds = %if.end439.critedge, %if.then430
-  call void @llvm.objc.release(i8* %0), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %0), !clang.imprecise_release !0
   unreachable
 
 return:                                           ; No predecessors!

diff  --git a/llvm/test/Transforms/ObjCARC/pointer-types.ll b/llvm/test/Transforms/ObjCARC/pointer-types.ll
index b70dbdb92b5e..e016b5657300 100644
--- a/llvm/test/Transforms/ObjCARC/pointer-types.ll
+++ b/llvm/test/Transforms/ObjCARC/pointer-types.ll
@@ -6,12 +6,11 @@
 ; rdar://10551239
 
 ; CHECK-LABEL: define void @test0(
-; CHECK: %otherBlock = phi void ()* [ %b1, %if.then ], [ null, %entry ]
-; CHECK-NEXT: call void @use_fptr(void ()* %otherBlock)
-; CHECK-NEXT: %tmp11 = bitcast void ()* %otherBlock to i8*
-; CHECK-NEXT: call void @llvm.objc.release(i8* %tmp11)
+; CHECK: %otherBlock = phi ptr [ %b1, %if.then ], [ null, %entry ]
+; CHECK-NEXT: call void @use_fptr(ptr %otherBlock)
+; CHECK-NEXT: call void @llvm.objc.release(ptr %otherBlock)
 
-define void @test0(i1 %tobool, void ()* %b1) {
+define void @test0(i1 %tobool, ptr %b1) {
 entry:
   br i1 %tobool, label %if.end, label %if.then
 
@@ -19,13 +18,12 @@ if.then:                                          ; preds = %entry
   br label %if.end
 
 if.end:                                           ; preds = %if.then, %entry
-  %otherBlock = phi void ()* [ %b1, %if.then ], [ null, %entry ]
-  call void @use_fptr(void ()* %otherBlock)
-  %tmp11 = bitcast void ()* %otherBlock to i8*
-  call void @llvm.objc.release(i8* %tmp11) nounwind
+  %otherBlock = phi ptr [ %b1, %if.then ], [ null, %entry ]
+  call void @use_fptr(ptr %otherBlock)
+  call void @llvm.objc.release(ptr %otherBlock) nounwind
   ret void
 }
 
-declare void @use_fptr(void ()*)
-declare void @llvm.objc.release(i8*)
+declare void @use_fptr(ptr)
+declare void @llvm.objc.release(ptr)
 

diff  --git a/llvm/test/Transforms/ObjCARC/post-inlining.ll b/llvm/test/Transforms/ObjCARC/post-inlining.ll
index 50adf64ddc98..2b50b2e253f4 100644
--- a/llvm/test/Transforms/ObjCARC/post-inlining.ll
+++ b/llvm/test/Transforms/ObjCARC/post-inlining.ll
@@ -1,10 +1,10 @@
 ; RUN: opt -S -passes=objc-arc < %s | FileCheck %s
 
-declare void @use_pointer(i8*)
-declare i8* @returner()
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
+declare void @use_pointer(ptr)
+declare ptr @returner()
+declare ptr @llvm.objc.retain(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
 
 ; Clean up residue left behind after inlining.
 
@@ -12,10 +12,10 @@ declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
 ; CHECK: entry:
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test0(i8* %call.i) {
+define void @test0(ptr %call.i) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %call.i) nounwind
-  %1 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %0) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %call.i) nounwind
+  %1 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %0) nounwind
   ret void
 }
 
@@ -25,10 +25,10 @@ entry:
 ; CHECK: entry:
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
-define void @test1(i8* %call.i) {
+define void @test1(ptr %call.i) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %call.i) nounwind
-  %1 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %call.i) nounwind
+  %0 = tail call ptr @llvm.objc.retain(ptr %call.i) nounwind
+  %1 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call.i) nounwind
   ret void
 }
 
@@ -36,14 +36,14 @@ entry:
 
 ; CHECK-LABEL: define void @test24(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   call void @use_pointer(i8* %p)
+; CHECK-NEXT:   call void @use_pointer(ptr %p)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test24(i8* %p) {
+define void @test24(ptr %p) {
 entry:
-  call i8* @llvm.objc.autoreleaseReturnValue(i8* %p) nounwind
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p) nounwind
-  call void @use_pointer(i8* %p)
+  call ptr @llvm.objc.autoreleaseReturnValue(ptr %p) nounwind
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p) nounwind
+  call void @use_pointer(ptr %p)
   ret void
 }
 
@@ -52,61 +52,57 @@ entry:
 
 ; 1) Noop instructions: bitcasts and zero-indices GEPs.
 
-; CHECK-LABEL: define i8* @testNoop(
+; CHECK-LABEL: define ptr @testNoop(
 ; CHECK: entry:
-; CHECK-NEXT: %noop0 = bitcast i8* %call.i to i64*
-; CHECK-NEXT: %noop1 = getelementptr i8, i8* %call.i, i32 0
-; CHECK-NEXT: ret i8* %call.i
+; CHECK-NEXT: ret ptr %call.i
 ; CHECK-NEXT: }
-define i8* @testNoop(i8* %call.i) {
+define ptr @testNoop(ptr %call.i) {
 entry:
-  %0 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %call.i) nounwind
-  %noop0 = bitcast i8* %call.i to i64*
-  %noop1 = getelementptr i8, i8* %call.i, i32 0
-  %1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call.i) nounwind
-  ret i8* %call.i
+  %0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call.i) nounwind
+  %1 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call.i) nounwind
+  ret ptr %call.i
 }
 
 ; 2) Lifetime markers.
 
-declare void @llvm.lifetime.start.p0i8(i64, i8*)
-declare void @llvm.lifetime.end.p0i8(i64, i8*)
+declare void @llvm.lifetime.start.p0(i64, ptr)
+declare void @llvm.lifetime.end.p0(i64, ptr)
 
-; CHECK-LABEL: define i8* @testLifetime(
+; CHECK-LABEL: define ptr @testLifetime(
 ; CHECK: entry:
 ; CHECK-NEXT: %obj = alloca i8
-; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* %obj)
-; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* %obj)
-; CHECK-NEXT: ret i8* %call.i
+; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr %obj)
+; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr %obj)
+; CHECK-NEXT: ret ptr %call.i
 ; CHECK-NEXT: }
-define i8* @testLifetime(i8* %call.i) {
+define ptr @testLifetime(ptr %call.i) {
 entry:
   %obj = alloca i8
-  call void @llvm.lifetime.start.p0i8(i64 8, i8* %obj)
-  %0 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %call.i) nounwind
-  call void @llvm.lifetime.end.p0i8(i64 8, i8* %obj)
-  %1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call.i) nounwind
-  ret i8* %call.i
+  call void @llvm.lifetime.start.p0(i64 8, ptr %obj)
+  %0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call.i) nounwind
+  call void @llvm.lifetime.end.p0(i64 8, ptr %obj)
+  %1 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call.i) nounwind
+  ret ptr %call.i
 }
 
 ; 3) Dynamic alloca markers.
 
-declare i8* @llvm.stacksave()
-declare void @llvm.stackrestore(i8*)
+declare ptr @llvm.stacksave()
+declare void @llvm.stackrestore(ptr)
 
-; CHECK-LABEL: define i8* @testStack(
+; CHECK-LABEL: define ptr @testStack(
 ; CHECK: entry:
-; CHECK-NEXT: %save = tail call i8* @llvm.stacksave()
+; CHECK-NEXT: %save = tail call ptr @llvm.stacksave()
 ; CHECK-NEXT: %obj = alloca i8, i8 %arg
-; CHECK-NEXT: call void @llvm.stackrestore(i8* %save)
-; CHECK-NEXT: ret i8* %call.i
+; CHECK-NEXT: call void @llvm.stackrestore(ptr %save)
+; CHECK-NEXT: ret ptr %call.i
 ; CHECK-NEXT: }
-define i8* @testStack(i8* %call.i, i8 %arg) {
+define ptr @testStack(ptr %call.i, i8 %arg) {
 entry:
-  %save = tail call i8* @llvm.stacksave()
+  %save = tail call ptr @llvm.stacksave()
   %obj = alloca i8, i8 %arg
-  %0 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %call.i) nounwind
-  call void @llvm.stackrestore(i8* %save)
-  %1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call.i) nounwind
-  ret i8* %call.i
+  %0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call.i) nounwind
+  call void @llvm.stackrestore(ptr %save)
+  %1 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call.i) nounwind
+  ret ptr %call.i
 }

diff  --git a/llvm/test/Transforms/ObjCARC/pr12270.ll b/llvm/test/Transforms/ObjCARC/pr12270.ll
index 30573e35e275..dddcdf0f212b 100644
--- a/llvm/test/Transforms/ObjCARC/pr12270.ll
+++ b/llvm/test/Transforms/ObjCARC/pr12270.ll
@@ -2,20 +2,19 @@
 ; test that we don't crash on unreachable code
 %2 = type opaque
 
-define void @_i_Test__foo(%2 *%x) {
+define void @_i_Test__foo(ptr %x) {
 entry:
   unreachable
 
 return:                                           ; No predecessors!
-  %bar = bitcast %2* %x to i8*
-  %foo = call i8* @llvm.objc.autoreleaseReturnValue(i8* %bar) nounwind
+  %foo = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
   call void @callee()
-  call void @use_pointer(i8* %foo)
-  call void @llvm.objc.release(i8* %foo) nounwind
+  call void @use_pointer(ptr %foo)
+  call void @llvm.objc.release(ptr %foo) nounwind
   ret void
 }
 
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare void @llvm.objc.release(i8*)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare void @llvm.objc.release(ptr)
 declare void @callee()
-declare void @use_pointer(i8*)
+declare void @use_pointer(ptr)

diff  --git a/llvm/test/Transforms/ObjCARC/provenance.ll b/llvm/test/Transforms/ObjCARC/provenance.ll
index 8970b6c44bd6..4e54f2771e6b 100644
--- a/llvm/test/Transforms/ObjCARC/provenance.ll
+++ b/llvm/test/Transforms/ObjCARC/provenance.ll
@@ -9,29 +9,29 @@
 
 declare void @g(i8)
 
-define void @f(i8* %a, i8** %b, i8** %c) {
-  %y1 = load i8, i8* %a
+define void @f(ptr %a, ptr %b, ptr %c) {
+  %y1 = load i8, ptr %a
   call void @g(i8 %y1)
 
-  %y2 = load i8*, i8** %b
-  %y3 = load i8*, i8** %c
+  %y2 = load ptr, ptr %b
+  %y3 = load ptr, ptr %c
 
-  %x0 = load i8, i8* @"\01l_objc_msgSend_fixup_"
+  %x0 = load i8, ptr @"\01l_objc_msgSend_fixup_"
   call void @g(i8 %x0)
 
-  %x1 = load i8, i8* @g1
+  %x1 = load i8, ptr @g1
   call void @g(i8 %x1)
 
-  %x2 = load i8, i8* @g2
+  %x2 = load i8, ptr @g2
   call void @g(i8 %x2)
 
-  %x3 = load i8, i8* @g3
+  %x3 = load i8, ptr @g3
   call void @g(i8 %x3)
 
-  %x4 = load i8, i8* @g4
+  %x4 = load i8, ptr @g4
   call void @g(i8 %x4)
 
-  %x5 = load i8, i8* @g5
+  %x5 = load i8, ptr @g5
   call void @g(i8 %x5)
   ret void
 }

diff  --git a/llvm/test/Transforms/ObjCARC/related-check.ll b/llvm/test/Transforms/ObjCARC/related-check.ll
index 91814b9fcf1c..e09d6b1168b8 100644
--- a/llvm/test/Transforms/ObjCARC/related-check.ll
+++ b/llvm/test/Transforms/ObjCARC/related-check.ll
@@ -5,34 +5,34 @@
 ; RUN: 
diff  -u %t/out1.ll %t/out2.ll
 
 %0 = type opaque
-%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* }
+%struct._class_t = type { ptr, ptr, ptr, ptr, ptr }
 %struct._objc_cache = type opaque
-%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* }
+%struct._class_ro_t = type { i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
 %struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] }
-%struct._objc_method = type { i8*, i8*, i8* }
-%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] }
-%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8**, i8*, %struct._prop_list_t* }
+%struct._objc_method = type { ptr, ptr, ptr }
+%struct._objc_protocol_list = type { i64, [0 x ptr] }
+%struct._protocol_t = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, ptr, ptr, ptr }
 %struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] }
-%struct._ivar_t = type { i32*, i8*, i8*, i32, i32 }
+%struct._ivar_t = type { ptr, ptr, ptr, i32, i32 }
 %struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] }
-%struct._prop_t = type { i8*, i8* }
-%struct.__NSConstantString_tag = type { i32*, i32, i8*, i64 }
+%struct._prop_t = type { ptr, ptr }
+%struct.__NSConstantString_tag = type { ptr, i32, ptr, i64 }
 
 @.str = private unnamed_addr constant [8 x i8] c"%s: %s\0A\00", align 1
 @OBJC_METH_VAR_NAME_ = private unnamed_addr constant [25 x i8] c"fileSystemRepresentation\00", section "__TEXT,__objc_methname,cstring_literals", align 1
- at OBJC_SELECTOR_REFERENCES_ = internal externally_initialized global i8* getelementptr inbounds ([25 x i8], [25 x i8]* @OBJC_METH_VAR_NAME_, i32 0, i32 0), section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8
+ at OBJC_SELECTOR_REFERENCES_ = internal externally_initialized global ptr @OBJC_METH_VAR_NAME_, section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8
 @"OBJC_CLASS_$_NSString" = external global %struct._class_t
-@"OBJC_CLASSLIST_REFERENCES_$_" = internal global %struct._class_t* @"OBJC_CLASS_$_NSString", section "__DATA,__objc_classrefs,regular,no_dead_strip", align 8
+@"OBJC_CLASSLIST_REFERENCES_$_" = internal global ptr @"OBJC_CLASS_$_NSString", section "__DATA,__objc_classrefs,regular,no_dead_strip", align 8
 @__CFConstantStringClassReference = external global [0 x i32]
 @.str.1 = private unnamed_addr constant [3 x i8] c"%@\00", section "__TEXT,__cstring,cstring_literals", align 1
- at _unnamed_cfstring_ = private global %struct.__NSConstantString_tag { i32* getelementptr inbounds ([0 x i32], [0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i64 2 }, section "__DATA,__cfstring", align 8 #0
+ at _unnamed_cfstring_ = private global %struct.__NSConstantString_tag { ptr @__CFConstantStringClassReference, i32 1992, ptr @.str.1, i64 2 }, section "__DATA,__cfstring", align 8 #0
 @OBJC_METH_VAR_NAME_.2 = private unnamed_addr constant [18 x i8] c"stringWithFormat:\00", section "__TEXT,__objc_methname,cstring_literals", align 1
- at OBJC_SELECTOR_REFERENCES_.3 = internal externally_initialized global i8* getelementptr inbounds ([18 x i8], [18 x i8]* @OBJC_METH_VAR_NAME_.2, i32 0, i32 0), section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8
- at global1 = external local_unnamed_addr constant i8*, align 8
- at llvm.compiler.used = appending global [5 x i8*] [i8* getelementptr inbounds ([25 x i8], [25 x i8]* @OBJC_METH_VAR_NAME_, i32 0, i32 0), i8* bitcast (i8** @OBJC_SELECTOR_REFERENCES_ to i8*), i8* bitcast (%struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" to i8*), i8* getelementptr inbounds ([18 x i8], [18 x i8]* @OBJC_METH_VAR_NAME_.2, i32 0, i32 0), i8* bitcast (i8** @OBJC_SELECTOR_REFERENCES_.3 to i8*)], section "llvm.metadata"
+ at OBJC_SELECTOR_REFERENCES_.3 = internal externally_initialized global ptr @OBJC_METH_VAR_NAME_.2, section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8
+ at global1 = external local_unnamed_addr constant ptr, align 8
+ at llvm.compiler.used = appending global [5 x ptr] [ptr @OBJC_METH_VAR_NAME_, ptr @OBJC_SELECTOR_REFERENCES_, ptr @"OBJC_CLASSLIST_REFERENCES_$_", ptr @OBJC_METH_VAR_NAME_.2, ptr @OBJC_SELECTOR_REFERENCES_.3], section "llvm.metadata"
 
 ; Function Attrs: optsize ssp uwtable(sync)
-define i32 @main(i32 noundef %argc, i8** nocapture noundef readnone %argv) local_unnamed_addr #1 {
+define i32 @main(i32 noundef %argc, ptr nocapture noundef readnone %argv) local_unnamed_addr #1 {
 entry:
   %persistent = alloca i32, align 4
   %personalized = alloca i32, align 4
@@ -40,10 +40,8 @@ entry:
   br i1 %cmp31, label %for.body.lr.ph, label %for.cond.cleanup
 
 for.body.lr.ph:                                   ; preds = %entry
-  %0 = bitcast i32* %persistent to i8*
-  %1 = bitcast i32* %personalized to i8*
-  %2 = load i8*, i8** @OBJC_SELECTOR_REFERENCES_, align 8
-  %3 = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.3, align 8
+  %0 = load ptr, ptr @OBJC_SELECTOR_REFERENCES_, align 8
+  %1 = load ptr, ptr @OBJC_SELECTOR_REFERENCES_.3, align 8
   br label %for.body
 
 for.cond.cleanup.loopexit:                        ; preds = %if.end19
@@ -54,116 +52,113 @@ for.cond.cleanup:                                 ; preds = %for.cond.cleanup.lo
 
 for.body:                                         ; preds = %for.body.lr.ph, %if.end19
   %i.032 = phi i32 [ 1, %for.body.lr.ph ], [ %inc, %if.end19 ]
-  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) #4
-  store i32 0, i32* %persistent, align 4
-  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %1) #4
-  store i32 0, i32* %personalized, align 4
-  %call = call zeroext i1 @lookupType(i32* noundef nonnull %persistent, i32* noundef nonnull %personalized) #8, !clang.arc.no_objc_arc_exceptions !15
+  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %persistent) #4
+  store i32 0, ptr %persistent, align 4
+  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %personalized) #4
+  store i32 0, ptr %personalized, align 4
+  %call = call zeroext i1 @lookupType(ptr noundef nonnull %persistent, ptr noundef nonnull %personalized) #8, !clang.arc.no_objc_arc_exceptions !15
   br i1 %call, label %if.then, label %if.end19
 
 if.then:                                          ; preds = %for.body
-  %4 = load i32, i32* %persistent, align 4
-  %cmp1.not = icmp eq i32 %4, 0
+  %2 = load i32, ptr %persistent, align 4
+  %cmp1.not = icmp eq i32 %2, 0
   br i1 %cmp1.not, label %if.end, label %if.then2
 
 if.then2:                                         ; preds = %if.then
-  %call34 = call %0* bitcast (%0* (...)* @getnsstr to %0* ()*)() #8 [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
-  call void (...) @llvm.objc.clang.arc.noop.use(%0* %call34) #4
-  call void @llvm.objc.release(i8* null) #4, !clang.imprecise_release !15
-  %call56 = call %0* bitcast (%0* (...)* @getnsstr to %0* ()*)() #8 [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
-  call void (...) @llvm.objc.clang.arc.noop.use(%0* %call56) #4
-  call void @llvm.objc.release(i8* null) #4, !clang.imprecise_release !15
+  %call34 = call ptr @getnsstr() #8 [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %call34) #4
+  call void @llvm.objc.release(ptr null) #4, !clang.imprecise_release !15
+  %call56 = call ptr @getnsstr() #8 [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %call56) #4
+  call void @llvm.objc.release(ptr null) #4, !clang.imprecise_release !15
   br label %if.end
 
 if.end:                                           ; preds = %if.then2, %if.then
-  %path.0 = phi %0* [ %call34, %if.then2 ], [ null, %if.then ]
-  %name.0 = phi %0* [ %call56, %if.then2 ], [ null, %if.then ]
-  %5 = load i32, i32* %personalized, align 4
-  %cmp7.not = icmp eq i32 %5, 0
+  %path.0 = phi ptr [ %call34, %if.then2 ], [ null, %if.then ]
+  %name.0 = phi ptr [ %call56, %if.then2 ], [ null, %if.then ]
+  %3 = load i32, ptr %personalized, align 4
+  %cmp7.not = icmp eq i32 %3, 0
   br i1 %cmp7.not, label %if.end11, label %if.then8
 
 if.then8:                                         ; preds = %if.end
-  %call910 = call %0* bitcast (%0* (...)* @getnsstr to %0* ()*)() #8 [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
-  call void (...) @llvm.objc.clang.arc.noop.use(%0* %call910) #4
-  %6 = bitcast %0* %path.0 to i8*
-  call void @llvm.objc.release(i8* %6) #4, !clang.imprecise_release !15
+  %call910 = call ptr @getnsstr() #8 [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %call910) #4
+  call void @llvm.objc.release(ptr %path.0) #4, !clang.imprecise_release !15
   br label %if.end11
 
 if.end11:                                         ; preds = %if.then8, %if.end
-  %path.1 = phi %0* [ %call910, %if.then8 ], [ %path.0, %if.end ]
-  %cmp12.not = icmp eq %0* %path.1, null
+  %path.1 = phi ptr [ %call910, %if.then8 ], [ %path.0, %if.end ]
+  %cmp12.not = icmp eq ptr %path.1, null
   br i1 %cmp12.not, label %if.else, label %if.then13
 
 if.then13:                                        ; preds = %if.end11
-  %7 = bitcast %0* %path.1 to i8*
-  %call14 = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* noundef nonnull %7, i8* noundef %2) #8, !clang.arc.no_objc_arc_exceptions !15
-  %call15 = call i32 (i8*, ...) @printf(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i8* noundef %call14) #8, !clang.arc.no_objc_arc_exceptions !15
+  %call14 = call ptr @objc_msgSend(ptr noundef nonnull %path.1, ptr noundef %0) #8, !clang.arc.no_objc_arc_exceptions !15
+  %call15 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str, ptr noundef %call14) #8, !clang.arc.no_objc_arc_exceptions !15
   br label %if.end18
 
 if.else:                                          ; preds = %if.end11
-  %8 = load i8*, i8** bitcast (%struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" to i8**), align 8
-  %call1617 = call i8* (i8*, i8*, %0*, ...) bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, %0*, ...)*)(i8* noundef %8, i8* noundef %3, %0* noundef nonnull bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %0*), %0* noundef null) #8 [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
-  call void (...) @llvm.objc.clang.arc.noop.use(i8* %call1617) #4
-  call void @llvm.objc.release(i8* %call1617) #4, !clang.imprecise_release !15
+  %4 = load ptr, ptr @"OBJC_CLASSLIST_REFERENCES_$_", align 8
+  %call1617 = call ptr (ptr, ptr, ptr, ...) @objc_msgSend(ptr noundef %4, ptr noundef %1, ptr noundef nonnull @_unnamed_cfstring_, ptr noundef null) #8 [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ], !clang.arc.no_objc_arc_exceptions !15
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %call1617) #4
+  call void @llvm.objc.release(ptr %call1617) #4, !clang.imprecise_release !15
   br label %if.end18
 
 if.end18:                                         ; preds = %if.else, %if.then13
-  %.pre-phi = phi i8* [ null, %if.else ], [ %7, %if.then13 ]
-  %9 = bitcast %0* %name.0 to i8*
-  call void @llvm.objc.release(i8* %9) #4, !clang.imprecise_release !15
-  call void @llvm.objc.release(i8* %.pre-phi) #4, !clang.imprecise_release !15
+  %.pre-phi = phi ptr [ null, %if.else ], [ %path.1, %if.then13 ]
+  call void @llvm.objc.release(ptr %name.0) #4, !clang.imprecise_release !15
+  call void @llvm.objc.release(ptr %.pre-phi) #4, !clang.imprecise_release !15
   br label %if.end19
 
 if.end19:                                         ; preds = %if.end18, %for.body
-  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %1) #4
-  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) #4
+  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %personalized) #4
+  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %persistent) #4
   %inc = add nuw nsw i32 %i.032, 1
   %exitcond.not = icmp eq i32 %inc, %argc
   br i1 %exitcond.not, label %for.cond.cleanup.loopexit, label %for.body
 }
 
-; CHECK-LABEL: define i8* @foo() {
+; CHECK-LABEL: define ptr @foo() {
 ; CHECK-NOT: @llvm.objc
-; CHECK: ret i8* %
-
-define i8* @foo() {
-  %t = alloca i8*, align 8
-  %v4 = load i8*, i8** @global1, align 8
-  %v5 = tail call i8* @llvm.objc.retain(i8* %v4)
-  store i8* %v4, i8** %t, align 8
-  %v13 = load i8*, i8** bitcast (%struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" to i8**), align 8
-  %call78 = call i8* @bar(i8* %v13)
-  call void @llvm.objc.release(i8* %v4)
-  ret i8* %call78
+; CHECK: ret ptr %
+
+define ptr @foo() {
+  %t = alloca ptr, align 8
+  %v4 = load ptr, ptr @global1, align 8
+  %v5 = tail call ptr @llvm.objc.retain(ptr %v4)
+  store ptr %v4, ptr %t, align 8
+  %v13 = load ptr, ptr @"OBJC_CLASSLIST_REFERENCES_$_", align 8
+  %call78 = call ptr @bar(ptr %v13)
+  call void @llvm.objc.release(ptr %v4)
+  ret ptr %call78
 }
 
-declare i8* @bar(i8*)
+declare ptr @bar(ptr)
 
-declare i8* @llvm.objc.retain(i8*)
+declare ptr @llvm.objc.retain(ptr)
 
 ; Function Attrs: argmemonly mustprogress nocallback nofree nosync nounwind willreturn
-declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #2
+declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2
 
 ; Function Attrs: argmemonly mustprogress nocallback nofree nosync nounwind willreturn
-declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #2
+declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2
 
 ; Function Attrs: inaccessiblememonly mustprogress nocallback nofree nosync nounwind willreturn
 declare void @llvm.objc.clang.arc.noop.use(...) #5
 
-declare zeroext i1 @lookupType(i32* noundef, i32* noundef) #2
+declare zeroext i1 @lookupType(ptr noundef, ptr noundef) #2
 
-declare %0* @getnsstr(...) #2
+declare ptr @getnsstr(...) #2
 
 ; Function Attrs: nounwind
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) #3
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr) #3
 
 ; Function Attrs: nounwind
-declare void @llvm.objc.release(i8*) #3
+declare void @llvm.objc.release(ptr) #3
 
-declare i32 @printf(i8* noundef, ...) #2
+declare i32 @printf(ptr noundef, ...) #2
 
 ; Function Attrs: nonlazybind
-declare i8* @objc_msgSend(i8*, i8*, ...) #4
+declare ptr @objc_msgSend(ptr, ptr, ...) #4
 
 attributes #0 = { "objc_arc_inert" }
 

diff  --git a/llvm/test/Transforms/ObjCARC/retain-block-side-effects.ll b/llvm/test/Transforms/ObjCARC/retain-block-side-effects.ll
index 6adb86411e1e..b43c49c193c4 100644
--- a/llvm/test/Transforms/ObjCARC/retain-block-side-effects.ll
+++ b/llvm/test/Transforms/ObjCARC/retain-block-side-effects.ll
@@ -4,39 +4,35 @@
 ; objc_retainBlock stores into %repeater so the load from after the
 ; call isn't forwardable from the store before the call.
 
-; CHECK: %tmp16 = call i8* @llvm.objc.retainBlock(i8* %tmp15) [[NUW:#[0-9]+]]
-; CHECK: %tmp17 = bitcast i8* %tmp16 to void ()*
-; CHECK: %tmp18 = load %struct.__block_byref_repeater*, %struct.__block_byref_repeater** %byref.forwarding, align 8
-; CHECK: %repeater12 = getelementptr inbounds %struct.__block_byref_repeater, %struct.__block_byref_repeater* %tmp18, i64 0, i32 6
-; CHECK: store void ()* %tmp17, void ()** %repeater12, align 8
+; CHECK: %tmp16 = call ptr @llvm.objc.retainBlock(ptr %block) [[NUW:#[0-9]+]]
+; CHECK: %tmp18 = load ptr, ptr %byref.forwarding, align 8
+; CHECK: %repeater12 = getelementptr inbounds %struct.__block_byref_repeater, ptr %tmp18, i64 0, i32 6
+; CHECK: store ptr %tmp16, ptr %repeater12, align 8
 
 target 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"
 
 %0 = type opaque
-%struct.__block_byref_repeater = type { i8*, %struct.__block_byref_repeater*, i32, i32, i8*, i8*, void ()* }
+%struct.__block_byref_repeater = type { ptr, ptr, i32, i32, ptr, ptr, ptr }
 %struct.__block_descriptor = type { i64, i64 }
 
 define void @foo() noreturn {
 entry:
   %repeater = alloca %struct.__block_byref_repeater, align 8
-  %block = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0*, i8* }>, align 8
-  %byref.forwarding = getelementptr inbounds %struct.__block_byref_repeater, %struct.__block_byref_repeater* %repeater, i64 0, i32 1
-  %tmp10 = getelementptr inbounds %struct.__block_byref_repeater, %struct.__block_byref_repeater* %repeater, i64 0, i32 6
-  store void ()* null, void ()** %tmp10, align 8
-  %block.captured11 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0*, i8* }>* %block, i64 0, i32 6
-  %tmp14 = bitcast %struct.__block_byref_repeater* %repeater to i8*
-  store i8* %tmp14, i8** %block.captured11, align 8
-  %tmp15 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0*, i8* }>* %block to i8*
-  %tmp16 = call i8* @llvm.objc.retainBlock(i8* %tmp15) nounwind
-  %tmp17 = bitcast i8* %tmp16 to void ()*
-  %tmp18 = load %struct.__block_byref_repeater*, %struct.__block_byref_repeater** %byref.forwarding, align 8
-  %repeater12 = getelementptr inbounds %struct.__block_byref_repeater, %struct.__block_byref_repeater* %tmp18, i64 0, i32 6
-  %tmp13 = load void ()*, void ()** %repeater12, align 8
-  store void ()* %tmp17, void ()** %repeater12, align 8
+  %block = alloca <{ ptr, i32, i32, ptr, ptr, ptr, ptr }>, align 8
+  %byref.forwarding = getelementptr inbounds %struct.__block_byref_repeater, ptr %repeater, i64 0, i32 1
+  %tmp10 = getelementptr inbounds %struct.__block_byref_repeater, ptr %repeater, i64 0, i32 6
+  store ptr null, ptr %tmp10, align 8
+  %block.captured11 = getelementptr inbounds <{ ptr, i32, i32, ptr, ptr, ptr, ptr }>, ptr %block, i64 0, i32 6
+  store ptr %repeater, ptr %block.captured11, align 8
+  %tmp16 = call ptr @llvm.objc.retainBlock(ptr %block) nounwind
+  %tmp18 = load ptr, ptr %byref.forwarding, align 8
+  %repeater12 = getelementptr inbounds %struct.__block_byref_repeater, ptr %tmp18, i64 0, i32 6
+  %tmp13 = load ptr, ptr %repeater12, align 8
+  store ptr %tmp16, ptr %repeater12, align 8
   ret void
 }
 
-declare i8* @llvm.objc.retainBlock(i8*)
+declare ptr @llvm.objc.retainBlock(ptr)
 
 ; CHECK: attributes #0 = { noreturn }
 ; CHECK: attributes [[NUW]] = { nounwind }

diff  --git a/llvm/test/Transforms/ObjCARC/retain-not-declared.ll b/llvm/test/Transforms/ObjCARC/retain-not-declared.ll
index a20ec8dd6c85..9d551d93e83c 100644
--- a/llvm/test/Transforms/ObjCARC/retain-not-declared.ll
+++ b/llvm/test/Transforms/ObjCARC/retain-not-declared.ll
@@ -1,28 +1,28 @@
 ; RUN: opt -S -passes=objc-arc,objc-arc-contract < %s | FileCheck %s
 
 target 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"
-declare i8* @llvm.objc.unretainedObject(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @objc_msgSend(i8*, i8*, ...)
-declare void @llvm.objc.release(i8*)
+declare ptr @llvm.objc.unretainedObject(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @objc_msgSend(ptr, ptr, ...)
+declare void @llvm.objc.release(ptr)
 
 ; Test that the optimizer can create an objc_retainAutoreleaseReturnValue
 ; declaration even if no objc_retain declaration exists.
 ; rdar://9401303
 
-; CHECK:      define i8* @test0(i8* %p) {
+; CHECK:      define ptr @test0(ptr %p) {
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %0 = tail call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %p) [[NUW:#[0-9]+]]
-; CHECK-NEXT:   ret i8* %0
+; CHECK-NEXT:   %0 = tail call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %p) [[NUW:#[0-9]+]]
+; CHECK-NEXT:   ret ptr %0
 ; CHECK-NEXT: }
 
-define i8* @test0(i8* %p) {
+define ptr @test0(ptr %p) {
 entry:
-  %call = tail call i8* @llvm.objc.unretainedObject(i8* %p)
-  %0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %1 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %call) nounwind
-  ret i8* %call
+  %call = tail call ptr @llvm.objc.unretainedObject(ptr %p)
+  %0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  %1 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call) nounwind
+  ret ptr %call
 }
 
 ; Properly create the @llvm.objc.retain declaration when it doesn't already exist.
@@ -34,31 +34,31 @@ entry:
 ; CHECK: @llvm.objc.release
 ; CHECK: @llvm.objc.release
 ; CHECK: }
-define void @test1(i8* %call88) nounwind personality i32 (...)* @__gxx_personality_v0 {
+define void @test1(ptr %call88) nounwind personality ptr @__gxx_personality_v0 {
 entry:
-  %tmp1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call88) nounwind
-  %call94 = invoke i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*)*)(i8* %tmp1)
+  %tmp1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call88) nounwind
+  %call94 = invoke ptr @objc_msgSend(ptr %tmp1)
           to label %invoke.cont93 unwind label %lpad91
 
 invoke.cont93:                                    ; preds = %entry
-  %tmp2 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call94) nounwind
-  call void @llvm.objc.release(i8* %tmp1) nounwind
-  invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %tmp2)
+  %tmp2 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call94) nounwind
+  call void @llvm.objc.release(ptr %tmp1) nounwind
+  invoke void @objc_msgSend(ptr %tmp2)
           to label %invoke.cont102 unwind label %lpad100
 
 invoke.cont102:                                   ; preds = %invoke.cont93
-  call void @llvm.objc.release(i8* %tmp2) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %tmp2) nounwind, !clang.imprecise_release !0
   unreachable
 
 lpad91:                                           ; preds = %entry
-  %exn91 = landingpad {i8*, i32}
+  %exn91 = landingpad {ptr, i32}
               cleanup
   unreachable
 
 lpad100:                                          ; preds = %invoke.cont93
-  %exn100 = landingpad {i8*, i32}
+  %exn100 = landingpad {ptr, i32}
               cleanup
-  call void @llvm.objc.release(i8* %tmp2) nounwind, !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %tmp2) nounwind, !clang.imprecise_release !0
   unreachable
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/rle-s2l.ll b/llvm/test/Transforms/ObjCARC/rle-s2l.ll
index d62147875a55..f2d47f08de65 100644
--- a/llvm/test/Transforms/ObjCARC/rle-s2l.ll
+++ b/llvm/test/Transforms/ObjCARC/rle-s2l.ll
@@ -1,136 +1,136 @@
 ; RUN: opt -S -passes=objc-arc < %s | FileCheck %s
 
-declare i8* @llvm.objc.loadWeak(i8**)
-declare i8* @llvm.objc.loadWeakRetained(i8**)
-declare i8* @llvm.objc.storeWeak(i8**, i8*)
-declare i8* @llvm.objc.initWeak(i8**, i8*)
-declare void @use_pointer(i8*)
+declare ptr @llvm.objc.loadWeak(ptr)
+declare ptr @llvm.objc.loadWeakRetained(ptr)
+declare ptr @llvm.objc.storeWeak(ptr, ptr)
+declare ptr @llvm.objc.initWeak(ptr, ptr)
+declare void @use_pointer(ptr)
 declare void @callee()
 
 ; Basic redundant @llvm.objc.loadWeak elimination.
 
-; CHECK:      define void @test0(i8** %p) {
-; CHECK-NEXT:   %y = call i8* @llvm.objc.loadWeak(i8** %p)
-; CHECK-NEXT:   call void @use_pointer(i8* %y)
+; CHECK:      define void @test0(ptr %p) {
+; CHECK-NEXT:   %y = call ptr @llvm.objc.loadWeak(ptr %p)
+; CHECK-NEXT:   call void @use_pointer(ptr %y)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test0(i8** %p) {
-  %x = call i8* @llvm.objc.loadWeak(i8** %p)
-  %y = call i8* @llvm.objc.loadWeak(i8** %p)
-  call void @use_pointer(i8* %y)
+define void @test0(ptr %p) {
+  %x = call ptr @llvm.objc.loadWeak(ptr %p)
+  %y = call ptr @llvm.objc.loadWeak(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 
 ; DCE the @llvm.objc.loadWeak.
 
-; CHECK:      define void @test1(i8** %p) {
-; CHECK-NEXT:   %y = call i8* @llvm.objc.loadWeakRetained(i8** %p)
-; CHECK-NEXT:   call void @use_pointer(i8* %y)
+; CHECK:      define void @test1(ptr %p) {
+; CHECK-NEXT:   %y = call ptr @llvm.objc.loadWeakRetained(ptr %p)
+; CHECK-NEXT:   call void @use_pointer(ptr %y)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test1(i8** %p) {
-  %x = call i8* @llvm.objc.loadWeak(i8** %p)
-  %y = call i8* @llvm.objc.loadWeakRetained(i8** %p)
-  call void @use_pointer(i8* %y)
+define void @test1(ptr %p) {
+  %x = call ptr @llvm.objc.loadWeak(ptr %p)
+  %y = call ptr @llvm.objc.loadWeakRetained(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 
 ; Basic redundant @llvm.objc.loadWeakRetained elimination.
 
-; CHECK:      define void @test2(i8** %p) {
-; CHECK-NEXT:   %x = call i8* @llvm.objc.loadWeak(i8** %p)
-; CHECK-NEXT:   store i8 3, i8* %x
-; CHECK-NEXT:   %1 = tail call i8* @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
+; CHECK:      define void @test2(ptr %p) {
+; CHECK-NEXT:   %x = call ptr @llvm.objc.loadWeak(ptr %p)
+; CHECK-NEXT:   store i8 3, ptr %x
+; CHECK-NEXT:   %1 = tail call ptr @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test2(i8** %p) {
-  %x = call i8* @llvm.objc.loadWeak(i8** %p)
-  store i8 3, i8* %x
-  %y = call i8* @llvm.objc.loadWeakRetained(i8** %p)
-  call void @use_pointer(i8* %y)
+define void @test2(ptr %p) {
+  %x = call ptr @llvm.objc.loadWeak(ptr %p)
+  store i8 3, ptr %x
+  %y = call ptr @llvm.objc.loadWeakRetained(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 
 ; Basic redundant @llvm.objc.loadWeakRetained elimination, this time
 ; with a readonly call instead of a store.
 
-; CHECK:      define void @test3(i8** %p) {
-; CHECK-NEXT:   %x = call i8* @llvm.objc.loadWeak(i8** %p)
-; CHECK-NEXT:   call void @use_pointer(i8* %x) [[RO:#[0-9]+]]
-; CHECK-NEXT:   %1 = tail call i8* @llvm.objc.retain(i8* %x)
-; CHECK-NEXT:   call void @use_pointer(i8* %x)
+; CHECK:      define void @test3(ptr %p) {
+; CHECK-NEXT:   %x = call ptr @llvm.objc.loadWeak(ptr %p)
+; CHECK-NEXT:   call void @use_pointer(ptr %x) [[RO:#[0-9]+]]
+; CHECK-NEXT:   %1 = tail call ptr @llvm.objc.retain(ptr %x)
+; CHECK-NEXT:   call void @use_pointer(ptr %x)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test3(i8** %p) {
-  %x = call i8* @llvm.objc.loadWeak(i8** %p)
-  call void @use_pointer(i8* %x) readonly
-  %y = call i8* @llvm.objc.loadWeakRetained(i8** %p)
-  call void @use_pointer(i8* %y)
+define void @test3(ptr %p) {
+  %x = call ptr @llvm.objc.loadWeak(ptr %p)
+  call void @use_pointer(ptr %x) readonly
+  %y = call ptr @llvm.objc.loadWeakRetained(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 
 ; A regular call blocks redundant weak load elimination.
 
-; CHECK:      define void @test4(i8** %p) {
-; CHECK-NEXT:   %x = call i8* @llvm.objc.loadWeak(i8** %p)
-; CHECK-NEXT:   call void @use_pointer(i8* %x) [[RO]]
+; CHECK:      define void @test4(ptr %p) {
+; CHECK-NEXT:   %x = call ptr @llvm.objc.loadWeak(ptr %p)
+; CHECK-NEXT:   call void @use_pointer(ptr %x) [[RO]]
 ; CHECK-NEXT:   call void @callee()
-; CHECK-NEXT:   %y = call i8* @llvm.objc.loadWeak(i8** %p)
-; CHECK-NEXT:   call void @use_pointer(i8* %y)
+; CHECK-NEXT:   %y = call ptr @llvm.objc.loadWeak(ptr %p)
+; CHECK-NEXT:   call void @use_pointer(ptr %y)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test4(i8** %p) {
-  %x = call i8* @llvm.objc.loadWeak(i8** %p)
-  call void @use_pointer(i8* %x) readonly
+define void @test4(ptr %p) {
+  %x = call ptr @llvm.objc.loadWeak(ptr %p)
+  call void @use_pointer(ptr %x) readonly
   call void @callee()
-  %y = call i8* @llvm.objc.loadWeak(i8** %p)
-  call void @use_pointer(i8* %y)
+  %y = call ptr @llvm.objc.loadWeak(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 
 ; Store to load forwarding.
 
-; CHECK:      define void @test5(i8** %p, i8* %n) {
-; CHECK-NEXT:   %1 = call i8* @llvm.objc.storeWeak(i8** %p, i8* %n)
-; CHECK-NEXT:   call void @use_pointer(i8* %n)
+; CHECK:      define void @test5(ptr %p, ptr %n) {
+; CHECK-NEXT:   %1 = call ptr @llvm.objc.storeWeak(ptr %p, ptr %n)
+; CHECK-NEXT:   call void @use_pointer(ptr %n)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test5(i8** %p, i8* %n) {
-  call i8* @llvm.objc.storeWeak(i8** %p, i8* %n)
-  %y = call i8* @llvm.objc.loadWeak(i8** %p)
-  call void @use_pointer(i8* %y)
+define void @test5(ptr %p, ptr %n) {
+  call ptr @llvm.objc.storeWeak(ptr %p, ptr %n)
+  %y = call ptr @llvm.objc.loadWeak(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 
 ; Store to load forwarding with objc_initWeak.
 
-; CHECK:      define void @test6(i8** %p, i8* %n) {
-; CHECK-NEXT:   %1 = call i8* @llvm.objc.initWeak(i8** %p, i8* %n)
-; CHECK-NEXT:   call void @use_pointer(i8* %n)
+; CHECK:      define void @test6(ptr %p, ptr %n) {
+; CHECK-NEXT:   %1 = call ptr @llvm.objc.initWeak(ptr %p, ptr %n)
+; CHECK-NEXT:   call void @use_pointer(ptr %n)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test6(i8** %p, i8* %n) {
-  call i8* @llvm.objc.initWeak(i8** %p, i8* %n)
-  %y = call i8* @llvm.objc.loadWeak(i8** %p)
-  call void @use_pointer(i8* %y)
+define void @test6(ptr %p, ptr %n) {
+  call ptr @llvm.objc.initWeak(ptr %p, ptr %n)
+  %y = call ptr @llvm.objc.loadWeak(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 
 ; Don't forward if there's a may-alias store in the way.
 
-; CHECK:      define void @test7(i8** %p, i8* %n, i8** %q, i8* %m) {
-; CHECK-NEXT:   call i8* @llvm.objc.initWeak(i8** %p, i8* %n)
-; CHECK-NEXT:   call i8* @llvm.objc.storeWeak(i8** %q, i8* %m)
-; CHECK-NEXT:   %y = call i8* @llvm.objc.loadWeak(i8** %p)
-; CHECK-NEXT:   call void @use_pointer(i8* %y)
+; CHECK:      define void @test7(ptr %p, ptr %n, ptr %q, ptr %m) {
+; CHECK-NEXT:   call ptr @llvm.objc.initWeak(ptr %p, ptr %n)
+; CHECK-NEXT:   call ptr @llvm.objc.storeWeak(ptr %q, ptr %m)
+; CHECK-NEXT:   %y = call ptr @llvm.objc.loadWeak(ptr %p)
+; CHECK-NEXT:   call void @use_pointer(ptr %y)
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
-define void @test7(i8** %p, i8* %n, i8** %q, i8* %m) {
-  call i8* @llvm.objc.initWeak(i8** %p, i8* %n)
-  call i8* @llvm.objc.storeWeak(i8** %q, i8* %m)
-  %y = call i8* @llvm.objc.loadWeak(i8** %p)
-  call void @use_pointer(i8* %y)
+define void @test7(ptr %p, ptr %n, ptr %q, ptr %m) {
+  call ptr @llvm.objc.initWeak(ptr %p, ptr %n)
+  call ptr @llvm.objc.storeWeak(ptr %q, ptr %m)
+  %y = call ptr @llvm.objc.loadWeak(ptr %p)
+  call void @use_pointer(ptr %y)
   ret void
 }
 

diff  --git a/llvm/test/Transforms/ObjCARC/rv.ll b/llvm/test/Transforms/ObjCARC/rv.ll
index e0c1de29c169..ae35d28e5b01 100644
--- a/llvm/test/Transforms/ObjCARC/rv.ll
+++ b/llvm/test/Transforms/ObjCARC/rv.ll
@@ -2,27 +2,27 @@
 
 target datalayout = "e-p:64:64:64"
 
-declare i8* @llvm.objc.retain(i8*)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.autorelease(i8*)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*)
-declare void @llvm.objc.autoreleasePoolPop(i8*)
+declare ptr @llvm.objc.retain(ptr)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
+declare void @llvm.objc.release(ptr)
+declare ptr @llvm.objc.autorelease(ptr)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.retainAutoreleaseReturnValue(ptr)
+declare void @llvm.objc.autoreleasePoolPop(ptr)
 declare void @llvm.objc.autoreleasePoolPush()
-declare i8* @llvm.objc.retainBlock(i8*)
+declare ptr @llvm.objc.retainBlock(ptr)
 declare void @llvm.objc.clang.arc.noop.use(...)
 
-declare i8* @objc_retainedObject(i8*)
-declare i8* @objc_unretainedObject(i8*)
-declare i8* @objc_unretainedPointer(i8*)
+declare ptr @objc_retainedObject(ptr)
+declare ptr @objc_unretainedObject(ptr)
+declare ptr @objc_unretainedPointer(ptr)
 
-declare void @use_pointer(i8*)
+declare void @use_pointer(ptr)
 declare void @callee()
-declare void @callee_fnptr(void ()*)
+declare void @callee_fnptr(ptr)
 declare void @invokee()
-declare i8* @returner()
-declare i8* @returner1(i8*)
+declare ptr @returner()
+declare ptr @returner1(ptr)
 declare i32 @__gxx_personality_v0(...)
 
 ; Test that retain+release elimination is suppressed when the
@@ -31,27 +31,27 @@ declare i32 @__gxx_personality_v0(...)
 
 ; CHECK-LABEL:      define void @test0(
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %x = call i8* @returner
-; CHECK-NEXT:   %0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x) [[NUW:#[0-9]+]]
+; CHECK-NEXT:   %x = call ptr @returner
+; CHECK-NEXT:   %0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x) [[NUW:#[0-9]+]]
 ; CHECK: t:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: return:
-; CHECK-NEXT: call void @llvm.objc.release(i8* %x)
+; CHECK-NEXT: call void @llvm.objc.release(ptr %x)
 ; CHECK-NEXT: ret void
 ; CHECK-NEXT: }
 define void @test0(i1 %p) nounwind {
 entry:
-  %x = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x)
+  %x = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x)
   br i1 %p, label %t, label %return
 
 t:
-  call void @use_pointer(i8* %x)
-  store i8 0, i8* %x
+  call void @use_pointer(ptr %x)
+  store i8 0, ptr %x
   br label %return
 
 return:
-  call void @llvm.objc.release(i8* %x) nounwind
+  call void @llvm.objc.release(ptr %x) nounwind
   ret void
 }
 
@@ -61,57 +61,56 @@ return:
 ; CHECK-NOT: @llvm.objc.
 ; CHECK: }
 define void @test2() {
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* null)
-  call i8* @llvm.objc.autoreleaseReturnValue(i8* null)
-  ; call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* null) ; TODO
-  %bitcast = bitcast i32* null to i8*
-  %rb = call i8* @llvm.objc.retainBlock(i8* %bitcast)
-  call void @use_pointer(i8* %rb)
-  %rb2 = call i8* @llvm.objc.retainBlock(i8* undef)
-  call void @use_pointer(i8* %rb2)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr null)
+  call ptr @llvm.objc.autoreleaseReturnValue(ptr null)
+  ; call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr null) ; TODO
+  %rb = call ptr @llvm.objc.retainBlock(ptr null)
+  call void @use_pointer(ptr %rb)
+  %rb2 = call ptr @llvm.objc.retainBlock(ptr undef)
+  call void @use_pointer(ptr %rb2)
   ret void
 }
 
 ; Delete a redundant retainRV,autoreleaseRV when forwaring a call result
 ; directly to a return value.
 
-; CHECK-LABEL: define i8* @test3(
-; CHECK: call i8* @returner()
-; CHECK-NEXT: ret i8* %call
-define i8* @test3() {
+; CHECK-LABEL: define ptr @test3(
+; CHECK: call ptr @returner()
+; CHECK-NEXT: ret ptr %call
+define ptr @test3() {
 entry:
-  %call = tail call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %1 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %0) nounwind
-  ret i8* %1
+  %call = tail call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  %1 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %0) nounwind
+  ret ptr %1
 }
 
 ; Delete a redundant retain,autoreleaseRV when forwaring a call result
 ; directly to a return value.
 
-; CHECK-LABEL: define i8* @test4(
-; CHECK: call i8* @returner()
-; CHECK-NEXT: ret i8* %call
-define i8* @test4() {
+; CHECK-LABEL: define ptr @test4(
+; CHECK: call ptr @returner()
+; CHECK-NEXT: ret ptr %call
+define ptr @test4() {
 entry:
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retain(i8* %call) nounwind
-  %1 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %0) nounwind
-  ret i8* %1
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retain(ptr %call) nounwind
+  %1 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %0) nounwind
+  ret ptr %1
 }
 
 ; Delete a redundant fused retain+autoreleaseRV when forwaring a call result
 ; directly to a return value.
 
 ; TODO
-; HECK: define i8* @test5
-; HECK: call i8* @returner()
-; HECK-NEXT: ret i8* %call
-;define i8* @test5() {
+; HECK: define ptr @test5
+; HECK: call ptr @returner()
+; HECK-NEXT: ret ptr %call
+;define ptr @test5() {
 ;entry:
-;  %call = call i8* @returner()
-;  %0 = call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %call) nounwind
-;  ret i8* %0
+;  %call = call ptr @returner()
+;  %0 = call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %call) nounwind
+;  ret ptr %0
 ;}
 
 ; Don't eliminate objc_retainAutoreleasedReturnValue by merging it into
@@ -122,100 +121,100 @@ entry:
 ; into objc_retainAutoreleasedReturnValueAutoreleaseReturnValue?
 ; Those entrypoints don't exist yet though.
 
-; CHECK-LABEL: define i8* @test7(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
-; CHECK: %t = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-define i8* @test7() {
-  %p = call i8* @returner()
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
-  %t = call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-  call void @use_pointer(i8* %p)
-  ret i8* %t
+; CHECK-LABEL: define ptr @test7(
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
+; CHECK: %t = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+define ptr @test7() {
+  %p = call ptr @returner()
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
+  %t = call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+  call void @use_pointer(ptr %p)
+  ret ptr %t
 }
 
-; CHECK-LABEL: define i8* @test7b(
-; CHECK: call i8* @llvm.objc.retain(i8* %p)
-; CHECK: %t = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-define i8* @test7b() {
-  %p = call i8* @returner()
-  call void @use_pointer(i8* %p)
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
-  %t = call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-  ret i8* %p
+; CHECK-LABEL: define ptr @test7b(
+; CHECK: call ptr @llvm.objc.retain(ptr %p)
+; CHECK: %t = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+define ptr @test7b() {
+  %p = call ptr @returner()
+  call void @use_pointer(ptr %p)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
+  %t = call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+  ret ptr %p
 }
 
 ; Don't apply the RV optimization to autorelease if there's no retain.
 
-; CHECK: define i8* @test9(i8* %p)
-; CHECK: call i8* @llvm.objc.autorelease(i8* %p)
-define i8* @test9(i8* %p) {
-  call i8* @llvm.objc.autorelease(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test9(ptr %p)
+; CHECK: call ptr @llvm.objc.autorelease(ptr %p)
+define ptr @test9(ptr %p) {
+  call ptr @llvm.objc.autorelease(ptr %p)
+  ret ptr %p
 }
 
 ; Do not apply the RV optimization.
 
-; CHECK: define i8* @test10(i8* %p)
-; CHECK: tail call i8* @llvm.objc.retain(i8* %p) [[NUW]]
-; CHECK: call i8* @llvm.objc.autorelease(i8* %p) [[NUW]]
-; CHECK-NEXT: ret i8* %p
-define i8* @test10(i8* %p) {
-  %1 = call i8* @llvm.objc.retain(i8* %p)
-  %2 = call i8* @llvm.objc.autorelease(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test10(ptr %p)
+; CHECK: tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
+; CHECK: call ptr @llvm.objc.autorelease(ptr %p) [[NUW]]
+; CHECK-NEXT: ret ptr %p
+define ptr @test10(ptr %p) {
+  %1 = call ptr @llvm.objc.retain(ptr %p)
+  %2 = call ptr @llvm.objc.autorelease(ptr %p)
+  ret ptr %p
 }
 
 ; Don't do the autoreleaseRV optimization because @use_pointer
 ; could undo the retain.
 
-; CHECK: define i8* @test11(i8* %p)
-; CHECK: tail call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: call void @use_pointer(i8* %p)
-; CHECK: call i8* @llvm.objc.autorelease(i8* %p)
-; CHECK-NEXT: ret i8* %p
-define i8* @test11(i8* %p) {
-  %1 = call i8* @llvm.objc.retain(i8* %p)
-  call void @use_pointer(i8* %p)
-  %2 = call i8* @llvm.objc.autorelease(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test11(ptr %p)
+; CHECK: tail call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: call void @use_pointer(ptr %p)
+; CHECK: call ptr @llvm.objc.autorelease(ptr %p)
+; CHECK-NEXT: ret ptr %p
+define ptr @test11(ptr %p) {
+  %1 = call ptr @llvm.objc.retain(ptr %p)
+  call void @use_pointer(ptr %p)
+  %2 = call ptr @llvm.objc.autorelease(ptr %p)
+  ret ptr %p
 }
 
 ; Don't spoil the RV optimization.
 
-; CHECK: define i8* @test12(i8* %p)
-; CHECK: tail call i8* @llvm.objc.retain(i8* %p)
-; CHECK: call void @use_pointer(i8* %p)
-; CHECK: tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-; CHECK: ret i8* %p
-define i8* @test12(i8* %p) {
-  %1 = call i8* @llvm.objc.retain(i8* %p)
-  call void @use_pointer(i8* %p)
-  %2 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test12(ptr %p)
+; CHECK: tail call ptr @llvm.objc.retain(ptr %p)
+; CHECK: call void @use_pointer(ptr %p)
+; CHECK: tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+; CHECK: ret ptr %p
+define ptr @test12(ptr %p) {
+  %1 = call ptr @llvm.objc.retain(ptr %p)
+  call void @use_pointer(ptr %p)
+  %2 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+  ret ptr %p
 }
 
 ; Don't zap the objc_retainAutoreleasedReturnValue.
 
-; CHECK-LABEL: define i8* @test13(
-; CHECK: tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
-; CHECK: call i8* @llvm.objc.autorelease(i8* %p)
-; CHECK: ret i8* %p
-define i8* @test13() {
-  %p = call i8* @returner()
-  %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
+; CHECK-LABEL: define ptr @test13(
+; CHECK: tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
+; CHECK: call ptr @llvm.objc.autorelease(ptr %p)
+; CHECK: ret ptr %p
+define ptr @test13() {
+  %p = call ptr @returner()
+  %1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
   call void @callee()
-  %2 = call i8* @llvm.objc.autorelease(i8* %p)
-  ret i8* %p
+  %2 = call ptr @llvm.objc.autorelease(ptr %p)
+  ret ptr %p
 }
 
 ; Convert objc_retainAutoreleasedReturnValue to objc_retain if its
 ; argument is not a return value.
 
 ; CHECK-LABEL: define void @test14(
-; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %p) [[NUW]]
+; CHECK-NEXT: tail call ptr @llvm.objc.retain(ptr %p) [[NUW]]
 ; CHECK-NEXT: ret void
-define void @test14(i8* %p) {
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
+define void @test14(ptr %p) {
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
   ret void
 }
 
@@ -223,102 +222,101 @@ define void @test14(i8* %p) {
 ; argument is a return value.
 
 ; CHECK-LABEL: define void @test15(
-; CHECK-NEXT: %y = call i8* @returner()
-; CHECK-NEXT: tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y) [[NUW]]
+; CHECK-NEXT: %y = call ptr @returner()
+; CHECK-NEXT: tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %y) [[NUW]]
 ; CHECK-NEXT: ret void
 define void @test15() {
-  %y = call i8* @returner()
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y)
+  %y = call ptr @returner()
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %y)
   ret void
 }
 
 ; Delete autoreleaseRV+retainRV pairs.
 
-; CHECK: define i8* @test19(i8* %p) {
-; CHECK-NEXT: ret i8* %p
-define i8* @test19(i8* %p) {
-  call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test19(ptr %p) {
+; CHECK-NEXT: ret ptr %p
+define ptr @test19(ptr %p) {
+  call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
+  ret ptr %p
 }
 
 ; Delete autoreleaseRV+retainRV pairs when they have equivalent PHIs as inputs
 
-; CHECK: define i8* @test19phi(i8* %p) {
+; CHECK: define ptr @test19phi(ptr %p) {
 ; CHECK-NEXT: entry:
 ; CHECK-NEXT: br label %test19bb
 ; CHECK: test19bb:
-; CHECK-NEXT: ret i8* %p
-define i8* @test19phi(i8* %p) {
+; CHECK-NEXT: ret ptr %p
+define ptr @test19phi(ptr %p) {
 entry:
   br label %test19bb
 test19bb:
-  %phi1 = phi i8* [ %p, %entry ]
-  %phi2 = phi i8* [ %p, %entry ]
-  call i8* @llvm.objc.autoreleaseReturnValue(i8* %phi1)
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %phi2)
-  ret i8* %p
+  %phi1 = phi ptr [ %p, %entry ]
+  %phi2 = phi ptr [ %p, %entry ]
+  call ptr @llvm.objc.autoreleaseReturnValue(ptr %phi1)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %phi2)
+  ret ptr %p
 }
 
 ; Like test19 but with plain autorelease.
 
-; CHECK: define i8* @test20(i8* %p) {
-; CHECK-NEXT: call i8* @llvm.objc.autorelease(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: ret i8* %p
-define i8* @test20(i8* %p) {
-  call i8* @llvm.objc.autorelease(i8* %p)
-  call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test20(ptr %p) {
+; CHECK-NEXT: call ptr @llvm.objc.autorelease(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: ret ptr %p
+define ptr @test20(ptr %p) {
+  call ptr @llvm.objc.autorelease(ptr %p)
+  call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %p)
+  ret ptr %p
 }
 
 ; Like test19 but with plain retain.
 
-; CHECK: define i8* @test21(i8* %p) {
-; CHECK-NEXT: call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: ret i8* %p
-define i8* @test21(i8* %p) {
-  call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-  call i8* @llvm.objc.retain(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test21(ptr %p) {
+; CHECK-NEXT: call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: ret ptr %p
+define ptr @test21(ptr %p) {
+  call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  ret ptr %p
 }
 
 ; Like test19 but with plain retain and autorelease.
 
-; CHECK: define i8* @test22(i8* %p) {
-; CHECK-NEXT: call i8* @llvm.objc.autorelease(i8* %p)
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: ret i8* %p
-define i8* @test22(i8* %p) {
-  call i8* @llvm.objc.autorelease(i8* %p)
-  call i8* @llvm.objc.retain(i8* %p)
-  ret i8* %p
+; CHECK: define ptr @test22(ptr %p) {
+; CHECK-NEXT: call ptr @llvm.objc.autorelease(ptr %p)
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: ret ptr %p
+define ptr @test22(ptr %p) {
+  call ptr @llvm.objc.autorelease(ptr %p)
+  call ptr @llvm.objc.retain(ptr %p)
+  ret ptr %p
 }
 
 ; Convert autoreleaseRV to autorelease.
 
 ; CHECK-LABEL: define void @test23(
-; CHECK: call i8* @llvm.objc.autorelease(i8* %p) [[NUW]]
-define void @test23(i8* %p) {
-  store i8 0, i8* %p
-  call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
+; CHECK: call ptr @llvm.objc.autorelease(ptr %p) [[NUW]]
+define void @test23(ptr %p) {
+  store i8 0, ptr %p
+  call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
   ret void
 }
 
 ; Don't convert autoreleaseRV to autorelease if the result is returned,
 ; even through a bitcast.
 
-; CHECK-LABEL: define {}* @test24(
-; CHECK: tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-define {}* @test24(i8* %p) {
-  %t = call i8* @llvm.objc.autoreleaseReturnValue(i8* %p)
-  %s = bitcast i8* %p to {}*
-  ret {}* %s
+; CHECK-LABEL: define ptr @test24(
+; CHECK: tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+define ptr @test24(ptr %p) {
+  %t = call ptr @llvm.objc.autoreleaseReturnValue(ptr %p)
+  ret ptr %p
 }
 
-declare i8* @first_test25();
-declare i8* @second_test25(i8*);
+declare ptr @first_test25();
+declare ptr @second_test25(ptr);
 declare void @somecall_test25();
 
 ; ARC optimizer used to move the last release between the call to second_test25
@@ -326,17 +324,17 @@ declare void @somecall_test25();
 ; released prematurely when %first and %second were pointing to the same object.
 
 ; CHECK-LABEL: define void @test25(
-; CHECK: %[[CALL1:.*]] = call i8* @second_test25(
-; CHECK-NEXT: tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %[[CALL1]])
+; CHECK: %[[CALL1:.*]] = call ptr @second_test25(
+; CHECK-NEXT: tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %[[CALL1]])
 
 define void @test25() {
-  %first = call i8* @first_test25()
-  %v0 = call i8* @llvm.objc.retain(i8* %first)
+  %first = call ptr @first_test25()
+  %v0 = call ptr @llvm.objc.retain(ptr %first)
   call void @somecall_test25()
-  %second = call i8* @second_test25(i8* %first)
-  %call2 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %second)
-  call void @llvm.objc.release(i8* %second), !clang.imprecise_release !0
-  call void @llvm.objc.release(i8* %first), !clang.imprecise_release !0
+  %second = call ptr @second_test25(ptr %first)
+  %call2 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %second)
+  call void @llvm.objc.release(ptr %second), !clang.imprecise_release !0
+  call void @llvm.objc.release(ptr %first), !clang.imprecise_release !0
   ret void
 }
 
@@ -344,139 +342,136 @@ define void @test25() {
 ; they are not in the same basic block. This code used to cause an assertion
 ; failure.
 
-; CHECK-LABEL: define i8* @test26()
-; CHECK: call i8* @returner()
+; CHECK-LABEL: define ptr @test26()
+; CHECK: call ptr @returner()
 ; CHECK-NOT:  call
-define i8* @test26() {
+define ptr @test26() {
 bb0:
-  %v0 = call i8* @returner()
-  %v1 = tail call i8* @llvm.objc.retain(i8* %v0)
+  %v0 = call ptr @returner()
+  %v1 = tail call ptr @llvm.objc.retain(ptr %v0)
   br label %bb1
 bb1:
-  %v2 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %v1)
+  %v2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %v1)
   br label %bb2
 bb2:
-  ret i8* %v2
+  ret ptr %v2
 }
 
-declare i32* @func27(i32);
+declare ptr @func27(i32);
 
 ; Check that ObjCARCOpt::OptimizeAutoreleaseRVCall doesn't turn a call to
 ; @llvm.objc.autoreleaseReturnValue into a call to @llvm.objc.autorelease when a return
 ; instruction uses a value equivalent to @llvm.objc.autoreleaseReturnValue's operand.
 ; In the code below, %phival and %retval are considered equivalent.
 
-; CHECK-LABEL: define i32* @test27(
-; CHECK: %[[PHIVAL:.*]] = phi i8* [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
-; CHECK: %[[RETVAL:.*]] = phi i32* [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
-; CHECK: tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %[[PHIVAL]])
-; CHECK: ret i32* %[[RETVAL]]
+; CHECK-LABEL: define ptr @test27(
+; CHECK: %[[PHIVAL:.*]] = phi ptr [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
+; CHECK: %[[RETVAL:.*]] = phi ptr [ %{{.*}}, %bb1 ], [ %{{.*}}, %bb2 ]
+; CHECK: tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %[[PHIVAL]])
+; CHECK: ret ptr %[[RETVAL]]
 
-define i32* @test27(i1 %cond) {
+define ptr @test27(i1 %cond) {
 entry:
   br i1 %cond, label %bb1, label %bb2
 bb1:
-  %v0 = call i32* @func27(i32 1)
-  %v1 = bitcast i32* %v0 to i8*
+  %v0 = call ptr @func27(i32 1)
   br label %bb3
 bb2:
-  %v2 = call i32* @func27(i32 2)
-  %v3 = bitcast i32* %v2 to i8*
+  %v2 = call ptr @func27(i32 2)
   br label %bb3
 bb3:
-  %phival = phi i8* [ %v1, %bb1 ], [ %v3, %bb2 ]
-  %retval = phi i32* [ %v0, %bb1 ], [ %v2, %bb2 ]
-  %v4 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %phival)
-  ret i32* %retval
+  %phival = phi ptr [ %v0, %bb1 ], [ %v2, %bb2 ]
+  %retval = phi ptr [ %v0, %bb1 ], [ %v2, %bb2 ]
+  %v4 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %phival)
+  ret ptr %retval
 }
 
 ; Don't eliminate the retainRV/autoreleaseRV pair if the call isn't a tail call.
 
-; CHECK-LABEL: define i8* @test28(
-; CHECK: call i8* @returner()
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(
-; CHECK: call i8* @llvm.objc.autoreleaseReturnValue(
-define i8* @test28() {
+; CHECK-LABEL: define ptr @test28(
+; CHECK: call ptr @returner()
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(
+; CHECK: call ptr @llvm.objc.autoreleaseReturnValue(
+define ptr @test28() {
 entry:
-  %call = call i8* @returner()
-  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind
-  %1 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %0) nounwind
-  ret i8* %1
+  %call = call ptr @returner()
+  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind
+  %1 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %0) nounwind
+  ret ptr %1
 }
 
-; CHECK-LABEL: define i8* @test29(
-; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(
-; CHECK: call i8* @llvm.objc.autoreleaseReturnValue(
+; CHECK-LABEL: define ptr @test29(
+; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(
+; CHECK: call ptr @llvm.objc.autoreleaseReturnValue(
 
-define i8* @test29(i8* %k) local_unnamed_addr personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+define ptr @test29(ptr %k) local_unnamed_addr personality ptr @__gxx_personality_v0 {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %k)
-  %call = invoke i8* @returner1(i8* %k)
+  %0 = tail call ptr @llvm.objc.retain(ptr %k)
+  %call = invoke ptr @returner1(ptr %k)
           to label %invoke.cont unwind label %lpad
 
 invoke.cont:
-  %1 = bitcast i8* %call to i8*
-  %2 = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %1)
-  tail call void @llvm.objc.release(i8* %k), !clang.imprecise_release !0
-  %3 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1)
-  ret i8* %call
+  %1 = notail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call)
+  tail call void @llvm.objc.release(ptr %k), !clang.imprecise_release !0
+  %2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call)
+  ret ptr %call
 
 lpad:
-  %4 = landingpad { i8*, i32 }
+  %3 = landingpad { ptr, i32 }
           cleanup
-  tail call void @llvm.objc.release(i8* %k) #1, !clang.imprecise_release !0
-  resume { i8*, i32 } %4
+  tail call void @llvm.objc.release(ptr %k) #1, !clang.imprecise_release !0
+  resume { ptr, i32 } %3
 }
 
 ; The second retainRV/autoreleaseRV pair can be removed since the call to
 ; @returner is a tail call.
 
-; CHECK-LABEL: define i8* @test30(
-; CHECK: %[[V0:.*]] = call i8* @returner()
-; CHECK-NEXT: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %[[V0]])
-; CHECK-NEXT: call i8* @llvm.objc.autoreleaseReturnValue(i8* %[[V0]])
-; CHECK-NEXT: ret i8* %[[V0]]
-; CHECK: %[[V3:.*]] = tail call i8* @returner()
-; CHECK-NEXT: ret i8* %[[V3]]
+; CHECK-LABEL: define ptr @test30(
+; CHECK: %[[V0:.*]] = call ptr @returner()
+; CHECK-NEXT: call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %[[V0]])
+; CHECK-NEXT: call ptr @llvm.objc.autoreleaseReturnValue(ptr %[[V0]])
+; CHECK-NEXT: ret ptr %[[V0]]
+; CHECK: %[[V3:.*]] = tail call ptr @returner()
+; CHECK-NEXT: ret ptr %[[V3]]
 
-define i8* @test30(i1 %cond) {
+define ptr @test30(i1 %cond) {
   br i1 %cond, label %bb0, label %bb1
 bb0:
-  %v0 = call i8* @returner()
-  %v1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %v0)
-  %v2 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %v0)
-  ret i8* %v0
+  %v0 = call ptr @returner()
+  %v1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %v0)
+  %v2 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %v0)
+  ret ptr %v0
 bb1:
-  %v3 = tail call i8* @returner()
-  %v4 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %v3)
-  %v5 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %v3)
-  ret i8* %v3
+  %v3 = tail call ptr @returner()
+  %v4 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %v3)
+  %v5 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %v3)
+  ret ptr %v3
 }
 
 ; Remove operand bundle "clang.arc.attachedcall" and the autoreleaseRV call if the call
 ; is a tail call.
 
-; CHECK-LABEL: define i8* @test31(
-; CHECK-NEXT: %[[CALL:.*]] = tail call i8* @returner()
-; CHECK-NEXT: ret i8* %[[CALL]]
+; CHECK-LABEL: define ptr @test31(
+; CHECK-NEXT: %[[CALL:.*]] = tail call ptr @returner()
+; CHECK-NEXT: ret ptr %[[CALL]]
 
-define i8* @test31() {
-  %call = tail call i8* @returner() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
-  call void (...) @llvm.objc.clang.arc.noop.use(i8* %call)
-  %1 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %call)
-  ret i8* %1
+define ptr @test31() {
+  %call = tail call ptr @returner() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %call)
+  %1 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %call)
+  ret ptr %1
 }
 
-; CHECK-LABEL: define i8* @test32(
-; CHECK: %[[CALL:.*]] = call i8* @returner() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
-; CHECK: call void (...) @llvm.objc.clang.arc.noop.use(i8* %[[CALL]])
-; CHECK: call i8* @llvm.objc.autoreleaseReturnValue(i8* %[[CALL]])
+; CHECK-LABEL: define ptr @test32(
+; CHECK: %[[CALL:.*]] = call ptr @returner() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
+; CHECK: call void (...) @llvm.objc.clang.arc.noop.use(ptr %[[CALL]])
+; CHECK: call ptr @llvm.objc.autoreleaseReturnValue(ptr %[[CALL]])
 
-define i8* @test32() {
-  %call = call i8* @returner() [ "clang.arc.attachedcall"(i8* (i8*)* @llvm.objc.retainAutoreleasedReturnValue) ]
-  call void (...) @llvm.objc.clang.arc.noop.use(i8* %call)
-  %1 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %call)
-  ret i8* %1
+define ptr @test32() {
+  %call = call ptr @returner() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
+  call void (...) @llvm.objc.clang.arc.noop.use(ptr %call)
+  %1 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %call)
+  ret ptr %1
 }
 
 !0 = !{}

diff  --git a/llvm/test/Transforms/ObjCARC/split-backedge.ll b/llvm/test/Transforms/ObjCARC/split-backedge.ll
index e284971e3e1b..ed855541cfb5 100644
--- a/llvm/test/Transforms/ObjCARC/split-backedge.ll
+++ b/llvm/test/Transforms/ObjCARC/split-backedge.ll
@@ -4,46 +4,46 @@
 ; rdar://11256239
 
 ; CHECK-LABEL: define void @test0(
-; CHECK: call i8* @llvm.objc.retain(i8* %call) [[NUW:#[0-9]+]]
-; CHECK: call i8* @llvm.objc.retain(i8* %call) [[NUW]]
-; CHECK: call i8* @llvm.objc.retain(i8* %cond) [[NUW]]
-; CHECK: call void @llvm.objc.release(i8* %call) [[NUW]]
-; CHECK: call void @llvm.objc.release(i8* %call) [[NUW]]
-; CHECK: call void @llvm.objc.release(i8* %cond) [[NUW]]
-define void @test0() personality i8* bitcast (i32 (...)* @__objc_personality_v0 to i8*) {
+; CHECK: call ptr @llvm.objc.retain(ptr %call) [[NUW:#[0-9]+]]
+; CHECK: call ptr @llvm.objc.retain(ptr %call) [[NUW]]
+; CHECK: call ptr @llvm.objc.retain(ptr %cond) [[NUW]]
+; CHECK: call void @llvm.objc.release(ptr %call) [[NUW]]
+; CHECK: call void @llvm.objc.release(ptr %call) [[NUW]]
+; CHECK: call void @llvm.objc.release(ptr %cond) [[NUW]]
+define void @test0() personality ptr @__objc_personality_v0 {
 entry:
   br label %while.body
 
 while.body:                                       ; preds = %while.cond
-  %call = invoke i8* @returner()
+  %call = invoke ptr @returner()
           to label %invoke.cont unwind label %lpad, !clang.arc.no_objc_arc_exceptions !0
 
 invoke.cont:                                      ; preds = %while.body
-  %t0 = call i8* @llvm.objc.retain(i8* %call) nounwind
-  %t1 = call i8* @llvm.objc.retain(i8* %call) nounwind
-  %call.i1 = invoke i8* @returner()
+  %t0 = call ptr @llvm.objc.retain(ptr %call) nounwind
+  %t1 = call ptr @llvm.objc.retain(ptr %call) nounwind
+  %call.i1 = invoke ptr @returner()
           to label %invoke.cont1 unwind label %lpad
 
 invoke.cont1:                                     ; preds = %invoke.cont
-  %cond = select i1 undef, i8* null, i8* %call
-  %t2 = call i8* @llvm.objc.retain(i8* %cond) nounwind
-  call void @llvm.objc.release(i8* %call) nounwind
-  call void @llvm.objc.release(i8* %call) nounwind
-  call void @use_pointer(i8* %cond)
-  call void @llvm.objc.release(i8* %cond) nounwind
+  %cond = select i1 undef, ptr null, ptr %call
+  %t2 = call ptr @llvm.objc.retain(ptr %cond) nounwind
+  call void @llvm.objc.release(ptr %call) nounwind
+  call void @llvm.objc.release(ptr %call) nounwind
+  call void @use_pointer(ptr %cond)
+  call void @llvm.objc.release(ptr %cond) nounwind
   br label %while.body
 
 lpad:                                             ; preds = %invoke.cont, %while.body
-  %t4 = landingpad { i8*, i32 }
-          catch i8* null
+  %t4 = landingpad { ptr, i32 }
+          catch ptr null
   ret void
 }
 
-declare i8* @returner()
+declare ptr @returner()
 declare i32 @__objc_personality_v0(...)
-declare void @llvm.objc.release(i8*)
-declare i8* @llvm.objc.retain(i8*)
-declare void @use_pointer(i8*)
+declare void @llvm.objc.release(ptr)
+declare ptr @llvm.objc.retain(ptr)
+declare void @use_pointer(ptr)
 
 !0 = !{}
 

diff  --git a/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll b/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
index 320d7916fb54..31c634656f60 100644
--- a/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
+++ b/llvm/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
@@ -1,107 +1,107 @@
 ; RUN: opt -passes=objc-arc -S < %s | FileCheck %s
 
-declare void @llvm.objc.release(i8* %x)
-declare i8* @llvm.objc.retain(i8* %x)
-declare i8* @llvm.objc.autorelease(i8* %x)
-declare i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
-declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %x)
-declare i8* @tmp(i8*)
+declare void @llvm.objc.release(ptr %x)
+declare ptr @llvm.objc.retain(ptr %x)
+declare ptr @llvm.objc.autorelease(ptr %x)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
+declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %x)
+declare ptr @tmp(ptr)
 
 ; Never tail call objc_autorelease.
 
-; CHECK: define i8* @test0(i8* %x) [[NUW:#[0-9]+]] {
-; CHECK: %tmp0 = call i8* @llvm.objc.autorelease(i8* %x) [[NUW]]
-; CHECK: %tmp1 = call i8* @llvm.objc.autorelease(i8* %x) [[NUW]]
+; CHECK: define ptr @test0(ptr %x) [[NUW:#[0-9]+]] {
+; CHECK: %tmp0 = call ptr @llvm.objc.autorelease(ptr %x) [[NUW]]
+; CHECK: %tmp1 = call ptr @llvm.objc.autorelease(ptr %x) [[NUW]]
 ; CHECK: }
-define i8* @test0(i8* %x) nounwind {
+define ptr @test0(ptr %x) nounwind {
 entry:
-  %tmp0 = call i8* @llvm.objc.autorelease(i8* %x)
-  %tmp1 = tail call i8* @llvm.objc.autorelease(i8* %x)
+  %tmp0 = call ptr @llvm.objc.autorelease(ptr %x)
+  %tmp1 = tail call ptr @llvm.objc.autorelease(ptr %x)
 
-  ret i8* %x
+  ret ptr %x
 }
 
 ; Always tail call autoreleaseReturnValue.
 
-; CHECK: define i8* @test1(i8* %x) [[NUW]] {
-; CHECK: %tmp0 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) [[NUW]]
-; CHECK: %tmp1 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) [[NUW]]
+; CHECK: define ptr @test1(ptr %x) [[NUW]] {
+; CHECK: %tmp0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) [[NUW]]
+; CHECK: %tmp1 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) [[NUW]]
 ; CHECK: }
-define i8* @test1(i8* %x) nounwind {
+define ptr @test1(ptr %x) nounwind {
 entry:
-  %tmp0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
-  %tmp1 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
-  ret i8* %x
+  %tmp0 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
+  %tmp1 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
+  ret ptr %x
 }
 
 ; Always tail call objc_retain.
 
-; CHECK: define i8* @test2(i8* %x) [[NUW]] {
-; CHECK: %tmp0 = tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
-; CHECK: %tmp1 = tail call i8* @llvm.objc.retain(i8* %x) [[NUW]]
+; CHECK: define ptr @test2(ptr %x) [[NUW]] {
+; CHECK: %tmp0 = tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
+; CHECK: %tmp1 = tail call ptr @llvm.objc.retain(ptr %x) [[NUW]]
 ; CHECK: }
-define i8* @test2(i8* %x) nounwind {
+define ptr @test2(ptr %x) nounwind {
 entry:
-  %tmp0 = call i8* @llvm.objc.retain(i8* %x)
-  %tmp1 = tail call i8* @llvm.objc.retain(i8* %x)
-  ret i8* %x
+  %tmp0 = call ptr @llvm.objc.retain(ptr %x)
+  %tmp1 = tail call ptr @llvm.objc.retain(ptr %x)
+  ret ptr %x
 }
 
 ; Always tail call objc_retainAutoreleasedReturnValue unless it's annotated with
 ; notail.
-; CHECK: define i8* @test3(i8* %x) [[NUW]] {
-; CHECK: %tmp0 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y) [[NUW]]
-; CHECK: %tmp1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z) [[NUW]]
-; CHECK: %tmp2 = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z2) [[NUW]]
+; CHECK: define ptr @test3(ptr %x) [[NUW]] {
+; CHECK: %tmp0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %y) [[NUW]]
+; CHECK: %tmp1 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %z) [[NUW]]
+; CHECK: %tmp2 = notail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %z2) [[NUW]]
 ; CHECK: }
-define i8* @test3(i8* %x) nounwind {
+define ptr @test3(ptr %x) nounwind {
 entry:
-  %y = call i8* @tmp(i8* %x)
-  %tmp0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %y)
-  %z = call i8* @tmp(i8* %x)
-  %tmp1 = tail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z)
-  %z2 = call i8* @tmp(i8* %x)
-  %tmp2 = notail call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %z2)
-  ret i8* %x
+  %y = call ptr @tmp(ptr %x)
+  %tmp0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %y)
+  %z = call ptr @tmp(ptr %x)
+  %tmp1 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %z)
+  %z2 = call ptr @tmp(ptr %x)
+  %tmp2 = notail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %z2)
+  ret ptr %x
 }
 
 ; By itself, we should never change whether or not objc_release is tail called.
 
-; CHECK: define void @test4(i8* %x) [[NUW]] {
-; CHECK: call void @llvm.objc.release(i8* %x) [[NUW]]
-; CHECK: tail call void @llvm.objc.release(i8* %x) [[NUW]]
+; CHECK: define void @test4(ptr %x) [[NUW]] {
+; CHECK: call void @llvm.objc.release(ptr %x) [[NUW]]
+; CHECK: tail call void @llvm.objc.release(ptr %x) [[NUW]]
 ; CHECK: }
-define void @test4(i8* %x) nounwind {
+define void @test4(ptr %x) nounwind {
 entry:
-  call void @llvm.objc.release(i8* %x)
-  tail call void @llvm.objc.release(i8* %x)
+  call void @llvm.objc.release(ptr %x)
+  tail call void @llvm.objc.release(ptr %x)
   ret void
 }
 
 ; If we convert a tail called @llvm.objc.autoreleaseReturnValue to an
 ; @llvm.objc.autorelease, ensure that the tail call is removed.
-; CHECK: define i8* @test5(i8* %x) [[NUW]] {
-; CHECK: %tmp0 = call i8* @llvm.objc.autorelease(i8* %x) [[NUW]]
+; CHECK: define ptr @test5(ptr %x) [[NUW]] {
+; CHECK: %tmp0 = call ptr @llvm.objc.autorelease(ptr %x) [[NUW]]
 ; CHECK: }
-define i8* @test5(i8* %x) nounwind {
+define ptr @test5(ptr %x) nounwind {
 entry:
-  %tmp0 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
-  ret i8* %tmp0
+  %tmp0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
+  ret ptr %tmp0
 }
 
 ; Always tail call llvm.objc.unsafeClaimAutoreleasedReturnValue.
-; CHECK: define i8* @test6(i8* %x) [[NUW]] {
-; CHECK: %tmp0 = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %y) [[NUW]]
-; CHECK: %tmp1 = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %z) [[NUW]]
+; CHECK: define ptr @test6(ptr %x) [[NUW]] {
+; CHECK: %tmp0 = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %y) [[NUW]]
+; CHECK: %tmp1 = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %z) [[NUW]]
 ; CHECK: }
-define i8* @test6(i8* %x) nounwind {
+define ptr @test6(ptr %x) nounwind {
 entry:
-  %y = call i8* @tmp(i8* %x)
-  %tmp0 = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %y)
-  %z = call i8* @tmp(i8* %x)
-  %tmp1 = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %z)
-  ret i8* %x
+  %y = call ptr @tmp(ptr %x)
+  %tmp0 = call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %y)
+  %z = call ptr @tmp(ptr %x)
+  %tmp1 = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %z)
+  ret ptr %x
 }
 
 ; CHECK: attributes [[NUW]] = { nounwind }

diff  --git a/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll b/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll
index a0d900f24009..5e1fe0a6695d 100644
--- a/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll
+++ b/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll
@@ -2,12 +2,12 @@
 
 ; Generated by compiling:
 ;
-; id baz(void *X) { return (__bridge_transfer id)X; }
+; id baz(ptr X) { return (__bridge_transfer id)X; }
 ; 
 ; void foo(id X) {
-; void *Y = 0;
+; ptr Y = 0;
 ; if (X)
-;   Y = (__bridge_retained void *)X;
+;   Y = (__bridge_retained ptr)X;
 ; baz(Y);
 ; }
 ;
@@ -15,31 +15,31 @@
 ;
 ; And then hand-reduced further. 
 
-declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
-declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
-declare i8* @llvm.objc.retain(i8*)
-declare void @llvm.objc.release(i8*)
+declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
+declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)
+declare ptr @llvm.objc.retain(ptr)
+declare void @llvm.objc.release(ptr)
 
-define void @foo(i8* %X) {
+define void @foo(ptr %X) {
 entry:
-  %0 = tail call i8* @llvm.objc.retain(i8* %X) 
-  %tobool = icmp eq i8* %0, null
+  %0 = tail call ptr @llvm.objc.retain(ptr %X) 
+  %tobool = icmp eq ptr %0, null
   br i1 %tobool, label %if.end, label %if.then
 
 if.then:                                          ; preds = %entry
-  %1 = tail call i8* @llvm.objc.retain(i8* nonnull %0)
+  %1 = tail call ptr @llvm.objc.retain(ptr nonnull %0)
   br label %if.end
 
 if.end:                                           ; preds = %if.then, %entry
-  %Y.0 = phi i8* [ %1, %if.then ], [ null, %entry ]
-  %2 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %Y.0)
-  %3 = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %2)
-  tail call void @llvm.objc.release(i8* %0) 
+  %Y.0 = phi ptr [ %1, %if.then ], [ null, %entry ]
+  %2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %Y.0)
+  %3 = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %2)
+  tail call void @llvm.objc.release(ptr %0) 
   ret void
 }
 
 ; CHECK: if.then
-; CHECK: tail call i8* @llvm.objc.retain
+; CHECK: tail call ptr @llvm.objc.retain
 ; CHECK: %Y.0 = phi
 ; CHECK-NEXT: tail call void @llvm.objc.release
 ; CHECK-NEXT: tail call void @llvm.objc.release

diff  --git a/llvm/test/Transforms/ObjCARC/weak-contract.ll b/llvm/test/Transforms/ObjCARC/weak-contract.ll
index bb3d4454b50c..e22ceaf66808 100644
--- a/llvm/test/Transforms/ObjCARC/weak-contract.ll
+++ b/llvm/test/Transforms/ObjCARC/weak-contract.ll
@@ -1,14 +1,14 @@
 ; RUN: opt -passes=objc-arc-contract -S < %s | FileCheck %s
 
-declare i8* @llvm.objc.initWeak(i8**, i8*)
+declare ptr @llvm.objc.initWeak(ptr, ptr)
 
 ; Convert objc_initWeak(p, null) to *p = null.
 
-; CHECK:      define i8* @test0(i8** %p) {
-; CHECK-NEXT:   store i8* null, i8** %p
-; CHECK-NEXT:   ret i8* null
+; CHECK:      define ptr @test0(ptr %p) {
+; CHECK-NEXT:   store ptr null, ptr %p
+; CHECK-NEXT:   ret ptr null
 ; CHECK-NEXT: }
-define i8* @test0(i8** %p) {
-  %t = call i8* @llvm.objc.initWeak(i8** %p, i8* null)
-  ret i8* %t
+define ptr @test0(ptr %p) {
+  %t = call ptr @llvm.objc.initWeak(ptr %p, ptr null)
+  ret ptr %t
 }

diff  --git a/llvm/test/Transforms/ObjCARC/weak-copies.ll b/llvm/test/Transforms/ObjCARC/weak-copies.ll
index dcb8ec27b942..665730922b4a 100644
--- a/llvm/test/Transforms/ObjCARC/weak-copies.ll
+++ b/llvm/test/Transforms/ObjCARC/weak-copies.ll
@@ -3,86 +3,84 @@
 target 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"
 target triple = "x86_64-apple-darwin11.0.0"
 
-%0 = type { i64, i64, i8*, i8*, i8*, i8* }
-%1 = type <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, i8* }>
+%0 = type { i64, i64, ptr, ptr, ptr, ptr }
+%1 = type <{ ptr, i32, i32, ptr, ptr, ptr }>
 %struct.__block_descriptor = type { i64, i64 }
 
- at _NSConcreteStackBlock = external global i8*
+ at _NSConcreteStackBlock = external global ptr
 @.str = private unnamed_addr constant [6 x i8] c"v8@?0\00"
 @"\01L_OBJC_CLASS_NAME_" = internal global [3 x i8] c"\01@\00", section "__TEXT,__objc_classname,cstring_literals", align 1
- at __block_descriptor_tmp = internal constant %0 { i64 0, i64 40, i8* bitcast (void (i8*, i8*)* @__copy_helper_block_ to i8*), i8* bitcast (void (i8*)* @__destroy_helper_block_ to i8*), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0) }
+ at __block_descriptor_tmp = internal constant %0 { i64 0, i64 40, ptr @__copy_helper_block_, ptr @__destroy_helper_block_, ptr @.str, ptr @"\01L_OBJC_CLASS_NAME_" }
 @"\01L_OBJC_IMAGE_INFO" = internal constant [2 x i32] [i32 0, i32 16], section "__DATA, __objc_imageinfo, regular, no_dead_strip"
- at llvm.used = appending global [2 x i8*] [i8* getelementptr inbounds ([3 x i8], [3 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), i8* bitcast ([2 x i32]* @"\01L_OBJC_IMAGE_INFO" to i8*)], section "llvm.metadata"
+ at llvm.used = appending global [2 x ptr] [ptr @"\01L_OBJC_CLASS_NAME_", ptr @"\01L_OBJC_IMAGE_INFO"], section "llvm.metadata"
 
 ; Eliminate unnecessary weak pointer copies.
 
 ; CHECK:      define void @foo() {
 ; CHECK-NEXT: entry:
-; CHECK-NEXT:   %call = call i8* @bar()
-; CHECK-NEXT:   call void @use(i8* %call) [[NUW:#[0-9]+]]
+; CHECK-NEXT:   %call = call ptr @bar()
+; CHECK-NEXT:   call void @use(ptr %call) [[NUW:#[0-9]+]]
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
 define void @foo() {
 entry:
-  %w = alloca i8*, align 8
-  %x = alloca i8*, align 8
-  %call = call i8* @bar()
-  %0 = call i8* @llvm.objc.initWeak(i8** %w, i8* %call) nounwind
-  %1 = call i8* @llvm.objc.loadWeak(i8** %w) nounwind
-  %2 = call i8* @llvm.objc.initWeak(i8** %x, i8* %1) nounwind
-  %3 = call i8* @llvm.objc.loadWeak(i8** %x) nounwind
-  call void @use(i8* %3) nounwind
-  call void @llvm.objc.destroyWeak(i8** %x) nounwind
-  call void @llvm.objc.destroyWeak(i8** %w) nounwind
+  %w = alloca ptr, align 8
+  %x = alloca ptr, align 8
+  %call = call ptr @bar()
+  %0 = call ptr @llvm.objc.initWeak(ptr %w, ptr %call) nounwind
+  %1 = call ptr @llvm.objc.loadWeak(ptr %w) nounwind
+  %2 = call ptr @llvm.objc.initWeak(ptr %x, ptr %1) nounwind
+  %3 = call ptr @llvm.objc.loadWeak(ptr %x) nounwind
+  call void @use(ptr %3) nounwind
+  call void @llvm.objc.destroyWeak(ptr %x) nounwind
+  call void @llvm.objc.destroyWeak(ptr %w) nounwind
   ret void
 }
 
 ; Eliminate unnecessary weak pointer copies in a block initialization.
 
-; CHECK:      define void @qux(i8* %me) #0 {
+; CHECK:      define void @qux(ptr %me) #0 {
 ; CHECK-NEXT: entry:
 ; CHECK-NEXT:   %block = alloca %1, align 8
 ; CHECK-NOT:    alloca
 ; CHECK:      }
-define void @qux(i8* %me) nounwind {
+define void @qux(ptr %me) nounwind {
 entry:
-  %w = alloca i8*, align 8
+  %w = alloca ptr, align 8
   %block = alloca %1, align 8
-  %0 = call i8* @llvm.objc.retain(i8* %me) nounwind
-  %1 = call i8* @llvm.objc.initWeak(i8** %w, i8* %0) nounwind
-  %block.isa = getelementptr inbounds %1, %1* %block, i64 0, i32 0
-  store i8* bitcast (i8** @_NSConcreteStackBlock to i8*), i8** %block.isa, align 8
-  %block.flags = getelementptr inbounds %1, %1* %block, i64 0, i32 1
-  store i32 1107296256, i32* %block.flags, align 8
-  %block.reserved = getelementptr inbounds %1, %1* %block, i64 0, i32 2
-  store i32 0, i32* %block.reserved, align 4
-  %block.invoke = getelementptr inbounds %1, %1* %block, i64 0, i32 3
-  store i8* bitcast (void (i8*)* @__qux_block_invoke_0 to i8*), i8** %block.invoke, align 8
-  %block.descriptor = getelementptr inbounds %1, %1* %block, i64 0, i32 4
-  store %struct.__block_descriptor* bitcast (%0* @__block_descriptor_tmp to %struct.__block_descriptor*), %struct.__block_descriptor** %block.descriptor, align 8
-  %block.captured = getelementptr inbounds %1, %1* %block, i64 0, i32 5
-  %2 = call i8* @llvm.objc.loadWeak(i8** %w) nounwind
-  %3 = call i8* @llvm.objc.initWeak(i8** %block.captured, i8* %2) nounwind
-  %4 = bitcast %1* %block to void ()*
-  call void @use_block(void ()* %4) nounwind
-  call void @llvm.objc.destroyWeak(i8** %block.captured) nounwind
-  call void @llvm.objc.destroyWeak(i8** %w) nounwind
-  call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0
+  %0 = call ptr @llvm.objc.retain(ptr %me) nounwind
+  %1 = call ptr @llvm.objc.initWeak(ptr %w, ptr %0) nounwind
+  store ptr @_NSConcreteStackBlock, ptr %block, align 8
+  %block.flags = getelementptr inbounds %1, ptr %block, i64 0, i32 1
+  store i32 1107296256, ptr %block.flags, align 8
+  %block.reserved = getelementptr inbounds %1, ptr %block, i64 0, i32 2
+  store i32 0, ptr %block.reserved, align 4
+  %block.invoke = getelementptr inbounds %1, ptr %block, i64 0, i32 3
+  store ptr @__qux_block_invoke_0, ptr %block.invoke, align 8
+  %block.descriptor = getelementptr inbounds %1, ptr %block, i64 0, i32 4
+  store ptr @__block_descriptor_tmp, ptr %block.descriptor, align 8
+  %block.captured = getelementptr inbounds %1, ptr %block, i64 0, i32 5
+  %2 = call ptr @llvm.objc.loadWeak(ptr %w) nounwind
+  %3 = call ptr @llvm.objc.initWeak(ptr %block.captured, ptr %2) nounwind
+  call void @use_block(ptr %block) nounwind
+  call void @llvm.objc.destroyWeak(ptr %block.captured) nounwind
+  call void @llvm.objc.destroyWeak(ptr %w) nounwind
+  call void @llvm.objc.release(ptr %0) nounwind, !clang.imprecise_release !0
   ret void
 }
 
-declare i8* @llvm.objc.retain(i8*)
-declare void @use_block(void ()*) nounwind
-declare void @__qux_block_invoke_0(i8* %.block_descriptor) nounwind
-declare void @__copy_helper_block_(i8*, i8*) nounwind
-declare void @llvm.objc.copyWeak(i8**, i8**)
-declare void @__destroy_helper_block_(i8*) nounwind
-declare void @llvm.objc.release(i8*)
-declare i8* @bar()
-declare i8* @llvm.objc.initWeak(i8**, i8*)
-declare i8* @llvm.objc.loadWeak(i8**)
-declare void @use(i8*) nounwind
-declare void @llvm.objc.destroyWeak(i8**)
+declare ptr @llvm.objc.retain(ptr)
+declare void @use_block(ptr) nounwind
+declare void @__qux_block_invoke_0(ptr %.block_descriptor) nounwind
+declare void @__copy_helper_block_(ptr, ptr) nounwind
+declare void @llvm.objc.copyWeak(ptr, ptr)
+declare void @__destroy_helper_block_(ptr) nounwind
+declare void @llvm.objc.release(ptr)
+declare ptr @bar()
+declare ptr @llvm.objc.initWeak(ptr, ptr)
+declare ptr @llvm.objc.loadWeak(ptr)
+declare void @use(ptr) nounwind
+declare void @llvm.objc.destroyWeak(ptr)
 
 ; CHECK: attributes [[NUW]] = { nounwind }
 

diff  --git a/llvm/test/Transforms/ObjCARC/weak-dce.ll b/llvm/test/Transforms/ObjCARC/weak-dce.ll
index 82d03c7b46f5..06bffe5ffd62 100644
--- a/llvm/test/Transforms/ObjCARC/weak-dce.ll
+++ b/llvm/test/Transforms/ObjCARC/weak-dce.ll
@@ -3,44 +3,44 @@
 
 ; Delete the weak calls and replace them with just the net retain.
 
-;      CHECK: define void @test0(i8* %p) {
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
+;      CHECK: define void @test0(ptr %p) {
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
 ; CHECK-NEXT: ret void
 
-define void @test0(i8* %p) {
-  %weakBlock = alloca i8*, align 8
-  %tmp7 = call i8* @llvm.objc.initWeak(i8** %weakBlock, i8* %p) nounwind
-  %tmp26 = call i8* @llvm.objc.loadWeakRetained(i8** %weakBlock) nounwind
-  call void @llvm.objc.destroyWeak(i8** %weakBlock) nounwind
+define void @test0(ptr %p) {
+  %weakBlock = alloca ptr, align 8
+  %tmp7 = call ptr @llvm.objc.initWeak(ptr %weakBlock, ptr %p) nounwind
+  %tmp26 = call ptr @llvm.objc.loadWeakRetained(ptr %weakBlock) nounwind
+  call void @llvm.objc.destroyWeak(ptr %weakBlock) nounwind
   ret void
 }
 
-;      CHECK: define i8* @test1(i8* %p) {
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %p)
-; CHECK-NEXT: ret i8* %p
+;      CHECK: define ptr @test1(ptr %p) {
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %p)
+; CHECK-NEXT: ret ptr %p
 
-define i8* @test1(i8* %p) {
-  %weakBlock = alloca i8*, align 8
-  %tmp7 = call i8* @llvm.objc.initWeak(i8** %weakBlock, i8* %p) nounwind
-  %tmp26 = call i8* @llvm.objc.loadWeakRetained(i8** %weakBlock) nounwind
-  call void @llvm.objc.destroyWeak(i8** %weakBlock) nounwind
-  ret i8* %tmp26
+define ptr @test1(ptr %p) {
+  %weakBlock = alloca ptr, align 8
+  %tmp7 = call ptr @llvm.objc.initWeak(ptr %weakBlock, ptr %p) nounwind
+  %tmp26 = call ptr @llvm.objc.loadWeakRetained(ptr %weakBlock) nounwind
+  call void @llvm.objc.destroyWeak(ptr %weakBlock) nounwind
+  ret ptr %tmp26
 }
 
-;      CHECK: define i8* @test2(i8* %p, i8* %q) {
-; CHECK-NEXT: call i8* @llvm.objc.retain(i8* %q)
-; CHECK-NEXT: ret i8* %q
-
-define i8* @test2(i8* %p, i8* %q) {
-  %weakBlock = alloca i8*, align 8
-  %tmp7 = call i8* @llvm.objc.initWeak(i8** %weakBlock, i8* %p) nounwind
-  %tmp19 = call i8* @llvm.objc.storeWeak(i8** %weakBlock, i8* %q) nounwind
-  %tmp26 = call i8* @llvm.objc.loadWeakRetained(i8** %weakBlock) nounwind
-  call void @llvm.objc.destroyWeak(i8** %weakBlock) nounwind
-  ret i8* %tmp26
+;      CHECK: define ptr @test2(ptr %p, ptr %q) {
+; CHECK-NEXT: call ptr @llvm.objc.retain(ptr %q)
+; CHECK-NEXT: ret ptr %q
+
+define ptr @test2(ptr %p, ptr %q) {
+  %weakBlock = alloca ptr, align 8
+  %tmp7 = call ptr @llvm.objc.initWeak(ptr %weakBlock, ptr %p) nounwind
+  %tmp19 = call ptr @llvm.objc.storeWeak(ptr %weakBlock, ptr %q) nounwind
+  %tmp26 = call ptr @llvm.objc.loadWeakRetained(ptr %weakBlock) nounwind
+  call void @llvm.objc.destroyWeak(ptr %weakBlock) nounwind
+  ret ptr %tmp26
 }
 
-declare i8* @llvm.objc.initWeak(i8**, i8*)
-declare void @llvm.objc.destroyWeak(i8**)
-declare i8* @llvm.objc.loadWeakRetained(i8**)
-declare i8* @llvm.objc.storeWeak(i8** %weakBlock, i8* %q)
+declare ptr @llvm.objc.initWeak(ptr, ptr)
+declare void @llvm.objc.destroyWeak(ptr)
+declare ptr @llvm.objc.loadWeakRetained(ptr)
+declare ptr @llvm.objc.storeWeak(ptr %weakBlock, ptr %q)

diff  --git a/llvm/test/Transforms/ObjCARC/weak.ll b/llvm/test/Transforms/ObjCARC/weak.ll
index 504df9a15127..ad5ac571f06c 100644
--- a/llvm/test/Transforms/ObjCARC/weak.ll
+++ b/llvm/test/Transforms/ObjCARC/weak.ll
@@ -1,60 +1,60 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt -passes=objc-arc -S < %s | FileCheck %s
 
-declare i8* @llvm.objc.initWeak(i8**, i8*)
-declare i8* @llvm.objc.storeWeak(i8**, i8*)
-declare i8* @llvm.objc.loadWeak(i8**)
-declare void @llvm.objc.destroyWeak(i8**)
-declare i8* @llvm.objc.loadWeakRetained(i8**)
-declare void @llvm.objc.moveWeak(i8**, i8**)
-declare void @llvm.objc.copyWeak(i8**, i8**)
+declare ptr @llvm.objc.initWeak(ptr, ptr)
+declare ptr @llvm.objc.storeWeak(ptr, ptr)
+declare ptr @llvm.objc.loadWeak(ptr)
+declare void @llvm.objc.destroyWeak(ptr)
+declare ptr @llvm.objc.loadWeakRetained(ptr)
+declare void @llvm.objc.moveWeak(ptr, ptr)
+declare void @llvm.objc.copyWeak(ptr, ptr)
 
 ; If the pointer-to-weak-pointer is null, it's undefined behavior.
 
-define void @test0(i8* %p, i8** %q) {
+define void @test0(ptr %p, ptr %q) {
 ; CHECK-LABEL: @test0(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
-; CHECK-NEXT:    store i1 true, i1* undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
+; CHECK-NEXT:    store i1 true, ptr undef, align 1
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  call i8* @llvm.objc.storeWeak(i8** null, i8* %p)
-  call i8* @llvm.objc.storeWeak(i8** undef, i8* %p)
-  call i8* @llvm.objc.loadWeakRetained(i8** null)
-  call i8* @llvm.objc.loadWeakRetained(i8** undef)
-  call i8* @llvm.objc.loadWeak(i8** null)
-  call i8* @llvm.objc.loadWeak(i8** undef)
-  call i8* @llvm.objc.initWeak(i8** null, i8* %p)
-  call i8* @llvm.objc.initWeak(i8** undef, i8* %p)
-  call void @llvm.objc.destroyWeak(i8** null)
-  call void @llvm.objc.destroyWeak(i8** undef)
+  call ptr @llvm.objc.storeWeak(ptr null, ptr %p)
+  call ptr @llvm.objc.storeWeak(ptr undef, ptr %p)
+  call ptr @llvm.objc.loadWeakRetained(ptr null)
+  call ptr @llvm.objc.loadWeakRetained(ptr undef)
+  call ptr @llvm.objc.loadWeak(ptr null)
+  call ptr @llvm.objc.loadWeak(ptr undef)
+  call ptr @llvm.objc.initWeak(ptr null, ptr %p)
+  call ptr @llvm.objc.initWeak(ptr undef, ptr %p)
+  call void @llvm.objc.destroyWeak(ptr null)
+  call void @llvm.objc.destroyWeak(ptr undef)
 
-  call void @llvm.objc.copyWeak(i8** null, i8** %q)
-  call void @llvm.objc.copyWeak(i8** undef, i8** %q)
-  call void @llvm.objc.copyWeak(i8** %q, i8** null)
-  call void @llvm.objc.copyWeak(i8** %q, i8** undef)
+  call void @llvm.objc.copyWeak(ptr null, ptr %q)
+  call void @llvm.objc.copyWeak(ptr undef, ptr %q)
+  call void @llvm.objc.copyWeak(ptr %q, ptr null)
+  call void @llvm.objc.copyWeak(ptr %q, ptr undef)
 
-  call void @llvm.objc.moveWeak(i8** null, i8** %q)
-  call void @llvm.objc.moveWeak(i8** undef, i8** %q)
-  call void @llvm.objc.moveWeak(i8** %q, i8** null)
-  call void @llvm.objc.moveWeak(i8** %q, i8** undef)
+  call void @llvm.objc.moveWeak(ptr null, ptr %q)
+  call void @llvm.objc.moveWeak(ptr undef, ptr %q)
+  call void @llvm.objc.moveWeak(ptr %q, ptr null)
+  call void @llvm.objc.moveWeak(ptr %q, ptr undef)
 
   ret void
 }


        


More information about the llvm-commits mailing list