[llvm] 07253bc - [LICM] Convert tests to opaque pointers (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 5 07:49:13 PDT 2022


Author: Nikita Popov
Date: 2022-10-05T16:47:53+02:00
New Revision: 07253bc8c0a1f7f502fc5bb94f4205752c0d22e4

URL: https://github.com/llvm/llvm-project/commit/07253bc8c0a1f7f502fc5bb94f4205752c0d22e4
DIFF: https://github.com/llvm/llvm-project/commit/07253bc8c0a1f7f502fc5bb94f4205752c0d22e4.diff

LOG: [LICM] Convert tests to opaque pointers (NFC)

Using https://gist.github.com/nikic/98357b71fd67756b0f064c9517b62a34.

The opaque pointer migration resolves the TODO on test_fence3: The
transform now works as expected by dint of the bitcast no longer
existing.

Added: 
    

Modified: 
    llvm/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll
    llvm/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll
    llvm/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll
    llvm/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll
    llvm/test/Transforms/LICM/2003-05-02-LoadHoist.ll
    llvm/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.ll
    llvm/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll
    llvm/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll
    llvm/test/Transforms/LICM/2007-05-22-VolatileSink.ll
    llvm/test/Transforms/LICM/2007-07-30-AliasSet.ll
    llvm/test/Transforms/LICM/2007-09-17-PromoteValue.ll
    llvm/test/Transforms/LICM/2007-09-24-PromoteNullValue.ll
    llvm/test/Transforms/LICM/2007-10-01-PromoteSafeValue.ll
    llvm/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll
    llvm/test/Transforms/LICM/2008-07-22-LoadGlobalConstant.ll
    llvm/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll
    llvm/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll
    llvm/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll
    llvm/test/Transforms/LICM/2011-04-09-RAUW-AST.ll
    llvm/test/Transforms/LICM/2011-07-06-Alignment.ll
    llvm/test/Transforms/LICM/AArch64/sve-load-hoist.ll
    llvm/test/Transforms/LICM/AMDGPU/bitcast.ll
    llvm/test/Transforms/LICM/AliasSetMemSet.ll
    llvm/test/Transforms/LICM/PR21582.ll
    llvm/test/Transforms/LICM/allow-speculation-option.ll
    llvm/test/Transforms/LICM/argmemonly-call.ll
    llvm/test/Transforms/LICM/assume.ll
    llvm/test/Transforms/LICM/atomics.ll
    llvm/test/Transforms/LICM/call-hoisting.ll
    llvm/test/Transforms/LICM/constexpr.ll
    llvm/test/Transforms/LICM/convergent.ll
    llvm/test/Transforms/LICM/crash.ll
    llvm/test/Transforms/LICM/dropped-tbaa.ll
    llvm/test/Transforms/LICM/explicit_guards.ll
    llvm/test/Transforms/LICM/fence.ll
    llvm/test/Transforms/LICM/funclet.ll
    llvm/test/Transforms/LICM/gc-relocate.ll
    llvm/test/Transforms/LICM/guards.ll
    llvm/test/Transforms/LICM/hoist-alloc.ll
    llvm/test/Transforms/LICM/hoist-bitcast-load.ll
    llvm/test/Transforms/LICM/hoist-debuginvariant.ll
    llvm/test/Transforms/LICM/hoist-deref-load.ll
    llvm/test/Transforms/LICM/hoist-fast-fdiv.ll
    llvm/test/Transforms/LICM/hoist-invariant-load.ll
    llvm/test/Transforms/LICM/hoist-load-without-store.ll
    llvm/test/Transforms/LICM/hoist-mustexec.ll
    llvm/test/Transforms/LICM/hoist-nounwind.ll
    llvm/test/Transforms/LICM/hoist-phi.ll
    llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll
    llvm/test/Transforms/LICM/hoisting.ll
    llvm/test/Transforms/LICM/infinite_loops.ll
    llvm/test/Transforms/LICM/int_sideeffect.ll
    llvm/test/Transforms/LICM/invariant.start.ll
    llvm/test/Transforms/LICM/lcssa-ssa-promoter.ll
    llvm/test/Transforms/LICM/lnicm-sink.ll
    llvm/test/Transforms/LICM/loopsink-pr38462.ll
    llvm/test/Transforms/LICM/loopsink-pr39570.ll
    llvm/test/Transforms/LICM/loopsink-pr39695.ll
    llvm/test/Transforms/LICM/loopsink.ll
    llvm/test/Transforms/LICM/opt-remarks-conditional-load.ll
    llvm/test/Transforms/LICM/opt-remarks-intervening-store.ll
    llvm/test/Transforms/LICM/opt-remarks.ll
    llvm/test/Transforms/LICM/pr23608.ll
    llvm/test/Transforms/LICM/pr26843.ll
    llvm/test/Transforms/LICM/pr27262.ll
    llvm/test/Transforms/LICM/pr36228.ll
    llvm/test/Transforms/LICM/pr37323.ll
    llvm/test/Transforms/LICM/pr38513.ll
    llvm/test/Transforms/LICM/pr40317.ll
    llvm/test/Transforms/LICM/pr42969.ll
    llvm/test/Transforms/LICM/pr50367.ll
    llvm/test/Transforms/LICM/pr51333.ll
    llvm/test/Transforms/LICM/pr55672.ll
    llvm/test/Transforms/LICM/pragma-licm-disable.ll
    llvm/test/Transforms/LICM/preheader-safe.ll
    llvm/test/Transforms/LICM/promote-atomic.ll
    llvm/test/Transforms/LICM/promote-capture.ll
    llvm/test/Transforms/LICM/promote-order.ll
    llvm/test/Transforms/LICM/promote-tls.ll
    llvm/test/Transforms/LICM/read-only-calls.ll
    llvm/test/Transforms/LICM/scalar-promote-memmodel.ll
    llvm/test/Transforms/LICM/scalar-promote-opaque-ptrs.ll
    llvm/test/Transforms/LICM/scalar-promote-unwind.ll
    llvm/test/Transforms/LICM/scalar-promote.ll
    llvm/test/Transforms/LICM/sink-debuginfo-preserve.ll
    llvm/test/Transforms/LICM/sink-foldable.ll
    llvm/test/Transforms/LICM/sink-promote.ll
    llvm/test/Transforms/LICM/sink-with-coroutine.ll
    llvm/test/Transforms/LICM/sinking-debugify.ll
    llvm/test/Transforms/LICM/sinking.ll
    llvm/test/Transforms/LICM/speculate.ll
    llvm/test/Transforms/LICM/store-hoisting.ll
    llvm/test/Transforms/LICM/strlen.ll
    llvm/test/Transforms/LICM/unrolled-deeply-nested.ll
    llvm/test/Transforms/LICM/update-scev.ll
    llvm/test/Transforms/LICM/volatile-alias.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll b/llvm/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll
index ffb738cb9def5..ac4f54cd6d85a 100644
--- a/llvm/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll
+++ b/llvm/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll
@@ -4,13 +4,13 @@
 
 define void @InitMoveArray() {
 bb3:
-	%X = alloca [2 x i64]		; <[2 x i64]*> [#uses=1]
+	%X = alloca [2 x i64]		; <ptr> [#uses=1]
 	br i1 false, label %bb13, label %bb4
 bb4:		; preds = %bb3
-	%reg3011 = getelementptr [2 x i64], [2 x i64]* %X, i64 0, i64 0		; <i64*> [#uses=1]
+	%reg3011 = getelementptr [2 x i64], ptr %X, i64 0, i64 0		; <ptr> [#uses=1]
 	br label %bb8
 bb8:		; preds = %bb8, %bb4
-	store i64 0, i64* %reg3011
+	store i64 0, ptr %reg3011
 	br i1 false, label %bb8, label %bb13
 bb13:		; preds = %bb8, %bb3
 	ret void

diff  --git a/llvm/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll b/llvm/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll
index 2718cb1053773..bc7b5e0c3e3db 100644
--- a/llvm/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll
+++ b/llvm/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll
@@ -3,7 +3,7 @@
 
 ; RUN: opt < %s -licm
 
-define i32 @main(i32 %argc, i8** %argv) {
+define i32 @main(i32 %argc, ptr %argv) {
 bb0:
 	br i1 false, label %bb7, label %bb5
 bb5:		; preds = %bb5, %bb0

diff  --git a/llvm/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll b/llvm/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll
index a9c6b856f8ea5..ae8d215c795c5 100644
--- a/llvm/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll
+++ b/llvm/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll
@@ -6,7 +6,7 @@ define i1 @test(i1 %c) {
 ; <label>:0
 	br i1 %c, label %Loop, label %Out
 Loop:		; preds = %Loop, %0
-	store i32 0, i32* null
+	store i32 0, ptr null
 	br i1 %c, label %Loop, label %Out
 Out:		; preds = %Loop, %0
 	%X = phi i1 [ %c, %0 ], [ true, %Loop ]		; <i1> [#uses=1]

diff  --git a/llvm/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll b/llvm/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll
index c759e6eff8e7e..2c23258758e9d 100644
--- a/llvm/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll
+++ b/llvm/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll
@@ -2,12 +2,11 @@
 ;
 ; RUN: opt < %s -licm
 
-define void @test(i32* %P) {
+define void @test(ptr %P) {
 	br label %Loop
 Loop:		; preds = %Loop, %0
-	store i32 5, i32* %P
-	%P2 = bitcast i32* %P to i8*		; <i8*> [#uses=1]
-	store i8 4, i8* %P2
+	store i32 5, ptr %P
+	store i8 4, ptr %P
 	br i1 true, label %Loop, label %Out
 Out:		; preds = %Loop
 	ret void

diff  --git a/llvm/test/Transforms/LICM/2003-05-02-LoadHoist.ll b/llvm/test/Transforms/LICM/2003-05-02-LoadHoist.ll
index 2f94dff4efd70..218f9a78576a0 100644
--- a/llvm/test/Transforms/LICM/2003-05-02-LoadHoist.ll
+++ b/llvm/test/Transforms/LICM/2003-05-02-LoadHoist.ll
@@ -5,17 +5,17 @@
 ;
 ; RUN: opt < %s -licm -gvn -instcombine -S | grep load
 
- at X = global i32 7		; <i32*> [#uses=2]
+ at X = global i32 7		; <ptr> [#uses=2]
 
 declare void @foo()
 
 define i32 @test(i1 %c) {
-	%A = load i32, i32* @X		; <i32> [#uses=1]
+	%A = load i32, ptr @X		; <i32> [#uses=1]
 	br label %Loop
 Loop:		; preds = %Loop, %0
 	call void @foo( )
         ;; Should not hoist this load!
-	%B = load i32, i32* @X		; <i32> [#uses=1]
+	%B = load i32, ptr @X		; <i32> [#uses=1]
 	br i1 %c, label %Loop, label %Out
 Out:		; preds = %Loop
 	%C = sub i32 %A, %B		; <i32> [#uses=1]

diff  --git a/llvm/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.ll b/llvm/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.ll
index e2b07facd48e4..348f4de6dcd11 100644
--- a/llvm/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.ll
+++ b/llvm/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.ll
@@ -1,15 +1,15 @@
 ; RUN: opt < %s -globals-aa -licm -disable-output
 
- at PL_regcomp_parse = internal global i8* null		; <i8**> [#uses=2]
+ at PL_regcomp_parse = internal global ptr null		; <ptr> [#uses=2]
 
 define void @test() {
 	br label %Outer
 Outer:		; preds = %Next, %0
 	br label %Inner
 Inner:		; preds = %Inner, %Outer
-	%tmp.114.i.i.i = load i8*, i8** @PL_regcomp_parse		; <i8*> [#uses=1]
-	%tmp.115.i.i.i = load i8, i8* %tmp.114.i.i.i		; <i8> [#uses=0]
-	store i8* null, i8** @PL_regcomp_parse
+	%tmp.114.i.i.i = load ptr, ptr @PL_regcomp_parse		; <ptr> [#uses=1]
+	%tmp.115.i.i.i = load i8, ptr %tmp.114.i.i.i		; <i8> [#uses=0]
+	store ptr null, ptr @PL_regcomp_parse
 	br i1 false, label %Inner, label %Next
 Next:		; preds = %Inner
 	br i1 false, label %Outer, label %Exit

diff  --git a/llvm/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll b/llvm/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll
index 9416028ef2e79..dd13b2c6e4b47 100644
--- a/llvm/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll
+++ b/llvm/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll
@@ -1,20 +1,20 @@
 ; RUN: opt < %s -licm -disable-output
-	%struct.roadlet = type { i8*, %struct.vehicle*, [8 x %struct.roadlet*], [8 x %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)*] }
-	%struct.vehicle = type { %struct.roadlet*, i8*, i32, i32, %union.._631., i32 }
+	%struct.roadlet = type { ptr, ptr, [8 x ptr], [8 x ptr] }
+	%struct.vehicle = type { ptr, ptr, i32, i32, %union.._631., i32 }
 	%union.._631. = type { i32 }
 
-declare %struct.roadlet* @_Z11return_nullP7roadletP7vehicle9direction(%struct.roadlet*, %struct.vehicle*, i32)
+declare ptr @_Z11return_nullP7roadletP7vehicle9direction(ptr, ptr, i32)
 
-declare %struct.roadlet* @_Z14lane_switch_okP7roadletP7vehicle9direction(%struct.roadlet*, %struct.vehicle*, i32)
+declare ptr @_Z14lane_switch_okP7roadletP7vehicle9direction(ptr, ptr, i32)
 
 define void @main() {
 __main.entry:
 	br label %invoke_cont.3
 invoke_cont.3:		; preds = %invoke_cont.3, %__main.entry
-	%tmp.34.i.i502.7 = getelementptr %struct.roadlet, %struct.roadlet* null, i32 0, i32 3, i32 7		; <%struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)**> [#uses=1]
-	store %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)* @_Z11return_nullP7roadletP7vehicle9direction, %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)** %tmp.34.i.i502.7
-	store %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)* @_Z14lane_switch_okP7roadletP7vehicle9direction, %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)** null
-	%tmp.4.i.i339 = getelementptr %struct.roadlet, %struct.roadlet* null, i32 0, i32 3, i32 undef		; <%struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)**> [#uses=1]
-	store %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)* @_Z11return_nullP7roadletP7vehicle9direction, %struct.roadlet* (%struct.roadlet*, %struct.vehicle*, i32)** %tmp.4.i.i339
+	%tmp.34.i.i502.7 = getelementptr %struct.roadlet, ptr null, i32 0, i32 3, i32 7		; <ptr> [#uses=1]
+	store ptr @_Z11return_nullP7roadletP7vehicle9direction, ptr %tmp.34.i.i502.7
+	store ptr @_Z14lane_switch_okP7roadletP7vehicle9direction, ptr null
+	%tmp.4.i.i339 = getelementptr %struct.roadlet, ptr null, i32 0, i32 3, i32 undef		; <ptr> [#uses=1]
+	store ptr @_Z11return_nullP7roadletP7vehicle9direction, ptr %tmp.4.i.i339
 	br label %invoke_cont.3
 }

diff  --git a/llvm/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll b/llvm/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll
index 9763660ffb0be..56350cedcda98 100644
--- a/llvm/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll
+++ b/llvm/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll
@@ -2,11 +2,11 @@
 ; PR908
 ; END.
 
-	%struct.alloc_chain = type { i8*, %struct.alloc_chain* }
-	%struct.oggpack_buffer = type { i32, i32, i8*, i8*, i32 }
-	%struct.vorbis_block = type { float**, %struct.oggpack_buffer, i32, i32, i32, i32, i32, i32, i64, i64, %struct.vorbis_dsp_state*, i8*, i32, i32, i32, %struct.alloc_chain*, i32, i32, i32, i32, i8* }
-	%struct.vorbis_dsp_state = type { i32, %struct.vorbis_info*, float**, float**, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i64, i64, i64, i64, i64, i8* }
-	%struct.vorbis_info = type { i32, i32, i32, i32, i32, i32, i32, i8* }
+	%struct.alloc_chain = type { ptr, ptr }
+	%struct.oggpack_buffer = type { i32, i32, ptr, ptr, i32 }
+	%struct.vorbis_block = type { ptr, %struct.oggpack_buffer, i32, i32, i32, i32, i32, i32, i64, i64, ptr, ptr, i32, i32, i32, ptr, i32, i32, i32, i32, ptr }
+	%struct.vorbis_dsp_state = type { i32, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i64, i64, i64, i64, i64, ptr }
+	%struct.vorbis_info = type { i32, i32, i32, i32, i32, i32, i32, ptr }
 
 define fastcc void @_01forward() {
 entry:

diff  --git a/llvm/test/Transforms/LICM/2007-05-22-VolatileSink.ll b/llvm/test/Transforms/LICM/2007-05-22-VolatileSink.ll
index f5ce86b7245ac..5342cbbcf07b1 100644
--- a/llvm/test/Transforms/LICM/2007-05-22-VolatileSink.ll
+++ b/llvm/test/Transforms/LICM/2007-05-22-VolatileSink.ll
@@ -3,16 +3,16 @@
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"
 target triple = "i686-apple-darwin8"
 
-define void @Transpose(i32* %DataIn, i32* %DataOut) {
+define void @Transpose(ptr %DataIn, ptr %DataOut) {
 entry:
-	%buffer = alloca [64 x i32], align 16		; <[64 x i32]*> [#uses=2]
+	%buffer = alloca [64 x i32], align 16		; <ptr> [#uses=2]
 	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
 	br label %bb6
 
 bb:		; preds = %bb6
-	%tmp2 = load volatile i32, i32* %DataIn		; <i32> [#uses=1]
-	%tmp3 = getelementptr [64 x i32], [64 x i32]* %buffer, i32 0, i32 %i.0		; <i32*> [#uses=1]
-	store i32 %tmp2, i32* %tmp3
+	%tmp2 = load volatile i32, ptr %DataIn		; <i32> [#uses=1]
+	%tmp3 = getelementptr [64 x i32], ptr %buffer, i32 0, i32 %i.0		; <ptr> [#uses=1]
+	store i32 %tmp2, ptr %tmp3
 	%tmp5 = add i32 %i.0, 1		; <i32> [#uses=1]
 	br label %bb6
 
@@ -26,9 +26,9 @@ bb6:		; preds = %bb, %entry
 bb12:		; preds = %bb22
 	%tmp14 = mul i32 %j.1, 8		; <i32> [#uses=1]
 	%tmp16 = add i32 %tmp14, %i.1		; <i32> [#uses=1]
-	%tmp17 = getelementptr [64 x i32], [64 x i32]* %buffer, i32 0, i32 %tmp16		; <i32*> [#uses=1]
-	%tmp18 = load i32, i32* %tmp17		; <i32> [#uses=1]
-	store volatile i32 %tmp18, i32* %DataOut
+	%tmp17 = getelementptr [64 x i32], ptr %buffer, i32 0, i32 %tmp16		; <ptr> [#uses=1]
+	%tmp18 = load i32, ptr %tmp17		; <i32> [#uses=1]
+	store volatile i32 %tmp18, ptr %DataOut
 	%tmp21 = add i32 %j.1, 1		; <i32> [#uses=1]
 	br label %bb22
 

diff  --git a/llvm/test/Transforms/LICM/2007-07-30-AliasSet.ll b/llvm/test/Transforms/LICM/2007-07-30-AliasSet.ll
index fb672f0441029..1a62839a280d3 100644
--- a/llvm/test/Transforms/LICM/2007-07-30-AliasSet.ll
+++ b/llvm/test/Transforms/LICM/2007-07-30-AliasSet.ll
@@ -1,8 +1,8 @@
 ; RUN: opt < %s -licm -simple-loop-unswitch -disable-output
 	%struct.III_scalefac_t = type { [22 x i32], [13 x [3 x i32]] }
-	%struct.gr_info = type { i32, i32, i32, i32, i32, i32, i32, i32, [3 x i32], [3 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32*, [4 x i32] }
+	%struct.gr_info = type { i32, i32, i32, i32, i32, i32, i32, i32, [3 x i32], [3 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, [4 x i32] }
 
-define i32 @scale_bitcount_lsf(%struct.III_scalefac_t* %scalefac, %struct.gr_info* %cod_info) {
+define i32 @scale_bitcount_lsf(ptr %scalefac, ptr %cod_info) {
 entry:
 	br i1 false, label %bb28, label %bb133.preheader
 
@@ -17,13 +17,13 @@ bb63.outer:		; preds = %bb73, %bb28
 
 bb35:		; preds = %cond_next60, %bb63.outer
 	%window.34 = phi i32 [ %tmp62, %cond_next60 ], [ 0, %bb63.outer ]		; <i32> [#uses=1]
-	%tmp44 = getelementptr [4 x i32], [4 x i32]* null, i32 0, i32 0		; <i32*> [#uses=1]
-	%tmp46 = load i32, i32* %tmp44, align 4		; <i32> [#uses=0]
+	%tmp44 = getelementptr [4 x i32], ptr null, i32 0, i32 0		; <ptr> [#uses=1]
+	%tmp46 = load i32, ptr %tmp44, align 4		; <i32> [#uses=0]
 	br i1 false, label %cond_true50, label %cond_next60
 
 cond_true50:		; preds = %bb35
-	%tmp59 = getelementptr [4 x i32], [4 x i32]* null, i32 0, i32 0		; <i32*> [#uses=1]
-	store i32 0, i32* %tmp59, align 4
+	%tmp59 = getelementptr [4 x i32], ptr null, i32 0, i32 0		; <ptr> [#uses=1]
+	store i32 0, ptr %tmp59, align 4
 	br label %cond_next60
 
 cond_next60:		; preds = %cond_true50, %bb35

diff  --git a/llvm/test/Transforms/LICM/2007-09-17-PromoteValue.ll b/llvm/test/Transforms/LICM/2007-09-17-PromoteValue.ll
index 1d25d17c2e640..c9235222ca121 100644
--- a/llvm/test/Transforms/LICM/2007-09-17-PromoteValue.ll
+++ b/llvm/test/Transforms/LICM/2007-09-17-PromoteValue.ll
@@ -1,21 +1,21 @@
 ; ModuleID = 'PR1657.bc'
 ; Do not promote getelementptr because it may exposes load from a null pointer 
 ; and store from a null pointer  which are covered by 
-; icmp eq %struct.decision* null, null condition.
+; icmp eq ptr null, null condition.
 ; RUN: opt < %s -licm -S | not grep promoted
-	%struct.decision = type { i8, %struct.decision* }
+	%struct.decision = type { i8, ptr }
 
 define i32 @main() {
 entry:
 	br label %blah.i
 
 blah.i:		; preds = %cond_true.i, %entry
-	%tmp3.i = icmp eq %struct.decision* null, null		; <i1> [#uses=1]
+	%tmp3.i = icmp eq ptr null, null		; <i1> [#uses=1]
 	br i1 %tmp3.i, label %clear_modes.exit, label %cond_true.i
 
 cond_true.i:		; preds = %blah.i
-	%tmp1.i = getelementptr %struct.decision, %struct.decision* null, i32 0, i32 0		; <i8*> [#uses=1]
-	store i8 0, i8* %tmp1.i
+	%tmp1.i = getelementptr %struct.decision, ptr null, i32 0, i32 0		; <ptr> [#uses=1]
+	store i8 0, ptr %tmp1.i
 	br label %blah.i
 
 clear_modes.exit:		; preds = %blah.i
@@ -23,35 +23,35 @@ clear_modes.exit:		; preds = %blah.i
 	unreachable
 }
 
-define i32 @f(i8* %ptr) {
+define i32 @f(ptr %ptr) {
 entry:
         br label %loop.head
 
 loop.head:              ; preds = %cond.true, %entry
-        %x = phi i8* [ %ptr, %entry ], [ %ptr.i, %cond.true ]           ; <i8*> [#uses=1]
-        %tmp3.i = icmp ne i8* %ptr, %x          ; <i1> [#uses=1]
+        %x = phi ptr [ %ptr, %entry ], [ %ptr.i, %cond.true ]           ; <ptr> [#uses=1]
+        %tmp3.i = icmp ne ptr %ptr, %x          ; <i1> [#uses=1]
         br i1 %tmp3.i, label %cond.true, label %exit
 
 cond.true:              ; preds = %loop.head
-        %ptr.i = getelementptr i8, i8* %ptr, i32 0          ; <i8*> [#uses=2]
-        store i8 0, i8* %ptr.i
+        %ptr.i = getelementptr i8, ptr %ptr, i32 0          ; <ptr> [#uses=2]
+        store i8 0, ptr %ptr.i
         br label %loop.head
 
 exit:           ; preds = %loop.head
         ret i32 0
 }
 
-define i32 @f2(i8* %p, i8* %q) {
+define i32 @f2(ptr %p, ptr %q) {
 entry:
         br label %loop.head
 
 loop.head:              ; preds = %cond.true, %entry
-        %tmp3.i = icmp eq i8* null, %q            ; <i1> [#uses=1]
+        %tmp3.i = icmp eq ptr null, %q            ; <i1> [#uses=1]
         br i1 %tmp3.i, label %exit, label %cond.true
 
 cond.true:              ; preds = %loop.head
-        %ptr.i = getelementptr i8, i8* %p, i32 0          ; <i8*> [#uses=2]
-        store i8 0, i8* %ptr.i
+        %ptr.i = getelementptr i8, ptr %p, i32 0          ; <ptr> [#uses=2]
+        store i8 0, ptr %ptr.i
         br label %loop.head
 
 exit:           ; preds = %loop.head

diff  --git a/llvm/test/Transforms/LICM/2007-09-24-PromoteNullValue.ll b/llvm/test/Transforms/LICM/2007-09-24-PromoteNullValue.ll
index 916f479cba149..00dbdc3d06372 100644
--- a/llvm/test/Transforms/LICM/2007-09-24-PromoteNullValue.ll
+++ b/llvm/test/Transforms/LICM/2007-09-24-PromoteNullValue.ll
@@ -25,7 +25,7 @@ cond_true11:		; preds = %bb6
 	br label %return
 
 cond_next14:		; preds = %bb6
-	store i8 0, i8* null
+	store i8 0, ptr null
 	br label %bb15
 
 bb15:		; preds = %cond_next14, %bb

diff  --git a/llvm/test/Transforms/LICM/2007-10-01-PromoteSafeValue.ll b/llvm/test/Transforms/LICM/2007-10-01-PromoteSafeValue.ll
index e3d0d02edd9df..7ac03cf4349a4 100644
--- a/llvm/test/Transforms/LICM/2007-10-01-PromoteSafeValue.ll
+++ b/llvm/test/Transforms/LICM/2007-10-01-PromoteSafeValue.ll
@@ -2,21 +2,21 @@
 ; Promote value if at least one use is safe
 
 
-define i32 @f2(i32* %p, i8* %q) {
+define i32 @f2(ptr %p, ptr %q) {
 entry:
         br label %loop.head
 
 loop.head:              ; preds = %cond.true, %entry
-        store i32 20, i32* %p
-        %tmp3.i = icmp eq i8* null, %q            ; <i1> [#uses=1]
+        store i32 20, ptr %p
+        %tmp3.i = icmp eq ptr null, %q            ; <i1> [#uses=1]
         br i1 %tmp3.i, label %exit, label %cond.true
         
 cond.true:              ; preds = %loop.head
-        store i32 40, i32* %p
+        store i32 40, ptr %p
         br label %loop.head
 
 ; CHECK: exit:
-; CHECK: store i32 20, i32* %p
+; CHECK: store i32 20, ptr %p
 exit:           ; preds = %loop.head
         ret i32 0
 }

diff  --git a/llvm/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll b/llvm/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll
index a5a7bf85f10d4..5c00d76ce5395 100644
--- a/llvm/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll
+++ b/llvm/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll
@@ -5,7 +5,7 @@ target triple = "i686-pc-linux-gnu"
 	%struct._zval_struct = type { %union._double, i32, i8, i8, i8, i8 }
 	%union._double = type { double }
 
-define i8* @zend_fetch_resource(%struct._zval_struct** %passed_id, i32 %default_id, i8* %resource_type_name, i32* %found_resource_type, i32 %num_resource_types, ...) {
+define ptr @zend_fetch_resource(ptr %passed_id, i32 %default_id, ptr %resource_type_name, ptr %found_resource_type, i32 %num_resource_types, ...) {
 entry:
 	br label %whilebody.i.i
 
@@ -19,12 +19,12 @@ forcond:		; preds = %forbody, %ifthen.i.i
 	br i1 false, label %forbody, label %afterfor
 
 forbody:		; preds = %forcond
-	va_arg i8** null, i32		; <i32>:0 [#uses=0]
+	va_arg ptr null, i32		; <i32>:0 [#uses=0]
 	br i1 false, label %ifthen59, label %forcond
 
 ifthen59:		; preds = %forbody
 	unreachable
 
 afterfor:		; preds = %forcond
-	ret i8* null
+	ret ptr null
 }

diff  --git a/llvm/test/Transforms/LICM/2008-07-22-LoadGlobalConstant.ll b/llvm/test/Transforms/LICM/2008-07-22-LoadGlobalConstant.ll
index c7b5f65dde8a2..982920f9b9169 100644
--- a/llvm/test/Transforms/LICM/2008-07-22-LoadGlobalConstant.ll
+++ b/llvm/test/Transforms/LICM/2008-07-22-LoadGlobalConstant.ll
@@ -1,12 +1,12 @@
 ; RUN: opt < %s -basic-aa -licm -S | FileCheck %s
 
- at a = external constant float*
+ at a = external constant ptr
 
 define void @test(i32 %count) {
 entry:
         br label %forcond
 
-; CHECK:  %tmp3 = load float*, float** @a
+; CHECK:  %tmp3 = load ptr, ptr @a
 ; CHECK:  br label %forcond
 
 forcond:
@@ -19,16 +19,16 @@ forcond:
 ; CHECK:  br i1 %cmp, label %forbody, label %afterfor
 
 forbody:
-        %tmp3 = load float*, float** @a
-        %arrayidx = getelementptr float, float* %tmp3, i32 %i.0
+        %tmp3 = load ptr, ptr @a
+        %arrayidx = getelementptr float, ptr %tmp3, i32 %i.0
         %tmp7 = uitofp i32 %i.0 to float
-        store float %tmp7, float* %arrayidx
+        store float %tmp7, ptr %arrayidx
         %inc = add i32 %i.0, 1
         br label %forcond
 
-; CHECK:  %arrayidx = getelementptr float, float* %tmp3, i32 %i.0
+; CHECK:  %arrayidx = getelementptr float, ptr %tmp3, i32 %i.0
 ; CHECK:  %tmp7 = uitofp i32 %i.0 to float
-; CHECK:  store float %tmp7, float* %arrayidx
+; CHECK:  store float %tmp7, ptr %arrayidx
 ; CHECK:  %inc = add i32 %i.0, 1
 ; CHECK:  br label %forcond
 

diff  --git a/llvm/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll b/llvm/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll
index 1b3ff5bbb3185..937d197212169 100644
--- a/llvm/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll
+++ b/llvm/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll
@@ -1,6 +1,6 @@
 ; Test for rdar://7452967
 ; RUN: opt < %s -licm -disable-output
-define void @foo (i8* %v)
+define void @foo (ptr %v)
 {
   entry:
     br i1 undef, label %preheader, label %return
@@ -9,10 +9,10 @@ define void @foo (i8* %v)
     br i1 undef, label %loop, label %return
 
   loop:
-    indirectbr i8* undef, [label %preheader, label %stuff]
+    indirectbr ptr undef, [label %preheader, label %stuff]
 
   stuff:
-    %0 = load i8, i8* undef, align 1
+    %0 = load i8, ptr undef, align 1
     br label %loop
 
   return:

diff  --git a/llvm/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll b/llvm/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll
index fb0fbbdc69462..b83f870a89329 100644
--- a/llvm/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll
+++ b/llvm/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll
@@ -3,9 +3,9 @@
 
 @g_39 = external global i16, align 2
 
-declare i32* @func_84(i32** nocapture) nounwind readonly
+declare ptr @func_84(ptr nocapture) nounwind readonly
 
-declare i32** @func_108(i32*** nocapture) nounwind readonly
+declare ptr @func_108(ptr nocapture) nounwind readonly
 
 define void @func() nounwind {
 entry:
@@ -15,13 +15,13 @@ for.body4.lr.ph:
   br label %for.body4
 
 ; CHECK: for.body4:
-; CHECK: load volatile i16, i16* @g_39
+; CHECK: load volatile i16, ptr @g_39
 
 for.body4:
-  %l_612.11 = phi i32* [ undef, %for.body4.lr.ph ], [ %call19, %for.body4 ]
-  %tmp7 = load volatile i16, i16* @g_39, align 2
-  %call = call i32** @func_108(i32*** undef)
-  %call19 = call i32* @func_84(i32** %call)
+  %l_612.11 = phi ptr [ undef, %for.body4.lr.ph ], [ %call19, %for.body4 ]
+  %tmp7 = load volatile i16, ptr @g_39, align 2
+  %call = call ptr @func_108(ptr undef)
+  %call19 = call ptr @func_84(ptr %call)
   br i1 false, label %for.body4, label %for.cond.loopexit
 
 for.cond.loopexit:

diff  --git a/llvm/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll b/llvm/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll
index ede773f5f039c..d6c13d4cc695d 100644
--- a/llvm/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll
+++ b/llvm/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll
@@ -2,13 +2,13 @@
 ; PR9634
 
 @g_58 = common global i32 0, align 4
- at g_116 = common global i32* null, align 8
+ at g_116 = common global ptr null, align 8
 
 define void @f() nounwind {
 
 ; CHECK: entry:
 ; CHECK: alloca [9 x i16]
-; CHECK: load i32, i32* @g_58
+; CHECK: load i32, ptr @g_58
 ; CHECK: br label %for.body
 
 entry:
@@ -17,11 +17,11 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %inc12 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
-  store i32* @g_58, i32** @g_116, align 8, !tbaa !0
-  %tmp2 = load i32*, i32** @g_116, align 8, !tbaa !0
-  %tmp3 = load i32, i32* %tmp2, !tbaa !4
+  store ptr @g_58, ptr @g_116, align 8, !tbaa !0
+  %tmp2 = load ptr, ptr @g_116, align 8, !tbaa !0
+  %tmp3 = load i32, ptr %tmp2, !tbaa !4
   %or = or i32 %tmp3, 10
-  store i32 %or, i32* %tmp2, !tbaa !4
+  store i32 %or, ptr %tmp2, !tbaa !4
   %inc = add nsw i32 %inc12, 1
   %cmp = icmp slt i32 %inc, 4
   br i1 %cmp, label %for.body, label %for.end

diff  --git a/llvm/test/Transforms/LICM/2011-04-09-RAUW-AST.ll b/llvm/test/Transforms/LICM/2011-04-09-RAUW-AST.ll
index bf069c2a99174..95614c590ff46 100644
--- a/llvm/test/Transforms/LICM/2011-04-09-RAUW-AST.ll
+++ b/llvm/test/Transforms/LICM/2011-04-09-RAUW-AST.ll
@@ -6,7 +6,7 @@
 
 define i32 @main() nounwind {
 entry:
-  %tmp = load i32, i32* @g_3, align 4
+  %tmp = load i32, ptr @g_3, align 4
   %tobool = icmp eq i32 %tmp, 0
   br i1 %tobool, label %for.cond, label %if.then
 
@@ -14,7 +14,7 @@ if.then:                                          ; preds = %entry
   br label %for.cond
 
 for.cond:                                         ; preds = %for.inc10, %if.then, %entry
-  %g.0 = phi i32* [ %g.0, %for.inc10 ], [ @g_3, %entry ], [ null, %if.then ]
+  %g.0 = phi ptr [ %g.0, %for.inc10 ], [ @g_3, %entry ], [ null, %if.then ]
   %x.0 = phi i32 [ %inc12, %for.inc10 ], [ 0, %entry ], [ 0, %if.then ]
   %cmp = icmp slt i32 %x.0, 5
   br i1 %cmp, label %for.cond4, label %for.end13
@@ -30,8 +30,8 @@ for.cond4:                                        ; preds = %for.body7, %for.con
 ; CHECK-NEXT: store i32 1
 
 for.body7:                                        ; preds = %for.cond4
-  store i32 0, i32* @g_3, align 4
-  store i32 1, i32* %g.0, align 4
+  store i32 0, ptr @g_3, align 4
+  store i32 1, ptr %g.0, align 4
   %inc = add nsw i32 %y.0, 1
   br label %for.cond4
 
@@ -40,10 +40,10 @@ for.inc10:                                        ; preds = %for.cond4
   br label %for.cond
 
 for.end13:                                        ; preds = %for.cond
-  %tmp14 = load i32, i32* @g_3, align 4
-  %call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %tmp14) nounwind
+  %tmp14 = load i32, ptr @g_3, align 4
+  %call = tail call i32 (ptr, ...) @printf(ptr @.str, i32 %tmp14) nounwind
   ret i32 0
 }
 
-declare i32 @printf(i8* nocapture, ...) nounwind
+declare i32 @printf(ptr nocapture, ...) nounwind
 

diff  --git a/llvm/test/Transforms/LICM/2011-07-06-Alignment.ll b/llvm/test/Transforms/LICM/2011-07-06-Alignment.ll
index c71dd802ea9be..f9e2f5dfdf3cf 100644
--- a/llvm/test/Transforms/LICM/2011-07-06-Alignment.ll
+++ b/llvm/test/Transforms/LICM/2011-07-06-Alignment.ll
@@ -8,9 +8,8 @@ entry:
 
 for.cond:
   %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ]
-  %arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 3
-  %vecidx = bitcast float* %arrayidx to <4 x float>*
-  store <4 x float> zeroinitializer, <4 x float>* %vecidx, align 4
+  %arrayidx = getelementptr [1024 x float], ptr @A, i64 0, i64 3
+  store <4 x float> zeroinitializer, ptr %arrayidx, align 4
   %indvar.next = add i64 %indvar, 1
   %exitcond = icmp ne i64 %indvar, 1024
   br i1 %exitcond, label %for.body, label %for.end

diff  --git a/llvm/test/Transforms/LICM/AArch64/sve-load-hoist.ll b/llvm/test/Transforms/LICM/AArch64/sve-load-hoist.ll
index c6c39a6446659..66caf877371ce 100644
--- a/llvm/test/Transforms/LICM/AArch64/sve-load-hoist.ll
+++ b/llvm/test/Transforms/LICM/AArch64/sve-load-hoist.ll
@@ -1,6 +1,6 @@
 ; RUN: opt -licm -mtriple aarch64-linux-gnu -mattr=+sve -S < %s | FileCheck %s
 
-define void @no_hoist_load1_nxv2i64(<vscale x 2 x i64>* %out, i8* %in8, i32 %n) {
+define void @no_hoist_load1_nxv2i64(ptr %out, ptr %in8, i32 %n) {
 ; CHECK-LABEL: @no_hoist_load1_nxv2i64(
 ; CHECK: entry:
 ; CHECK-NOT: load
@@ -8,16 +8,15 @@ define void @no_hoist_load1_nxv2i64(<vscale x 2 x i64>* %out, i8* %in8, i32 %n)
 ; CHECK: load
 entry:
   %cmp0 = icmp ugt i32 %n, 0
-  %invst = call {}* @llvm.invariant.start.p0i8(i64 16, i8* %in8)
-  %in = bitcast i8* %in8 to <vscale x 2 x i64>*
+  %invst = call ptr @llvm.invariant.start.p0(i64 16, ptr %in8)
   br i1 %cmp0, label %for.body, label %for.end
 
 for.body:
   %i = phi i32 [0, %entry], [%inc, %for.body]
   %i2 = zext i32 %i to i64
-  %ptr = getelementptr <vscale x 2 x i64>, <vscale x 2 x i64>* %out, i64 %i2
-  %val = load <vscale x 2 x i64>, <vscale x 2 x i64>* %in, align 16
-  store <vscale x 2 x i64> %val, <vscale x 2 x i64>* %ptr, align 16
+  %ptr = getelementptr <vscale x 2 x i64>, ptr %out, i64 %i2
+  %val = load <vscale x 2 x i64>, ptr %in8, align 16
+  store <vscale x 2 x i64> %val, ptr %ptr, align 16
   %inc = add nuw nsw i32 %i, 1
   %cmp = icmp ult i32 %inc, %n
   br i1 %cmp, label %for.body, label %for.end
@@ -26,7 +25,7 @@ for.end:
   ret void
 }
 
-define void @no_hoist_gather(<vscale x 2 x i32>* %out_ptr, <vscale x 2 x i32>* %in_ptr, <vscale x 2 x i64> %ptr_vec, i64 %n, <vscale x 2 x i1> %pred) {
+define void @no_hoist_gather(ptr %out_ptr, ptr %in_ptr, <vscale x 2 x i64> %ptr_vec, i64 %n, <vscale x 2 x i1> %pred) {
 ; CHECK-LABEL: @no_hoist_gather(
 ; CHECK: entry:
 ; CHECK-NOT: llvm.aarch64.sve.ld1.gather.scalar.offset
@@ -38,11 +37,11 @@ entry:
 for.body:
   %i = phi i64 [0, %entry], [%inc, %for.body]
   %gather = call <vscale x 2 x i32> @llvm.aarch64.sve.ld1.gather.scalar.offset.nxv2i32.nxv2i64(<vscale x 2 x i1> %pred, <vscale x 2 x i64> %ptr_vec, i64 0)
-  %in_ptr_gep = getelementptr <vscale x 2 x i32>, <vscale x 2 x i32>* %in_ptr, i64 %i
-  %in_ptr_load = load <vscale x 2 x i32>, <vscale x 2 x i32>* %in_ptr_gep, align 8
+  %in_ptr_gep = getelementptr <vscale x 2 x i32>, ptr %in_ptr, i64 %i
+  %in_ptr_load = load <vscale x 2 x i32>, ptr %in_ptr_gep, align 8
   %sum = add <vscale x 2 x i32> %gather, %in_ptr_load
-  %out_ptr_gep = getelementptr <vscale x 2 x i32>, <vscale x 2 x i32>* %out_ptr, i64 %i
-  store  <vscale x 2 x i32> %sum, <vscale x 2 x i32>* %out_ptr_gep, align 8
+  %out_ptr_gep = getelementptr <vscale x 2 x i32>, ptr %out_ptr, i64 %i
+  store  <vscale x 2 x i32> %sum, ptr %out_ptr_gep, align 8
   %inc = add nuw nsw i64 %i, 1
   %cmp = icmp ult i64 %inc, %n
   br i1 %cmp, label %for.body, label %for.end
@@ -51,7 +50,7 @@ for.end:
   ret void
 }
 
-define void @no_hoist_scatter(<vscale x 2 x i32>* %out_ptr, <vscale x 2 x i32>* %in_ptr, <vscale x 2 x i64> %ptr_vec, i64 %n, <vscale x 2 x i1> %pred) {
+define void @no_hoist_scatter(ptr %out_ptr, ptr %in_ptr, <vscale x 2 x i64> %ptr_vec, i64 %n, <vscale x 2 x i1> %pred) {
 ; CHECK-LABEL: @no_hoist_scatter(
 ; CHECK: entry:
 ; CHECK-NOT: load
@@ -62,7 +61,7 @@ entry:
 
 for.body:
   %i = phi i64 [0, %entry], [%inc, %for.body]
-  %in_ptr_load = load <vscale x 2 x i32>, <vscale x 2 x i32>* %in_ptr, align 8
+  %in_ptr_load = load <vscale x 2 x i32>, ptr %in_ptr, align 8
   call void @llvm.aarch64.sve.st1.scatter.scalar.offset.nxv2i32.nxv2i64(<vscale x 2 x i32> %in_ptr_load, <vscale x 2 x i1> %pred, <vscale x 2 x i64> %ptr_vec, i64 %i)
   %inc = add nuw nsw i64 %i, 1
   %cmp = icmp ult i64 %inc, %n
@@ -72,7 +71,7 @@ for.end:
   ret void
 }
 
-declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) nounwind readonly
+declare ptr @llvm.invariant.start.p0(i64, ptr nocapture) nounwind readonly
 
 declare void @llvm.aarch64.sve.st1.scatter.scalar.offset.nxv2i32.nxv2i64(<vscale x 2 x i32>, <vscale x 2 x i1>, <vscale x 2 x i64>, i64)
 

diff  --git a/llvm/test/Transforms/LICM/AMDGPU/bitcast.ll b/llvm/test/Transforms/LICM/AMDGPU/bitcast.ll
index 5f45465516bac..ea8bf696e565a 100644
--- a/llvm/test/Transforms/LICM/AMDGPU/bitcast.ll
+++ b/llvm/test/Transforms/LICM/AMDGPU/bitcast.ll
@@ -2,18 +2,18 @@
 
 ; CHECK-LABEL: foo
 ; CHECK: ret
-define void @foo(i8* %d, <1 x i32>* %s, i32 %idx) {
+define void @foo(ptr %d, ptr %s, i32 %idx) {
 entry:
   br label %for.body
 
 for.body:
-  %v0 = load <1 x i32>, <1 x i32>* %s
+  %v0 = load <1 x i32>, ptr %s
   %v1 = bitcast <1 x i32> %v0 to <4 x i8>
   br label %for.cond
 
 for.cond:
   %e0 = extractelement <4 x i8> %v1, i32 %idx
-  store i8 %e0, i8* %d
+  store i8 %e0, ptr %d
   br i1 false, label %for.exit, label %for.body
 
 for.exit:

diff  --git a/llvm/test/Transforms/LICM/AliasSetMemSet.ll b/llvm/test/Transforms/LICM/AliasSetMemSet.ll
index d60b321e278e2..0164c409fd9c7 100644
--- a/llvm/test/Transforms/LICM/AliasSetMemSet.ll
+++ b/llvm/test/Transforms/LICM/AliasSetMemSet.ll
@@ -14,9 +14,9 @@ bb6:                                              ; preds = %bb4, %bb6
   %k.4.04 = phi i8 [ 0, %bb4 ], [ %_tmp9, %bb6 ]
   %_tmp31 = sext i8 %j.3.06 to i64
   %_tmp4 = mul i64 %_tmp31, 10
-  %_tmp5 = getelementptr i8, i8* undef, i64 %_tmp4
-  %_tmp7 = getelementptr i8, i8* %_tmp5, i8 %k.4.04
-  store i8 42, i8* %_tmp7
+  %_tmp5 = getelementptr i8, ptr undef, i64 %_tmp4
+  %_tmp7 = getelementptr i8, ptr %_tmp5, i8 %k.4.04
+  store i8 42, ptr %_tmp7
   %_tmp9 = add i8 %k.4.04, 1
   %_tmp11 = icmp slt i8 %_tmp9, 10
   br i1 %_tmp11, label %bb6, label %bb7

diff  --git a/llvm/test/Transforms/LICM/PR21582.ll b/llvm/test/Transforms/LICM/PR21582.ll
index 2fbbc66e57414..31277b1b4eb98 100644
--- a/llvm/test/Transforms/LICM/PR21582.ll
+++ b/llvm/test/Transforms/LICM/PR21582.ll
@@ -10,8 +10,8 @@ entry:
 
 for.cond:                                         ; preds = %for.end, %entry
 ; CHECK-LABEL: for.cond:
-; CHECK: store i32 0, i32* @b
-  store i32 0, i32* @b, align 4
+; CHECK: store i32 0, ptr @b
+  store i32 0, ptr @b, align 4
   br i1 true, label %for.body.preheader, label %for.end
 
 for.body.preheader:                               ; preds = %for.cond
@@ -19,8 +19,7 @@ for.body.preheader:                               ; preds = %for.cond
 
 for.body:                                         ; preds = %for.body, %for.body.preheader
   %g.15 = phi i32 [ undef, %for.body ], [ 0, %for.body.preheader ]
-  %arrayidx2 = getelementptr inbounds i32, i32* @fn3.i, i64 0
-  %0 = load i32, i32* %arrayidx2, align 4
+  %0 = load i32, ptr @fn3.i, align 4
   %call = call i32 @g()
   br i1 false, label %for.body, label %for.end.loopexit
 
@@ -34,7 +33,7 @@ for.end:                                          ; preds = %for.end.loopexit, %
 if.then:                                          ; preds = %for.end
 ; CHECK-LABEL: if.then:
 ; CHECK: phi i32 [ {{.*}}, %for.end ]
-; CHECK-NOT: store i32 0, i32* @b
+; CHECK-NOT: store i32 0, ptr @b
 ; CHECK: ret i32
   ret i32 %whatever
 }

diff  --git a/llvm/test/Transforms/LICM/allow-speculation-option.ll b/llvm/test/Transforms/LICM/allow-speculation-option.ll
index 46839cb19a061..cf36e013bdc83 100644
--- a/llvm/test/Transforms/LICM/allow-speculation-option.ll
+++ b/llvm/test/Transforms/LICM/allow-speculation-option.ll
@@ -3,19 +3,19 @@
 ; RUN: opt -passes='loop-mssa(lnicm<allowspeculation>)' -S %s | FileCheck --check-prefixes=COMMON,SPEC_ON %s
 ; RUN: opt -passes='loop-mssa(lnicm<no-allowspeculation>)' -S %s | FileCheck --check-prefixes=COMMON,SPEC_OFF %s
 
-define void @test([10 x i32]* %ptr, i32 %N) {
+define void @test(ptr %ptr, i32 %N) {
 ; COMMON-LABEL: @test(
 ; COMMON-NEXT:  entry:
-; SPEC_ON-NEXT:   [[GEP:%.*]] = getelementptr [10 x i32], [10 x i32]* [[PTR:%.*]], i32 0, i32 1
+; SPEC_ON-NEXT:   [[GEP:%.*]] = getelementptr [10 x i32], ptr [[PTR:%.*]], i32 0, i32 1
 ; COMMON-NEXT:    br label [[LOOP_HEADER:%.*]]
 ; COMMON:       loop.header:
 ; COMMON-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
 ; COMMON-NEXT:    [[CMP:%.*]] = icmp ult i32 [[IV]], [[N:%.*]]
 ; COMMON-NEXT:    br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]
 ; COMMON:       loop.latch:
-; SPEC_OFF-NEXT:  [[GEP:%.*]] = getelementptr [10 x i32], [10 x i32]* [[PTR:%.*]], i32 0, i32 1
-; COMMON-NEXT:    [[GEP_IV:%.*]] = getelementptr i32, i32* [[GEP]], i32 [[IV]]
-; COMMON-NEXT:    store i32 9999, i32* [[GEP_IV]], align 4
+; SPEC_OFF-NEXT:  [[GEP:%.*]] = getelementptr [10 x i32], ptr [[PTR:%.*]], i32 0, i32 1
+; COMMON-NEXT:    [[GEP_IV:%.*]] = getelementptr i32, ptr [[GEP]], i32 [[IV]]
+; COMMON-NEXT:    store i32 9999, ptr [[GEP_IV]], align 4
 ; COMMON-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
 ; COMMON-NEXT:    br label [[LOOP_HEADER]]
 ; COMMON:       exit:
@@ -30,9 +30,9 @@ loop.header:
   br i1 %cmp, label %loop.latch, label %exit
 
 loop.latch:
-  %gep = getelementptr [10 x i32], [10 x i32]* %ptr, i32 0, i32 1
-  %gep.iv = getelementptr i32, i32* %gep, i32 %iv
-  store i32 9999, i32* %gep.iv
+  %gep = getelementptr [10 x i32], ptr %ptr, i32 0, i32 1
+  %gep.iv = getelementptr i32, ptr %gep, i32 %iv
+  store i32 9999, ptr %gep.iv
   %iv.next = add i32 %iv, 1
   br label %loop.header
 

diff  --git a/llvm/test/Transforms/LICM/argmemonly-call.ll b/llvm/test/Transforms/LICM/argmemonly-call.ll
index 59b9c687d3351..89f762790bd8b 100644
--- a/llvm/test/Transforms/LICM/argmemonly-call.ll
+++ b/llvm/test/Transforms/LICM/argmemonly-call.ll
@@ -2,9 +2,9 @@
 
 declare i32 @foo() readonly argmemonly nounwind
 declare i32 @foo2() readonly nounwind
-declare i32 @bar(i32* %loc2) readonly argmemonly nounwind
+declare i32 @bar(ptr %loc2) readonly argmemonly nounwind
 
-define void @test(i32* %loc) {
+define void @test(ptr %loc) {
 ; CHECK-LABEL: @test
 ; CHECK: @foo
 ; CHECK-LABEL: loop:
@@ -12,12 +12,12 @@ define void @test(i32* %loc) {
 
 loop:
   %res = call i32 @foo()
-  store i32 %res, i32* %loc
+  store i32 %res, ptr %loc
   br label %loop
 }
 
 ; Negative test: show argmemonly is required
-define void @test_neg(i32* %loc) {
+define void @test_neg(ptr %loc) {
 ; CHECK-LABEL: @test_neg
 ; CHECK-LABEL: loop:
 ; CHECK: @foo
@@ -25,99 +25,95 @@ define void @test_neg(i32* %loc) {
 
 loop:
   %res = call i32 @foo2()
-  store i32 %res, i32* %loc
+  store i32 %res, ptr %loc
   br label %loop
 }
 
-define void @test2(i32* noalias %loc, i32* noalias %loc2) {
+define void @test2(ptr noalias %loc, ptr noalias %loc2) {
 ; CHECK-LABEL: @test2
 ; CHECK: @bar
 ; CHECK-LABEL: loop:
   br label %loop
 
 loop:
-  %res = call i32 @bar(i32* %loc2)
-  store i32 %res, i32* %loc
+  %res = call i32 @bar(ptr %loc2)
+  store i32 %res, ptr %loc
   br label %loop
 }
 
 ; Negative test: %might clobber gep
-define void @test3(i32* %loc) {
+define void @test3(ptr %loc) {
 ; CHECK-LABEL: @test3
 ; CHECK-LABEL: loop:
 ; CHECK: @bar
   br label %loop
 
 loop:
-  %res = call i32 @bar(i32* %loc)
-  %gep = getelementptr i32, i32 *%loc, i64 1000000
-  store i32 %res, i32* %gep
+  %res = call i32 @bar(ptr %loc)
+  %gep = getelementptr i32, ptr %loc, i64 1000000
+  store i32 %res, ptr %gep
   br label %loop
 }
 
 
 ; Negative test: %loc might alias %loc2
-define void @test4(i32* %loc, i32* %loc2) {
+define void @test4(ptr %loc, ptr %loc2) {
 ; CHECK-LABEL: @test4
 ; CHECK-LABEL: loop:
 ; CHECK: @bar
   br label %loop
 
 loop:
-  %res = call i32 @bar(i32* %loc2)
-  store i32 %res, i32* %loc
+  %res = call i32 @bar(ptr %loc2)
+  store i32 %res, ptr %loc
   br label %loop
 }
 
-declare i32 @foo_new(i32*) readonly
+declare i32 @foo_new(ptr) readonly
 
-define void @test5(i32* %loc2, i32* noalias %loc) {
+define void @test5(ptr %loc2, ptr noalias %loc) {
 ; CHECK-LABEL: @test5
 ; CHECK: @bar
 ; CHECK-LABEL: loop:
   br label %loop
 
 loop:
-  %res1 = call i32 @bar(i32* %loc2)
-  %res = call i32 @foo_new(i32* %loc2)
-  store volatile i32 %res1, i32* %loc
+  %res1 = call i32 @bar(ptr %loc2)
+  %res = call i32 @foo_new(ptr %loc2)
+  store volatile i32 %res1, ptr %loc
   br label %loop
 }
 
 
 ; memcpy doesn't write to it's source argument, so loads to that location
 ; can still be hoisted
-define void @test6(i32* noalias %loc, i32* noalias %loc2) {
+define void @test6(ptr noalias %loc, ptr noalias %loc2) {
 ; CHECK-LABEL: @test6
-; CHECK: %val = load i32, i32* %loc2
+; CHECK: %val = load i32, ptr %loc2
 ; CHECK-LABEL: loop:
 ; CHECK: @llvm.memcpy
   br label %loop
 
 loop:
-  %val = load i32, i32* %loc2
-  store i32 %val, i32* %loc
-  %dest = bitcast i32* %loc to i8*
-  %src = bitcast i32* %loc2 to i8*
-  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 8, i1 false)
+  %val = load i32, ptr %loc2
+  store i32 %val, ptr %loc
+  call void @llvm.memcpy.p0.p0.i64(ptr %loc, ptr %loc2, i64 8, i1 false)
   br label %loop
 }
 
-define void @test7(i32* noalias %loc, i32* noalias %loc2) {
+define void @test7(ptr noalias %loc, ptr noalias %loc2) {
 ; CHECK-LABEL: @test7
-; CHECK: %val = load i32, i32* %loc2
+; CHECK: %val = load i32, ptr %loc2
 ; CHECK-LABEL: loop:
 ; CHECK: @custom_memcpy
   br label %loop
 
 loop:
-  %val = load i32, i32* %loc2
-  store i32 %val, i32* %loc
-  %dest = bitcast i32* %loc to i8*
-  %src = bitcast i32* %loc2 to i8*
-  call void @custom_memcpy(i8* %dest, i8* %src)
+  %val = load i32, ptr %loc2
+  store i32 %val, ptr %loc
+  call void @custom_memcpy(ptr %loc, ptr %loc2)
   br label %loop
 }
 
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1)
-declare void @custom_memcpy(i8* nocapture writeonly, i8* nocapture readonly) argmemonly nounwind
+declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1)
+declare void @custom_memcpy(ptr nocapture writeonly, ptr nocapture readonly) argmemonly nounwind

diff  --git a/llvm/test/Transforms/LICM/assume.ll b/llvm/test/Transforms/LICM/assume.ll
index 187ffb831893a..4fc1863aaabbf 100644
--- a/llvm/test/Transforms/LICM/assume.ll
+++ b/llvm/test/Transforms/LICM/assume.ll
@@ -33,11 +33,11 @@ for.end104:
   ret void
 }
 
-define void @f_1(i1 %cond, i32* %ptr) {
+define void @f_1(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @f_1(
 ; CHECK-LABEL: entry:
 ; CHECK: call void @llvm.assume(i1 %cond)
-; CHECK: %val = load i32, i32* %ptr
+; CHECK: %val = load i32, ptr %ptr
 ; CHECK-LABEL: loop:
 
 entry:
@@ -46,19 +46,19 @@ entry:
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
   call void @llvm.assume(i1 %cond)
-  %val = load i32, i32* %ptr
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; Can't hoist because the call may throw and the assume
 ; may never execute.
-define void @f_2(i1 %cond, i32* %ptr) {
+define void @f_2(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @f_2(
 ; CHECK-LABEL: entry:
 ; CHECK-LABEL: loop:
 ; CHECK: call void @llvm.assume(i1 %cond)
-; CHECK: %val = load i32, i32* %ptr
+; CHECK: %val = load i32, ptr %ptr
 
 entry:
   br label %loop
@@ -67,17 +67,17 @@ loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
   call void @maythrow()
   call void @llvm.assume(i1 %cond)
-  %val = load i32, i32* %ptr
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; Note: resulting loop could be peeled and then hoisted, but
 ; by default assume is captured in phi cycle.
-define void @f_3(i1 %cond, i32* %ptr) {
+define void @f_3(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @f_3(
 ; CHECK-LABEL: entry:
-; CHECK: %val = load i32, i32* %ptr
+; CHECK: %val = load i32, ptr %ptr
 ; CHECK-LABEL: loop:
 ; CHECK: call void @llvm.assume(i1 %x.cmp)
 
@@ -88,7 +88,7 @@ loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
   %x.cmp = phi i1 [%cond, %entry], [%cond.next, %loop]
   call void @llvm.assume(i1 %x.cmp)
-  %val = load i32, i32* %ptr
+  %val = load i32, ptr %ptr
   %cond.next = icmp eq i32 %val, 5
   %x.inc = add i32 %x, %val
   br label %loop

diff  --git a/llvm/test/Transforms/LICM/atomics.ll b/llvm/test/Transforms/LICM/atomics.ll
index c7ff0c46b9098..06946e0fdc78c 100644
--- a/llvm/test/Transforms/LICM/atomics.ll
+++ b/llvm/test/Transforms/LICM/atomics.ll
@@ -1,13 +1,13 @@
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck %s
 
 ; Check that we can hoist unordered loads
-define i32 @test1(i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test1(ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
   %i = phi i32 [ %inc, %loop ], [ 0, %entry ]
-  %val = load atomic i32, i32* %y unordered, align 4
+  %val = load atomic i32, ptr %y unordered, align 4
   %inc = add nsw i32 %i, 1
   %exitcond = icmp eq i32 %inc, %val
   br i1 %exitcond, label %end, label %loop
@@ -22,12 +22,12 @@ end:
 ; Check that we don't sink/hoist monotonic loads
 ; (Strictly speaking, it's not forbidden, but it's supposed to be possible to
 ; use monotonic for spinlock-like constructs.)
-define i32 @test2(i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test2(ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  %val = load atomic i32, i32* %y monotonic, align 4
+  %val = load atomic i32, ptr %y monotonic, align 4
   %exitcond = icmp ne i32 %val, 0
   br i1 %exitcond, label %end, label %loop
 
@@ -42,31 +42,31 @@ end:
 ; Check that we hoist unordered around monotonic.
 ; (The noalias shouldn't be necessary in theory, but LICM isn't quite that
 ; smart yet.)
-define i32 @test3(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test3(ptr nocapture noalias %x, ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  %valb = load atomic i32, i32* %x unordered, align 4
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  %valb = load atomic i32, ptr %x unordered, align 4
   %exitcond = icmp ne i32 %vala, %valb
   br i1 %exitcond, label %end, label %loop
 
 end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test3(
-; CHECK: load atomic i32, i32* %x unordered
+; CHECK: load atomic i32, ptr %x unordered
 ; CHECK-NEXT: br label %loop
 }
 
 ; We can sink an unordered store
-define i32 @test4(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test4(ptr nocapture noalias %x, ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store atomic i32 %vala, i32* %x unordered, align 4
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store atomic i32 %vala, ptr %x unordered, align 4
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
 
@@ -74,98 +74,98 @@ end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test4(
 ; CHECK-LABEL: loop:
-; CHECK: load atomic i32, i32* %y monotonic
+; CHECK: load atomic i32, ptr %y monotonic
 ; CHECK-NOT: store
 ; CHECK-LABEL: end:
 ; CHECK-NEXT:   %[[LCSSAPHI:.*]] = phi i32 [ %vala
-; CHECK:   store atomic i32 %[[LCSSAPHI]], i32* %x unordered, align 4
+; CHECK:   store atomic i32 %[[LCSSAPHI]], ptr %x unordered, align 4
 }
 
 ; We currently don't handle ordered atomics.
-define i32 @test5(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test5(ptr nocapture noalias %x, ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store atomic i32 %vala, i32* %x release, align 4
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store atomic i32 %vala, ptr %x release, align 4
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
 
 end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test5(
-; CHECK: load atomic i32, i32* %y monotonic
+; CHECK: load atomic i32, ptr %y monotonic
 ; CHECK-NEXT: store atomic
 }
 
 ; We currently don't touch volatiles
-define i32 @test6(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test6(ptr nocapture noalias %x, ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store volatile i32 %vala, i32* %x, align 4
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store volatile i32 %vala, ptr %x, align 4
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
 
 end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test6(
-; CHECK: load atomic i32, i32* %y monotonic
+; CHECK: load atomic i32, ptr %y monotonic
 ; CHECK-NEXT: store volatile
 }
 
 ; We currently don't touch volatiles
-define i32 @test6b(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test6b(ptr nocapture noalias %x, ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store atomic volatile i32 %vala, i32* %x unordered, align 4
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store atomic volatile i32 %vala, ptr %x unordered, align 4
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
 
 end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test6b(
-; CHECK: load atomic i32, i32* %y monotonic
+; CHECK: load atomic i32, ptr %y monotonic
 ; CHECK-NEXT: store atomic volatile
 }
 
 ; Mixing unorder atomics and normal loads/stores is
 ; current unimplemented
-define i32 @test7(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp {
+define i32 @test7(ptr nocapture noalias %x, ptr nocapture %y) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  store i32 5, i32* %x
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store atomic i32 %vala, i32* %x unordered, align 4
+  store i32 5, ptr %x
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store atomic i32 %vala, ptr %x unordered, align 4
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
 
 end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test7(
-; CHECK: store i32 5, i32* %x
-; CHECK-NEXT: load atomic i32, i32* %y
+; CHECK: store i32 5, ptr %x
+; CHECK-NEXT: load atomic i32, ptr %y
 ; CHECK-NEXT: store atomic i32
 }
 
 ; Three provably noalias locations - we can sink normal and unordered, but
 ;  not monotonic
-define i32 @test7b(i32* nocapture noalias %x, i32* nocapture %y, i32* noalias nocapture %z) nounwind uwtable ssp {
+define i32 @test7b(ptr nocapture noalias %x, ptr nocapture %y, ptr noalias nocapture %z) nounwind uwtable ssp {
 entry:
   br label %loop
 
 loop:
-  store i32 5, i32* %x
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store atomic i32 %vala, i32* %z unordered, align 4
+  store i32 5, ptr %x
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store atomic i32 %vala, ptr %z unordered, align 4
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
 
@@ -173,20 +173,20 @@ end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test7b(
 ; CHECK-LABEL: loop:
-; CHECK: load atomic i32, i32* %y monotonic
+; CHECK: load atomic i32, ptr %y monotonic
 ; CHECK-LABEL: end:
-; CHECK: store i32 5, i32* %x
-; CHECK: store atomic i32 %{{.+}}, i32* %z unordered, align 4
+; CHECK: store i32 5, ptr %x
+; CHECK: store atomic i32 %{{.+}}, ptr %z unordered, align 4
 }
 
 
-define i32 @test8(i32* nocapture noalias %x, i32* nocapture %y) {
+define i32 @test8(ptr nocapture noalias %x, ptr nocapture %y) {
 entry:
   br label %loop
 
 loop:
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store atomic i32 %vala, i32* %x unordered, align 4
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store atomic i32 %vala, ptr %x unordered, align 4
   fence release
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
@@ -195,20 +195,20 @@ end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test8(
 ; CHECK-LABEL: loop:
-; CHECK: load atomic i32, i32* %y monotonic
+; CHECK: load atomic i32, ptr %y monotonic
 ; CHECK-NEXT: store atomic
 ; CHECK-NEXT: fence
 }
 
 ; Exact semantics of monotonic accesses are a bit vague in the C++ spec,
 ; for the moment, be conservative and don't touch them.
-define i32 @test9(i32* nocapture noalias %x, i32* nocapture %y) {
+define i32 @test9(ptr nocapture noalias %x, ptr nocapture %y) {
 entry:
   br label %loop
 
 loop:
-  %vala = load atomic i32, i32* %y monotonic, align 4
-  store atomic i32 %vala, i32* %x monotonic, align 4
+  %vala = load atomic i32, ptr %y monotonic, align 4
+  store atomic i32 %vala, ptr %x monotonic, align 4
   %exitcond = icmp ne i32 %vala, 0
   br i1 %exitcond, label %end, label %loop
 
@@ -216,6 +216,6 @@ end:
   ret i32 %vala
 ; CHECK-LABEL: define i32 @test9(
 ; CHECK-LABEL: loop:
-; CHECK: load atomic i32, i32* %y monotonic
-; CHECK-NEXT:   store atomic i32 %vala, i32* %x monotonic, align 4
+; CHECK: load atomic i32, ptr %y monotonic
+; CHECK-NEXT:   store atomic i32 %vala, ptr %x monotonic, align 4
 }

diff  --git a/llvm/test/Transforms/LICM/call-hoisting.ll b/llvm/test/Transforms/LICM/call-hoisting.ll
index 084d8e21f8616..cc5d0f83d3be8 100644
--- a/llvm/test/Transforms/LICM/call-hoisting.ll
+++ b/llvm/test/Transforms/LICM/call-hoisting.ll
@@ -1,9 +1,9 @@
 ; RUN: opt -S -basic-aa -licm %s | FileCheck %s
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck %s
 
-declare i32 @load(i32* %p) argmemonly readonly nounwind
+declare i32 @load(ptr %p) argmemonly readonly nounwind
 
-define void @test_load(i32* noalias %loc, i32* noalias %sink) {
+define void @test_load(ptr noalias %loc, ptr noalias %sink) {
 ; CHECK-LABEL: @test_load
 ; CHECK-LABEL: entry:
 ; CHECK: call i32 @load
@@ -13,8 +13,8 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  %ret = call i32 @load(i32* %loc)
-  store volatile i32 %ret, i32* %sink
+  %ret = call i32 @load(ptr %loc)
+  store volatile i32 %ret, ptr %sink
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -23,18 +23,18 @@ exit:
   ret void
 }
 
-declare i32 @spec(i32* %p, i32* %q) readonly argmemonly nounwind speculatable
+declare i32 @spec(ptr %p, ptr %q) readonly argmemonly nounwind speculatable
 
 ; We should strip the dereferenceable callsite attribute on spec call's argument since it is
 ; can cause UB in the speculatable call when hoisted to preheader.
 ; However, we need not strip the nonnull attribute since it just propagates
 ; poison if the parameter was indeed null.
-define void @test_strip_attribute(i32* noalias %loc, i32* noalias %sink, i32* %q) {
+define void @test_strip_attribute(ptr noalias %loc, ptr noalias %sink, ptr %q) {
 ; CHECK-LABEL: @test_strip_attribute(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[RET:%.*]] = call i32 @load(i32* [[LOC:%.*]])
-; CHECK-NEXT:    [[NULLCHK:%.*]] = icmp eq i32* [[Q:%.*]], null
-; CHECK-NEXT:    [[RET2:%.*]] = call i32 @spec(i32* nonnull [[Q]], i32* [[LOC]])
+; CHECK-NEXT:    [[RET:%.*]] = call i32 @load(ptr [[LOC:%.*]])
+; CHECK-NEXT:    [[NULLCHK:%.*]] = icmp eq ptr [[Q:%.*]], null
+; CHECK-NEXT:    [[RET2:%.*]] = call i32 @spec(ptr nonnull [[Q]], ptr [[LOC]])
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[ISNULL:%.*]] ]
@@ -44,16 +44,16 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %isnull ]
-  %ret = call i32 @load(i32* %loc)
-  %nullchk = icmp eq i32* %q, null
+  %ret = call i32 @load(ptr %loc)
+  %nullchk = icmp eq ptr %q, null
   br i1 %nullchk, label %isnull, label %nonnullbb
 
 nonnullbb:
-  %ret2 = call i32 @spec(i32* nonnull %q, i32* dereferenceable(12) %loc)
+  %ret2 = call i32 @spec(ptr nonnull %q, ptr dereferenceable(12) %loc)
   br label %isnull
 
 isnull:
-  store volatile i32 %ret, i32* %sink
+  store volatile i32 %ret, ptr %sink
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -62,9 +62,9 @@ exit:
   ret void
 }
 
-declare void @store(i32 %val, i32* %p) argmemonly writeonly nounwind
+declare void @store(i32 %val, ptr %p) argmemonly writeonly nounwind
 
-define void @test(i32* %loc) {
+define void @test(ptr %loc) {
 ; CHECK-LABEL: @test
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -74,7 +74,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @store(i32 0, i32* %loc)
+  call void @store(i32 0, ptr %loc)
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -83,7 +83,7 @@ exit:
   ret void
 }
 
-define void @test_multiexit(i32* %loc, i1 %earlycnd) {
+define void @test_multiexit(ptr %loc, i1 %earlycnd) {
 ; CHECK-LABEL: @test_multiexit
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -93,7 +93,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
-  call void @store(i32 0, i32* %loc)
+  call void @store(i32 0, ptr %loc)
   %iv.next = add i32 %iv, 1
   br i1 %earlycnd, label %exit1, label %backedge
 
@@ -107,7 +107,7 @@ exit2:
   ret void
 }
 
-define void @neg_lv_value(i32* %loc) {
+define void @neg_lv_value(ptr %loc) {
 ; CHECK-LABEL: @neg_lv_value
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -117,7 +117,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @store(i32 %iv, i32* %loc)
+  call void @store(i32 %iv, ptr %loc)
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -126,7 +126,7 @@ exit:
   ret void
 }
 
-define void @neg_lv_addr(i32* %loc) {
+define void @neg_lv_addr(ptr %loc) {
 ; CHECK-LABEL: @neg_lv_addr
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -136,8 +136,8 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  %p = getelementptr i32, i32* %loc, i32 %iv
-  call void @store(i32 0, i32* %p)
+  %p = getelementptr i32, ptr %loc, i32 %iv
+  call void @store(i32 0, ptr %p)
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -146,7 +146,7 @@ exit:
   ret void
 }
 
-define void @neg_mod(i32* %loc) {
+define void @neg_mod(ptr %loc) {
 ; CHECK-LABEL: @neg_mod
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -156,8 +156,8 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @store(i32 0, i32* %loc)
-  store i32 %iv, i32* %loc
+  call void @store(i32 0, ptr %loc)
+  store i32 %iv, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -166,7 +166,7 @@ exit:
   ret void
 }
 
-define void @neg_ref(i32* %loc) {
+define void @neg_ref(ptr %loc) {
 ; CHECK-LABEL: @neg_ref
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -176,8 +176,8 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
-  call void @store(i32 0, i32* %loc)
-  %v = load i32, i32* %loc
+  call void @store(i32 0, ptr %loc)
+  %v = load i32, ptr %loc
   %earlycnd = icmp eq i32 %v, 198
   br i1 %earlycnd, label %exit1, label %backedge
 
@@ -194,7 +194,7 @@ exit2:
 
 declare void @modref()
 
-define void @neg_modref(i32* %loc) {
+define void @neg_modref(ptr %loc) {
 ; CHECK-LABEL: @neg_modref
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -204,7 +204,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @store(i32 0, i32* %loc)
+  call void @store(i32 0, ptr %loc)
   call void @modref()
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
@@ -214,7 +214,7 @@ exit:
   ret void
 }
 
-define void @neg_fence(i32* %loc) {
+define void @neg_fence(ptr %loc) {
 ; CHECK-LABEL: @neg_fence
 ; CHECK-LABEL: loop:
 ; CHECK: call void @store
@@ -224,7 +224,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @store(i32 0, i32* %loc)
+  call void @store(i32 0, ptr %loc)
   fence seq_cst
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
@@ -234,11 +234,11 @@ exit:
   ret void
 }
 
-declare void @not_nounwind(i32 %v, i32* %p) writeonly argmemonly
-declare void @not_argmemonly(i32 %v, i32* %p) writeonly nounwind
-declare void @not_writeonly(i32 %v, i32* %p) argmemonly nounwind
+declare void @not_nounwind(i32 %v, ptr %p) writeonly argmemonly
+declare void @not_argmemonly(i32 %v, ptr %p) writeonly nounwind
+declare void @not_writeonly(i32 %v, ptr %p) argmemonly nounwind
 
-define void @neg_not_nounwind(i32* %loc) {
+define void @neg_not_nounwind(ptr %loc) {
 ; CHECK-LABEL: @neg_not_nounwind
 ; CHECK-LABEL: loop:
 ; CHECK: call void @not_nounwind
@@ -248,7 +248,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @not_nounwind(i32 0, i32* %loc)
+  call void @not_nounwind(i32 0, ptr %loc)
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -257,7 +257,7 @@ exit:
   ret void
 }
 
-define void @neg_not_argmemonly(i32* %loc) {
+define void @neg_not_argmemonly(ptr %loc) {
 ; CHECK-LABEL: @neg_not_argmemonly
 ; CHECK-LABEL: loop:
 ; CHECK: call void @not_argmemonly
@@ -267,7 +267,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @not_argmemonly(i32 0, i32* %loc)
+  call void @not_argmemonly(i32 0, ptr %loc)
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -276,7 +276,7 @@ exit:
   ret void
 }
 
-define void @neg_not_writeonly(i32* %loc) {
+define void @neg_not_writeonly(ptr %loc) {
 ; CHECK-LABEL: @neg_not_writeonly
 ; CHECK-LABEL: loop:
 ; CHECK: call void @not_writeonly
@@ -286,7 +286,7 @@ entry:
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  call void @not_writeonly(i32 0, i32* %loc)
+  call void @not_writeonly(i32 0, ptr %loc)
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit

diff  --git a/llvm/test/Transforms/LICM/constexpr.ll b/llvm/test/Transforms/LICM/constexpr.ll
index 40d2ef25e8196..7871a47a572b0 100644
--- a/llvm/test/Transforms/LICM/constexpr.ll
+++ b/llvm/test/Transforms/LICM/constexpr.ll
@@ -5,12 +5,12 @@
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-pc-windows-msvc"
 
- at in = internal unnamed_addr global i32* null, align 8
- at out = internal unnamed_addr global i32* null, align 8
+ at in = internal unnamed_addr global ptr null, align 8
+ at out = internal unnamed_addr global ptr null, align 8
 
 ; CHECK-LABEL: @bar
 ; CHECK: entry:
-; CHECK: load i64, i64* bitcast (i32** @in to i64*)
+; CHECK: load i64, ptr @in
 ; CHECK: do.body:
 ; CHECK-NOT: load
 
@@ -25,18 +25,18 @@ do.body:                                          ; preds = %l2, %entry
   br i1 %c, label %l1, label %do.body.l2_crit_edge
 
 do.body.l2_crit_edge:                             ; preds = %do.body
-  %inval.pre = load i32*, i32** @in, align 8
+  %inval.pre = load ptr, ptr @in, align 8
   br label %l2
 
 l1:                                               ; preds = %do.body
-  %v1 = load i64, i64* bitcast (i32** @in to i64*), align 8
-  store i64 %v1, i64* bitcast (i32** @out to i64*), align 8
-  %0 = inttoptr i64 %v1 to i32*
+  %v1 = load i64, ptr @in, align 8
+  store i64 %v1, ptr @out, align 8
+  %0 = inttoptr i64 %v1 to ptr
   br label %l2
 
 l2:                                               ; preds = %do.body.l2_crit_edge, %l1
-  %inval = phi i32* [ %inval.pre, %do.body.l2_crit_edge ], [ %0, %l1 ]
-  %int = ptrtoint i32* %inval to i64
+  %inval = phi ptr [ %inval.pre, %do.body.l2_crit_edge ], [ %0, %l1 ]
+  %int = ptrtoint ptr %inval to i64
   %next = add i64 %total, %int
   %inc = add nsw i32 %i.0, 1
   %cmp = icmp slt i32 %inc, %N

diff  --git a/llvm/test/Transforms/LICM/convergent.ll b/llvm/test/Transforms/LICM/convergent.ll
index 9ff95bf1d320f..c3d92881a2927 100644
--- a/llvm/test/Transforms/LICM/convergent.ll
+++ b/llvm/test/Transforms/LICM/convergent.ll
@@ -5,7 +5,7 @@
 ; CHECK: loop:
 ; CHECK: call i32 @f
 
-define i32 @test(i32* nocapture noalias %x, i32* nocapture %y) {
+define i32 @test(ptr nocapture noalias %x, ptr nocapture %y) {
 entry:
   br label %loop
 

diff  --git a/llvm/test/Transforms/LICM/crash.ll b/llvm/test/Transforms/LICM/crash.ll
index 607449b821ad0..e724e556be855 100644
--- a/llvm/test/Transforms/LICM/crash.ll
+++ b/llvm/test/Transforms/LICM/crash.ll
@@ -12,12 +12,12 @@ entry:
   br label %for.body
 
 for.body:                                         ; preds = %for.cond, %bb.nph
-  store i8 0, i8* @g_12, align 1
-  %tmp6 = load i8, i8* @g_12, align 1
+  store i8 0, ptr @g_12, align 1
+  %tmp6 = load i8, ptr @g_12, align 1
   br label %for.cond
 
 for.cond:                                         ; preds = %for.body
-  store i8 %tmp6, i8* @g_12, align 1
+  store i8 %tmp6, ptr @g_12, align 1
   br i1 false, label %for.cond.for.end10_crit_edge, label %for.body
 
 for.cond.for.end10_crit_edge:                     ; preds = %for.cond
@@ -35,31 +35,29 @@ entry:
   br label %for.body
 
 for.body:                                         ; preds = %for.body, %entry
-  %tmp7 = load i32, i32* @g_8, align 4
-  store i32* @g_8, i32** undef, align 16
-  store i32 undef, i32* @g_8, align 4
+  %tmp7 = load i32, ptr @g_8, align 4
+  store ptr @g_8, ptr undef, align 16
+  store i32 undef, ptr @g_8, align 4
   br label %for.body
 }
 
 ; PR8102
 define void @test3() {
 entry:
-  %__first = alloca { i32* }
+  %__first = alloca { ptr }
   br i1 undef, label %for.cond, label %for.end
 
 for.cond:                                         ; preds = %for.cond, %entry
-  %tmp1 = getelementptr { i32*}, { i32*}* %__first, i32 0, i32 0
-  %tmp2 = load i32*, i32** %tmp1, align 4
-  %call = tail call i32* @test3helper(i32* %tmp2)
-  %tmp3 = getelementptr { i32*}, { i32*}* %__first, i32 0, i32 0
-  store i32* %call, i32** %tmp3, align 4
+  %tmp2 = load ptr, ptr %__first, align 4
+  %call = tail call ptr @test3helper(ptr %tmp2)
+  store ptr %call, ptr %__first, align 4
   br i1 false, label %for.cond, label %for.end
 
 for.end:                                          ; preds = %for.cond, %entry
   ret void
 }
 
-declare i32* @test3helper(i32*)
+declare ptr @test3helper(ptr)
 
 
 ; PR8602
@@ -69,8 +67,8 @@ define void @test4() noreturn nounwind {
   br label %1
 
 ; <label>:1                                       ; preds = %1, %0
-  store volatile i32* @g_47, i32** undef, align 8
-  store i32 undef, i32* @g_47, align 4
+  store volatile ptr @g_47, ptr undef, align 8
+  store i32 undef, ptr @g_47, align 4
   br label %1
 }
 

diff  --git a/llvm/test/Transforms/LICM/dropped-tbaa.ll b/llvm/test/Transforms/LICM/dropped-tbaa.ll
index 3297cc0b305a5..9c47435372dfa 100644
--- a/llvm/test/Transforms/LICM/dropped-tbaa.ll
+++ b/llvm/test/Transforms/LICM/dropped-tbaa.ll
@@ -3,11 +3,11 @@
 
 ; This test case case is generated from the following C code with -fstrict-aliasing,
 ; and after passing through -inline -mem2reg -loop-rotate -instcombine
-; void add(double *restrict data, int *restrict addend) {
+; void add(ptr restrict data, int *restrict addend) {
 ;    *data += *addend;
 ; }
 ;
-; void foo(double *data, int *addend) {
+; void foo(ptr data, int *addend) {
 ;    for (int i = 0; i < 1000; ++i) {
 ;        *data += *addend;
 ;        add(data, addend);
@@ -16,17 +16,16 @@
 ; We want to make sure the load of addend gets hoisted, independent of the second load
 ; load having 
diff erent noalias metadata.
 
-define void @foo(double* %data, i32* %addend) #0 {
+define void @foo(ptr %data, ptr %addend) #0 {
 ; CHECK:       for.body.lr.ph:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ADDEND:%.*]], align 4, !tbaa !1
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ADDEND:%.*]], align 4, !tbaa !1
 ; CHECK-NEXT:    [[CONV:%.*]] = sitofp i32 [[TMP1]] to double
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ADDEND]], align 4, !tbaa !1, !alias.scope !5, !noalias !8
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ADDEND]], align 4, !tbaa !1, !alias.scope !5, !noalias !8
 ; CHECK-NEXT:    [[CONV_I:%.*]] = sitofp i32 [[TMP2]] to double
 entry:
   %i = alloca i32, align 4
-  %0 = bitcast i32* %i to i8*
-  call void @llvm.lifetime.start.p0i8(i64 4, i8* %0) #2
-  store i32 0, i32* %i, align 4, !tbaa !1
+  call void @llvm.lifetime.start.p0(i64 4, ptr %i) #2
+  store i32 0, ptr %i, align 4, !tbaa !1
   br i1 true, label %for.body.lr.ph, label %for.cond.cleanup
 
 for.body.lr.ph:                                   ; preds = %entry
@@ -36,32 +35,31 @@ for.cond.for.cond.cleanup_crit_edge:              ; preds = %for.inc
   br label %for.cond.cleanup
 
 for.cond.cleanup:                                 ; preds = %for.cond.for.cond.cleanup_crit_edge, %entry
-  %1 = bitcast i32* %i to i8*
-  call void @llvm.lifetime.end.p0i8(i64 4, i8* %1) #2
+  call void @llvm.lifetime.end.p0(i64 4, ptr %i) #2
   br label %for.end
 
 for.body:                                         ; preds = %for.body.lr.ph, %for.inc
-  %2 = load i32, i32* %addend, align 4, !tbaa !1
-  %conv = sitofp i32 %2 to double
-  %3 = load i32, i32* %i, align 4, !tbaa !1
-  %idxprom = sext i32 %3 to i64
-  %arrayidx = getelementptr inbounds double, double* %data, i64 %idxprom
-  %4 = load double, double* %arrayidx, align 8, !tbaa !5
-  %add = fadd double %4, %conv
-  store double %add, double* %arrayidx, align 8, !tbaa !5
-  %idxprom1 = sext i32 %3 to i64
-  %arrayidx2 = getelementptr inbounds double, double* %data, i64 %idxprom1
-  %5 = load i32, i32* %addend, align 4, !tbaa !1, !alias.scope !7, !noalias !10
-  %conv.i = sitofp i32 %5 to double
-  %6 = load double, double* %arrayidx2, align 8, !tbaa !5, !alias.scope !10, !noalias !7
-  %add.i = fadd double %6, %conv.i
-  store double %add.i, double* %arrayidx2, align 8, !tbaa !5, !alias.scope !10, !noalias !7
+  %0 = load i32, ptr %addend, align 4, !tbaa !1
+  %conv = sitofp i32 %0 to double
+  %1 = load i32, ptr %i, align 4, !tbaa !1
+  %idxprom = sext i32 %1 to i64
+  %arrayidx = getelementptr inbounds double, ptr %data, i64 %idxprom
+  %2 = load double, ptr %arrayidx, align 8, !tbaa !5
+  %add = fadd double %2, %conv
+  store double %add, ptr %arrayidx, align 8, !tbaa !5
+  %idxprom1 = sext i32 %1 to i64
+  %arrayidx2 = getelementptr inbounds double, ptr %data, i64 %idxprom1
+  %3 = load i32, ptr %addend, align 4, !tbaa !1, !alias.scope !7, !noalias !10
+  %conv.i = sitofp i32 %3 to double
+  %4 = load double, ptr %arrayidx2, align 8, !tbaa !5, !alias.scope !10, !noalias !7
+  %add.i = fadd double %4, %conv.i
+  store double %add.i, ptr %arrayidx2, align 8, !tbaa !5, !alias.scope !10, !noalias !7
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body
-  %7 = load i32, i32* %i, align 4, !tbaa !1
-  %inc = add nsw i32 %7, 1
-  store i32 %inc, i32* %i, align 4, !tbaa !1
+  %5 = load i32, ptr %i, align 4, !tbaa !1
+  %inc = add nsw i32 %5, 1
+  store i32 %inc, ptr %i, align 4, !tbaa !1
   %cmp = icmp slt i32 %inc, 1000
   br i1 %cmp, label %for.body, label %for.cond.for.cond.cleanup_crit_edge
 
@@ -69,8 +67,8 @@ for.end:                                          ; preds = %for.cond.cleanup
   ret void
 }
 
-declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #0
-declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0
+declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #0
+declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #0
 
 attributes #0 = { argmemonly nounwind }
 

diff  --git a/llvm/test/Transforms/LICM/explicit_guards.ll b/llvm/test/Transforms/LICM/explicit_guards.ll
index ffc6b55e26a20..c8fffb9a7acc9 100644
--- a/llvm/test/Transforms/LICM/explicit_guards.ll
+++ b/llvm/test/Transforms/LICM/explicit_guards.ll
@@ -79,10 +79,10 @@ exit:
 }
 
 
-define void @hoist_invariant_load(i1 %cond, i32* %np, i32 %M) {
+define void @hoist_invariant_load(i1 %cond, ptr %np, i32 %M) {
 ; CHECK-LABEL: @hoist_invariant_load(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[N:%.*]] = load i32, i32* [[NP:%.*]]
+; CHECK-NEXT:    [[N:%.*]] = load i32, ptr [[NP:%.*]]
 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
@@ -105,7 +105,7 @@ entry:
 
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
-  %N = load i32, i32* %np
+  %N = load i32, ptr %np
   %guard_cond = icmp slt i32 %iv, %N
   call void(i1, ...) @llvm.experimental.guard(i1 %guard_cond) [ "deopt"() ]
   %loop_cond = icmp slt i32 %iv, %M

diff  --git a/llvm/test/Transforms/LICM/fence.ll b/llvm/test/Transforms/LICM/fence.ll
index a4883b8bf7e39..476b12cdb482f 100644
--- a/llvm/test/Transforms/LICM/fence.ll
+++ b/llvm/test/Transforms/LICM/fence.ll
@@ -65,7 +65,7 @@ exit:
   ret void
 }
 
-define void @testneg1(i64 %n, i64* %p) {
+define void @testneg1(i64 %n, ptr %p) {
 ; CHECK-LABEL: @testneg1
 ; CHECK-LABEL: loop:
 ; CHECK: fence
@@ -73,7 +73,7 @@ entry:
   br label %loop
 loop:
   %iv = phi i64 [0, %entry], [%iv.next, %loop]
-  store i64 %iv, i64* %p
+  store i64 %iv, ptr %p
   fence release
   %iv.next = add i64 %iv, 1
   %test = icmp slt i64 %iv, %n
@@ -82,7 +82,7 @@ exit:
   ret void
 }
 
-define void @testneg2(i64* %p) {
+define void @testneg2(ptr %p) {
 ; CHECK-LABEL: @testneg2
 ; CHECK-LABEL: loop:
 ; CHECK: fence
@@ -91,7 +91,7 @@ entry:
 loop:
   %iv = phi i64 [0, %entry], [%iv.next, %loop]
   fence acquire
-  %n = load i64, i64* %p
+  %n = load i64, ptr %p
   %iv.next = add i64 %iv, 1
   %test = icmp slt i64 %iv, %n
   br i1 %test, label %loop, label %exit
@@ -101,7 +101,7 @@ exit:
 
 ; Note: While a false negative for LICM on it's own, O3 does get this
 ; case by combining the fences.
-define void @testfn1(i64 %n, i64* %p) {
+define void @testfn1(i64 %n, ptr %p) {
 ; CHECK-LABEL: @testfn1
 ; CHECK-LABEL: loop:
 ; CHECK: fence

diff  --git a/llvm/test/Transforms/LICM/funclet.ll b/llvm/test/Transforms/LICM/funclet.ll
index d808cd9a0f50c..f863da6f26cf8 100644
--- a/llvm/test/Transforms/LICM/funclet.ll
+++ b/llvm/test/Transforms/LICM/funclet.ll
@@ -5,7 +5,7 @@
 target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
 target triple = "i386-pc-windows-msvc18.0.0"
 
-define void @test1(i32* %s, i1 %b) personality i32 (...)* @__CxxFrameHandler3 {
+define void @test1(ptr %s, i1 %b) personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @pure_computation()
@@ -19,8 +19,8 @@ define void @test1(i32* %s, i1 %b) personality i32 (...)* @__CxxFrameHandler3 {
 ; CHECK-NEXT:    [[DOTLCSSA1:%.*]] = phi i32 [ [[TMP0]], [[WHILE_BODY]] ]
 ; CHECK-NEXT:    [[CS:%.*]] = catchswitch within none [label %catch] unwind to caller
 ; CHECK:       catch:
-; CHECK-NEXT:    [[CP:%.*]] = catchpad within [[CS]] [i8* null, i32 64, i8* null]
-; CHECK-NEXT:    store i32 [[DOTLCSSA1]], i32* [[S:%.*]], align 4
+; CHECK-NEXT:    [[CP:%.*]] = catchpad within [[CS]] [ptr null, i32 64, ptr null]
+; CHECK-NEXT:    store i32 [[DOTLCSSA1]], ptr [[S:%.*]], align 4
 ; CHECK-NEXT:    catchret from [[CP]] to label [[TRY_CONT:%.*]]
 ; CHECK:       try.cont.loopexit:
 ; CHECK-NEXT:    br label [[TRY_CONT]]
@@ -43,15 +43,15 @@ catch.dispatch:                                   ; preds = %while.body
   %cs = catchswitch within none [label %catch] unwind to caller
 
 catch:                                            ; preds = %catch.dispatch
-  %cp = catchpad within %cs [i8* null, i32 64, i8* null]
-  store i32 %.lcssa1, i32* %s
+  %cp = catchpad within %cs [ptr null, i32 64, ptr null]
+  store i32 %.lcssa1, ptr %s
   catchret from %cp to label %try.cont
 
 try.cont:                                         ; preds = %catch, %while.cond
   ret void
 }
 
-define void @test2(i32* %s, i1 %b) personality i32 (...)* @__CxxFrameHandler3 {
+define void @test2(ptr %s, i1 %b) personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
@@ -63,7 +63,7 @@ define void @test2(i32* %s, i1 %b) personality i32 (...)* @__CxxFrameHandler3 {
 ; CHECK:       catch.dispatch:
 ; CHECK-NEXT:    [[CP:%.*]] = cleanuppad within none []
 ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @pure_computation() [ "funclet"(token [[CP]]) ]
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[S:%.*]], align 4
+; CHECK-NEXT:    store i32 [[TMP0]], ptr [[S:%.*]], align 4
 ; CHECK-NEXT:    cleanupret from [[CP]] unwind to caller
 ; CHECK:       try.cont:
 ; CHECK-NEXT:    ret void
@@ -82,27 +82,25 @@ while.body:                                       ; preds = %while.cond
 catch.dispatch:                                   ; preds = %while.body
   %.lcssa1 = phi i32 [ %0, %while.body ]
   %cp = cleanuppad within none []
-  store i32 %.lcssa1, i32* %s
+  store i32 %.lcssa1, ptr %s
   cleanupret from %cp unwind to caller
 
 try.cont:                                         ; preds = %catch, %while.cond
   ret void
 }
 
-define void @test3(i1 %a, i1 %b, i1 %c) personality i32 (...)* @__CxxFrameHandler3 {
+define void @test3(i1 %a, i1 %b, i1 %c) personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[DOTFRAME:%.*]] = alloca i8, align 4
 ; CHECK-NEXT:    [[DOTFRAME2:%.*]] = alloca i8, align 4
-; CHECK-NEXT:    [[BC:%.*]] = bitcast i8* [[DOTFRAME]] to i32*
-; CHECK-NEXT:    [[BC2:%.*]] = bitcast i8* [[DOTFRAME2]] to i32*
 ; CHECK-NEXT:    br i1 [[A:%.*]], label [[TRY_SUCCESS_OR_CAUGHT:%.*]], label [[FORBODY_PREHEADER:%.*]]
 ; CHECK:       forbody.preheader:
-; CHECK-NEXT:    store i32 1, i32* [[BC]], align 4
-; CHECK-NEXT:    store i32 2, i32* [[BC2]], align 4
+; CHECK-NEXT:    store i32 1, ptr [[DOTFRAME]], align 4
+; CHECK-NEXT:    store i32 2, ptr [[DOTFRAME2]], align 4
 ; CHECK-NEXT:    br label [[FORBODY:%.*]]
 ; CHECK:       catch.object.Throwable:
-; CHECK-NEXT:    [[CP:%.*]] = catchpad within [[CS:%.*]] [i8* null, i32 64, i8* null]
+; CHECK-NEXT:    [[CP:%.*]] = catchpad within [[CS:%.*]] [ptr null, i32 64, ptr null]
 ; CHECK-NEXT:    unreachable
 ; CHECK:       try.success.or.caught.loopexit:
 ; CHECK-NEXT:    br label [[TRY_SUCCESS_OR_CAUGHT]]
@@ -124,12 +122,10 @@ define void @test3(i1 %a, i1 %b, i1 %c) personality i32 (...)* @__CxxFrameHandle
 entry:
   %.frame = alloca i8, align 4
   %.frame2 = alloca i8, align 4
-  %bc = bitcast i8* %.frame to i32*
-  %bc2 = bitcast i8* %.frame2 to i32*
   br i1 %a, label %try.success.or.caught, label %forbody
 
 catch.object.Throwable:                           ; preds = %catch.dispatch
-  %cp = catchpad within %cs [i8* null, i32 64, i8* null]
+  %cp = catchpad within %cs [ptr null, i32 64, ptr null]
   unreachable
 
 try.success.or.caught:                            ; preds = %forcond.backedge, %0
@@ -145,8 +141,8 @@ catch.dispatch:                                   ; preds = %else, %forbody
   %cs = catchswitch within none [label %catch.object.Throwable] unwind to caller
 
 forbody:                                          ; preds = %forcond.backedge, %0
-  store i32 1, i32* %bc, align 4
-  store i32 2, i32* %bc2, align 4
+  store i32 1, ptr %.frame, align 4
+  store i32 2, ptr %.frame2, align 4
   invoke void @may_throw()
   to label %postinvoke unwind label %catch.dispatch
 

diff  --git a/llvm/test/Transforms/LICM/gc-relocate.ll b/llvm/test/Transforms/LICM/gc-relocate.ll
index 826985ebce80c..ca2090e9a88a7 100644
--- a/llvm/test/Transforms/LICM/gc-relocate.ll
+++ b/llvm/test/Transforms/LICM/gc-relocate.ll
@@ -4,35 +4,34 @@
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
 target triple = "x86_64-unknown-linux-gnu"
 
-define i8 addrspace(1)* @test(i8 addrspace(1)* %arg) #0 gc "statepoint-example" personality i32* ()* @wobble {
+define ptr addrspace(1) @test(ptr addrspace(1) %arg) #0 gc "statepoint-example" personality ptr @wobble {
 ; CHECK-LABEL: @test(
 ; CHECK-NEXT:  bb:
 ; CHECK-NEXT:    br label [[BB1:%.*]]
 ; CHECK:       bb1:
-; CHECK-NEXT:    [[TMP:%.*]] = call token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull elementtype(i32 (i32, i8 addrspace(1)*, i32, i32, i32)) @zot, i32 5, i32 0, i32 undef, i8 addrspace(1)* undef, i32 undef, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 235, i32 3, i32 32, i32 0, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 3, float undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 4, double undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 3, float undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* null, i32 3, i32 -15108, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* [[ARG:%.*]]) ]
+; CHECK-NEXT:    [[TMP:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 1, i32 16, ptr nonnull elementtype(i32 (i32, ptr addrspace(1), i32, i32, i32)) @zot, i32 5, i32 0, i32 undef, ptr addrspace(1) undef, i32 undef, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 235, i32 3, i32 32, i32 0, i32 0, ptr addrspace(1) undef, i32 3, i32 undef, i32 3, float undef, i32 0, ptr addrspace(1) undef, i32 7, ptr null, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, ptr addrspace(1) undef, i32 4, double undef, i32 7, ptr null, i32 0, ptr addrspace(1) undef, i32 3, float undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) null, i32 3, i32 -15108, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null), "gc-live"(ptr addrspace(1) [[ARG:%.*]]) ]
 ; CHECK-NEXT:    br i1 false, label [[BB1]], label [[BB2:%.*]]
 ; CHECK:       bb2:
-; CHECK-NEXT:    [[RES_LE:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[TMP]], i32 0, i32 0) #[[ATTR1:[0-9]+]]
-; CHECK-NEXT:    ret i8 addrspace(1)* [[RES_LE]]
+; CHECK-NEXT:    [[RES_LE:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[TMP]], i32 0, i32 0) #[[ATTR1:[0-9]+]]
+; CHECK-NEXT:    ret ptr addrspace(1) [[RES_LE]]
 ;
 bb:
   br label %bb1
 
 bb1:
-  %tmp = call token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull elementtype(i32 (i32, i8 addrspace(1)*, i32, i32, i32)) @zot, i32 5, i32 0, i32 undef, i8 addrspace(1)* undef, i32 undef, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 235, i32 3, i32 32, i32 0, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 3, float undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 4, double undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 3, float undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* null, i32 3, i32 -15108, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* %arg) ]
-  %res = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp, i32 0, i32 0) readnone
+  %tmp = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 1, i32 16, ptr nonnull elementtype(i32 (i32, ptr addrspace(1), i32, i32, i32)) @zot, i32 5, i32 0, i32 undef, ptr addrspace(1) undef, i32 undef, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 235, i32 3, i32 32, i32 0, i32 0, ptr addrspace(1) undef, i32 3, i32 undef, i32 3, float undef, i32 0, ptr addrspace(1) undef, i32 7, ptr null, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, ptr addrspace(1) undef, i32 4, double undef, i32 7, ptr null, i32 0, ptr addrspace(1) undef, i32 3, float undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) null, i32 3, i32 -15108, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null), "gc-live"(ptr addrspace(1) %arg) ]
+  %res = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tmp, i32 0, i32 0) readnone
   br i1 undef, label %bb1, label %bb2
 
 bb2:
-  ret i8 addrspace(1)* %res
+  ret ptr addrspace(1) %res
 }
 
-declare i32* @wobble()
-declare i32 @zot(i32, i8 addrspace(1)*, i32, i32, i32)
-declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64, i32, void (i32)*, i32, i32, ...)
+declare ptr @wobble()
+declare i32 @zot(i32, ptr addrspace(1), i32, i32, i32)
+declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)
 
 ; Function Attrs: nounwind readnone
-declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32) #0
-declare token @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...)
+declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32, i32) #0
 
 attributes #0 = { nounwind readnone }

diff  --git a/llvm/test/Transforms/LICM/guards.ll b/llvm/test/Transforms/LICM/guards.ll
index 7feb1291483d3..9b717bae3e94c 100644
--- a/llvm/test/Transforms/LICM/guards.ll
+++ b/llvm/test/Transforms/LICM/guards.ll
@@ -4,11 +4,11 @@
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' -ipt-expensive-asserts=true < %s -S | FileCheck %s
 
 ; Hoist guard and load.
-define void @test1(i1 %cond, i32* %ptr) {
+define void @test1(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND:%.*]]) [ "deopt"(i32 0) ]
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR:%.*]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
@@ -22,21 +22,21 @@ entry:
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
   call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
-  %val = load i32, i32* %ptr
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; Can't hoist over a side effect
-define void @test2(i1 %cond, i32* %ptr) {
+define void @test2(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 0, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[PTR:%.*]], align 4
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND:%.*]]) [ "deopt"(i32 0) ]
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR]], align 4
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
 ; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
@@ -46,24 +46,24 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  store i32 0, i32* %ptr
+  store i32 0, ptr %ptr
   call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
-  %val = load i32, i32* %ptr
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; Can't hoist over a side effect
-define void @test2b(i1 %cond, i32* %ptr) {
+define void @test2b(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test2b(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[P2:%.*]] = getelementptr i32, i32* [[PTR:%.*]], i32 1
+; CHECK-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 1
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 [[X]], i32* [[P2]], align 4
+; CHECK-NEXT:    store i32 [[X]], ptr [[P2]], align 4
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND:%.*]]) [ "deopt"(i32 0) ]
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR]], align 4
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
 ; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
@@ -73,22 +73,22 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  %p2 = getelementptr i32, i32* %ptr, i32 1
-  store i32 %x, i32* %p2
+  %p2 = getelementptr i32, ptr %ptr, i32 1
+  store i32 %x, ptr %p2
   call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
-  %val = load i32, i32* %ptr
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; But can hoist if the side effect is hoisted with MSSA
-define void @test2b_prime(i1 %cond, i32* noalias %ptr) {
+define void @test2b_prime(i1 %cond, ptr noalias %ptr) {
 ; CHECK-LABEL: @test2b_prime(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[P2:%.*]] = getelementptr i32, i32* [[PTR:%.*]], i32 1
-; CHECK-NEXT:    store i32 0, i32* [[P2]], align 4
+; CHECK-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 1
+; CHECK-NEXT:    store i32 0, ptr [[P2]], align 4
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND:%.*]]) [ "deopt"(i32 0) ]
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR]], align 4
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
@@ -101,25 +101,25 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  %p2 = getelementptr i32, i32* %ptr, i32 1
-  store i32 0, i32* %p2
+  %p2 = getelementptr i32, ptr %ptr, i32 1
+  store i32 0, ptr %p2
   call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
-  %val = load i32, i32* %ptr
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; Hoist guard. Cannot hoist load because of aliasing, but can promote.
-define void @test3(i1 %cond, i32* %ptr) {
+define void @test3(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND:%.*]]) [ "deopt"(i32 0) ]
-; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i32, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i32, ptr [[PTR:%.*]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ [[PTR_PROMOTED]], [[ENTRY:%.*]] ], [ 0, [[LOOP]] ]
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[X_INC:%.*]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 0, i32* [[PTR]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[PTR]], align 4
 ; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[TMP0]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
@@ -130,17 +130,17 @@ entry:
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
   call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
-  %val = load i32, i32* %ptr
-  store i32 0, i32* %ptr
+  %val = load i32, ptr %ptr
+  store i32 0, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; Hoist load and guard.
-define void @test4(i1 %c, i32* %p) {
+define void @test4(i1 %c, ptr %p) {
 ; CHECK-LABEL: @test4(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[INVARIANT_COND]]) [ "deopt"() ]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -174,7 +174,7 @@ if.false:
   br label %backedge
 
 backedge:
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
   %loop_cond = icmp slt i32 %iv.next, 1000
@@ -185,7 +185,7 @@ exit:
 }
 
 ; Do not hoist across a conditionally executed side effect.
-define void @test4a(i1 %c, i32* %p, i32* %q) {
+define void @test4a(i1 %c, ptr %p, ptr %q) {
 ; CHECK-LABEL: @test4a(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -194,12 +194,12 @@ define void @test4a(i1 %c, i32* %p, i32* %q) {
 ; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
 ; CHECK:       if.true:
-; CHECK-NEXT:    store i32 123, i32* [[Q:%.*]], align 4
+; CHECK-NEXT:    store i32 123, ptr [[Q:%.*]], align 4
 ; CHECK-NEXT:    br label [[BACKEDGE]]
 ; CHECK:       if.false:
 ; CHECK-NEXT:    br label [[BACKEDGE]]
 ; CHECK:       backedge:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[INVARIANT_COND]]) [ "deopt"() ]
 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], 1000
@@ -217,14 +217,14 @@ loop:
   br i1 %c, label %if.true, label %if.false
 
 if.true:
-  store i32 123, i32* %q
+  store i32 123, ptr %q
   br label %backedge
 
 if.false:
   br label %backedge
 
 backedge:
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
   %loop_cond = icmp slt i32 %iv.next, 1000
@@ -235,7 +235,7 @@ exit:
 }
 
 ; Do not hoist a conditionally executed guard.
-define void @test4b(i1 %c, i32* %p, i32* %q) {
+define void @test4b(i1 %c, ptr %p, ptr %q) {
 ; CHECK-LABEL: @test4b(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -244,7 +244,7 @@ define void @test4b(i1 %c, i32* %p, i32* %q) {
 ; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
 ; CHECK:       if.true:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[INVARIANT_COND]]) [ "deopt"() ]
 ; CHECK-NEXT:    br label [[BACKEDGE]]
@@ -266,7 +266,7 @@ loop:
   br i1 %c, label %if.true, label %if.false
 
 if.true:
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
   br label %backedge
@@ -283,11 +283,11 @@ exit:
 }
 
 ; Hoist store, load and guard.
-define void @test4c(i1 %c, i32* %p, i8* noalias %s) {
+define void @test4c(i1 %c, ptr %p, ptr noalias %s) {
 ; CHECK-LABEL: @test4c(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    store i8 0, i8* [[S:%.*]], align 1
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    store i8 0, ptr [[S:%.*]], align 1
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[INVARIANT_COND]]) [ "deopt"() ]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -312,7 +312,7 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
   %iv.next = add i32 %iv, 1
-  store i8 0, i8* %s
+  store i8 0, ptr %s
   br i1 %c, label %if.true, label %if.false
 
 if.true:
@@ -322,7 +322,7 @@ if.false:
   br label %backedge
 
 backedge:
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
   %loop_cond = icmp slt i32 %iv.next, 1000
@@ -333,10 +333,10 @@ exit:
 }
 
 ; Check that we don't hoist across a store in a conditionally executed block.
-define void @test4d(i1 %c, i32* %p, i8* noalias %s) {
+define void @test4d(i1 %c, ptr %p, ptr noalias %s) {
 ; CHECK-LABEL: @test4d(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
@@ -344,7 +344,7 @@ define void @test4d(i1 %c, i32* %p, i8* noalias %s) {
 ; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
 ; CHECK:       if.true:
-; CHECK-NEXT:    store i8 0, i8* [[S:%.*]], align 1
+; CHECK-NEXT:    store i8 0, ptr [[S:%.*]], align 1
 ; CHECK-NEXT:    br label [[BACKEDGE]]
 ; CHECK:       if.false:
 ; CHECK-NEXT:    br label [[BACKEDGE]]
@@ -365,14 +365,14 @@ loop:
   br i1 %c, label %if.true, label %if.false
 
 if.true:
-  store i8 0, i8* %s
+  store i8 0, ptr %s
   br label %backedge
 
 if.false:
   br label %backedge
 
 backedge:
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
   %loop_cond = icmp slt i32 %iv.next, 1000
@@ -383,12 +383,12 @@ exit:
 }
 
 ; Check that we don't hoist across a store before the guard in the backedge.
-define void @test4e(i1 %c, i32* %p, i8* noalias %s) {
+define void @test4e(i1 %c, ptr %p, ptr noalias %s) {
 ; CHECK-LABEL: @test4e(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
-; CHECK-NEXT:    store i8 0, i8* [[S:%.*]], align 1
+; CHECK-NEXT:    store i8 0, ptr [[S:%.*]], align 1
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[INVARIANT_COND]]) [ "deopt"() ]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
@@ -421,9 +421,9 @@ if.false:
   br label %backedge
 
 backedge:
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
-  store i8 0, i8* %s
+  store i8 0, ptr %s
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
   %loop_cond = icmp slt i32 %iv.next, 1000
   br i1 %loop_cond, label %loop, label %exit
@@ -433,13 +433,13 @@ exit:
 }
 
 ; Check that we can hoist the guard in spite of store which happens after.
-define void @test4f(i1 %c, i32* %p, i8* noalias %s) {
+define void @test4f(i1 %c, ptr %p, ptr noalias %s) {
 ; CHECK-LABEL: @test4f(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[INVARIANT_COND]]) [ "deopt"() ]
-; CHECK-NEXT:    store i8 0, i8* [[S:%.*]], align 1
+; CHECK-NEXT:    store i8 0, ptr [[S:%.*]], align 1
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
@@ -471,10 +471,10 @@ if.false:
   br label %backedge
 
 backedge:
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
-  store i8 0, i8* %s
+  store i8 0, ptr %s
   %loop_cond = icmp slt i32 %iv.next, 1000
   br i1 %loop_cond, label %loop, label %exit
 
@@ -483,10 +483,10 @@ exit:
 }
 
 ; Do not hoist an invariant guard across a variant guard.
-define void @test5(i1 %c, i32* %p, i32* %q) {
+define void @test5(i1 %c, ptr %p, ptr %q) {
 ; CHECK-LABEL: @test5(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
@@ -509,7 +509,7 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
   %iv.next = add i32 %iv, 1
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   %variant_cond = icmp ne i32 %a, %iv
   call void (i1, ...) @llvm.experimental.guard(i1 %variant_cond) [ "deopt"() ]
@@ -525,10 +525,10 @@ exit:
 }
 
 ; Hoist an invariant guard, leave the following variant guard in the loop.
-define void @test5a(i1 %c, i32* %p, i32* %q) {
+define void @test5a(i1 %c, ptr %p, ptr %q) {
 ; CHECK-LABEL: @test5a(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[P:%.*]], align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
 ; CHECK-NEXT:    [[INVARIANT_COND:%.*]] = icmp ne i32 [[A]], 100
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[INVARIANT_COND]]) [ "deopt"() ]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -551,7 +551,7 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
   %iv.next = add i32 %iv, 1
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   %variant_cond = icmp ne i32 %a, %iv
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]

diff  --git a/llvm/test/Transforms/LICM/hoist-alloc.ll b/llvm/test/Transforms/LICM/hoist-alloc.ll
index cb0d18abbf746..d8c1d3e2db201 100644
--- a/llvm/test/Transforms/LICM/hoist-alloc.ll
+++ b/llvm/test/Transforms/LICM/hoist-alloc.ll
@@ -6,15 +6,14 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
 declare void @unknown()
-declare void @init(i8* nocapture)
+declare void @init(ptr nocapture)
 declare void @use(i8)
 
 define i8 @test_sink_alloca() {
 ; CHECK-LABEL: @test_sink_alloca(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A:%.*]] = alloca [32 x i8], align 1
-; CHECK-NEXT:    [[A_RAW:%.*]] = bitcast [32 x i8]* [[A]] to i8*
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
+; CHECK-NEXT:    call void @init(ptr [[A]])
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
@@ -23,21 +22,20 @@ define i8 @test_sink_alloca() {
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.end:
-; CHECK-NEXT:    [[ADDR_LE:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
-; CHECK-NEXT:    [[RES_LE:%.*]] = load i8, i8* [[ADDR_LE]], align 1
+; CHECK-NEXT:    [[ADDR_LE:%.*]] = getelementptr i8, ptr [[A]], i32 31
+; CHECK-NEXT:    [[RES_LE:%.*]] = load i8, ptr [[ADDR_LE]], align 1
 ; CHECK-NEXT:    ret i8 [[RES_LE]]
 ;
 entry:
   %a = alloca [32 x i8]
-  %a.raw = bitcast [32 x i8]* %a to i8*
-  call void @init(i8* %a.raw)
+  call void @init(ptr %a)
   br label %for.body
 
 for.body:
   %iv = phi i64 [ %iv.next, %for.body ], [ 0, %entry ]
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a, i32 31
+  %res = load i8, ptr %addr
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
   br i1 %exitcond, label %for.end, label %for.body
@@ -50,10 +48,9 @@ define i8 @test_hoist_alloca() {
 ; CHECK-LABEL: @test_hoist_alloca(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A:%.*]] = alloca [32 x i8], align 1
-; CHECK-NEXT:    [[A_RAW:%.*]] = bitcast [32 x i8]* [[A]] to i8*
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
-; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
-; CHECK-NEXT:    [[RES:%.*]] = load i8, i8* [[ADDR]], align 1
+; CHECK-NEXT:    call void @init(ptr [[A]])
+; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, ptr [[A]], i32 31
+; CHECK-NEXT:    [[RES:%.*]] = load i8, ptr [[ADDR]], align 1
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
@@ -68,15 +65,14 @@ define i8 @test_hoist_alloca() {
 ;
 entry:
   %a = alloca [32 x i8]
-  %a.raw = bitcast [32 x i8]* %a to i8*
-  call void @init(i8* %a.raw)
+  call void @init(ptr %a)
   br label %for.body
 
 for.body:
   %iv = phi i64 [ %iv.next, %for.body ], [ 0, %entry ]
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a, i32 31
+  %res = load i8, ptr %addr
   call void @use(i8 %res)
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
@@ -89,14 +85,14 @@ for.end:
 ; The attributes listed here are a) inferred by -O3 from the names
 ; and b) required for a standalone test.  We're very inconsistent about
 ; which decisions we drive from TLI vs assume attributes have been infered.
-declare void @free(i8* nocapture)
-declare noalias i8* @malloc(i64)
+declare void @free(ptr nocapture)
+declare noalias ptr @malloc(i64)
 
 define i8 @test_sink_malloc() {
 ; CHECK-LABEL: @test_sink_malloc(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull i8* @malloc(i64 32)
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
+; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull ptr @malloc(i64 32)
+; CHECK-NEXT:    call void @init(ptr [[A_RAW]])
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
@@ -105,28 +101,28 @@ define i8 @test_sink_malloc() {
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.end:
-; CHECK-NEXT:    [[ADDR_LE:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
-; CHECK-NEXT:    [[RES_LE:%.*]] = load i8, i8* [[ADDR_LE]], align 1
-; CHECK-NEXT:    call void @free(i8* [[A_RAW]])
+; CHECK-NEXT:    [[ADDR_LE:%.*]] = getelementptr i8, ptr [[A_RAW]], i32 31
+; CHECK-NEXT:    [[RES_LE:%.*]] = load i8, ptr [[ADDR_LE]], align 1
+; CHECK-NEXT:    call void @free(ptr [[A_RAW]])
 ; CHECK-NEXT:    ret i8 [[RES_LE]]
 ;
 entry:
   ; Mark as nonnull to simplify test
-  %a.raw = call nonnull i8* @malloc(i64 32)
-  call void @init(i8* %a.raw)
+  %a.raw = call nonnull ptr @malloc(i64 32)
+  call void @init(ptr %a.raw)
   br label %for.body
 
 for.body:
   %iv = phi i64 [ %iv.next, %for.body ], [ 0, %entry ]
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a.raw, i32 31
+  %res = load i8, ptr %addr
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
   br i1 %exitcond, label %for.end, label %for.body
 
 for.end:
-  call void @free(i8* %a.raw)
+  call void @free(ptr %a.raw)
   ret i8 %res
 }
 
@@ -135,54 +131,54 @@ for.end:
 define i8 @test_hoist_malloc() {
 ; CHECK-LABEL: @test_hoist_malloc(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull i8* @malloc(i64 32)
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
-; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
+; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull ptr @malloc(i64 32)
+; CHECK-NEXT:    call void @init(ptr [[A_RAW]])
+; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, ptr [[A_RAW]], i32 31
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    call void @unknown()
-; CHECK-NEXT:    [[RES:%.*]] = load i8, i8* [[ADDR]], align 1
+; CHECK-NEXT:    [[RES:%.*]] = load i8, ptr [[ADDR]], align 1
 ; CHECK-NEXT:    call void @use(i8 [[RES]])
 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.end:
 ; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i8 [ [[RES]], [[FOR_BODY]] ]
-; CHECK-NEXT:    call void @free(i8* [[A_RAW]])
+; CHECK-NEXT:    call void @free(ptr [[A_RAW]])
 ; CHECK-NEXT:    ret i8 [[RES_LCSSA]]
 ;
 entry:
-  %a.raw = call nonnull i8* @malloc(i64 32)
-  call void @init(i8* %a.raw)
+  %a.raw = call nonnull ptr @malloc(i64 32)
+  call void @init(ptr %a.raw)
   br label %for.body
 
 for.body:
   %iv = phi i64 [ %iv.next, %for.body ], [ 0, %entry ]
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a.raw, i32 31
+  %res = load i8, ptr %addr
   call void @use(i8 %res)
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
   br i1 %exitcond, label %for.end, label %for.body
 
 for.end:
-  call void @free(i8* %a.raw)
+  call void @free(ptr %a.raw)
   ret i8 %res
 }
 
 define i8 @test_hoist_malloc_leak() nofree nosync {
 ; CHECK-LABEL: @test_hoist_malloc_leak(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull i8* @malloc(i64 32)
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
-; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
+; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull ptr @malloc(i64 32)
+; CHECK-NEXT:    call void @init(ptr [[A_RAW]])
+; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, ptr [[A_RAW]], i32 31
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    call void @unknown()
-; CHECK-NEXT:    [[RES:%.*]] = load i8, i8* [[ADDR]], align 1
+; CHECK-NEXT:    [[RES:%.*]] = load i8, ptr [[ADDR]], align 1
 ; CHECK-NEXT:    call void @use(i8 [[RES]])
 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
@@ -192,15 +188,15 @@ define i8 @test_hoist_malloc_leak() nofree nosync {
 ; CHECK-NEXT:    ret i8 [[RES_LCSSA]]
 ;
 entry:
-  %a.raw = call nonnull i8* @malloc(i64 32)
-  call void @init(i8* %a.raw)
+  %a.raw = call nonnull ptr @malloc(i64 32)
+  call void @init(ptr %a.raw)
   br label %for.body
 
 for.body:
   %iv = phi i64 [ %iv.next, %for.body ], [ 0, %entry ]
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a.raw, i32 31
+  %res = load i8, ptr %addr
   call void @use(i8 %res)
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
@@ -216,21 +212,21 @@ for.end:
 define void @test_hoist_malloc_cond_free(i1 %c) {
 ; CHECK-LABEL: @test_hoist_malloc_cond_free(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull i8* @malloc(i64 32)
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
+; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull ptr @malloc(i64 32)
+; CHECK-NEXT:    call void @init(ptr [[A_RAW]])
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[COND_FREE:%.*]], label [[PREHEADER:%.*]]
 ; CHECK:       cond.free:
-; CHECK-NEXT:    call void @free(i8* [[A_RAW]])
+; CHECK-NEXT:    call void @free(ptr [[A_RAW]])
 ; CHECK-NEXT:    br label [[PREHEADER]]
 ; CHECK:       preheader:
-; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
+; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, ptr [[A_RAW]], i32 31
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[PREHEADER]] ]
 ; CHECK-NEXT:    br i1 [[C]], label [[FOR_END:%.*]], label [[LOOP_LATCH]]
 ; CHECK:       loop.latch:
 ; CHECK-NEXT:    call void @unknown()
-; CHECK-NEXT:    [[RES:%.*]] = load i8, i8* [[ADDR]], align 1
+; CHECK-NEXT:    [[RES:%.*]] = load i8, ptr [[ADDR]], align 1
 ; CHECK-NEXT:    call void @use(i8 [[RES]])
 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
@@ -239,11 +235,11 @@ define void @test_hoist_malloc_cond_free(i1 %c) {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %a.raw = call nonnull i8* @malloc(i64 32)
-  call void @init(i8* %a.raw)
+  %a.raw = call nonnull ptr @malloc(i64 32)
+  call void @init(ptr %a.raw)
   br i1 %c, label %cond.free, label %preheader
 cond.free:
-  call void @free(i8* %a.raw)
+  call void @free(ptr %a.raw)
   br label %preheader
 preheader:
   br label %for.body
@@ -254,8 +250,8 @@ for.body:
 
 loop.latch:
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a.raw, i32 31
+  %res = load i8, ptr %addr
   call void @use(i8 %res)
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
@@ -268,11 +264,11 @@ for.end:
 define i8 @test_sink_malloc_cond_free(i1 %c) {
 ; CHECK-LABEL: @test_sink_malloc_cond_free(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull i8* @malloc(i64 32)
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
+; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull ptr @malloc(i64 32)
+; CHECK-NEXT:    call void @init(ptr [[A_RAW]])
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[COND_FREE:%.*]], label [[PREHEADER:%.*]]
 ; CHECK:       cond.free:
-; CHECK-NEXT:    call void @free(i8* [[A_RAW]])
+; CHECK-NEXT:    call void @free(ptr [[A_RAW]])
 ; CHECK-NEXT:    br label [[PREHEADER]]
 ; CHECK:       preheader:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
@@ -285,8 +281,8 @@ define i8 @test_sink_malloc_cond_free(i1 %c) {
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_END_SPLIT_LOOP_EXIT:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.end.split.loop.exit:
-; CHECK-NEXT:    [[ADDR_LE:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
-; CHECK-NEXT:    [[RES_LE:%.*]] = load i8, i8* [[ADDR_LE]], align 1
+; CHECK-NEXT:    [[ADDR_LE:%.*]] = getelementptr i8, ptr [[A_RAW]], i32 31
+; CHECK-NEXT:    [[RES_LE:%.*]] = load i8, ptr [[ADDR_LE]], align 1
 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
 ; CHECK:       for.end.split.loop.exit1:
 ; CHECK-NEXT:    [[PHI_PH2:%.*]] = phi i8 [ 0, [[FOR_BODY]] ]
@@ -296,11 +292,11 @@ define i8 @test_sink_malloc_cond_free(i1 %c) {
 ; CHECK-NEXT:    ret i8 [[PHI]]
 ;
 entry:
-  %a.raw = call nonnull i8* @malloc(i64 32)
-  call void @init(i8* %a.raw)
+  %a.raw = call nonnull ptr @malloc(i64 32)
+  call void @init(ptr %a.raw)
   br i1 %c, label %cond.free, label %preheader
 cond.free:
-  call void @free(i8* %a.raw)
+  call void @free(ptr %a.raw)
   br label %preheader
 preheader:
   br label %for.body
@@ -311,8 +307,8 @@ for.body:
 
 loop.latch:
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a.raw, i32 31
+  %res = load i8, ptr %addr
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
   br i1 %exitcond, label %for.end, label %for.body
@@ -322,61 +318,61 @@ for.end:
   ret i8 %phi
 }
 
-declare noalias i8* @my_alloc(i64) allocsize(0)
+declare noalias ptr @my_alloc(i64) allocsize(0)
 
 ; We would need context sensitive reasoning about frees (which we don't
 ; don't currently have) to hoist the load in this example.
 define i8 @test_hoist_allocsize() {
 ; CHECK-LABEL: @test_hoist_allocsize(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull i8* @my_alloc(i64 32)
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
-; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
+; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull ptr @my_alloc(i64 32)
+; CHECK-NEXT:    call void @init(ptr [[A_RAW]])
+; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, ptr [[A_RAW]], i32 31
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    call void @unknown()
-; CHECK-NEXT:    [[RES:%.*]] = load i8, i8* [[ADDR]], align 1
+; CHECK-NEXT:    [[RES:%.*]] = load i8, ptr [[ADDR]], align 1
 ; CHECK-NEXT:    call void @use(i8 [[RES]])
 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.end:
 ; CHECK-NEXT:    [[RES_LCSSA:%.*]] = phi i8 [ [[RES]], [[FOR_BODY]] ]
-; CHECK-NEXT:    call void @free(i8* [[A_RAW]])
+; CHECK-NEXT:    call void @free(ptr [[A_RAW]])
 ; CHECK-NEXT:    ret i8 [[RES_LCSSA]]
 ;
 entry:
-  %a.raw = call nonnull i8* @my_alloc(i64 32)
-  call void @init(i8* %a.raw)
+  %a.raw = call nonnull ptr @my_alloc(i64 32)
+  call void @init(ptr %a.raw)
   br label %for.body
 
 for.body:
   %iv = phi i64 [ %iv.next, %for.body ], [ 0, %entry ]
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a.raw, i32 31
+  %res = load i8, ptr %addr
   call void @use(i8 %res)
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200
   br i1 %exitcond, label %for.end, label %for.body
 
 for.end:
-  call void @free(i8* %a.raw)
+  call void @free(ptr %a.raw)
   ret i8 %res
 }
 
 define i8 @test_hoist_allocsize_leak() nofree nosync {
 ; CHECK-LABEL: @test_hoist_allocsize_leak(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull i8* @my_alloc(i64 32)
-; CHECK-NEXT:    call void @init(i8* [[A_RAW]])
-; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, i8* [[A_RAW]], i32 31
+; CHECK-NEXT:    [[A_RAW:%.*]] = call nonnull ptr @my_alloc(i64 32)
+; CHECK-NEXT:    call void @init(ptr [[A_RAW]])
+; CHECK-NEXT:    [[ADDR:%.*]] = getelementptr i8, ptr [[A_RAW]], i32 31
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    call void @unknown()
-; CHECK-NEXT:    [[RES:%.*]] = load i8, i8* [[ADDR]], align 1
+; CHECK-NEXT:    [[RES:%.*]] = load i8, ptr [[ADDR]], align 1
 ; CHECK-NEXT:    call void @use(i8 [[RES]])
 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], 200
@@ -386,15 +382,15 @@ define i8 @test_hoist_allocsize_leak() nofree nosync {
 ; CHECK-NEXT:    ret i8 [[RES_LCSSA]]
 ;
 entry:
-  %a.raw = call nonnull i8* @my_alloc(i64 32)
-  call void @init(i8* %a.raw)
+  %a.raw = call nonnull ptr @my_alloc(i64 32)
+  call void @init(ptr %a.raw)
   br label %for.body
 
 for.body:
   %iv = phi i64 [ %iv.next, %for.body ], [ 0, %entry ]
   call void @unknown() ;; may throw
-  %addr = getelementptr i8, i8* %a.raw, i32 31
-  %res = load i8, i8* %addr
+  %addr = getelementptr i8, ptr %a.raw, i32 31
+  %res = load i8, ptr %addr
   call void @use(i8 %res)
   %iv.next = add nuw nsw i64 %iv, 1
   %exitcond = icmp eq i64 %iv.next, 200

diff  --git a/llvm/test/Transforms/LICM/hoist-bitcast-load.ll b/llvm/test/Transforms/LICM/hoist-bitcast-load.ll
index 8181b90b2fa61..b347b0425e88c 100644
--- a/llvm/test/Transforms/LICM/hoist-bitcast-load.ll
+++ b/llvm/test/Transforms/LICM/hoist-bitcast-load.ll
@@ -6,11 +6,11 @@ target triple = "x86_64-unknown-linux-gnu"
 
 ; Make sure the basic alloca pointer hoisting works:
 ; CHECK-LABEL: @test1
-; CHECK: load i32, i32* %c, align 4
+; CHECK: load i32, ptr %c, align 4
 ; CHECK: for.body:
 
 ; Function Attrs: nounwind uwtable
-define void @test1(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 {
+define void @test1(ptr nocapture %a, ptr nocapture readonly %b, i32 %n) #0 {
 entry:
   %cmp6 = icmp sgt i32 %n, 0
   %c = alloca i32
@@ -18,17 +18,17 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -44,30 +44,29 @@ for.end:                                          ; preds = %for.inc, %entry
 ; Make sure the basic alloca pointer hoisting works through a bitcast to a
 ; pointer to a smaller type:
 ; CHECK-LABEL: @test2
-; CHECK: load i32, i32* %c, align 4
+; CHECK: load i32, ptr %ca, align 4
 ; CHECK: for.body:
 
 ; Function Attrs: nounwind uwtable
-define void @test2(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 {
+define void @test2(ptr nocapture %a, ptr nocapture readonly %b, i32 %n) #0 {
 entry:
   %cmp6 = icmp sgt i32 %n, 0
   %ca = alloca i64
-  %c = bitcast i64* %ca to i32*
   br i1 %cmp6, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %ca, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -82,30 +81,30 @@ for.end:                                          ; preds = %for.inc, %entry
 
 ; Make sure the basic alloca pointer hoisting works through an addrspacecast
 ; CHECK-LABEL: @test2_addrspacecast
-; CHECK: load i32, i32 addrspace(1)* %c, align 4
+; CHECK: load i32, ptr addrspace(1) %c, align 4
 ; CHECK: for.body:
 
 ; Function Attrs: nounwind uwtable
-define void @test2_addrspacecast(i32 addrspace(1)* nocapture %a, i32 addrspace(1)* nocapture readonly %b, i32 %n) #0 {
+define void @test2_addrspacecast(ptr addrspace(1) nocapture %a, ptr addrspace(1) nocapture readonly %b, i32 %n) #0 {
 entry:
   %cmp6 = icmp sgt i32 %n, 0
   %ca = alloca i64
-  %c = addrspacecast i64* %ca to i32 addrspace(1)*
+  %c = addrspacecast ptr %ca to ptr addrspace(1)
   br i1 %cmp6, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %a, i64 %indvars.iv
-  %0 = load i32, i32 addrspace(1)* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %a, i64 %indvars.iv
+  %0 = load i32, ptr addrspace(1) %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32 addrspace(1)* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %b, i64 %indvars.iv
-  %2 = load i32, i32 addrspace(1)* %arrayidx3, align 4
+  %1 = load i32, ptr addrspace(1) %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr addrspace(1) %b, i64 %indvars.iv
+  %2 = load i32, ptr addrspace(1) %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32 addrspace(1)* %arrayidx, align 4
+  store i32 %mul, ptr addrspace(1) %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -121,11 +120,11 @@ for.end:                                          ; preds = %for.inc, %entry
 ; Make sure the basic alloca pointer hoisting works through a bitcast to a
 ; pointer to a smaller type (where the bitcast also needs to be hoisted):
 ; CHECK-LABEL: @test3
-; CHECK: load i32, i32* %c, align 4
+; CHECK: load i32, ptr %ca, align 4
 ; CHECK: for.body:
 
 ; Function Attrs: nounwind uwtable
-define void @test3(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 {
+define void @test3(ptr nocapture %a, ptr nocapture readonly %b, i32 %n) #0 {
 entry:
   %cmp6 = icmp sgt i32 %n, 0
   %ca = alloca i64
@@ -133,18 +132,17 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %c = bitcast i64* %ca to i32*
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %ca, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -161,29 +159,28 @@ for.end:                                          ; preds = %for.inc, %entry
 ; to a pointer to a larger type:
 ; CHECK-LABEL: @test4
 ; CHECK: for.body:
-; CHECK: load i32, i32* %c, align 4
+; CHECK: load i32, ptr %ca, align 4
 
 ; Function Attrs: nounwind uwtable
-define void @test4(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 {
+define void @test4(ptr nocapture %a, ptr nocapture readonly %b, i32 %n) #0 {
 entry:
   %cmp6 = icmp sgt i32 %n, 0
   %ca = alloca i16
-  %c = bitcast i16* %ca to i32*
   br i1 %cmp6, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %ca, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -199,32 +196,30 @@ for.end:                                          ; preds = %for.inc, %entry
 ; Don't crash on bitcasts to unsized types.
 ; CHECK-LABEL: @test5
 ; CHECK: for.body:
-; CHECK: load i32, i32* %c, align 4
+; CHECK: load i32, ptr %ca, align 4
 
 %atype = type opaque
 
 ; Function Attrs: nounwind uwtable
-define void @test5(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 {
+define void @test5(ptr nocapture %a, ptr nocapture readonly %b, i32 %n) #0 {
 entry:
   %cmp6 = icmp sgt i32 %n, 0
   %ca = alloca i16
-  %cab = bitcast i16* %ca to %atype*
-  %c = bitcast %atype* %cab to i32*
   br i1 %cmp6, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %ca, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then

diff  --git a/llvm/test/Transforms/LICM/hoist-debuginvariant.ll b/llvm/test/Transforms/LICM/hoist-debuginvariant.ll
index 0bfaf232a3e9b..92bd578ab9e15 100644
--- a/llvm/test/Transforms/LICM/hoist-debuginvariant.ll
+++ b/llvm/test/Transforms/LICM/hoist-debuginvariant.ll
@@ -13,20 +13,20 @@ target triple = "x86_64-unknown-linux-gnu"
 
 define void @fn1() !dbg !6 {
 ; CHECK-LABEL: @fn1(
-; CHECK-NEXT: [[_TMP2:%.*]] = load i32, i32* @a, align 4
-; CHECK-NEXT: [[_TMP3:%.*]] = load i32, i32* @b, align 4
+; CHECK-NEXT: [[_TMP2:%.*]] = load i32, ptr @a, align 4
+; CHECK-NEXT: [[_TMP3:%.*]] = load i32, ptr @b, align 4
 ; CHECK-NEXT: [[_TMP4:%.*]] = sdiv i32 [[_TMP2]], [[_TMP3]]
 ; CHECK-NEXT: br label [[BB3:%.*]]
 
   br label %bb3
 
 bb3:                                              ; preds = %bb3, %0
-  call void @llvm.dbg.value(metadata i32* @c, metadata !10, metadata !DIExpression(DW_OP_deref)), !dbg !12
-  %_tmp2 = load i32, i32* @a, align 4
-  %_tmp3 = load i32, i32* @b, align 4
+  call void @llvm.dbg.value(metadata ptr @c, metadata !10, metadata !DIExpression(DW_OP_deref)), !dbg !12
+  %_tmp2 = load i32, ptr @a, align 4
+  %_tmp3 = load i32, ptr @b, align 4
   %_tmp4 = sdiv i32 %_tmp2, %_tmp3
-  store i32 %_tmp4, i32* @c, align 4
-  %_tmp6 = load volatile i32, i32* @c, align 4
+  store i32 %_tmp4, ptr @c, align 4
+  %_tmp6 = load volatile i32, ptr @c, align 4
   br label %bb3
 }
 

diff  --git a/llvm/test/Transforms/LICM/hoist-deref-load.ll b/llvm/test/Transforms/LICM/hoist-deref-load.ll
index 1887b80db0bd7..4a4d5419a9d81 100644
--- a/llvm/test/Transforms/LICM/hoist-deref-load.ll
+++ b/llvm/test/Transforms/LICM/hoist-deref-load.ll
@@ -14,25 +14,25 @@ target triple = "x86_64-unknown-linux-gnu"
 ; and we want to hoist the load of %c out of the loop. This can be done only
 ; because the dereferenceable attribute is on %c.
 
-define void @test1(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32* nocapture readonly nonnull dereferenceable(4) align 4 %c, i32 %n) #0 {
+define void @test1(ptr noalias nocapture %a, ptr noalias nocapture readonly %b, ptr nocapture readonly nonnull dereferenceable(4) align 4 %c, i32 %n) #0 {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C:%.*]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C:%.*]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -50,17 +50,17 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -75,7 +75,7 @@ for.end:                                          ; preds = %for.inc, %entry
 
 ; This is the same as @test1, but without the dereferenceable attribute on %c.
 ; Without this attribute, we should not hoist the load of %c.
-define void @test2(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32* nocapture readonly nonnull %c, i32 %n) #0 {
+define void @test2(ptr noalias nocapture %a, ptr noalias nocapture readonly %b, ptr nocapture readonly nonnull %c, i32 %n) #0 {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
@@ -84,16 +84,16 @@ define void @test2(i32* noalias nocapture %a, i32* noalias nocapture readonly %b
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C:%.*]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C:%.*]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -111,17 +111,17 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -138,30 +138,30 @@ for.end:                                          ; preds = %for.inc, %entry
 ; void test3(int * restrict a, int * restrict b, int c[static 3], int n) {
 ;   for (int i = 0; i < n; ++i)
 ;     if (a[i] > 0)
-;       a[i] = c[2]*b[i];
+;       a[i] = cptr b[i];
 ; }
 ; and we want to hoist the load of c[2] out of the loop. This can be done only
 ; because the dereferenceable attribute is on %c.
-define void @test3(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32* nocapture readonly dereferenceable(12) align 4 %c, i32 %n) #0 {
+define void @test3(ptr noalias nocapture %a, ptr noalias nocapture readonly %b, ptr nocapture readonly dereferenceable(12) align 4 %c, i32 %n) #0 {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[C2:%.*]] = getelementptr inbounds i32, i32* [[C:%.*]], i64 2
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C2]], align 4
+; CHECK-NEXT:    [[C2:%.*]] = getelementptr inbounds i32, ptr [[C:%.*]], i64 2
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C2]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -179,18 +179,18 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %c2 = getelementptr inbounds i32, i32* %c, i64 2
-  %1 = load i32, i32* %c2, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %c2 = getelementptr inbounds i32, ptr %c, i64 2
+  %1 = load i32, ptr %c2, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -205,26 +205,26 @@ for.end:                                          ; preds = %for.inc, %entry
 
 ; This is the same as @test3, but with a dereferenceable attribute on %c with a
 ; size too small to cover c[2] (and so we should not hoist it).
-define void @test4(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32* nocapture readonly dereferenceable(11) %c, i32 %n) #0 {
+define void @test4(ptr noalias nocapture %a, ptr noalias nocapture readonly %b, ptr nocapture readonly dereferenceable(11) %c, i32 %n) #0 {
 ; CHECK-LABEL: @test4(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[C2:%.*]] = getelementptr inbounds i32, i32* [[C:%.*]], i64 2
+; CHECK-NEXT:    [[C2:%.*]] = getelementptr inbounds i32, ptr [[C:%.*]], i64 2
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C2]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C2]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -242,18 +242,18 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %c2 = getelementptr inbounds i32, i32* %c, i64 2
-  %1 = load i32, i32* %c2, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %c2 = getelementptr inbounds i32, ptr %c, i64 2
+  %1 = load i32, ptr %c2, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -276,28 +276,28 @@ for.end:                                          ; preds = %for.inc, %entry
 ; and we want to hoist the load of %c out of the loop. This can be done only
 ; because the dereferenceable_or_null attribute is on %c and there is a null
 ; check on %c.
-define void @test5(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) align 4 %c, i32 %n) #0 {
+define void @test5(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) align 4 %c, i32 %n) #0 {
 ; CHECK-LABEL: @test5(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne ptr [[C:%.*]], null
 ; CHECK-NEXT:    br i1 [[NOT_NULL]], label [[NOT_NULL:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       not.null:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -310,7 +310,7 @@ define void @test5(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) ali
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %not_null = icmp ne i32* %c, null
+  %not_null = icmp ne ptr %c, null
   br i1 %not_null, label %not.null, label %for.end
 
 not.null:
@@ -319,17 +319,17 @@ not.null:
 
 for.body:                                         ; preds = %not.null, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %not.null ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -347,26 +347,26 @@ for.end:                                          ; preds = %for.inc, %entry, %n
 
 ; This test case has an icmp on c but the use of this comparison is
 ; not a branch.
-define i1 @test6(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c, i32 %n) #0 {
+define i1 @test6(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) %c, i32 %n) #0 {
 ; CHECK-LABEL: @test6(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne ptr [[C:%.*]], null
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -379,23 +379,23 @@ define i1 @test6(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c, i
 ; CHECK-NEXT:    ret i1 [[NOT_NULL]]
 ;
 entry:
-  %not_null = icmp ne i32* %c, null
+  %not_null = icmp ne ptr %c, null
   %cmp11 = icmp sgt i32 %n, 0
   br i1 %cmp11, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -417,26 +417,26 @@ for.end:                                          ; preds = %for.inc, %entry
 ; }
 ; and we want to hoist the load of %c out of the loop. This can be done only
 ; because the dereferenceable meatdata on the c = *cptr load.
-define void @test7(i32* noalias %a, i32* %b, i32** %cptr, i32 %n) #0 {
+define void @test7(ptr noalias %a, ptr %b, ptr %cptr, i32 %n) #0 {
 ; CHECK-LABEL: @test7(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[C:%.*]] = load i32*, i32** [[CPTR:%.*]], align 8, !dereferenceable !0, !align !0
+; CHECK-NEXT:    [[C:%.*]] = load ptr, ptr [[CPTR:%.*]], align 8, !dereferenceable !0, !align !0
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -449,23 +449,23 @@ define void @test7(i32* noalias %a, i32* %b, i32** %cptr, i32 %n) #0 {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %c = load i32*, i32** %cptr, !dereferenceable !0, !align !{i64 4}
+  %c = load ptr, ptr %cptr, !dereferenceable !0, !align !{i64 4}
   %cmp11 = icmp sgt i32 %n, 0
   br i1 %cmp11, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -489,29 +489,29 @@ for.end:                                          ; preds = %for.inc, %entry
 ; and we want to hoist the load of %c out of the loop. This can be done only
 ; because the dereferenceable_or_null meatdata on the c = *cptr load and there
 ; is a null check on %c.
-define void @test8(i32* noalias %a, i32* %b, i32** %cptr, i32 %n) #0 {
+define void @test8(ptr noalias %a, ptr %b, ptr %cptr, i32 %n) #0 {
 ; CHECK-LABEL: @test8(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[C:%.*]] = load i32*, i32** [[CPTR:%.*]], align 8, !dereferenceable_or_null !0, !align !0
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne i32* [[C]], null
+; CHECK-NEXT:    [[C:%.*]] = load ptr, ptr [[CPTR:%.*]], align 8, !dereferenceable_or_null !0, !align !0
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne ptr [[C]], null
 ; CHECK-NEXT:    br i1 [[NOT_NULL]], label [[NOT_NULL:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       not.null:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -524,8 +524,8 @@ define void @test8(i32* noalias %a, i32* %b, i32** %cptr, i32 %n) #0 {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %c = load i32*, i32** %cptr, !dereferenceable_or_null !0, !align !{i64 4}
-  %not_null = icmp ne i32* %c, null
+  %c = load ptr, ptr %cptr, !dereferenceable_or_null !0, !align !{i64 4}
+  %not_null = icmp ne ptr %c, null
   br i1 %not_null, label %not.null, label %for.end
 
 not.null:
@@ -534,17 +534,17 @@ not.null:
 
 for.body:                                         ; preds = %not.null, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %not.null ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -559,26 +559,26 @@ for.end:                                          ; preds = %for.inc, %entry, %n
 
 ; This is the same as @test8, but without the null check on %c.
 ; Without this check, we should not hoist the load of %c.
-define void @test9(i32* noalias %a, i32* %b, i32** %cptr, i32 %n) #0 {
+define void @test9(ptr noalias %a, ptr %b, ptr %cptr, i32 %n) #0 {
 ; CHECK-LABEL: @test9(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[C:%.*]] = load i32*, i32** [[CPTR:%.*]], align 8, !dereferenceable_or_null !0
+; CHECK-NEXT:    [[C:%.*]] = load ptr, ptr [[CPTR:%.*]], align 8, !dereferenceable_or_null !0
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -591,23 +591,23 @@ define void @test9(i32* noalias %a, i32* %b, i32** %cptr, i32 %n) #0 {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %c = load i32*, i32** %cptr, !dereferenceable_or_null !0
+  %c = load ptr, ptr %cptr, !dereferenceable_or_null !0
   %cmp11 = icmp sgt i32 %n, 0
   br i1 %cmp11, label %for.body, label %for.end
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -626,26 +626,26 @@ for.end:                                          ; preds = %for.inc, %entry
 ; on the dereferenceability anymore.
 ; In other words this test checks that we strip dereferenceability  metadata
 ; after hoisting an instruction.
-define void @test10(i32* noalias %a, i32* %b, i32** dereferenceable(8) align 8 %cptr, i32 %n) #0 {
+define void @test10(ptr noalias %a, ptr %b, ptr dereferenceable(8) align 8 %cptr, i32 %n) #0 {
 ; CHECK-LABEL: @test10(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[C:%.*]] = load i32*, i32** [[CPTR:%.*]], align 8
+; CHECK-NEXT:    [[C:%.*]] = load ptr, ptr [[CPTR:%.*]], align 8
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -663,18 +663,18 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %c = load i32*, i32** %cptr, !dereferenceable !0
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %c = load ptr, ptr %cptr, !dereferenceable !0
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -687,26 +687,26 @@ for.end:                                          ; preds = %for.inc, %entry
   ret void
 }
 
-define void @test11(i32* noalias %a, i32* %b, i32** dereferenceable(8) %cptr, i32 %n) #0 {
+define void @test11(ptr noalias %a, ptr %b, ptr dereferenceable(8) %cptr, i32 %n) #0 {
 ; CHECK-LABEL: @test11(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[C:%.*]] = load i32*, i32** [[CPTR:%.*]], align 8, !dereferenceable !0
+; CHECK-NEXT:    [[C:%.*]] = load ptr, ptr [[CPTR:%.*]], align 8, !dereferenceable !0
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[D:%.*]] = load i32, i32* [[C]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[E:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[D:%.*]] = load i32, ptr [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[E:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[E]], [[D]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -726,18 +726,18 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
-  %c = load i32*, i32** %cptr, !dereferenceable !0
+  %c = load ptr, ptr %cptr, !dereferenceable !0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %d = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %e = load i32, i32* %arrayidx3, align 4
+  %d = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %e = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %e, %d
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -753,27 +753,27 @@ for.end:                                          ; preds = %for.inc, %entry
 declare void @llvm.experimental.guard(i1, ...)
 
 ; Prove non-null ness of %c via a guard, not a branch.
-define void @test12(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) align 4 %c, i32 %n) #0 {
+define void @test12(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) align 4 %c, i32 %n) #0 {
 ; CHECK-LABEL: @test12(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne ptr [[C:%.*]], null
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[NOT_NULL]]) [ "deopt"() ]
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -786,7 +786,7 @@ define void @test12(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) al
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %not_null = icmp ne i32* %c, null
+  %not_null = icmp ne ptr %c, null
   call void(i1, ...) @llvm.experimental.guard(i1 %not_null) [ "deopt"() ]
   %cmp11 = icmp sgt i32 %n, 0
   br i1 %cmp11, label %for.body, label %for.end
@@ -795,17 +795,17 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -820,26 +820,26 @@ for.end:                                          ; preds = %for.inc, %entry, %e
 
 ; Like @test12, but has a post-dominating guard, which cannot be used
 ; to prove %c is nonnull at the point of the load.
-define void @test13(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c, i32 %n) #0 {
+define void @test13(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) %c, i32 %n) #0 {
 ; CHECK-LABEL: @test13(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne ptr [[C:%.*]], null
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -853,24 +853,24 @@ define void @test13(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %not_null = icmp ne i32* %c, null
+  %not_null = icmp ne ptr %c, null
   %cmp11 = icmp sgt i32 %n, 0
   br i1 %cmp11, label %for.body, label %for.end
 
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -886,29 +886,29 @@ for.end:                                          ; preds = %for.inc, %entry, %e
 
 ; Check that branch by condition "null check AND something" allows to hoist the
 ; load.
-define void @test14(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) align 4 %c, i32 %n, i1 %dummy_cond) #0 {
+define void @test14(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) align 4 %c, i32 %n, i1 %dummy_cond) #0 {
 ; CHECK-LABEL: @test14(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne ptr [[C:%.*]], null
 ; CHECK-NEXT:    [[DUMMY_AND:%.*]] = and i1 [[NOT_NULL]], [[DUMMY_COND:%.*]]
 ; CHECK-NEXT:    br i1 [[DUMMY_AND]], label [[NOT_NULL:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       not.null:
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -922,7 +922,7 @@ define void @test14(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) al
 ;
 
 entry:
-  %not_null = icmp ne i32* %c, null
+  %not_null = icmp ne ptr %c, null
   %dummy_and = and i1 %not_null, %dummy_cond
   br i1 %dummy_and, label %not.null, label %for.end
 
@@ -932,17 +932,17 @@ not.null:
 
 for.body:                                         ; preds = %not.null, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %not.null ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -957,28 +957,28 @@ for.end:                                          ; preds = %for.inc, %entry, %n
 
 ; Check that guard by condition "null check AND something" allows to hoist the
 ; load.
-define void @test15(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) align 4 %c, i32 %n, i1 %dummy_cond) #0 {
+define void @test15(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) align 4 %c, i32 %n, i1 %dummy_cond) #0 {
 ; CHECK-LABEL: @test15(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp ne ptr [[C:%.*]], null
 ; CHECK-NEXT:    [[DUMMY_AND:%.*]] = and i1 [[NOT_NULL]], [[DUMMY_COND:%.*]]
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[DUMMY_AND]]) [ "deopt"() ]
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
 ; CHECK-NEXT:    br i1 [[CMP11]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.preheader:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[C]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[C]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP0]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -992,7 +992,7 @@ define void @test15(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) al
 ;
 
 entry:
-  %not_null = icmp ne i32* %c, null
+  %not_null = icmp ne ptr %c, null
   %dummy_and = and i1 %not_null, %dummy_cond
   call void(i1, ...) @llvm.experimental.guard(i1 %dummy_and) [ "deopt"() ]
   %cmp11 = icmp sgt i32 %n, 0
@@ -1000,17 +1000,17 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -1026,10 +1026,10 @@ for.end:                                          ; preds = %for.inc, %entry
 ; Ensure that (c == null && other_cond) does not automatically mean that c is
 ; non-null in false branch. So the condition ((c == null && other_cond) == false)
 ; is not sufficient to conclude that c != null.
-define void @test16(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c, i32 %n, i1 %dummy_cond) #0 {
+define void @test16(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) %c, i32 %n, i1 %dummy_cond) #0 {
 ; CHECK-LABEL: @test16(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp eq i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp eq ptr [[C:%.*]], null
 ; CHECK-NEXT:    [[DUMMY_AND:%.*]] = and i1 [[NOT_NULL]], [[DUMMY_COND:%.*]]
 ; CHECK-NEXT:    br i1 [[DUMMY_AND]], label [[FOR_END:%.*]], label [[NOT_NULL:%.*]]
 ; CHECK:       not.null:
@@ -1039,16 +1039,16 @@ define void @test16(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -1062,7 +1062,7 @@ define void @test16(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c
 ;
 
 entry:
-  %not_null = icmp eq i32* %c, null
+  %not_null = icmp eq ptr %c, null
   %dummy_and = and i1 %not_null, %dummy_cond
   br i1 %dummy_and, label %for.end, label %not.null
 
@@ -1072,17 +1072,17 @@ not.null:
 
 for.body:                                         ; preds = %not.null, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %not.null ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then
@@ -1098,10 +1098,10 @@ for.end:                                          ; preds = %for.inc, %entry, %n
 ; Ensure that (c == null && other_cond) does not automatically mean that c is
 ; non-null in false branch. So the condition ((c == null && other_cond) == false)
 ; is not sufficient to conclude that c != null.
-define void @test17(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c, i32 %n, i1 %dummy_cond) #0 {
+define void @test17(ptr noalias %a, ptr %b, ptr dereferenceable_or_null(4) %c, i32 %n, i1 %dummy_cond) #0 {
 ; CHECK-LABEL: @test17(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp eq i32* [[C:%.*]], null
+; CHECK-NEXT:    [[NOT_NULL:%.*]] = icmp eq ptr [[C:%.*]], null
 ; CHECK-NEXT:    [[DUMMY_AND:%.*]] = and i1 [[NOT_NULL]], [[DUMMY_COND:%.*]]
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[DUMMY_AND]]) [ "deopt"() ]
 ; CHECK-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[N:%.*]], 0
@@ -1110,16 +1110,16 @@ define void @test17(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[C]], align 4
-; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX3]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], [[TMP1]]
-; CHECK-NEXT:    store i32 [[MUL]], i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[ARRAYIDX]], align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
@@ -1133,7 +1133,7 @@ define void @test17(i32* noalias %a, i32* %b, i32* dereferenceable_or_null(4) %c
 ;
 
 entry:
-  %not_null = icmp eq i32* %c, null
+  %not_null = icmp eq ptr %c, null
   %dummy_and = and i1 %not_null, %dummy_cond
   call void(i1, ...) @llvm.experimental.guard(i1 %dummy_and) [ "deopt"() ]
   %cmp11 = icmp sgt i32 %n, 0
@@ -1141,17 +1141,17 @@ entry:
 
 for.body:                                         ; preds = %entry, %for.inc
   %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
+  %0 = load i32, ptr %arrayidx, align 4
   %cmp1 = icmp sgt i32 %0, 0
   br i1 %cmp1, label %if.then, label %for.inc
 
 if.then:                                          ; preds = %for.body
-  %1 = load i32, i32* %c, align 4
-  %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
-  %2 = load i32, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %c, align 4
+  %arrayidx3 = getelementptr inbounds i32, ptr %b, i64 %indvars.iv
+  %2 = load i32, ptr %arrayidx3, align 4
   %mul = mul nsw i32 %2, %1
-  store i32 %mul, i32* %arrayidx, align 4
+  store i32 %mul, ptr %arrayidx, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body, %if.then

diff  --git a/llvm/test/Transforms/LICM/hoist-fast-fdiv.ll b/llvm/test/Transforms/LICM/hoist-fast-fdiv.ll
index c48cac4d954d4..4507f295522d1 100644
--- a/llvm/test/Transforms/LICM/hoist-fast-fdiv.ll
+++ b/llvm/test/Transforms/LICM/hoist-fast-fdiv.ll
@@ -32,7 +32,7 @@ end:                                      ; preds = %loop
   ret i1 %v16
 }
 
-define void @invariant_fdiv(float* %out, float %arg) {
+define void @invariant_fdiv(ptr %out, float %arg) {
 ; CHECK-LABEL: @invariant_fdiv(
 ; CHECK-NEXT: entry:
 ; CHECK-NEXT: %div = fdiv fast float 4.000000e+00, %arg
@@ -49,8 +49,8 @@ loop:                                              ; preds = %loop, %entry
 ; CHECK-NOT: fmul
   %div = fdiv fast float 4.000000e+00, %arg
   %mul = fmul fast float %div, 0x41F0000000000000
-  %gep = getelementptr inbounds float, float* %out, i32 %ind
-  store float %mul, float* %gep, align 4
+  %gep = getelementptr inbounds float, ptr %out, i32 %ind
+  store float %mul, ptr %gep, align 4
   %inc = add nuw nsw i32 %ind, 1
   %cond = icmp eq i32 %inc, 1024
   br i1 %cond, label %exit, label %loop

diff  --git a/llvm/test/Transforms/LICM/hoist-invariant-load.ll b/llvm/test/Transforms/LICM/hoist-invariant-load.ll
index 6562441d77c88..040822319a5d4 100644
--- a/llvm/test/Transforms/LICM/hoist-invariant-load.ll
+++ b/llvm/test/Transforms/LICM/hoist-invariant-load.ll
@@ -2,39 +2,39 @@
 ; RUN: opt < %s -licm -verify-memoryssa -disable-basic-aa -stats -S 2>&1 | grep "1 licm"
 
 @"\01L_OBJC_METH_VAR_NAME_" = internal global [4 x i8] c"foo\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_", i32 0, i32 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"
 @"\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 ([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 ([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"
 
-define void @test(i8* %x) uwtable ssp {
+define void @test(ptr %x) uwtable ssp {
 entry:
-  %x.addr = alloca i8*, align 8
+  %x.addr = alloca ptr, align 8
   %i = alloca i32, align 4
-  store i8* %x, i8** %x.addr, align 8
-  store i32 0, i32* %i, align 4
+  store ptr %x, ptr %x.addr, align 8
+  store i32 0, ptr %i, align 4
   br label %for.cond
 
 for.cond:                                         ; preds = %for.inc, %entry
-  %0 = load i32, i32* %i, align 4
+  %0 = load i32, ptr %i, align 4
   %cmp = icmp ult i32 %0, 10000
   br i1 %cmp, label %for.body, label %for.end
 
 for.body:                                         ; preds = %for.cond
-  %1 = load i8*, i8** %x.addr, align 8
-  %2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", !invariant.load !0
-  %call = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %1, i8* %2)
+  %1 = load ptr, ptr %x.addr, align 8
+  %2 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", !invariant.load !0
+  %call = call ptr @objc_msgSend(ptr %1, ptr %2)
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body
-  %3 = load i32, i32* %i, align 4
+  %3 = load i32, ptr %i, align 4
   %inc = add i32 %3, 1
-  store i32 %inc, i32* %i, align 4
+  store i32 %inc, ptr %i, align 4
   br label %for.cond
 
 for.end:                                          ; preds = %for.cond
   ret void
 }
 
-declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind
+declare ptr @objc_msgSend(ptr, ptr, ...) nonlazybind
 
 !0 = !{}

diff  --git a/llvm/test/Transforms/LICM/hoist-load-without-store.ll b/llvm/test/Transforms/LICM/hoist-load-without-store.ll
index 275a531727371..52ab8fd7836b9 100644
--- a/llvm/test/Transforms/LICM/hoist-load-without-store.ll
+++ b/llvm/test/Transforms/LICM/hoist-load-without-store.ll
@@ -12,13 +12,13 @@
 ;;   }
 ;; }
 
-define dso_local void @f(i32* nocapture %ptr, i32 %n) {
+define dso_local void @f(ptr nocapture %ptr, i32 %n) {
 ; CHECK-LABEL: @f(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP7:%.*]] = icmp slt i32 0, [[N:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP7]], label [[FOR_BODY_LR_PH:%.*]], label [[CLEANUP1:%.*]]
 ; CHECK:       for.body.lr.ph:
-; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i32, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i32, ptr [[PTR:%.*]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ [[PTR_PROMOTED]], [[FOR_BODY_LR_PH]] ], [ 1, [[IF_END:%.*]] ]
@@ -26,7 +26,7 @@ define dso_local void @f(i32* nocapture %ptr, i32 %n) {
 ; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
 ; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[FOR_BODY_CLEANUP1_CRIT_EDGE:%.*]]
 ; CHECK:       if.end:
-; CHECK-NEXT:    store i32 1, i32* [[PTR]], align 4
+; CHECK-NEXT:    store i32 1, ptr [[PTR]], align 4
 ; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_08]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[INC]], [[N]]
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP1_CRIT_EDGE:%.*]]
@@ -46,12 +46,12 @@ for.body.lr.ph:                                   ; preds = %entry
 
 for.body:                                         ; preds = %for.body.lr.ph, %if.end
   %i.08 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %if.end ]
-  %0 = load i32, i32* %ptr, align 4
+  %0 = load i32, ptr %ptr, align 4
   %tobool.not = icmp eq i32 %0, 0
   br i1 %tobool.not, label %if.end, label %for.body.cleanup1_crit_edge
 
 if.end:                                           ; preds = %for.body
-  store i32 1, i32* %ptr, align 4
+  store i32 1, ptr %ptr, align 4
   %inc = add nuw nsw i32 %i.08, 1
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.body, label %for.cond.cleanup1_crit_edge

diff  --git a/llvm/test/Transforms/LICM/hoist-mustexec.ll b/llvm/test/Transforms/LICM/hoist-mustexec.ll
index 592e20566a822..8d66071e5d7dc 100644
--- a/llvm/test/Transforms/LICM/hoist-mustexec.ll
+++ b/llvm/test/Transforms/LICM/hoist-mustexec.ll
@@ -8,10 +8,10 @@ declare void @f() nounwind
 declare void @llvm.experimental.guard(i1,...)
 
 ; constant fold on first ieration
-define i32 @test1(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test1(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test1(
 entry:
-; CHECK: %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
 ; CHECK-NEXT: br label %for.body
   br label %for.body
 
@@ -21,7 +21,7 @@ for.body:
   %r.chk = icmp ult i32 %iv, 2000
   br i1 %r.chk, label %continue, label %fail
 continue:
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = add nuw nsw i32 %iv, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -36,10 +36,10 @@ fail:
 }
 
 ; Same as test1, but with a floating point IR and fcmp
-define i32 @test_fcmp(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test_fcmp(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test_fcmp(
 entry:
-; CHECK: %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
 ; CHECK-NEXT: br label %for.body
   br label %for.body
 
@@ -49,7 +49,7 @@ for.body:
   %r.chk = fcmp olt float %iv, 2000.0
   br i1 %r.chk, label %continue, label %fail
 continue:
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = fadd float %iv, 1.0
   %exitcond = fcmp ogt float %inc, 1000.0
@@ -66,10 +66,10 @@ fail:
 ; Count down from a.length w/entry guard
 ; TODO: currently unable to prove the following:
 ; ule i32 (add nsw i32 %len, -1), %len where len is [0, 512]
-define i32 @test2(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test2(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test2(
 entry:
-  %len = load i32, i32* %a, align 4, !range !{i32 0, i32 512}
+  %len = load i32, ptr %a, align 4, !range !{i32 0, i32 512}
   %is.non.pos = icmp eq i32 %len, 0
   br i1 %is.non.pos, label %fail, label %preheader
 preheader:
@@ -82,8 +82,8 @@ for.body:
   br i1 %r.chk, label %continue, label %fail
 continue:
 ; CHECK-LABEL: continue
-; CHECK: %i1 = load i32, i32* %a, align 4
-  %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %dec = add nsw i32 %iv, -1
   %exitcond = icmp eq i32 %dec, 0
@@ -98,14 +98,14 @@ fail:
 }
 
 ; trivially true for zero
-define i32 @test3(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test3(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test3(
 entry:
-  %len = load i32, i32* %a, align 4, !range !{i32 0, i32 512}
+  %len = load i32, ptr %a, align 4, !range !{i32 0, i32 512}
   %is.zero = icmp eq i32 %len, 0
   br i1 %is.zero, label %fail, label %preheader
 preheader:
-; CHECK: %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
 ; CHECK-NEXT: br label %for.body
   br label %for.body
 for.body:
@@ -114,7 +114,7 @@ for.body:
   %r.chk = icmp ule i32 %iv, %len
   br i1 %r.chk, label %continue, label %fail
 continue:
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = add nuw nsw i32 %iv, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -129,14 +129,14 @@ fail:
 }
 
 ; requires fact length is non-zero
-define i32 @test4(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test4(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test4(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[LEN:%.*]] = load i32, i32* [[A:%.*]], align 4, !range !0
+; CHECK-NEXT:    [[LEN:%.*]] = load i32, ptr [[A:%.*]], align 4, !range !0
 ; CHECK-NEXT:    [[IS_ZERO:%.*]] = icmp eq i32 [[LEN]], 0
 ; CHECK-NEXT:    br i1 [[IS_ZERO]], label [[FAIL:%.*]], label [[PREHEADER:%.*]]
 ; CHECK:       preheader:
-; CHECK-NEXT:    [[I1:%.*]] = load i32, i32* [[A]], align 4
+; CHECK-NEXT:    [[I1:%.*]] = load i32, ptr [[A]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[INC:%.*]], [[CONTINUE:%.*]] ]
@@ -158,7 +158,7 @@ define i32 @test4(i32* noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-NEXT:    ret i32 -1
 ;
 entry:
-  %len = load i32, i32* %a, align 4, !range !{i32 0, i32 512}
+  %len = load i32, ptr %a, align 4, !range !{i32 0, i32 512}
   %is.zero = icmp eq i32 %len, 0
   br i1 %is.zero, label %fail, label %preheader
 preheader:
@@ -169,7 +169,7 @@ for.body:
   %r.chk = icmp ult i32 %iv, %len
   br i1 %r.chk, label %continue, label %fail
 continue:
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = add nuw nsw i32 %iv, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -184,10 +184,10 @@ fail:
 }
 
 ; variation on test1 with branch swapped
-define i32 @test-brswap(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test-brswap(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test-brswap(
 entry:
-; CHECK: %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
 ; CHECK-NEXT: br label %for.body
   br label %for.body
 
@@ -197,7 +197,7 @@ for.body:
   %r.chk = icmp ugt i32 %iv, 2000
   br i1 %r.chk, label %fail, label %continue
 continue:
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = add nuw nsw i32 %iv, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -211,21 +211,21 @@ fail:
   ret i32 -1
 }
 
-define i32 @test-nonphi(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test-nonphi(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test-nonphi(
 entry:
   br label %for.body
 
 for.body:
 ; CHECK-LABEL: continue
-; CHECK: %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
   %iv = phi i32 [ 0, %entry ], [ %inc, %continue ]
   %acc = phi i32 [ 0, %entry ], [ %add, %continue ]
   %xor = xor i32 %iv, 72
   %r.chk = icmp ugt i32 %xor, 2000
   br i1 %r.chk, label %fail, label %continue
 continue:
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = add nuw nsw i32 %iv, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -239,7 +239,7 @@ fail:
   ret i32 -1
 }
 
-define i32 @test-wrongphi(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test-wrongphi(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test-wrongphi(
 entry:
   br label %for.body
@@ -259,8 +259,8 @@ dummy_block2:
   br i1 %r.chk, label %fail, label %continue
 continue:
 ; CHECK-LABEL: continue
-; CHECK: %i1 = load i32, i32* %a, align 4
-  %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = add nuw nsw i32 %iv, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -275,10 +275,10 @@ fail:
 }
 
 ; This works because loop-simplify is run implicitly, but test for it anyways
-define i32 @test-multiple-latch(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test-multiple-latch(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test-multiple-latch(
 entry:
-; CHECK: %i1 = load i32, i32* %a, align 4
+; CHECK: %i1 = load i32, ptr %a, align 4
 ; CHECK-NEXT: br label %for.body
   br label %for.body
 
@@ -288,7 +288,7 @@ for.body:
   %r.chk = icmp ult i32 %iv, 2000
   br i1 %r.chk, label %continue1, label %fail
 continue1:
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %acc
   %inc = add nuw nsw i32 %iv, 1
   %cmp = icmp eq i32 %add, 0
@@ -305,11 +305,11 @@ fail:
   ret i32 -1
 }
 
-define void @test-hoisting-in-presence-of-guards(i1 %c, i32* %p) {
+define void @test-hoisting-in-presence-of-guards(i1 %c, ptr %p) {
 
 ; CHECK-LABEL: @test-hoisting-in-presence-of-guards
 ; CHECK:       entry:
-; CHECK:         %a = load i32, i32* %p
+; CHECK:         %a = load i32, ptr %p
 ; CHECK:         %invariant_cond = icmp ne i32 %a, 100
 ; CHECK:       loop:
 
@@ -319,7 +319,7 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
   %iv.next = add i32 %iv, 1
-  %a = load i32, i32* %p
+  %a = load i32, ptr %p
   %invariant_cond = icmp ne i32 %a, 100
   call void (i1, ...) @llvm.experimental.guard(i1 %invariant_cond) [ "deopt"() ]
   %loop_cond = icmp slt i32 %iv.next, 1000
@@ -334,11 +334,11 @@ declare void @may_throw() inaccessiblememonly
 
 ; Test that we can sink a mustexecute load from loop header even in presence of
 ; throwing instructions after it.
-define void @test_hoist_from_header_01(i32* %p, i32 %n) {
+define void @test_hoist_from_header_01(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_header_01(
 ; CHECK:       entry:
-; CHECK-NEXT:  %load = load i32, i32* %p
+; CHECK-NEXT:  %load = load i32, ptr %p
 ; CHECK-NOT:   load i32
 
 entry:
@@ -347,7 +347,7 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
   %dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   call void @may_throw()
   %cond = icmp slt i32 %iv, %n
   br i1 %cond, label %if.true, label %if.false
@@ -370,11 +370,11 @@ exit:
   ret void
 }
 
-define void @test_hoist_from_header_02(i32* %p, i32 %n) {
+define void @test_hoist_from_header_02(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_header_02(
 ; CHECK:       entry:
-; CHECK-NEXT:  %load = load i32, i32* %p
+; CHECK-NEXT:  %load = load i32, ptr %p
 ; CHECK-NOT:   load i32
 
 entry:
@@ -383,7 +383,7 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
   %dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   %cond = icmp slt i32 %iv, %n
   br i1 %cond, label %if.true, label %if.false
 
@@ -406,11 +406,11 @@ exit:
   ret void
 }
 
-define void @test_hoist_from_header_03(i32* %p, i32 %n) {
+define void @test_hoist_from_header_03(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_header_03(
 ; CHECK:       entry:
-; CHECK-NEXT:  %load = load i32, i32* %p
+; CHECK-NEXT:  %load = load i32, ptr %p
 ; CHECK-NOT:   load i32
 
 entry:
@@ -419,7 +419,7 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
   %dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   %cond = icmp slt i32 %iv, %n
   br i1 %cond, label %if.true, label %if.false
 
@@ -443,12 +443,12 @@ exit:
 }
 
 ; Check that a throwing instruction prohibits hoisting across it.
-define void @test_hoist_from_header_04(i32* %p, i32 %n) {
+define void @test_hoist_from_header_04(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_header_04(
 ; CHECK:       entry:
 ; CHECK:       loop:
-; CHECK:       %load = load i32, i32* %p
+; CHECK:       %load = load i32, ptr %p
 
 entry:
   br label %loop
@@ -457,7 +457,7 @@ loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
   %dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
   call void @may_throw()
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   %cond = icmp slt i32 %iv, %n
   br i1 %cond, label %if.true, label %if.false
 
@@ -481,11 +481,11 @@ exit:
 
 ; Check that we can hoist a mustexecute load from backedge even if something
 ; throws after it.
-define void @test_hoist_from_backedge_01(i32* %p, i32 %n) {
+define void @test_hoist_from_backedge_01(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_backedge_01(
 ; CHECK:       entry:
-; CHECK-NEXT:  %load = load i32, i32* %p
+; CHECK-NEXT:  %load = load i32, ptr %p
 ; CHECK-NOT:   load i32
 
 entry:
@@ -508,7 +508,7 @@ if.false:
 backedge:
   %merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
   %iv.next = add i32 %iv, %merge
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   call void @may_throw()
   %loop.cond = icmp ult i32 %iv.next, %load
   br i1 %loop.cond, label %loop, label %exit
@@ -518,12 +518,12 @@ exit:
 }
 
 ; Check that we don't hoist the load if something before it can throw.
-define void @test_hoist_from_backedge_02(i32* %p, i32 %n) {
+define void @test_hoist_from_backedge_02(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_backedge_02(
 ; CHECK:       entry:
 ; CHECK:       loop:
-; CHECK:       %load = load i32, i32* %p
+; CHECK:       %load = load i32, ptr %p
 
 entry:
   br label %loop
@@ -546,7 +546,7 @@ backedge:
   %merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
   %iv.next = add i32 %iv, %merge
   call void @may_throw()
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   %loop.cond = icmp ult i32 %iv.next, %load
   br i1 %loop.cond, label %loop, label %exit
 
@@ -554,12 +554,12 @@ exit:
   ret void
 }
 
-define void @test_hoist_from_backedge_03(i32* %p, i32 %n) {
+define void @test_hoist_from_backedge_03(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_backedge_03(
 ; CHECK:       entry:
 ; CHECK:       loop:
-; CHECK:       %load = load i32, i32* %p
+; CHECK:       %load = load i32, ptr %p
 
 entry:
   br label %loop
@@ -582,7 +582,7 @@ if.false:
 backedge:
   %merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
   %iv.next = add i32 %iv, %merge
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   %loop.cond = icmp ult i32 %iv.next, %load
   br i1 %loop.cond, label %loop, label %exit
 
@@ -590,12 +590,12 @@ exit:
   ret void
 }
 
-define void @test_hoist_from_backedge_04(i32* %p, i32 %n) {
+define void @test_hoist_from_backedge_04(ptr %p, i32 %n) {
 
 ; CHECK-LABEL: @test_hoist_from_backedge_04(
 ; CHECK:       entry:
 ; CHECK:       loop:
-; CHECK:       %load = load i32, i32* %p
+; CHECK:       %load = load i32, ptr %p
 
 entry:
   br label %loop
@@ -618,7 +618,7 @@ if.false:
 backedge:
   %merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
   %iv.next = add i32 %iv, %merge
-  %load = load i32, i32* %p
+  %load = load i32, ptr %p
   %loop.cond = icmp ult i32 %iv.next, %load
   br i1 %loop.cond, label %loop, label %exit
 

diff  --git a/llvm/test/Transforms/LICM/hoist-nounwind.ll b/llvm/test/Transforms/LICM/hoist-nounwind.ll
index 59f2f803364e1..1db810f0bcef4 100644
--- a/llvm/test/Transforms/LICM/hoist-nounwind.ll
+++ b/llvm/test/Transforms/LICM/hoist-nounwind.ll
@@ -6,7 +6,7 @@ target triple = "x86_64-unknown-linux-gnu"
 declare void @f() nounwind
 
 ; Don't hoist load past nounwind call.
-define i32 @test1(i32* noalias nocapture readonly %a) nounwind uwtable {
+define i32 @test1(ptr noalias nocapture readonly %a) nounwind uwtable {
 ; CHECK-LABEL: @test1(
 entry:
   br label %for.body
@@ -17,7 +17,7 @@ for.body:
   %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
   %x.05 = phi i32 [ 0, %entry ], [ %add, %for.body ]
   tail call void @f() nounwind
-  %i1 = load i32, i32* %a, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %x.05
   %inc = add nuw nsw i32 %i.06, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -50,7 +50,7 @@ for.cond.cleanup:
 }
 
 ; Hoist a non-volatile load past volatile load.
-define i32 @test3(i32* noalias nocapture readonly %a, i32* %v) nounwind uwtable {
+define i32 @test3(ptr noalias nocapture readonly %a, ptr %v) nounwind uwtable {
 ; CHECK-LABEL: @test3(
 entry:
   br label %for.body
@@ -62,8 +62,8 @@ entry:
 for.body:
   %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
   %x.05 = phi i32 [ 0, %entry ], [ %add, %for.body ]
-  %xxx = load volatile i32, i32* %v, align 4
-  %i1 = load i32, i32* %a, align 4
+  %xxx = load volatile i32, ptr %v, align 4
+  %i1 = load i32, ptr %a, align 4
   %add = add nsw i32 %i1, %x.05
   %inc = add nuw nsw i32 %i.06, 1
   %exitcond = icmp eq i32 %inc, 1000
@@ -74,7 +74,7 @@ for.cond.cleanup:
 }
 
 ; Don't a volatile load past volatile load.
-define i32 @test4(i32* noalias nocapture readonly %a, i32* %v) nounwind uwtable {
+define i32 @test4(ptr noalias nocapture readonly %a, ptr %v) nounwind uwtable {
 ; CHECK-LABEL: @test4(
 entry:
   br label %for.body
@@ -85,8 +85,8 @@ entry:
 for.body:
   %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
   %x.05 = phi i32 [ 0, %entry ], [ %add, %for.body ]
-  %xxx = load volatile i32, i32* %v, align 4
-  %i1 = load volatile i32, i32* %a, align 4
+  %xxx = load volatile i32, ptr %v, align 4
+  %i1 = load volatile i32, ptr %a, align 4
   %add = add nsw i32 %i1, %x.05
   %inc = add nuw nsw i32 %i.06, 1
   %exitcond = icmp eq i32 %inc, 1000

diff  --git a/llvm/test/Transforms/LICM/hoist-phi.ll b/llvm/test/Transforms/LICM/hoist-phi.ll
index 005690dd0ba4e..25fc2add39c5f 100644
--- a/llvm/test/Transforms/LICM/hoist-phi.ll
+++ b/llvm/test/Transforms/LICM/hoist-phi.ll
@@ -4,12 +4,12 @@
 ; RUN: opt -passes='require<opt-remark-emit>,loop-mssa(licm)' -S < %s | FileCheck %s -check-prefixes=CHECK,CHECK-DISABLED
 
 ; RUN: opt -passes='require<opt-remark-emit>,loop-mssa(licm)' -licm-control-flow-hoisting=1 -verify-memoryssa -S < %s | FileCheck %s -check-prefixes=CHECK,CHECK-ENABLED
-; Enable run below when adding promotion. e.g. "store i32 %phi, i32* %p" is promoted to phi.lcssa.
+; Enable run below when adding promotion. e.g. "store i32 %phi, ptr %p" is promoted to phi.lcssa.
 ; opt -passes='require<opt-remark-emit>,loop-mssa(licm)' -licm-control-flow-hoisting=0 -verify-memoryssa -S < %s | FileCheck %s -check-prefixes=CHECK,CHECK-DISABLED
 
 
 ; CHECK-LABEL: @triangle_phi
-define void @triangle_phi(i32 %x, i32* %p) {
+define void @triangle_phi(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK: %cmp1 = icmp sgt i32 %x, 0
 ; CHECK-ENABLED: br i1 %cmp1, label %[[IF_LICM:.*]], label %[[THEN_LICM:.*]]
@@ -22,7 +22,7 @@ entry:
 
 ; CHECK-ENABLED: [[THEN_LICM]]:
 ; CHECK-ENABLED: phi i32 [ %add, %[[IF_LICM]] ], [ %x, %entry ]
-; CHECK-ENABLED: store i32 %phi, i32* %p
+; CHECK-ENABLED: store i32 %phi, ptr %p
 ; CHECK-ENABLED: %cmp2 = icmp ne i32 %phi, 0
 ; CHECK: br label %loop
 
@@ -39,19 +39,19 @@ if:
 ; CHECK-DISABLED: %cmp2 = icmp ne i32 %phi, 0
 then:
   %phi = phi i32 [ %add, %if ], [ %x, %loop ]
-  store i32 %phi, i32* %p
+  store i32 %phi, ptr %p
   %cmp2 = icmp ne i32 %phi, 0
   br i1 %cmp2, label %loop, label %end
 
 ; CHECK-LABEL: end:
 ; CHECK-DISABLED: %[[PHI_LCSSA:.*]] = phi i32 [ %phi, %then ]
-; CHECK-DISABLED: store i32 %[[PHI_LCSSA]], i32* %p
+; CHECK-DISABLED: store i32 %[[PHI_LCSSA]], ptr %p
 end:
   ret void
 }
 
 ; CHECK-LABEL: @diamond_phi
-define void @diamond_phi(i32 %x, i32* %p) {
+define void @diamond_phi(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK: %cmp1 = icmp sgt i32 %x, 0
 ; CHECK-ENABLED: br i1 %cmp1, label %[[IF_LICM:.*]], label %[[ELSE_LICM:.*]]
@@ -68,7 +68,7 @@ entry:
 
 ; CHECK-ENABLED: [[THEN_LICM]]
 ; CHECK-ENABLED: %phi = phi i32 [ %add, %[[IF_LICM]] ], [ %sub, %[[ELSE_LICM]] ]
-; CHECK-ENABLED: store i32 %phi, i32* %p
+; CHECK-ENABLED: store i32 %phi, ptr %p
 ; CHECK-ENABLED: %cmp2 = icmp ne i32 %phi, 0
 ; CHECK: br label %loop
 
@@ -89,20 +89,20 @@ else:
 ; CHECK-DISABLED: %cmp2 = icmp ne i32 %phi, 0
 then:
   %phi = phi i32 [ %add, %if ], [ %sub, %else ]
-  store i32 %phi, i32* %p
+  store i32 %phi, ptr %p
   %cmp2 = icmp ne i32 %phi, 0
   br i1 %cmp2, label %loop, label %end
 
 ; CHECK-LABEL: end:
 ; CHECK-DISABLED: %[[PHI_LCSSA:.*]] = phi i32 [ %phi, %then ]
-; CHECK-DISABLED: store i32 %[[PHI_LCSSA]], i32* %p
+; CHECK-DISABLED: store i32 %[[PHI_LCSSA]], ptr %p
 end:
   ret void
 }
 
 ; TODO: This is currently too complicated for us to be able to hoist the phi.
 ; CHECK-LABEL: @three_way_phi
-define void @three_way_phi(i32 %x, i32* %p) {
+define void @three_way_phi(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp1 = icmp sgt i32 %x, 0
 ; CHECK-DAG: %add = add i32 %x, 1
@@ -134,7 +134,7 @@ if.if:
 
 then:
   %phi = phi i32 [ 0, %loop ], [ %add, %if ], [ %sub, %if.if ]
-  store i32 %phi, i32* %p
+  store i32 %phi, ptr %p
   %cmp3 = icmp ne i32 %phi, 0
   br i1 %cmp3, label %loop, label %end
 
@@ -144,7 +144,7 @@ end:
 
 ; TODO: This is currently too complicated for us to be able to hoist the phi.
 ; CHECK-LABEL: @tree_phi
-define void @tree_phi(i32 %x, i32* %p) {
+define void @tree_phi(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp1 = icmp sgt i32 %x, 0
 ; CHECK-DAG: %add = add i32 %x, 1
@@ -176,7 +176,7 @@ else:
 
 then:
   %phi = phi i32 [ %add, %if.if ], [ 0, %if.else ], [ %sub, %else ]
-  store i32 %phi, i32* %p
+  store i32 %phi, ptr %p
   %cmp3 = icmp ne i32 %phi, 0
   br i1 %cmp3, label %loop, label %end
 
@@ -186,7 +186,7 @@ end:
 
 ; TODO: We can hoist the first phi, but not the second.
 ; CHECK-LABEL: @phi_phi
-define void @phi_phi(i32 %x, i32* %p) {
+define void @phi_phi(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp1 = icmp sgt i32 %x, 0
 ; CHECK-DAG: %add = add i32 %x, 1
@@ -236,7 +236,7 @@ else:
 ; CHECK: %phi2 = phi i32 [ %phi1, %if.then ], [ %sub, %else ]
 then:
   %phi2 = phi i32 [ %phi1, %if.then ], [ %sub, %else ]
-  store i32 %phi2, i32* %p
+  store i32 %phi2, ptr %p
   %cmp3 = icmp ne i32 %phi2, 0
   br i1 %cmp3, label %loop, label %end
 
@@ -469,7 +469,7 @@ end:
 ; The phi is on one branch of a diamond while simultaneously at the end of a
 ; triangle. Check that we duplicate the triangle and not the diamond.
 ; CHECK-LABEL: @triangle_diamond
-define void @triangle_diamond(i32* %ptr, i32 %x, i32 %y) {
+define void @triangle_diamond(ptr %ptr, i32 %x, i32 %y) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp1 = icmp ne i32 %x, 0
 ; CHECK-DAG: %cmp2 = icmp ne i32 %y, 0
@@ -496,7 +496,7 @@ if:
 ; CHECK-DISABLED: %phi = phi i32 [ 0, %if ], [ 127, %loop ]
 then:
   %phi = phi i32 [ 0, %if ], [ 127, %loop ]
-  store i32 %phi, i32* %ptr
+  store i32 %phi, ptr %ptr
   br label %end
 
 if.then:
@@ -508,7 +508,7 @@ end:
 
 ; As the previous, but the end of the diamond is the head of the loop.
 ; CHECK-LABEL: @triangle_diamond_backedge
-define void @triangle_diamond_backedge(i32* %ptr, i32 %x, i32 %y) {
+define void @triangle_diamond_backedge(ptr %ptr, i32 %x, i32 %y) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp1 = icmp ne i32 %x, 0
 ; CHECK-DAG: %cmp2 = icmp ne i32 %y, 0
@@ -535,7 +535,7 @@ if:
 ; CHECK-DISABLED: %phi = phi i32 [ 0, %if ], [ 127, %loop ]
 then:
   %phi = phi i32 [ 0, %if ], [ 127, %loop ]
-  store i32 %phi, i32* %ptr
+  store i32 %phi, ptr %ptr
   br label %loop
 
 backedge:
@@ -544,7 +544,7 @@ backedge:
 
 ; TODO: The inner diamonds can be hoisted, but not currently the outer diamond
 ; CHECK-LABEL: @diamonds_inside_diamond
-define void @diamonds_inside_diamond(i32 %x, i32* %p) {
+define void @diamonds_inside_diamond(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp1 = icmp sgt i32 %x, 0
 ; CHECK-DAG: %cmp3 = icmp slt i32 %x, -10
@@ -614,7 +614,7 @@ else.then:
 ; CHECK: %cmp4 = icmp ne i32 %phi3, 0
 then:
   %phi3 = phi i32 [ %phi1, %if.then ], [ %phi2, %else.then ]
-  store i32 %phi3, i32* %p
+  store i32 %phi3, ptr %p
   %cmp4 = icmp ne i32 %phi3, 0
   br i1 %cmp4, label %loop, label %end
 
@@ -625,7 +625,7 @@ end:
 ; We can hoist blocks that contain an edge that exits the loop by ignoring that
 ; edge in the hoisted block.
 ; CHECK-LABEL: @triangle_phi_loopexit
-define void @triangle_phi_loopexit(i32 %x, i32* %p) {
+define void @triangle_phi_loopexit(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %add = add i32 %x, 1
 ; CHECK-DAG: %cmp1 = icmp sgt i32 %x, 0
@@ -654,7 +654,7 @@ if:
 ; CHECK-DISABLED: %phi = phi i32 [ %add, %if ], [ %x, %loop ]
 then:
   %phi = phi i32 [ %add, %if ], [ %x, %loop ]
-  store i32 %phi, i32* %p
+  store i32 %phi, ptr %p
   %cmp3 = icmp ne i32 %phi, 0
   br i1 %cmp3, label %loop, label %end
 
@@ -663,7 +663,7 @@ end:
 }
 
 ; CHECK-LABEL: @diamond_phi_oneloopexit
-define void @diamond_phi_oneloopexit(i32 %x, i32* %p) {
+define void @diamond_phi_oneloopexit(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %add = add i32 %x, 1
 ; CHECK-DAG: %cmp1 = icmp sgt i32 %x, 0
@@ -701,7 +701,7 @@ else:
 ; CHECK-DISABLED: %phi = phi i32 [ %add, %if ], [ %sub, %else ]
 then:
   %phi = phi i32 [ %add, %if ], [ %sub, %else ]
-  store i32 %phi, i32* %p
+  store i32 %phi, ptr %p
   %cmp3 = icmp ne i32 %phi, 0
   br i1 %cmp3, label %loop, label %end
 
@@ -710,7 +710,7 @@ end:
 }
 
 ; CHECK-LABEL: @diamond_phi_twoloopexit
-define void @diamond_phi_twoloopexit(i32 %x, i32* %p) {
+define void @diamond_phi_twoloopexit(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %sub = sub i32 %x, 1
 ; CHECK-DAG: %add = add i32 %x, 1
@@ -751,7 +751,7 @@ else:
 ; CHECK-DISABLED: %cmp4 = icmp ne i32 %phi, 0
 then:
   %phi = phi i32 [ %add, %if ], [ %sub, %else ]
-  store i32 %phi, i32* %p
+  store i32 %phi, ptr %p
   %cmp4 = icmp ne i32 %phi, 0
   br i1 %cmp4, label %loop, label %end
 
@@ -762,7 +762,7 @@ end:
 ; The store cannot be hoisted, so add and shr cannot be hoisted into a
 ; conditional block.
 ; CHECK-LABEL: @conditional_use
-define void @conditional_use(i32 %x, i32* %p) {
+define void @conditional_use(i32 %x, ptr %p) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cond = icmp ugt i32 %x, 0
 ; CHECK-DAG: %add = add i32 %x, 5
@@ -776,11 +776,11 @@ loop:
   br i1 %cond, label %if, label %else
 
 ; CHECK-LABEL: if:
-; CHECK: store i32 %shr, i32* %p, align 4
+; CHECK: store i32 %shr, ptr %p, align 4
 if:
   %add = add i32 %x, 5
   %shr = ashr i32 %add, 1
-  store i32 %shr, i32* %p, align 4
+  store i32 %shr, ptr %p, align 4
   br label %then
 
 else:
@@ -794,9 +794,9 @@ then:
 ; to check that we have a unique loop preheader when we hoist the store (and so
 ; don't fail an assertion).
 ; CHECK-LABEL: @triangles_in_diamond
-define void @triangles_in_diamond(i32* %ptr) {
+define void @triangles_in_diamond(ptr %ptr) {
 ; CHECK-LABEL: entry:
-; CHECK: store i32 0, i32* %ptr, align 4
+; CHECK: store i32 0, ptr %ptr, align 4
 ; CHECK: br label %loop
 entry:
   br label %loop
@@ -829,16 +829,15 @@ right_triangle.then:
   br label %loop.end
 
 loop.end:
-  store i32 0, i32* %ptr, align 4
+  store i32 0, ptr %ptr, align 4
   br label %loop
 }
 
 ; %cmp dominates its used after being hoisted, but not after %brmerge is rehoisted
 ; CHECK-LABEL: @rehoist
-define void @rehoist(i8* %this, i32 %x) {
+define void @rehoist(ptr %this, i32 %x) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %sub = add nsw i32 %x, -1
-; CHECK-DAG: %fptr = bitcast i8* %this to void (i8*)*
 ; CHECK-DAG: %cmp = icmp eq i32 0, %sub
 ; CHECK-DAG: %brmerge = or i1 %cmp, true
 entry:
@@ -849,8 +848,7 @@ loop:
   br i1 undef, label %if1, label %else1
 
 if1:
-  %fptr = bitcast i8* %this to void (i8*)*
-  call void %fptr(i8* %this)
+  call void %this(ptr %this)
   br label %then1
 
 else1:
@@ -874,7 +872,7 @@ end:
 ; A test case that uses empty blocks in a way that can cause control flow
 ; hoisting to get confused.
 ; CHECK-LABEL: @empty_blocks_multiple_conditional_branches
-define void @empty_blocks_multiple_conditional_branches(float %arg, float* %ptr) {
+define void @empty_blocks_multiple_conditional_branches(float %arg, ptr %ptr) {
 ; CHECK-LABEL: entry
 ; CHECK-DAG: %div1 = fmul float %arg, 4.000000e+00
 ; CHECK-DAG: %div2 = fmul float %arg, 2.000000e+00
@@ -912,7 +910,7 @@ cond2.if:
 ; CHECK-DISABLED: %phi = phi float [ 0.000000e+00, %cond2 ], [ %div1, %cond2.if ]
 cond2.then:
   %phi = phi float [ 0.000000e+00, %cond2 ], [ %div1, %cond2.if ]
-  store float %phi, float* %ptr
+  store float %phi, ptr %ptr
   br label %backedge2
 
 cond3:
@@ -920,7 +918,7 @@ cond3:
 
 cond3.if:
   %div2 = fmul float %arg, 2.000000e+00
-  store float %div2, float* %ptr
+  store float %div2, ptr %ptr
   br label %cond3.then
 
 cond3.then:
@@ -932,10 +930,10 @@ backedge2:
 
 ; We can't do much here, so mainly just check that we don't crash.
 ; CHECK-LABEL: @many_path_phi
-define void @many_path_phi(i32* %ptr1, i32* %ptr2) {
+define void @many_path_phi(ptr %ptr1, ptr %ptr2) {
 ; CHECK-LABEL: entry:
-; CHECK-DAG: %gep3 = getelementptr inbounds i32, i32* %ptr2, i32 2
-; CHECK-DAG: %gep2 = getelementptr inbounds i32, i32* %ptr2, i32 2
+; CHECK-DAG: %gep3 = getelementptr inbounds i32, ptr %ptr2, i32 2
+; CHECK-DAG: %gep2 = getelementptr inbounds i32, ptr %ptr2, i32 2
 ; CHECK: br label %loop
 entry:
   br label %loop
@@ -949,8 +947,8 @@ cond1:
   br i1 undef, label %end, label %cond1.else
 
 cond1.else:
-  %gep2 = getelementptr inbounds i32, i32* %ptr2, i32 2
-  %val2 = load i32, i32* %gep2, align 4
+  %gep2 = getelementptr inbounds i32, ptr %ptr2, i32 2
+  %val2 = load i32, ptr %gep2, align 4
   %cmp2 = icmp eq i32 %val2, 13
   br i1 %cmp2, label %cond1.end, label %end
 
@@ -961,8 +959,8 @@ cond2:
   br i1 undef, label %end, label %cond2.else
 
 cond2.else:
-  %gep3 = getelementptr inbounds i32, i32* %ptr2, i32 2
-  %val3 = load i32, i32* %gep3, align 4
+  %gep3 = getelementptr inbounds i32, ptr %ptr2, i32 2
+  %val3 = load i32, ptr %gep3, align 4
   %cmp3 = icmp eq i32 %val3, 13
   br i1 %cmp3, label %cond2.end, label %end
 
@@ -977,9 +975,9 @@ end:
 ; Check that we correctly handle the hoisting of %gep when theres a critical
 ; edge that branches to the preheader.
 ; CHECK-LABEL: @crit_edge
-define void @crit_edge(i32* %ptr, i32 %idx, i1 %cond1, i1 %cond2) {
+define void @crit_edge(ptr %ptr, i32 %idx, i1 %cond1, i1 %cond2) {
 ; CHECK-LABEL: entry:
-; CHECK: %gep = getelementptr inbounds i32, i32* %ptr, i32 %idx
+; CHECK: %gep = getelementptr inbounds i32, ptr %ptr, i32 %idx
 ; CHECK: br label %preheader
 entry:
   br label %preheader
@@ -991,13 +989,13 @@ loop:
   br i1 %cond1, label %then, label %if
 
 if:
-  %gep = getelementptr inbounds i32, i32* %ptr, i32 %idx
-  %val = load i32, i32* %gep
+  %gep = getelementptr inbounds i32, ptr %ptr, i32 %idx
+  %val = load i32, ptr %gep
   br label %then
 
 then:
   %phi = phi i32 [ %val, %if ], [ 0, %loop ]
-  store i32 %phi, i32* %ptr
+  store i32 %phi, ptr %ptr
   br i1 %cond2, label %loop, label %crit_edge
 
 crit_edge:
@@ -1007,7 +1005,7 @@ crit_edge:
 ; Check that the conditional sub is correctly hoisted from the inner loop to the
 ; preheader of the outer loop.
 ; CHECK-LABEL: @hoist_from_innermost_loop
-define void @hoist_from_innermost_loop(i32 %nx, i32* %ptr) {
+define void @hoist_from_innermost_loop(i32 %nx, ptr %ptr) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %sub = sub nsw i32 0, %nx
 ; CHECK: br label %outer_loop
@@ -1025,7 +1023,7 @@ inner_loop:
 
 if:
   %sub = sub nsw i32 0, %nx
-  store i32 %sub, i32* %ptr, align 4
+  store i32 %sub, ptr %ptr, align 4
   br label %inner_loop_end
 
 inner_loop_end:
@@ -1041,10 +1039,10 @@ outer_loop_end:
 ; We have a diamond starting from %if, but %if.if is also reachable from %loop,
 ; so %gep should not be conditionally hoisted.
 ; CHECK-LABEL: @diamond_with_extra_in_edge
-define void @diamond_with_extra_in_edge(i32* %ptr1, i32* %ptr2, i32 %arg) {
+define void @diamond_with_extra_in_edge(ptr %ptr1, ptr %ptr2, i32 %arg) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp2 = icmp ne i32 0, %arg
-; CHECK-DAG: %gep = getelementptr i32, i32* %ptr1, i32 4
+; CHECK-DAG: %gep = getelementptr i32, ptr %ptr1, i32 4
 ; CHECK: br label %loop
 entry:
   br label %loop
@@ -1059,8 +1057,8 @@ if:
   br i1 %cmp2, label %if.if, label %if.else
 
 if.if:
-  %gep = getelementptr i32, i32* %ptr1, i32 4
-  %val = load i32, i32* %gep, align 4
+  %gep = getelementptr i32, ptr %ptr1, i32 4
+  %val = load i32, ptr %gep, align 4
   br label %then
 
 if.else:
@@ -1068,17 +1066,17 @@ if.else:
 
 then:
   %phi2 = phi i32 [ %val, %if.if ], [ %phi1, %if.else ]
-  store i32 %phi2, i32* %ptr2, align 4
+  store i32 %phi2, ptr %ptr2, align 4
   br label %loop
 }
 
 ; %loop/%if/%then form a triangle, but %loop/%if/%then/%end also form a diamond.
 ; The triangle should be picked for conditional hoisting.
 ; CHECK-LABEL: @both_triangle_and_diamond
-define void @both_triangle_and_diamond(i32* %ptr1, i32* %ptr2, i32 %arg) {
+define void @both_triangle_and_diamond(ptr %ptr1, ptr %ptr2, i32 %arg) {
 ; CHECK-LABEL: entry:
 ; CHECK-DAG: %cmp1 = icmp ne i32 0, %arg
-; CHECK-DAG: %gep = getelementptr i32, i32* %ptr1, i32 4
+; CHECK-DAG: %gep = getelementptr i32, ptr %ptr1, i32 4
 ; CHECK-ENABLED: br i1 %cmp1, label %[[IF_LICM:.*]], label %[[THEN_LICM:.*]]
 entry:
   br label %loop
@@ -1096,8 +1094,8 @@ loop:
   br i1 %cmp1, label %if, label %then
 
 if:
-  %gep = getelementptr i32, i32* %ptr1, i32 4
-  %val = load i32, i32* %gep, align 4
+  %gep = getelementptr i32, ptr %ptr1, i32 4
+  %val = load i32, ptr %gep, align 4
   %cmp2 = icmp ugt i32 16, %phi1
   br i1 %cmp2, label %end, label %then
 
@@ -1109,7 +1107,7 @@ then:
 
 end:
   %phi3 = phi i32 [ %phi2, %then ], [ %val, %if ]
-  store i32 %phi3, i32* %ptr2, align 4
+  store i32 %phi3, ptr %ptr2, align 4
   br label %loop
 }
 
@@ -1235,7 +1233,7 @@ exit:
 ; hoisted. This means that we have to rehoist %d, but have to make sure to
 ; rehoist it after %phi.
 ; CHECK-LABEL: @phi_conditional_use
-define i64 @phi_conditional_use(i32 %f, i32* %g) {
+define i64 @phi_conditional_use(i32 %f, ptr %g) {
 ; CHECK-LABEL: entry:
 ; CHECK: %cmp1 = icmp eq i32 %f, 1
 ; CHECK: %cmp2 = icmp eq i32 %f, 0
@@ -1250,7 +1248,7 @@ entry:
 
 ; CHECK-ENABLED: [[IF_END_LICM]]:
 ; CHECK-ENABLED: %phi = phi i64 [ 0, %entry ], [ 1, %[[IF_THEN_LICM]] ]
-; CHECK-ENABLED: %d = getelementptr inbounds i32, i32* %g, i64 %phi
+; CHECK-ENABLED: %d = getelementptr inbounds i32, ptr %g, i64 %phi
 ; CHECK-ENABLED: i1 %cmp2, label %[[LOOP_BACKEDGE_LICM:.*]], label %[[IF_THEN2_LICM:.*]]
 
 ; CHECK-ENABLED: [[IF_THEN2_LICM]]:
@@ -1272,10 +1270,10 @@ if.end:
   br i1 %cmp2, label %loop.backedge, label %if.then2
 
 ; CHECK-LABEL: if.then2:
-; CHECK-DISABLED: %d = getelementptr inbounds i32, i32* %g, i64 %phi
+; CHECK-DISABLED: %d = getelementptr inbounds i32, ptr %g, i64 %phi
 if.then2:
-  %d = getelementptr inbounds i32, i32* %g, i64 %phi
-  store i32 1, i32* %d, align 4
+  %d = getelementptr inbounds i32, ptr %g, i64 %phi
+  store i32 1, ptr %d, align 4
   br label %loop.backedge
 
 loop.backedge:
@@ -1284,7 +1282,7 @@ loop.backedge:
 
 ; As above, but we have two such phis
 ; CHECK-LABEL: @phi_conditional_use_twice
-define i64 @phi_conditional_use_twice(i32 %f, i32* %g) {
+define i64 @phi_conditional_use_twice(i32 %f, ptr %g) {
 ; CHECK-LABEL: entry:
 ; CHECK: %cmp1 = icmp eq i32 %f, 1
 ; CHECK: %cmp2 = icmp eq i32 %f, 0
@@ -1300,7 +1298,7 @@ entry:
 
 ; CHECK-ENABLED: [[IF_END_LICM]]:
 ; CHECK-ENABLED: %phi1 = phi i64 [ 0, %entry ], [ 1, %[[IF_THEN_LICM]] ]
-; CHECK-ENABLED: %d = getelementptr inbounds i32, i32* %g, i64 %phi1
+; CHECK-ENABLED: %d = getelementptr inbounds i32, ptr %g, i64 %phi1
 ; CHECK-ENABLED: i1 %cmp2, label %[[IF_END2_LICM:.*]], label %[[IF_THEN2_LICM:.*]]
 
 ; CHECK-ENABLED: [[IF_THEN2_LICM]]:
@@ -1308,7 +1306,7 @@ entry:
 
 ; CHECK-ENABLED: [[IF_END2_LICM]]:
 ; CHECK-ENABLED: %phi2 = phi i64 [ 2, %[[IF_END_LICM]] ], [ 3, %[[IF_THEN2_LICM]] ]
-; CHECK-ENABLED: %e = getelementptr inbounds i32, i32* %g, i64 %phi2
+; CHECK-ENABLED: %e = getelementptr inbounds i32, ptr %g, i64 %phi2
 ; CHECK-ENABLED: i1 %cmp3, label %[[LOOP_BACKEDGE_LICM:.*]], label %[[IF_THEN3_LICM:.*]]
 
 ; CHECK-ENABLED: [[IF_THEN3_LICM]]:
@@ -1330,10 +1328,10 @@ if.end:
   br i1 %cmp2, label %if.end2, label %if.then2
 
 ; CHECK-LABEL: if.then2:
-; CHECK-DISABLED: %d = getelementptr inbounds i32, i32* %g, i64 %phi1
+; CHECK-DISABLED: %d = getelementptr inbounds i32, ptr %g, i64 %phi1
 if.then2:
-  %d = getelementptr inbounds i32, i32* %g, i64 %phi1
-  store i32 1, i32* %d, align 4
+  %d = getelementptr inbounds i32, ptr %g, i64 %phi1
+  store i32 1, ptr %d, align 4
   br label %if.end2
 
 ; CHECK-LABEL: if.end2:
@@ -1343,10 +1341,10 @@ if.end2:
   br i1 %cmp3, label %loop.backedge, label %if.then3
 
 ; CHECK-LABEL: if.then3:
-; CHECK-DISABLED: %e = getelementptr inbounds i32, i32* %g, i64 %phi2
+; CHECK-DISABLED: %e = getelementptr inbounds i32, ptr %g, i64 %phi2
 if.then3:
-  %e = getelementptr inbounds i32, i32* %g, i64 %phi2
-  store i32 1, i32* %e, align 4
+  %e = getelementptr inbounds i32, ptr %g, i64 %phi2
+  store i32 1, ptr %e, align 4
   br label %loop.backedge
 
 loop.backedge:
@@ -1356,11 +1354,11 @@ loop.backedge:
 ; The order that we hoist instructions from the loop is 
diff erent to the textual
 ; order in the function. Check that we can rehoist this correctly.
 ; CHECK-LABEL: @rehoist_wrong_order_1
-define void @rehoist_wrong_order_1(i32* %ptr) {
+define void @rehoist_wrong_order_1(ptr %ptr) {
 ; CHECK-LABEL: entry
-; CHECK-DAG: %gep2 = getelementptr inbounds i32, i32* %ptr, i64 2
-; CHECK-DAG: %gep3 = getelementptr inbounds i32, i32* %ptr, i64 3
-; CHECK-DAG: %gep1 = getelementptr inbounds i32, i32* %ptr, i64 1
+; CHECK-DAG: %gep2 = getelementptr inbounds i32, ptr %ptr, i64 2
+; CHECK-DAG: %gep3 = getelementptr inbounds i32, ptr %ptr, i64 3
+; CHECK-DAG: %gep1 = getelementptr inbounds i32, ptr %ptr, i64 1
 ; CHECK-ENABLED: br i1 undef, label %[[IF1_LICM:.*]], label %[[ELSE1_LICM:.*]]
 entry:
   br label %loop
@@ -1384,21 +1382,21 @@ loop:
   br i1 undef, label %if1, label %else1
 
 if1:
-  %gep1 = getelementptr inbounds i32, i32* %ptr, i64 1
-  store i32 0, i32* %gep1, align 4
+  %gep1 = getelementptr inbounds i32, ptr %ptr, i64 1
+  store i32 0, ptr %gep1, align 4
   br label %loop.backedge
 
 else1:
-  %gep2 = getelementptr inbounds i32, i32* %ptr, i64 2
-  store i32 0, i32* %gep2, align 4
+  %gep2 = getelementptr inbounds i32, ptr %ptr, i64 2
+  store i32 0, ptr %gep2, align 4
   br i1 undef, label %if2, label %loop.backedge
 
 if2:
   br i1 undef, label %if3, label %end
 
 if3:
-  %gep3 = getelementptr inbounds i32, i32* %ptr, i64 3
-  store i32 0, i32* %gep3, align 4
+  %gep3 = getelementptr inbounds i32, ptr %ptr, i64 3
+  store i32 0, ptr %gep3, align 4
   br label %end
 
 end:
@@ -1410,11 +1408,11 @@ loop.backedge:
 }
 
 ; CHECK-LABEL: @rehoist_wrong_order_2
-define void @rehoist_wrong_order_2(i32* %ptr) {
+define void @rehoist_wrong_order_2(ptr %ptr) {
 ; CHECK-LABEL: entry
-; CHECK-DAG: %gep2 = getelementptr inbounds i32, i32* %ptr, i64 2
-; CHECK-DAG: %gep3 = getelementptr inbounds i32, i32* %gep2, i64 3
-; CHECK-DAG: %gep1 = getelementptr inbounds i32, i32* %ptr, i64 1
+; CHECK-DAG: %gep2 = getelementptr inbounds i32, ptr %ptr, i64 2
+; CHECK-DAG: %gep3 = getelementptr inbounds i32, ptr %gep2, i64 3
+; CHECK-DAG: %gep1 = getelementptr inbounds i32, ptr %ptr, i64 1
 ; CHECK-ENABLED: br i1 undef, label %[[IF1_LICM:.*]], label %[[ELSE1_LICM:.*]]
 entry:
   br label %loop
@@ -1438,21 +1436,21 @@ loop:
   br i1 undef, label %if1, label %else1
 
 if1:
-  %gep1 = getelementptr inbounds i32, i32* %ptr, i64 1
-  store i32 0, i32* %gep1, align 4
+  %gep1 = getelementptr inbounds i32, ptr %ptr, i64 1
+  store i32 0, ptr %gep1, align 4
   br label %loop.backedge
 
 else1:
-  %gep2 = getelementptr inbounds i32, i32* %ptr, i64 2
-  store i32 0, i32* %gep2, align 4
+  %gep2 = getelementptr inbounds i32, ptr %ptr, i64 2
+  store i32 0, ptr %gep2, align 4
   br i1 undef, label %if2, label %loop.backedge
 
 if2:
   br i1 undef, label %if3, label %end
 
 if3:
-  %gep3 = getelementptr inbounds i32, i32* %gep2, i64 3
-  store i32 0, i32* %gep3, align 4
+  %gep3 = getelementptr inbounds i32, ptr %gep2, i64 3
+  store i32 0, ptr %gep3, align 4
   br label %end
 
 end:
@@ -1463,10 +1461,10 @@ loop.backedge:
 }
 
 ; CHECK-LABEL: @rehoist_wrong_order_3
-define void @rehoist_wrong_order_3(i32* %ptr) {
+define void @rehoist_wrong_order_3(ptr %ptr) {
 ; CHECK-LABEL: entry
-; CHECK-DAG: %gep2 = getelementptr inbounds i32, i32* %ptr, i64 2
-; CHECK-DAG: %gep1 = getelementptr inbounds i32, i32* %ptr, i64 1
+; CHECK-DAG: %gep2 = getelementptr inbounds i32, ptr %ptr, i64 2
+; CHECK-DAG: %gep1 = getelementptr inbounds i32, ptr %ptr, i64 1
 ; CHECK-ENABLED: br i1 undef, label %[[IF1_LICM:.*]], label %[[ELSE1_LICM:.*]]
 entry:
   br label %loop
@@ -1478,8 +1476,8 @@ entry:
 ; CHECK-ENABLED: br label %[[IF2_LICM]]
 
 ; CHECK-ENABLED: [[IF2_LICM]]:
-; CHECK-ENABLED: %phi = phi i32* [ %gep1, %[[IF1_LICM]] ], [ %gep2, %[[ELSE1_LICM]] ]
-; CHECK-ENABLED: %gep3 = getelementptr inbounds i32, i32* %phi, i64 3
+; CHECK-ENABLED: %phi = phi ptr [ %gep1, %[[IF1_LICM]] ], [ %gep2, %[[ELSE1_LICM]] ]
+; CHECK-ENABLED: %gep3 = getelementptr inbounds i32, ptr %phi, i64 3
 ; CHECK-ENABLED: br i1 undef, label %[[IF3_LICM:.*]], label %[[END_LICM:.*]]
 
 ; CHECK-ENABLED: [[IF3_LICM]]:
@@ -1492,22 +1490,22 @@ loop:
   br i1 undef, label %if1, label %else1
 
 if1:
-  %gep1 = getelementptr inbounds i32, i32* %ptr, i64 1
-  store i32 0, i32* %gep1, align 4
+  %gep1 = getelementptr inbounds i32, ptr %ptr, i64 1
+  store i32 0, ptr %gep1, align 4
   br label %if2
 
 else1:
-  %gep2 = getelementptr inbounds i32, i32* %ptr, i64 2
-  store i32 0, i32* %gep2, align 4
+  %gep2 = getelementptr inbounds i32, ptr %ptr, i64 2
+  store i32 0, ptr %gep2, align 4
   br i1 undef, label %if2, label %loop.backedge
 
 if2:
-  %phi = phi i32* [ %gep1, %if1 ], [ %gep2, %else1 ]
+  %phi = phi ptr [ %gep1, %if1 ], [ %gep2, %else1 ]
   br i1 undef, label %if3, label %end
 
 if3:
-  %gep3 = getelementptr inbounds i32, i32* %phi, i64 3
-  store i32 0, i32* %gep3, align 4
+  %gep3 = getelementptr inbounds i32, ptr %phi, i64 3
+  store i32 0, ptr %gep3, align 4
   br label %end
 
 end:

diff  --git a/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll b/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll
index 67abe66a7d6aa..570f4230c1a90 100644
--- a/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll
+++ b/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll
@@ -1,6 +1,6 @@
 ; RUN: opt -passes=licm %s -S | FileCheck %s
 
-; CHECK: %arrayidx4.promoted = load i32, i32* %arrayidx4, align 4, !tbaa !{{[0-9]+$}}
+; CHECK: %arrayidx4.promoted = load i32, ptr %arrayidx4, align 4, !tbaa !{{[0-9]+$}}
 
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
 
@@ -15,11 +15,10 @@ declare i16 @e(i32)
 define i16 @g() !dbg !13 {
 entry:
   %l_284 = alloca [2 x [3 x [6 x i32]]], align 16
-  %0 = bitcast [2 x [3 x [6 x i32]]]* %l_284 to i8*, !dbg !24
-  call void @llvm.lifetime.start.p0i8(i64 144, i8* nonnull %0), !dbg !24
-  call void @llvm.dbg.declare(metadata [2 x [3 x [6 x i32]]]* %l_284, metadata !17, metadata !DIExpression()), !dbg !25
-  %1 = load i16, i16* @a, align 2, !dbg !26, !tbaa !29
-  %cmp11 = icmp sgt i16 %1, -1, !dbg !33
+  call void @llvm.lifetime.start.p0(i64 144, ptr nonnull %l_284), !dbg !24
+  call void @llvm.dbg.declare(metadata ptr %l_284, metadata !17, metadata !DIExpression()), !dbg !25
+  %0 = load i16, ptr @a, align 2, !dbg !26, !tbaa !29
+  %cmp11 = icmp sgt i16 %0, -1, !dbg !33
   br i1 %cmp11, label %for.body.lr.ph, label %cleanup, !dbg !34
 
 for.body.lr.ph:                                   ; preds = %entry
@@ -31,16 +30,16 @@ for.body:                                         ; preds = %for.cond2, %for.bod
   br i1 %tobool, label %for.cond2, label %for.body.cleanup_crit_edge, !dbg !38
 
 for.cond2:                                        ; preds = %for.body
-  %arrayidx4 = getelementptr inbounds [2 x [3 x [6 x i32]]], [2 x [3 x [6 x i32]]]* %l_284, i64 0, i64 1, i64 2, i64 5, !dbg !39
-  %l = load i32, i32* %arrayidx4, !dbg !43, !tbaa !44
+  %arrayidx4 = getelementptr inbounds [2 x [3 x [6 x i32]]], ptr %l_284, i64 0, i64 1, i64 2, i64 5, !dbg !39
+  %l = load i32, ptr %arrayidx4, !dbg !43, !tbaa !44
   %add = add i32 %l, 1, !dbg !43
-  store i32 %add, i32* %arrayidx4, align 4, !dbg !43, !tbaa !44
-  %arrayidx8 = getelementptr inbounds [2 x [3 x [6 x i32]]], [2 x [3 x [6 x i32]]]* %l_284, i64 0, i64 1, i64 1, i64 4, !dbg !46
-  %2 = load i32, i32* %arrayidx8, align 8, !dbg !46, !tbaa !44
-  %conv9 = trunc i32 %2 to i16, !dbg !46
-  store i16 %conv9, i16* @b, align 2, !dbg !47, !tbaa !29
-  %3 = load i16, i16* @a, align 2, !dbg !26, !tbaa !29
-  %cmp = icmp sgt i16 %3, -1, !dbg !33
+  store i32 %add, ptr %arrayidx4, align 4, !dbg !43, !tbaa !44
+  %arrayidx8 = getelementptr inbounds [2 x [3 x [6 x i32]]], ptr %l_284, i64 0, i64 1, i64 1, i64 4, !dbg !46
+  %1 = load i32, ptr %arrayidx8, align 8, !dbg !46, !tbaa !44
+  %conv9 = trunc i32 %1 to i16, !dbg !46
+  store i16 %conv9, ptr @b, align 2, !dbg !47, !tbaa !29
+  %2 = load i16, ptr @a, align 2, !dbg !26, !tbaa !29
+  %cmp = icmp sgt i16 %2, -1, !dbg !33
   br i1 %cmp, label %for.body, label %for.cond.cleanup_crit_edge, !dbg !34, !llvm.loop !48
 
 for.cond.cleanup_crit_edge:                       ; preds = %for.cond2
@@ -50,15 +49,15 @@ for.body.cleanup_crit_edge:                       ; preds = %for.body
   br label %cleanup, !dbg !38
 
 cleanup:                                          ; preds = %for.body.cleanup_crit_edge, %for.cond.cleanup_crit_edge, %entry
-  call void @llvm.lifetime.end.p0i8(i64 144, i8* nonnull %0), !dbg !51
+  call void @llvm.lifetime.end.p0(i64 144, ptr nonnull %l_284), !dbg !51
   ret i16 1, !dbg !51
 }
 
 ; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn
-declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #1
+declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1
 
 ; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn
-declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #1
+declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1
 
 ; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
 declare void @llvm.dbg.value(metadata, metadata, metadata) #0

diff  --git a/llvm/test/Transforms/LICM/hoisting.ll b/llvm/test/Transforms/LICM/hoisting.ll
index 1080f2a3ac4f2..6001c52d885e1 100644
--- a/llvm/test/Transforms/LICM/hoisting.ll
+++ b/llvm/test/Transforms/LICM/hoisting.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt < %s -aa-pipeline=basic-aa -passes='loop-mssa(licm)' -S | FileCheck %s
 
- at X = global i32 0		; <i32*> [#uses=1]
+ at X = global i32 0		; <ptr> [#uses=1]
 
 declare void @foo()
 
@@ -11,7 +11,7 @@ declare i32 @llvm.bitreverse.i32(i32)
 ; potentially trapping instructions when they are not guaranteed to execute.
 define i32 @test1(i1 %c) {
 ; CHECK-LABEL: @test1(
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    call void @foo()
@@ -27,7 +27,7 @@ define i32 @test1(i1 %c) {
 ; CHECK-NEXT:    [[C:%.*]] = sub i32 [[A]], [[B_LCSSA]]
 ; CHECK-NEXT:    ret i32 [[C]]
 ;
-  %A = load i32, i32* @X		; <i32> [#uses=2]
+  %A = load i32, ptr @X		; <i32> [#uses=2]
   br label %Loop
 Loop:		; preds = %LoopTail, %0
   call void @foo( )
@@ -52,7 +52,7 @@ declare void @foo2(i32) nounwind
 ;; It is ok and desirable to hoist this potentially trapping instruction.
 define i32 @test2(i1 %c) {
 ; CHECK-LABEL: @test2(
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    [[B:%.*]] = sdiv i32 4, [[A]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
@@ -65,7 +65,7 @@ define i32 @test2(i1 %c) {
 ; CHECK-NEXT:    [[C:%.*]] = sub i32 [[A]], [[B_LCSSA]]
 ; CHECK-NEXT:    ret i32 [[C]]
 ;
-  %A = load i32, i32* @X
+  %A = load i32, ptr @X
   br label %Loop
 
 Loop:
@@ -86,7 +86,7 @@ Out:
 ; This loop invariant instruction should be constant folded, not hoisted.
 define i32 @test3(i1 %c) {
 ; CHECK-LABEL: @test3(
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    call void @foo2(i32 6)
@@ -96,7 +96,7 @@ define i32 @test3(i1 %c) {
 ; CHECK-NEXT:    [[C:%.*]] = sub i32 [[A]], [[B_LCSSA]]
 ; CHECK-NEXT:    ret i32 [[C]]
 ;
-  %A = load i32, i32* @X		; <i32> [#uses=2]
+  %A = load i32, ptr @X		; <i32> [#uses=2]
   br label %Loop
 Loop:
   %B = add i32 4, 2		; <i32> [#uses=2]
@@ -145,10 +145,10 @@ for.end:                                          ; preds = %for.body
 declare void @foo_may_call_exit(i32)
 
 ; PR14854
-define { i32*, i32 } @test5(i32 %i, { i32*, i32 } %e) {
+define { ptr, i32 } @test5(i32 %i, { ptr, i32 } %e) {
 ; CHECK-LABEL: @test5(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[OUT:%.*]] = extractvalue { i32*, i32 } [[E:%.*]], 1
+; CHECK-NEXT:    [[OUT:%.*]] = extractvalue { ptr, i32 } [[E:%.*]], 1
 ; CHECK-NEXT:    br label [[TAILRECURSE:%.*]]
 ; CHECK:       tailrecurse:
 ; CHECK-NEXT:    [[I_TR:%.*]] = phi i32 [ [[I:%.*]], [[ENTRY:%.*]] ], [ [[CMP2:%.*]], [[THEN:%.*]] ]
@@ -159,16 +159,16 @@ define { i32*, i32 } @test5(i32 %i, { i32*, i32 } %e) {
 ; CHECK-NEXT:    [[CMP2]] = add i32 [[I_TR]], 1
 ; CHECK-NEXT:    br label [[TAILRECURSE]]
 ; CHECK:       ifend:
-; CHECK-NEXT:    [[D_LE:%.*]] = insertvalue { i32*, i32 } [[E]], i32* null, 0
-; CHECK-NEXT:    ret { i32*, i32 } [[D_LE]]
+; CHECK-NEXT:    [[D_LE:%.*]] = insertvalue { ptr, i32 } [[E]], ptr null, 0
+; CHECK-NEXT:    ret { ptr, i32 } [[D_LE]]
 ;
 entry:
   br label %tailrecurse
 
 tailrecurse:                                      ; preds = %then, %entry
   %i.tr = phi i32 [ %i, %entry ], [ %cmp2, %then ]
-  %out = extractvalue { i32*, i32 } %e, 1
-  %d = insertvalue { i32*, i32 } %e, i32* null, 0
+  %out = extractvalue { ptr, i32 } %e, 1
+  %d = insertvalue { ptr, i32 } %e, ptr null, 0
   %cmp1 = icmp sgt i32 %out, %i.tr
   br i1 %cmp1, label %then, label %ifend
 
@@ -178,7 +178,7 @@ then:                                             ; preds = %tailrecurse
   br label %tailrecurse
 
 ifend:                                            ; preds = %tailrecurse
-  ret { i32*, i32 } %d
+  ret { ptr, i32 } %d
 }
 
 define void @test6(float %f) #2 {
@@ -259,7 +259,7 @@ define i32 @test_volatile(i1 %c) {
 ; CHECK-LABEL: @test_volatile(
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
-; CHECK-NEXT:    [[A:%.*]] = load volatile i32, i32* @X, align 4
+; CHECK-NEXT:    [[A:%.*]] = load volatile i32, ptr @X, align 4
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP]], label [[OUT:%.*]]
 ; CHECK:       Out:
 ; CHECK-NEXT:    [[A_LCSSA:%.*]] = phi i32 [ [[A]], [[LOOP]] ]
@@ -268,7 +268,7 @@ define i32 @test_volatile(i1 %c) {
   br label %Loop
 
 Loop:
-  %A = load volatile i32, i32* @X
+  %A = load volatile i32, ptr @X
   br i1 %c, label %Loop, label %Out
 
 Out:
@@ -276,25 +276,24 @@ Out:
 }
 
 
-declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) nounwind readonly
-declare void @llvm.invariant.end.p0i8({}*, i64, i8* nocapture) nounwind
-declare void @escaping.invariant.start({}*) nounwind
+declare ptr @llvm.invariant.start.p0(i64, ptr nocapture) nounwind readonly
+declare void @llvm.invariant.end.p0(ptr, i64, ptr nocapture) nounwind
+declare void @escaping.invariant.start(ptr) nounwind
 ; invariant.start dominates the load, and in this scope, the
 ; load is invariant. So, we can hoist the `addrld` load out of the loop.
-define i32 @test_fence(i8* %addr, i32 %n, i8* %volatile) {
+define i32 @test_fence(ptr %addr, i32 %n, ptr %volatile) {
 ; CHECK-LABEL: @test_fence(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, i8* [[ADDR:%.*]], i64 8
-; CHECK-NEXT:    [[ADDR_I:%.*]] = bitcast i8* [[GEP]] to i32*
-; CHECK-NEXT:    store atomic i32 5, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[ADDR:%.*]], i64 8
+; CHECK-NEXT:    store atomic i32 5, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    fence release
-; CHECK-NEXT:    [[INVST:%.*]] = call {}* @llvm.invariant.start.p0i8(i64 4, i8* [[GEP]])
-; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[INVST:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[GEP]])
+; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[INDVAR:%.*]] = phi i32 [ [[INDVAR_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
-; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, i8* [[VOLATILE:%.*]] unordered, align 8
+; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, ptr [[VOLATILE:%.*]] unordered, align 8
 ; CHECK-NEXT:    fence acquire
 ; CHECK-NEXT:    [[VOLCHK:%.*]] = icmp eq i8 [[VOLLOAD]], 0
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[VOLCHK]], i32 0, i32 [[ADDRLD]]
@@ -307,20 +306,19 @@ define i32 @test_fence(i8* %addr, i32 %n, i8* %volatile) {
 ; CHECK-NEXT:    ret i32 [[SUM_LCSSA]]
 ;
 entry:
-  %gep = getelementptr inbounds i8, i8* %addr, i64 8
-  %addr.i = bitcast i8* %gep to i32 *
-  store atomic i32 5, i32 * %addr.i unordered, align 8
+  %gep = getelementptr inbounds i8, ptr %addr, i64 8
+  store atomic i32 5, ptr %gep unordered, align 8
   fence release
-  %invst = call {}* @llvm.invariant.start.p0i8(i64 4, i8* %gep)
+  %invst = call ptr @llvm.invariant.start.p0(i64 4, ptr %gep)
   br label %loop
 
 loop:
   %indvar = phi i32 [ %indvar.next, %loop ], [ 0, %entry ]
   %sum = phi i32 [ %sum.next, %loop ], [ 0, %entry ]
-  %volload = load atomic i8, i8* %volatile unordered, align 8
+  %volload = load atomic i8, ptr %volatile unordered, align 8
   fence acquire
   %volchk = icmp eq i8 %volload, 0
-  %addrld = load atomic i32, i32* %addr.i unordered, align 8
+  %addrld = load atomic i32, ptr %gep unordered, align 8
   %sel = select i1 %volchk, i32 0, i32 %addrld
   %sum.next = add i32 %sel, %sum
   %indvar.next = add i32 %indvar, 1
@@ -335,23 +333,22 @@ loopexit:
 
 ; Same as test above, but the load is no longer invariant (presence of
 ; invariant.end). We cannot hoist the addrld out of loop.
-define i32 @test_fence1(i8* %addr, i32 %n, i8* %volatile) {
+define i32 @test_fence1(ptr %addr, i32 %n, ptr %volatile) {
 ; CHECK-LABEL: @test_fence1(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, i8* [[ADDR:%.*]], i64 8
-; CHECK-NEXT:    [[ADDR_I:%.*]] = bitcast i8* [[GEP]] to i32*
-; CHECK-NEXT:    store atomic i32 5, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[ADDR:%.*]], i64 8
+; CHECK-NEXT:    store atomic i32 5, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    fence release
-; CHECK-NEXT:    [[INVST:%.*]] = call {}* @llvm.invariant.start.p0i8(i64 4, i8* [[GEP]])
-; CHECK-NEXT:    call void @llvm.invariant.end.p0i8({}* [[INVST]], i64 4, i8* [[GEP]])
+; CHECK-NEXT:    [[INVST:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[GEP]])
+; CHECK-NEXT:    call void @llvm.invariant.end.p0(ptr [[INVST]], i64 4, ptr [[GEP]])
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[INDVAR:%.*]] = phi i32 [ [[INDVAR_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
-; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, i8* [[VOLATILE:%.*]] unordered, align 8
+; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, ptr [[VOLATILE:%.*]] unordered, align 8
 ; CHECK-NEXT:    fence acquire
 ; CHECK-NEXT:    [[VOLCHK:%.*]] = icmp eq i8 [[VOLLOAD]], 0
-; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[VOLCHK]], i32 0, i32 [[ADDRLD]]
 ; CHECK-NEXT:    [[SUM_NEXT]] = add i32 [[SEL]], [[SUM]]
 ; CHECK-NEXT:    [[INDVAR_NEXT]] = add i32 [[INDVAR]], 1
@@ -362,21 +359,20 @@ define i32 @test_fence1(i8* %addr, i32 %n, i8* %volatile) {
 ; CHECK-NEXT:    ret i32 [[SUM_LCSSA]]
 ;
 entry:
-  %gep = getelementptr inbounds i8, i8* %addr, i64 8
-  %addr.i = bitcast i8* %gep to i32 *
-  store atomic i32 5, i32 * %addr.i unordered, align 8
+  %gep = getelementptr inbounds i8, ptr %addr, i64 8
+  store atomic i32 5, ptr %gep unordered, align 8
   fence release
-  %invst = call {}* @llvm.invariant.start.p0i8(i64 4, i8* %gep)
-  call void @llvm.invariant.end.p0i8({}* %invst, i64 4, i8* %gep)
+  %invst = call ptr @llvm.invariant.start.p0(i64 4, ptr %gep)
+  call void @llvm.invariant.end.p0(ptr %invst, i64 4, ptr %gep)
   br label %loop
 
 loop:
   %indvar = phi i32 [ %indvar.next, %loop ], [ 0, %entry ]
   %sum = phi i32 [ %sum.next, %loop ], [ 0, %entry ]
-  %volload = load atomic i8, i8* %volatile unordered, align 8
+  %volload = load atomic i8, ptr %volatile unordered, align 8
   fence acquire
   %volchk = icmp eq i8 %volload, 0
-  %addrld = load atomic i32, i32* %addr.i unordered, align 8
+  %addrld = load atomic i32, ptr %gep unordered, align 8
   %sel = select i1 %volchk, i32 0, i32 %addrld
   %sum.next = add i32 %sel, %sum
   %indvar.next = add i32 %indvar, 1
@@ -389,23 +385,22 @@ loopexit:
 
 ; same as test above, but instead of invariant.end, we have the result of
 ; invariant.start escaping through a call. We cannot hoist the load.
-define i32 @test_fence2(i8* %addr, i32 %n, i8* %volatile) {
+define i32 @test_fence2(ptr %addr, i32 %n, ptr %volatile) {
 ; CHECK-LABEL: @test_fence2(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, i8* [[ADDR:%.*]], i64 8
-; CHECK-NEXT:    [[ADDR_I:%.*]] = bitcast i8* [[GEP]] to i32*
-; CHECK-NEXT:    store atomic i32 5, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[ADDR:%.*]], i64 8
+; CHECK-NEXT:    store atomic i32 5, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    fence release
-; CHECK-NEXT:    [[INVST:%.*]] = call {}* @llvm.invariant.start.p0i8(i64 4, i8* [[GEP]])
-; CHECK-NEXT:    call void @escaping.invariant.start({}* [[INVST]])
+; CHECK-NEXT:    [[INVST:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[GEP]])
+; CHECK-NEXT:    call void @escaping.invariant.start(ptr [[INVST]])
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[INDVAR:%.*]] = phi i32 [ [[INDVAR_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
-; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, i8* [[VOLATILE:%.*]] unordered, align 8
+; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, ptr [[VOLATILE:%.*]] unordered, align 8
 ; CHECK-NEXT:    fence acquire
 ; CHECK-NEXT:    [[VOLCHK:%.*]] = icmp eq i8 [[VOLLOAD]], 0
-; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[VOLCHK]], i32 0, i32 [[ADDRLD]]
 ; CHECK-NEXT:    [[SUM_NEXT]] = add i32 [[SEL]], [[SUM]]
 ; CHECK-NEXT:    [[INDVAR_NEXT]] = add i32 [[INDVAR]], 1
@@ -416,21 +411,20 @@ define i32 @test_fence2(i8* %addr, i32 %n, i8* %volatile) {
 ; CHECK-NEXT:    ret i32 [[SUM_LCSSA]]
 ;
 entry:
-  %gep = getelementptr inbounds i8, i8* %addr, i64 8
-  %addr.i = bitcast i8* %gep to i32 *
-  store atomic i32 5, i32 * %addr.i unordered, align 8
+  %gep = getelementptr inbounds i8, ptr %addr, i64 8
+  store atomic i32 5, ptr %gep unordered, align 8
   fence release
-  %invst = call {}* @llvm.invariant.start.p0i8(i64 4, i8* %gep)
-  call void @escaping.invariant.start({}* %invst)
+  %invst = call ptr @llvm.invariant.start.p0(i64 4, ptr %gep)
+  call void @escaping.invariant.start(ptr %invst)
   br label %loop
 
 loop:
   %indvar = phi i32 [ %indvar.next, %loop ], [ 0, %entry ]
   %sum = phi i32 [ %sum.next, %loop ], [ 0, %entry ]
-  %volload = load atomic i8, i8* %volatile unordered, align 8
+  %volload = load atomic i8, ptr %volatile unordered, align 8
   fence acquire
   %volchk = icmp eq i8 %volload, 0
-  %addrld = load atomic i32, i32* %addr.i unordered, align 8
+  %addrld = load atomic i32, ptr %gep unordered, align 8
   %sel = select i1 %volchk, i32 0, i32 %addrld
   %sum.next = add i32 %sel, %sum
   %indvar.next = add i32 %indvar, 1
@@ -441,26 +435,23 @@ loopexit:
   ret i32 %sum
 }
 
-; FIXME: invariant.start dominates the load, and in this scope, the
-; load is invariant. So, we can hoist the `addrld` load out of the loop.
 ; Consider the loadoperand addr.i bitcasted before being passed to
 ; invariant.start
-define i32 @test_fence3(i32* %addr, i32 %n, i8* %volatile) {
+define i32 @test_fence3(ptr %addr, i32 %n, ptr %volatile) {
 ; CHECK-LABEL: @test_fence3(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[ADDR_I:%.*]] = getelementptr inbounds i32, i32* [[ADDR:%.*]], i64 8
-; CHECK-NEXT:    [[GEP:%.*]] = bitcast i32* [[ADDR_I]] to i8*
-; CHECK-NEXT:    store atomic i32 5, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[ADDR_I:%.*]] = getelementptr inbounds i32, ptr [[ADDR:%.*]], i64 8
+; CHECK-NEXT:    store atomic i32 5, ptr [[ADDR_I]] unordered, align 8
 ; CHECK-NEXT:    fence release
-; CHECK-NEXT:    [[INVST:%.*]] = call {}* @llvm.invariant.start.p0i8(i64 4, i8* [[GEP]])
+; CHECK-NEXT:    [[INVST:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[ADDR_I]])
+; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, ptr [[ADDR_I]] unordered, align 8
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[INDVAR:%.*]] = phi i32 [ [[INDVAR_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
-; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, i8* [[VOLATILE:%.*]] unordered, align 8
+; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, ptr [[VOLATILE:%.*]] unordered, align 8
 ; CHECK-NEXT:    fence acquire
 ; CHECK-NEXT:    [[VOLCHK:%.*]] = icmp eq i8 [[VOLLOAD]], 0
-; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, i32* [[ADDR_I]] unordered, align 8
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[VOLCHK]], i32 0, i32 [[ADDRLD]]
 ; CHECK-NEXT:    [[SUM_NEXT]] = add i32 [[SEL]], [[SUM]]
 ; CHECK-NEXT:    [[INDVAR_NEXT]] = add i32 [[INDVAR]], 1
@@ -471,20 +462,19 @@ define i32 @test_fence3(i32* %addr, i32 %n, i8* %volatile) {
 ; CHECK-NEXT:    ret i32 [[SUM_LCSSA]]
 ;
 entry:
-  %addr.i = getelementptr inbounds i32, i32* %addr, i64 8
-  %gep = bitcast i32* %addr.i to i8 *
-  store atomic i32 5, i32 * %addr.i unordered, align 8
+  %addr.i = getelementptr inbounds i32, ptr %addr, i64 8
+  store atomic i32 5, ptr %addr.i unordered, align 8
   fence release
-  %invst = call {}* @llvm.invariant.start.p0i8(i64 4, i8* %gep)
+  %invst = call ptr @llvm.invariant.start.p0(i64 4, ptr %addr.i)
   br label %loop
 
 loop:
   %indvar = phi i32 [ %indvar.next, %loop ], [ 0, %entry ]
   %sum = phi i32 [ %sum.next, %loop ], [ 0, %entry ]
-  %volload = load atomic i8, i8* %volatile unordered, align 8
+  %volload = load atomic i8, ptr %volatile unordered, align 8
   fence acquire
   %volchk = icmp eq i8 %volload, 0
-  %addrld = load atomic i32, i32* %addr.i unordered, align 8
+  %addrld = load atomic i32, ptr %addr.i unordered, align 8
   %sel = select i1 %volchk, i32 0, i32 %addrld
   %sum.next = add i32 %sel, %sum
   %indvar.next = add i32 %indvar, 1
@@ -496,22 +486,21 @@ loopexit:
 }
 
 ; We should not hoist the addrld out of the loop.
-define i32 @test_fence4(i32* %addr, i32 %n, i8* %volatile) {
+define i32 @test_fence4(ptr %addr, i32 %n, ptr %volatile) {
 ; CHECK-LABEL: @test_fence4(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[ADDR_I:%.*]] = getelementptr inbounds i32, i32* [[ADDR:%.*]], i64 8
-; CHECK-NEXT:    [[GEP:%.*]] = bitcast i32* [[ADDR_I]] to i8*
+; CHECK-NEXT:    [[ADDR_I:%.*]] = getelementptr inbounds i32, ptr [[ADDR:%.*]], i64 8
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[INDVAR:%.*]] = phi i32 [ [[INDVAR_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
-; CHECK-NEXT:    store atomic i32 5, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    store atomic i32 5, ptr [[ADDR_I]] unordered, align 8
 ; CHECK-NEXT:    fence release
-; CHECK-NEXT:    [[INVST:%.*]] = call {}* @llvm.invariant.start.p0i8(i64 4, i8* [[GEP]])
-; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, i8* [[VOLATILE:%.*]] unordered, align 8
+; CHECK-NEXT:    [[INVST:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[ADDR_I]])
+; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, ptr [[VOLATILE:%.*]] unordered, align 8
 ; CHECK-NEXT:    fence acquire
 ; CHECK-NEXT:    [[VOLCHK:%.*]] = icmp eq i8 [[VOLLOAD]], 0
-; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, ptr [[ADDR_I]] unordered, align 8
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[VOLCHK]], i32 0, i32 [[ADDRLD]]
 ; CHECK-NEXT:    [[SUM_NEXT]] = add i32 [[SEL]], [[SUM]]
 ; CHECK-NEXT:    [[INDVAR_NEXT]] = add i32 [[INDVAR]], 1
@@ -522,20 +511,19 @@ define i32 @test_fence4(i32* %addr, i32 %n, i8* %volatile) {
 ; CHECK-NEXT:    ret i32 [[SUM_LCSSA]]
 ;
 entry:
-  %addr.i = getelementptr inbounds i32, i32* %addr, i64 8
-  %gep = bitcast i32* %addr.i to i8 *
+  %addr.i = getelementptr inbounds i32, ptr %addr, i64 8
   br label %loop
 
 loop:
   %indvar = phi i32 [ %indvar.next, %loop ], [ 0, %entry ]
   %sum = phi i32 [ %sum.next, %loop ], [ 0, %entry ]
-  store atomic i32 5, i32 * %addr.i unordered, align 8
+  store atomic i32 5, ptr %addr.i unordered, align 8
   fence release
-  %invst = call {}* @llvm.invariant.start.p0i8(i64 4, i8* %gep)
-  %volload = load atomic i8, i8* %volatile unordered, align 8
+  %invst = call ptr @llvm.invariant.start.p0(i64 4, ptr %addr.i)
+  %volload = load atomic i8, ptr %volatile unordered, align 8
   fence acquire
   %volchk = icmp eq i8 %volload, 0
-  %addrld = load atomic i32, i32* %addr.i unordered, align 8
+  %addrld = load atomic i32, ptr %addr.i unordered, align 8
   %sel = select i1 %volchk, i32 0, i32 %addrld
   %sum.next = add i32 %sel, %sum
   %indvar.next = add i32 %indvar, 1
@@ -548,22 +536,21 @@ loopexit:
 
 ; We can't hoist the invariant load out of the loop because
 ; the marker is given a variable size (-1).
-define i32 @test_fence5(i8* %addr, i32 %n, i8* %volatile) {
+define i32 @test_fence5(ptr %addr, i32 %n, ptr %volatile) {
 ; CHECK-LABEL: @test_fence5(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, i8* [[ADDR:%.*]], i64 8
-; CHECK-NEXT:    [[ADDR_I:%.*]] = bitcast i8* [[GEP]] to i32*
-; CHECK-NEXT:    store atomic i32 5, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[ADDR:%.*]], i64 8
+; CHECK-NEXT:    store atomic i32 5, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    fence release
-; CHECK-NEXT:    [[INVST:%.*]] = call {}* @llvm.invariant.start.p0i8(i64 -1, i8* [[GEP]])
+; CHECK-NEXT:    [[INVST:%.*]] = call ptr @llvm.invariant.start.p0(i64 -1, ptr [[GEP]])
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[INDVAR:%.*]] = phi i32 [ [[INDVAR_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
 ; CHECK-NEXT:    [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
-; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, i8* [[VOLATILE:%.*]] unordered, align 8
+; CHECK-NEXT:    [[VOLLOAD:%.*]] = load atomic i8, ptr [[VOLATILE:%.*]] unordered, align 8
 ; CHECK-NEXT:    fence acquire
 ; CHECK-NEXT:    [[VOLCHK:%.*]] = icmp eq i8 [[VOLLOAD]], 0
-; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, i32* [[ADDR_I]] unordered, align 8
+; CHECK-NEXT:    [[ADDRLD:%.*]] = load atomic i32, ptr [[GEP]] unordered, align 8
 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[VOLCHK]], i32 0, i32 [[ADDRLD]]
 ; CHECK-NEXT:    [[SUM_NEXT]] = add i32 [[SEL]], [[SUM]]
 ; CHECK-NEXT:    [[INDVAR_NEXT]] = add i32 [[INDVAR]], 1
@@ -574,20 +561,19 @@ define i32 @test_fence5(i8* %addr, i32 %n, i8* %volatile) {
 ; CHECK-NEXT:    ret i32 [[SUM_LCSSA]]
 ;
 entry:
-  %gep = getelementptr inbounds i8, i8* %addr, i64 8
-  %addr.i = bitcast i8* %gep to i32 *
-  store atomic i32 5, i32 * %addr.i unordered, align 8
+  %gep = getelementptr inbounds i8, ptr %addr, i64 8
+  store atomic i32 5, ptr %gep unordered, align 8
   fence release
-  %invst = call {}* @llvm.invariant.start.p0i8(i64 -1, i8* %gep)
+  %invst = call ptr @llvm.invariant.start.p0(i64 -1, ptr %gep)
   br label %loop
 
 loop:
   %indvar = phi i32 [ %indvar.next, %loop ], [ 0, %entry ]
   %sum = phi i32 [ %sum.next, %loop ], [ 0, %entry ]
-  %volload = load atomic i8, i8* %volatile unordered, align 8
+  %volload = load atomic i8, ptr %volatile unordered, align 8
   fence acquire
   %volchk = icmp eq i8 %volload, 0
-  %addrld = load atomic i32, i32* %addr.i unordered, align 8
+  %addrld = load atomic i32, ptr %gep unordered, align 8
   %sel = select i1 %volchk, i32 0, i32 %addrld
   %sum.next = add i32 %sel, %sum
   %indvar.next = add i32 %indvar, 1
@@ -606,21 +592,21 @@ declare void @g(i1)
 define void @test_fence6() {
 ; CHECK-LABEL: @test_fence6(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[I:%.*]] = call {}* @llvm.invariant.start.p0i8(i64 1, i8* @a)
+; CHECK-NEXT:    [[I:%.*]] = call ptr @llvm.invariant.start.p0(i64 1, ptr @a)
 ; CHECK-NEXT:    br label [[F:%.*]]
 ; CHECK:       f:
-; CHECK-NEXT:    [[TMP0:%.*]] = load i8, i8* @a, align 1
+; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr @a, align 1
 ; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[TMP0]], 0
 ; CHECK-NEXT:    [[T:%.*]] = icmp eq i8 [[TMP1]], 0
 ; CHECK-NEXT:    tail call void @g(i1 [[T]])
 ; CHECK-NEXT:    br label [[F]]
 ;
 entry:
-  %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* @a)
+  %i = call ptr @llvm.invariant.start.p0(i64 1, ptr @a)
   br label %f
 
 f:
-  %0 = load i8, i8* @a
+  %0 = load i8, ptr @a
   %1 = and i8 %0, 0
   %t = icmp eq i8 %1, 0
   tail call void @g(i1 %t)

diff  --git a/llvm/test/Transforms/LICM/infinite_loops.ll b/llvm/test/Transforms/LICM/infinite_loops.ll
index df8c92b2243aa..ed826bdeaa923 100644
--- a/llvm/test/Transforms/LICM/infinite_loops.ll
+++ b/llvm/test/Transforms/LICM/infinite_loops.ll
@@ -3,7 +3,7 @@
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<opt-remark-emit>,loop-mssa(licm)' -S %s | FileCheck %s
 
 ; Make sure we don't hoist the unsafe division to some executable block.
-define void @test_impossible_exit_in_untaken_block(i32 %a, i32 %b, i32* %p) {
+define void @test_impossible_exit_in_untaken_block(i32 %a, i32 %b, ptr %p) {
 ; CHECK-LABEL: @test_impossible_exit_in_untaken_block(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -12,7 +12,7 @@ define void @test_impossible_exit_in_untaken_block(i32 %a, i32 %b, i32* %p) {
 ; CHECK-NEXT:    br i1 false, label [[NEVER_TAKEN:%.*]], label [[BACKEDGE]]
 ; CHECK:       never_taken:
 ; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    store i32 [[DIV]], i32* [[P:%.*]]
+; CHECK-NEXT:    store i32 [[DIV]], ptr [[P:%.*]]
 ; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[EXIT:%.*]]
 ; CHECK:       backedge:
 ; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
@@ -29,7 +29,7 @@ loop:
 
 never_taken:
   %div = sdiv i32 %a, %b
-  store i32 %div, i32* %p
+  store i32 %div, ptr %p
   br i1 true, label %backedge, label %exit
 
 backedge:
@@ -50,17 +50,17 @@ exit:
 ; By the moment when this test was added, it was accidentally correct due to
 ; reasons not directly related to this piece of logic. Make sure that it keeps
 ; correct in the future.
-define void @test_impossible_exit_in_untaken_block_no_ub(i32 %a, i32 %b, i32* noalias %p, i32* noalias %vp) {
+define void @test_impossible_exit_in_untaken_block_no_ub(i32 %a, i32 %b, ptr noalias %p, ptr noalias %vp) {
 ; CHECK-LABEL: @test_impossible_exit_in_untaken_block_no_ub(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
-; CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* [[VP:%.*]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, ptr [[VP:%.*]]
 ; CHECK-NEXT:    br i1 false, label [[NEVER_TAKEN:%.*]], label [[BACKEDGE]]
 ; CHECK:       never_taken:
 ; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    store i32 [[DIV]], i32* [[P:%.*]]
+; CHECK-NEXT:    store i32 [[DIV]], ptr [[P:%.*]]
 ; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[EXIT:%.*]]
 ; CHECK:       backedge:
 ; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
@@ -73,12 +73,12 @@ entry:
 
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
-  load volatile i32, i32* %vp
+  load volatile i32, ptr %vp
   br i1 false, label %never_taken, label %backedge
 
 never_taken:
   %div = sdiv i32 %a, %b
-  store i32 %div, i32* %p
+  store i32 %div, ptr %p
   br i1 true, label %backedge, label %exit
 
 backedge:
@@ -92,7 +92,7 @@ exit:
 ; Same as above, but the volatile access is in mustexecute backedge block. The
 ; loop is no longer "finite by specification", make sure we don't hoist sdiv
 ; from it no matter how general the MustThrow analysis is.
-define void @test_impossible_exit_in_untaken_block_no_ub_2(i32 %a, i32 %b, i32* noalias %p, i32* noalias %vp) {
+define void @test_impossible_exit_in_untaken_block_no_ub_2(i32 %a, i32 %b, ptr noalias %p, ptr noalias %vp) {
 ; CHECK-LABEL: @test_impossible_exit_in_untaken_block_no_ub_2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
@@ -101,11 +101,11 @@ define void @test_impossible_exit_in_untaken_block_no_ub_2(i32 %a, i32 %b, i32*
 ; CHECK-NEXT:    br i1 false, label [[NEVER_TAKEN:%.*]], label [[BACKEDGE]]
 ; CHECK:       never_taken:
 ; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    store i32 [[DIV]], i32* [[P:%.*]]
+; CHECK-NEXT:    store i32 [[DIV]], ptr [[P:%.*]]
 ; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[EXIT:%.*]]
 ; CHECK:       backedge:
 ; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
-; CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, i32* [[VP:%.*]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load volatile i32, ptr [[VP:%.*]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    ret void
@@ -119,12 +119,12 @@ loop:
 
 never_taken:
   %div = sdiv i32 %a, %b
-  store i32 %div, i32* %p
+  store i32 %div, ptr %p
   br i1 true, label %backedge, label %exit
 
 backedge:
   %iv.next = add i32 %iv, 1
-  load volatile i32, i32* %vp
+  load volatile i32, ptr %vp
   br label %loop
 
 exit:

diff  --git a/llvm/test/Transforms/LICM/int_sideeffect.ll b/llvm/test/Transforms/LICM/int_sideeffect.ll
index 842efe56585aa..c241fee4be7ef 100644
--- a/llvm/test/Transforms/LICM/int_sideeffect.ll
+++ b/llvm/test/Transforms/LICM/int_sideeffect.ll
@@ -8,7 +8,7 @@ declare void @llvm.sideeffect()
 ; CHECK: load
 ; CHECK: loop:
 ; CHECK-NOT: load
-define float @licm(i64 %n, float* nocapture readonly %p) #0 {
+define float @licm(i64 %n, ptr nocapture readonly %p) #0 {
 bb0:
   br label %loop
 
@@ -16,7 +16,7 @@ loop:
   %i = phi i64 [ 0, %bb0 ], [ %t5, %loop ]
   %sum = phi float [ 0.000000e+00, %bb0 ], [ %t4, %loop ]
   call void @llvm.sideeffect()
-  %t3 = load float, float* %p
+  %t3 = load float, ptr %p
   %t4 = fadd float %sum, %t3
   %t5 = add i64 %i, 1
   %t6 = icmp ult i64 %t5, %n

diff  --git a/llvm/test/Transforms/LICM/invariant.start.ll b/llvm/test/Transforms/LICM/invariant.start.ll
index b5cfab37bebdd..53f252d2e8e94 100644
--- a/llvm/test/Transforms/LICM/invariant.start.ll
+++ b/llvm/test/Transforms/LICM/invariant.start.ll
@@ -2,11 +2,11 @@
 ; RUN: opt -licm -basic-aa < %s -S | FileCheck %s
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck %s
 
-define void @test1(i1 %cond, i32* %ptr) {
+define void @test1(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP0:%.*]] = call {}* @llvm.invariant.start.p0i32(i64 4, i32* [[PTR:%.*]])
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[PTR:%.*]])
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
@@ -19,23 +19,23 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
-  %val = load i32, i32* %ptr
+  call ptr @llvm.invariant.start.p0(i64 4, ptr %ptr)
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ;; despite the loop varying invariant.start, we should be
 ;; able to hoist the load
-define void @test2(i1 %cond, i32* %ptr) {
+define void @test2(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR:%.*]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
-; CHECK-NEXT:    [[PIV:%.*]] = getelementptr i32, i32* [[PTR]], i32 [[X]]
-; CHECK-NEXT:    [[TMP0:%.*]] = call {}* @llvm.invariant.start.p0i32(i64 4, i32* [[PIV]])
+; CHECK-NEXT:    [[PIV:%.*]] = getelementptr i32, ptr [[PTR]], i32 [[X]]
+; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[PIV]])
 ; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
@@ -44,23 +44,23 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  %piv = getelementptr i32, i32* %ptr, i32 %x
-  call {}* @llvm.invariant.start.p0i32(i64 4, i32* %piv)
-  %val = load i32, i32* %ptr
+  %piv = getelementptr i32, ptr %ptr, i32 %x
+  call ptr @llvm.invariant.start.p0(i64 4, ptr %piv)
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
-define void @test3(i1 %cond, i32* %ptr) {
+define void @test3(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP0:%.*]] = call {}* @llvm.invariant.start.p0i32(i64 4, i32* [[PTR:%.*]])
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR]], align 4
-; CHECK-NEXT:    [[P2:%.*]] = getelementptr i32, i32* [[PTR]], i32 1
+; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[PTR:%.*]])
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[PTR]], i32 1
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
-; CHECK-NEXT:    store volatile i32 0, i32* [[P2]], align 4
+; CHECK-NEXT:    store volatile i32 0, ptr [[P2]], align 4
 ; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
@@ -69,25 +69,25 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
-  %val = load i32, i32* %ptr
-  %p2 = getelementptr i32, i32* %ptr, i32 1
-  store volatile i32 0, i32* %p2
+  call ptr @llvm.invariant.start.p0(i64 4, ptr %ptr)
+  %val = load i32, ptr %ptr
+  %p2 = getelementptr i32, ptr %ptr, i32 1
+  store volatile i32 0, ptr %p2
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; can't hoist due to init in loop, only well defined if loop exits
 ; on first iteration, but we don't bother checking for that currently
-define void @test4(i1 %cond, i32* %ptr) {
+define void @test4(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test4(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 0, i32* [[PTR:%.*]], align 4
-; CHECK-NEXT:    [[TMP0:%.*]] = call {}* @llvm.invariant.start.p0i32(i64 4, i32* [[PTR]])
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[PTR:%.*]], align 4
+; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[PTR]])
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
 ; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
@@ -96,24 +96,24 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  store i32 0, i32* %ptr
-  call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
-  %val = load i32, i32* %ptr
+  store i32 0, ptr %ptr
+  call ptr @llvm.invariant.start.p0(i64 4, ptr %ptr)
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; don't try to reason about scopes
-define void @test5(i1 %cond, i32* %ptr) {
+define void @test5(i1 %cond, ptr %ptr) {
 ; CHECK-LABEL: @test5(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_INC:%.*]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 0, i32* [[PTR:%.*]], align 4
-; CHECK-NEXT:    [[SCOPE:%.*]] = call {}* @llvm.invariant.start.p0i32(i64 4, i32* [[PTR]])
-; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[PTR]], align 4
-; CHECK-NEXT:    call void @llvm.invariant.end.p0i32({}* [[SCOPE]], i64 4, i32* [[PTR]])
+; CHECK-NEXT:    store i32 0, ptr [[PTR:%.*]], align 4
+; CHECK-NEXT:    [[SCOPE:%.*]] = call ptr @llvm.invariant.start.p0(i64 4, ptr [[PTR]])
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    call void @llvm.invariant.end.p0(ptr [[SCOPE]], i64 4, ptr [[PTR]])
 ; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
@@ -122,13 +122,13 @@ entry:
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  store i32 0, i32* %ptr
-  %scope = call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
-  %val = load i32, i32* %ptr
-  call void @llvm.invariant.end.p0i32({}* %scope, i64 4, i32* %ptr)
+  store i32 0, ptr %ptr
+  %scope = call ptr @llvm.invariant.start.p0(i64 4, ptr %ptr)
+  %val = load i32, ptr %ptr
+  call void @llvm.invariant.end.p0(ptr %scope, i64 4, ptr %ptr)
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
-declare {}* @llvm.invariant.start.p0i32(i64, i32*)
-declare void @llvm.invariant.end.p0i32({}*, i64, i32*)
+declare ptr @llvm.invariant.start.p0(i64, ptr)
+declare void @llvm.invariant.end.p0(ptr, i64, ptr)

diff  --git a/llvm/test/Transforms/LICM/lcssa-ssa-promoter.ll b/llvm/test/Transforms/LICM/lcssa-ssa-promoter.ll
index 427d760c21891..e25680a57aa05 100644
--- a/llvm/test/Transforms/LICM/lcssa-ssa-promoter.ll
+++ b/llvm/test/Transforms/LICM/lcssa-ssa-promoter.ll
@@ -22,7 +22,7 @@ outer.preheader:
 ; CHECK: br label %outer.header
 
 outer.header:
-  store i32 0, i32* @x, align 4
+  store i32 0, ptr @x, align 4
   br i1 undef, label %outer.latch, label %inner.preheader
 ; CHECK: outer.header:
 ; CHECK-NEXT: br i1 undef, label %outer.latch, label %inner.preheader
@@ -39,13 +39,13 @@ inner.header:
 ; CHECK-NEXT: br i1 undef, label %inner.body.rhs, label %inner.latch
 
 inner.body.rhs:
-  store i32 0, i32* @x, align 4
+  store i32 0, ptr @x, align 4
   br label %inner.latch
 ; CHECK: inner.body.rhs:
 ; CHECK-NEXT: br label %inner.latch
 
 inner.latch:
-  %y_val = load i32, i32* @y, align 4
+  %y_val = load i32, ptr @y, align 4
   %icmp = icmp eq i32 %y_val, 0
   br i1 %icmp, label %inner.exit, label %inner.header
 ; CHECK: inner.latch:

diff  --git a/llvm/test/Transforms/LICM/lnicm-sink.ll b/llvm/test/Transforms/LICM/lnicm-sink.ll
index 54dfd7bb26699..96c812c6d8de5 100644
--- a/llvm/test/Transforms/LICM/lnicm-sink.ll
+++ b/llvm/test/Transforms/LICM/lnicm-sink.ll
@@ -22,7 +22,7 @@
 ; to try to make a perfect loop nest. (though y[i] = s; still prevents the 
 ; loop nest from being a perfect loop nest in this test case)
 
-define dso_local double @test(double %x, i32* noalias %y) {
+define dso_local double @test(double %x, ptr noalias %y) {
 entry:
   br label %for.body
 
@@ -48,8 +48,8 @@ for.end:
   %s.1.lcssa = phi i32 [ %call4, %for.body3 ]
   %t.1.lcssa = phi double [ %call, %for.body3 ]
   %idxprom = sext i32 %i.02 to i64
-  %arrayidx = getelementptr inbounds i32, i32* %y, i64 %idxprom
-  store i32 %s.1.lcssa, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %y, i64 %idxprom
+  store i32 %s.1.lcssa, ptr %arrayidx, align 4
   %inc6 = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc6, 10
   br i1 %cmp, label %for.body, label %for.end7
@@ -77,7 +77,7 @@ for.end7:
 ;   return t;
 ; }
 ;
-define dso_local double @test2(double %x, i32* noalias %y) {
+define dso_local double @test2(double %x, ptr noalias %y) {
 entry:
   br label %for.body
 
@@ -114,8 +114,8 @@ for.end:
   %s.1.lcssa = phi i32 [ %s.lcssa.k, %for.end.k ]
   %t.1.lcssa = phi double [ %t.lcssa.k, %for.end.k ]
   %idxprom = sext i32 %i.02 to i64
-  %arrayidx = getelementptr inbounds i32, i32* %y, i64 %idxprom
-  store i32 %s.1.lcssa, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %y, i64 %idxprom
+  store i32 %s.1.lcssa, ptr %arrayidx, align 4
   %inc6 = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc6, 10
   br i1 %cmp, label %for.body, label %for.end7

diff  --git a/llvm/test/Transforms/LICM/loopsink-pr38462.ll b/llvm/test/Transforms/LICM/loopsink-pr38462.ll
index 8d06c3742a54c..283e3c489184b 100644
--- a/llvm/test/Transforms/LICM/loopsink-pr38462.ll
+++ b/llvm/test/Transforms/LICM/loopsink-pr38462.ll
@@ -4,13 +4,13 @@
 target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-pc-windows-msvc19.13.26128"
 
-%struct.FontInfoData = type { i32 (...)** }
+%struct.FontInfoData = type { ptr }
 %struct.S = type { i8 }
 
 ; CHECK: @pr38462
 ; Make sure not to assert by trying to sink into catch.dispatch.
 
-define void @pr38462(%struct.FontInfoData* %this) personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) !prof !1 {
+define void @pr38462(ptr %this) personality ptr @__C_specific_handler !prof !1 {
 entry:
   %s = alloca %struct.S
   %call6 = call i32 @f()
@@ -18,7 +18,6 @@ entry:
   br i1 %tobool7, label %for.body.lr.ph, label %for.cond.cleanup
 
 for.body.lr.ph:
-  %0 = getelementptr inbounds %struct.S, %struct.S* %s, i64 0, i32 0
   br label %for.body
 
 for.cond.cleanup.loopexit:
@@ -31,15 +30,15 @@ for.body:
   %call2 = invoke i32 @f() to label %__try.cont unwind label %catch.dispatch
 
 catch.dispatch:
-  %1 = catchswitch within none [label %__except] unwind to caller
+  %0 = catchswitch within none [label %__except] unwind to caller
 
 __except:
-  %2 = catchpad within %1 [i8* null]
-  catchret from %2 to label %__except3
+  %1 = catchpad within %0 [ptr null]
+  catchret from %1 to label %__except3
 
 __except3:
-  call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %0)
-  %call.i = call zeroext i1 @g(%struct.S* nonnull %s)
+  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %s)
+  %call.i = call zeroext i1 @g(ptr nonnull %s)
   br i1 %call.i, label %if.then.i, label %exit
 
 if.then.i:
@@ -47,7 +46,7 @@ if.then.i:
   br label %exit
 
 exit:
-  call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %0)
+  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %s)
   br label %__try.cont
 
 __try.cont:
@@ -58,9 +57,9 @@ __try.cont:
 
 declare i32 @__C_specific_handler(...)
 declare i32 @f()
-declare zeroext i1 @g(%struct.S*)
-declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
-declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
+declare zeroext i1 @g(ptr)
+declare void @llvm.lifetime.start.p0(i64, ptr nocapture)
+declare void @llvm.lifetime.end.p0(i64, ptr nocapture)
 
 !1 = !{!"function_entry_count", i64 1}
 

diff  --git a/llvm/test/Transforms/LICM/loopsink-pr39570.ll b/llvm/test/Transforms/LICM/loopsink-pr39570.ll
index 0446ccd72d585..7ec4382031f98 100644
--- a/llvm/test/Transforms/LICM/loopsink-pr39570.ll
+++ b/llvm/test/Transforms/LICM/loopsink-pr39570.ll
@@ -4,54 +4,54 @@
 ; CHECK: pr39570
 ; Make sure not to assert.
 
-%0 = type { i32, %1*, %2, %6*, %33* }
-%1 = type { i32 (...)** }
-%2 = type { %3* }
-%3 = type { %4, i32, %5* }
-%4 = type { i32 (...)**, i32 }
+%0 = type { i32, ptr, %2, ptr, ptr }
+%1 = type { ptr }
+%2 = type { ptr }
+%3 = type { %4, i32, ptr }
+%4 = type { ptr, i32 }
 %5 = type opaque
-%6 = type { %7, %1*, %31*, i8, %2, %32* }
-%7 = type <{ %8, %9*, %10, i32, %33*, %33*, %33*, %27, %28, i16 }>
-%8 = type { i32 (...)** }
+%6 = type { %7, ptr, ptr, i8, %2, ptr }
+%7 = type <{ %8, ptr, %10, i32, ptr, ptr, ptr, %27, %28, i16 }>
+%8 = type { ptr }
 %9 = type opaque
 %10 = type { %11, %16, %18, %19 }
-%11 = type { %12*, i32, i32, %13* }
-%12 = type { i32 (...)** }
-%13 = type { %14*, %14* }
+%11 = type { ptr, i32, i32, ptr }
+%12 = type { ptr }
+%13 = type { ptr, ptr }
 %14 = type { %15, i32 }
-%15 = type { %12*, i32, i32, i16* }
-%16 = type { %12*, i32, i32, %17* }
-%17 = type { %13, %14* }
-%18 = type { %12*, i32, i32, %14** }
-%19 = type { %20, %21, %12*, float, i32, i32, %22, %22, %24, i32, i32 }
+%15 = type { ptr, i32, i32, ptr }
+%16 = type { ptr, i32, i32, ptr }
+%17 = type { %13, ptr }
+%18 = type { ptr, i32, i32, ptr }
+%19 = type { %20, %21, ptr, float, i32, i32, %22, %22, %24, i32, i32 }
 %20 = type { i8 }
 %21 = type { i8 }
-%22 = type { %12*, %23*, %23* }
+%22 = type { ptr, ptr, ptr }
 %23 = type opaque
-%24 = type { %12*, i32, i32, %25* }
-%25 = type { %12*, i32, i32, %26* }
+%24 = type { ptr, i32, i32, ptr }
+%25 = type { ptr, i32, i32, ptr }
 %26 = type opaque
-%27 = type { %33* }
-%28 = type { %29, i32, i32, %14* }
+%27 = type { ptr }
+%28 = type { %29, i32, i32, ptr }
 %29 = type { %30 }
-%30 = type { i32 (...)** }
+%30 = type { ptr }
 %31 = type opaque
-%32 = type { i32 (...)** }
-%33 = type <{ %8, %9*, %10, i32, %33*, %33*, %33*, %27, %28, i16, [2 x i8] }>
+%32 = type { ptr }
+%33 = type <{ %8, ptr, %10, i32, ptr, ptr, ptr, %27, %28, i16, [2 x i8] }>
 
-define dso_local void @pr39570() local_unnamed_addr align 2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !prof !1 {
+define dso_local void @pr39570() local_unnamed_addr align 2 personality ptr @__gxx_personality_v0 !prof !1 {
   br i1 undef, label %8, label %1, !prof !2
 
 ; <label>:1:                                      ; preds = %0
-  %2 = load %0*, %0** undef, align 4
+  %2 = load ptr, ptr undef, align 4
   br label %3
 
 ; <label>:3:                                      ; preds = %7, %1
-  %4 = getelementptr inbounds %0, %0* %2, i32 undef, i32 0
+  %4 = getelementptr inbounds %0, ptr %2, i32 undef, i32 0
   br label %5
 
 ; <label>:5:                                      ; preds = %3
-  %6 = getelementptr inbounds %0, %0* %2, i32 undef, i32 4
+  %6 = getelementptr inbounds %0, ptr %2, i32 undef, i32 4
   br i1 undef, label %18, label %7, !prof !3
 
 ; <label>:7:                                      ; preds = %5
@@ -66,23 +66,23 @@ define dso_local void @pr39570() local_unnamed_addr align 2 personality i8* bitc
           to label %17 unwind label %10
 
 ; <label>:10:                                     ; preds = %9
-  %11 = landingpad { i8*, i32 }
-          catch i8* null
+  %11 = landingpad { ptr, i32 }
+          catch ptr null
   unreachable
 
 ; <label>:12:                                     ; preds = %8
-  %13 = landingpad { i8*, i32 }
+  %13 = landingpad { ptr, i32 }
           cleanup
   invoke void @bar()
           to label %16 unwind label %14
 
 ; <label>:14:                                     ; preds = %12
-  %15 = landingpad { i8*, i32 }
-          catch i8* null
+  %15 = landingpad { ptr, i32 }
+          catch ptr null
   unreachable
 
 ; <label>:16:                                     ; preds = %12
-  resume { i8*, i32 } %13
+  resume { ptr, i32 } %13
 
 ; <label>:17:                                     ; preds = %9
   br label %18
@@ -96,8 +96,8 @@ define dso_local void @pr39570() local_unnamed_addr align 2 personality i8* bitc
           to label %22 unwind label %20
 
 ; <label>:20:                                     ; preds = %19
-  %21 = landingpad { i8*, i32 }
-          catch i8* null
+  %21 = landingpad { ptr, i32 }
+          catch ptr null
   unreachable
 
 ; <label>:22:                                     ; preds = %19

diff  --git a/llvm/test/Transforms/LICM/loopsink-pr39695.ll b/llvm/test/Transforms/LICM/loopsink-pr39695.ll
index ddb940a2af460..9545c8aed50b8 100644
--- a/llvm/test/Transforms/LICM/loopsink-pr39695.ll
+++ b/llvm/test/Transforms/LICM/loopsink-pr39695.ll
@@ -4,13 +4,13 @@
 ; The load instruction should not be sunk into following loop.
 ; CHECK:      @foo
 ; CHECK-NEXT: entry
-; CHECK-NEXT: %ptr = load i8*, i8** %pp, align 8
-; CHECK-NEXT: store i8* null, i8** %pp, align 8
+; CHECK-NEXT: %ptr = load ptr, ptr %pp, align 8
+; CHECK-NEXT: store ptr null, ptr %pp, align 8
 
-define i32 @foo(i32 %n, i8** %pp) !prof !0 {
+define i32 @foo(i32 %n, ptr %pp) !prof !0 {
 entry:
-  %ptr = load i8*, i8** %pp, align 8
-  store i8* null, i8** %pp, align 8
+  %ptr = load ptr, ptr %pp, align 8
+  store ptr null, ptr %pp, align 8
   br label %for.cond
 
 for.cond:                                         ; preds = %for.body, %entry
@@ -20,8 +20,8 @@ for.cond:                                         ; preds = %for.body, %entry
 
 for.body:                                         ; preds = %for.cond
   %0 = sext i32 %i.0 to i64
-  %arrayidx = getelementptr inbounds i8, i8* %ptr, i64 %0
-  %1 = load i8, i8* %arrayidx, align 1
+  %arrayidx = getelementptr inbounds i8, ptr %ptr, i64 %0
+  %1 = load i8, ptr %arrayidx, align 1
   %or19 = call i8 @llvm.bitreverse.i8(i8 %1)
   %v = sext i8 %or19 to i32
   %inc = add i32 %i.0, %v

diff  --git a/llvm/test/Transforms/LICM/loopsink.ll b/llvm/test/Transforms/LICM/loopsink.ll
index 87697364295d6..da907f6bb3676 100644
--- a/llvm/test/Transforms/LICM/loopsink.ll
+++ b/llvm/test/Transforms/LICM/loopsink.ll
@@ -19,15 +19,15 @@
 ; Sink load to b2
 ; CHECK: t1
 ; CHECK: .b2:
-; CHECK: load i32, i32* @g
+; CHECK: load i32, ptr @g
 ; CHECK: .b3:
-; CHECK-NOT:  load i32, i32* @g
+; CHECK-NOT:  load i32, ptr @g
 define i32 @t1(i32, i32) #0 !prof !0 {
   %3 = icmp eq i32 %1, 0
   br i1 %3, label %.exit, label %.preheader
 
 .preheader:
-  %invariant = load i32, i32* @g
+  %invariant = load i32, ptr @g
   br label %.b1
 
 .b1:
@@ -82,19 +82,19 @@ define i32 @t1(i32, i32) #0 !prof !0 {
 ; Sink load to b3 and b6
 ; CHECK: t2
 ; CHECK: .preheader:
-; CHECK-NOT: load i32, i32* @g
+; CHECK-NOT: load i32, ptr @g
 ; CHECK: .b3:
-; CHECK: load i32, i32* @g
+; CHECK: load i32, ptr @g
 ; CHECK: .b4:
 ; CHECK: .b6:
-; CHECK: load i32, i32* @g
+; CHECK: load i32, ptr @g
 ; CHECK: .b7:
 define i32 @t2(i32, i32) #0 !prof !0 {
   %3 = icmp eq i32 %1, 0
   br i1 %3, label %.exit, label %.preheader
 
 .preheader:
-  %invariant = load i32, i32* @g
+  %invariant = load i32, ptr @g
   br label %.b1
 
 .b1:
@@ -148,15 +148,15 @@ define i32 @t2(i32, i32) #0 !prof !0 {
 ; Do not sink load from preheader.
 ; CHECK: t3
 ; CHECK: .preheader:
-; CHECK: load i32, i32* @g
+; CHECK: load i32, ptr @g
 ; CHECK: .b1:
-; CHECK-NOT: load i32, i32* @g
+; CHECK-NOT: load i32, ptr @g
 define i32 @t3(i32, i32) #0 !prof !0 {
   %3 = icmp eq i32 %1, 0
   br i1 %3, label %.exit, label %.preheader
 
 .preheader:
-  %invariant = load i32, i32* @g
+  %invariant = load i32, ptr @g
   br label %.b1
 
 .b1:
@@ -198,13 +198,13 @@ define i32 @t3(i32, i32) #0 !prof !0 {
 ; For single-BB loop with <=1 avg trip count, sink load to b1
 ; CHECK: t4
 ; CHECK: .preheader:
-; CHECK-NOT: load i32, i32* @g
+; CHECK-NOT: load i32, ptr @g
 ; CHECK: .b1:
-; CHECK: load i32, i32* @g
+; CHECK: load i32, ptr @g
 ; CHECK: .exit:
 define i32 @t4(i32, i32) #0 !prof !0 {
 .preheader:
-  %invariant = load i32, i32* @g
+  %invariant = load i32, ptr @g
   br label %.b1
 
 .b1:
@@ -233,15 +233,15 @@ define i32 @t4(i32, i32) #0 !prof !0 {
 ; There is alias store in loop, do not sink load
 ; CHECK: t5
 ; CHECK: .preheader:
-; CHECK: load i32, i32* @g
+; CHECK: load i32, ptr @g
 ; CHECK: .b1:
-; CHECK-NOT: load i32, i32* @g
-define i32 @t5(i32, i32*) #0 !prof !0 {
+; CHECK-NOT: load i32, ptr @g
+define i32 @t5(i32, ptr) #0 !prof !0 {
   %3 = icmp eq i32 %0, 0
   br i1 %3, label %.exit, label %.preheader
 
 .preheader:
-  %invariant = load i32, i32* @g
+  %invariant = load i32, ptr @g
   br label %.b1
 
 .b1:
@@ -296,16 +296,16 @@ define i32 @t5(i32, i32*) #0 !prof !0 {
 ; Regardless of aliasing store in loop this load from constant memory can be sunk.
 ; CHECK: t5_const_memory
 ; CHECK: .preheader:
-; CHECK-NOT: load i32, i32* @g_const
+; CHECK-NOT: load i32, ptr @g_const
 ; CHECK: .b2:
-; CHECK: load i32, i32* @g_const
+; CHECK: load i32, ptr @g_const
 ; CHECK: br i1 %c2, label %.b3, label %.b4
-define i32 @t5_const_memory(i32, i32*) #0 !prof !0 {
+define i32 @t5_const_memory(i32, ptr) #0 !prof !0 {
   %3 = icmp eq i32 %0, 0
   br i1 %3, label %.exit, label %.preheader
 
 .preheader:
-  %invariant = load i32, i32* @g_const
+  %invariant = load i32, ptr @g_const
   br label %.b1
 
 .b1:
@@ -355,15 +355,15 @@ define i32 @t5_const_memory(i32, i32*) #0 !prof !0 {
 ; Do not sink unordered atomic load to b2
 ; CHECK: t6
 ; CHECK: .preheader:
-; CHECK:  load atomic i32, i32* @g unordered, align 4
+; CHECK:  load atomic i32, ptr @g unordered, align 4
 ; CHECK: .b2:
-; CHECK-NOT: load atomic i32, i32* @g unordered, align 4
+; CHECK-NOT: load atomic i32, ptr @g unordered, align 4
 define i32 @t6(i32, i32) #0 !prof !0 {
   %3 = icmp eq i32 %1, 0
   br i1 %3, label %.exit, label %.preheader
 
 .preheader:
-  %invariant = load atomic i32, i32* @g unordered, align 4
+  %invariant = load atomic i32, ptr @g unordered, align 4
   br label %.b1
 
 .b1:
@@ -403,15 +403,15 @@ define i32 @t6(i32, i32) #0 !prof !0 {
 ; load from constant.
 ; CHECK: t7
 ; CHECK: .preheader:
-; CHECK-NOT:  load atomic i32, i32* @g_const unordered, align 4
+; CHECK-NOT:  load atomic i32, ptr @g_const unordered, align 4
 ; CHECK: .b2:
-; CHECK: load atomic i32, i32* @g_const unordered, align 4
+; CHECK: load atomic i32, ptr @g_const unordered, align 4
 define i32 @t7(i32, i32) #0 !prof !0 {
   %3 = icmp eq i32 %1, 0
   br i1 %3, label %.exit, label %.preheader
 
 .preheader:
-  %invariant = load atomic i32, i32* @g_const unordered, align 4
+  %invariant = load atomic i32, ptr @g_const unordered, align 4
   br label %.b1
 
 .b1:

diff  --git a/llvm/test/Transforms/LICM/opt-remarks-conditional-load.ll b/llvm/test/Transforms/LICM/opt-remarks-conditional-load.ll
index abe1fa9275a80..3e540001085a4 100644
--- a/llvm/test/Transforms/LICM/opt-remarks-conditional-load.ll
+++ b/llvm/test/Transforms/LICM/opt-remarks-conditional-load.ll
@@ -5,22 +5,22 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1
 ; With the load from %p conditional, we can't optmize this and the remark
 ; should tell us about it.
 
-define void @test(i32* %array, i32* noalias %p) {
+define void @test(ptr %array, ptr noalias %p) {
 Entry:
   br label %Loop
 
 Loop:
   %j = phi i32 [ 0, %Entry ], [ %Next, %else]
-  %addr = getelementptr i32, i32* %array, i32 %j
-  %a = load i32, i32* %addr
+  %addr = getelementptr i32, ptr %array, i32 %j
+  %a = load i32, ptr %addr
   %c = icmp eq i32 %a, 0
   br i1 %c, label %then, label %else
 
 then:
 ; CHECK: remark: /tmp/kk.c:2:20: failed to hoist load with loop-invariant address because load is conditionally executed
-  %b = load i32, i32* %p, !dbg !8
+  %b = load i32, ptr %p, !dbg !8
   %a2 = add i32 %a, %b
-  store i32 %a2, i32* %addr
+  store i32 %a2, ptr %addr
   br label %else
 
 else:

diff  --git a/llvm/test/Transforms/LICM/opt-remarks-intervening-store.ll b/llvm/test/Transforms/LICM/opt-remarks-intervening-store.ll
index ce6dc61b4b737..8cdd656a43b1a 100644
--- a/llvm/test/Transforms/LICM/opt-remarks-intervening-store.ll
+++ b/llvm/test/Transforms/LICM/opt-remarks-intervening-store.ll
@@ -5,18 +5,18 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1
 ; Without the noalias on %p, we can't optmize this and the remark should tell
 ; us about it.
 
-define void @test(i32* %array, i32* %p) {
+define void @test(ptr %array, ptr %p) {
 Entry:
   br label %Loop
 
 Loop:
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]
-  %addr = getelementptr i32, i32* %array, i32 %j
-  %a = load i32, i32* %addr
+  %addr = getelementptr i32, ptr %array, i32 %j
+  %a = load i32, ptr %addr
 ; CHECK: remark: /tmp/kk.c:2:20: failed to move load with loop-invariant address because the loop may invalidate its value
-  %b = load i32, i32* %p, !dbg !8
+  %b = load i32, ptr %p, !dbg !8
   %a2 = add i32 %a, %b
-  store i32 %a2, i32* %addr
+  store i32 %a2, ptr %addr
   %Next = add i32 %j, 1
   %cond = icmp eq i32 %Next, 0
   br i1 %cond, label %Out, label %Loop
@@ -28,7 +28,7 @@ Out:
 ; This illustrates why we need to check loop-invariance before issuing this
 ; remark.
 
-define i32 @invalidated_load_with_non_loop_invariant_address(i32* %array, i32* %array2) {
+define i32 @invalidated_load_with_non_loop_invariant_address(ptr %array, ptr %array2) {
 Entry:
   br label %Loop
 
@@ -36,11 +36,11 @@ Loop:
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]
 
 ; CHECK-NOT: /tmp/kk.c:3:20: {{.*}} loop-invariant
-  %addr = getelementptr i32, i32* %array, i32 %j
-  %a = load i32, i32* %addr, !dbg !9
+  %addr = getelementptr i32, ptr %array, i32 %j
+  %a = load i32, ptr %addr, !dbg !9
 
-  %addr2 = getelementptr i32, i32* %array2, i32 %j
-  store i32 %j, i32* %addr2
+  %addr2 = getelementptr i32, ptr %array2, i32 %j
+  store i32 %j, ptr %addr2
 
   %Next = add i32 %j, 1
   %cond = icmp eq i32 %Next, 0

diff  --git a/llvm/test/Transforms/LICM/opt-remarks.ll b/llvm/test/Transforms/LICM/opt-remarks.ll
index a5cffd1145ba5..ebf784907fd99 100644
--- a/llvm/test/Transforms/LICM/opt-remarks.ll
+++ b/llvm/test/Transforms/LICM/opt-remarks.ll
@@ -2,18 +2,18 @@
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' %s -o /dev/null -pass-remarks=licm 2>&1 | FileCheck %s
 target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
 
-define void @hoist(i32* %array, i32* noalias %p) {
+define void @hoist(ptr %array, ptr noalias %p) {
 Entry:
   br label %Loop
 
 Loop:
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]
-  %addr = getelementptr i32, i32* %array, i32 %j
-  %a = load i32, i32* %addr
+  %addr = getelementptr i32, ptr %array, i32 %j
+  %a = load i32, ptr %addr
 ; CHECK: remark: /tmp/kk.c:2:20: hoisting load
-  %b = load i32, i32* %p, !dbg !8
+  %b = load i32, ptr %p, !dbg !8
   %a2 = add i32 %a, %b
-  store i32 %a2, i32* %addr
+  store i32 %a2, ptr %addr
   %Next = add i32 %j, 1
   %cond = icmp eq i32 %Next, 0
   br i1 %cond, label %Out, label %Loop
@@ -22,16 +22,16 @@ Out:
   ret void
 }
 
-define i32 @sink(i32* %array, i32* noalias %p, i32 %b) {
+define i32 @sink(ptr %array, ptr noalias %p, i32 %b) {
 Entry:
   br label %Loop
 
 Loop:
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]
-  %addr = getelementptr i32, i32* %array, i32 %j
-  %a = load i32, i32* %addr
+  %addr = getelementptr i32, ptr %array, i32 %j
+  %a = load i32, ptr %addr
   %a2 = add i32 %a, %b
-  store i32 %a2, i32* %addr
+  store i32 %a2, ptr %addr
 ; CHECK: remark: /tmp/kk.c:2:21: sinking add
   %a3 = add i32 %a, 1, !dbg !9
   %Next = add i32 %j, 1
@@ -43,19 +43,19 @@ Out:
   ret i32 %a4
 }
 
-define void @promote(i32* %array, i32* noalias %p) {
+define void @promote(ptr %array, ptr noalias %p) {
 Entry:
   br label %Loop
 
 Loop:
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]
-  %addr = getelementptr i32, i32* %array, i32 %j
-  %a = load i32, i32* %addr
-  %b = load i32, i32* %p
+  %addr = getelementptr i32, ptr %array, i32 %j
+  %a = load i32, ptr %addr
+  %b = load i32, ptr %p
   %a2 = add i32 %a, %b
-  store i32 %a2, i32* %addr
+  store i32 %a2, ptr %addr
 ; CHECK: remark: /tmp/kk.c:2:22: Moving accesses to memory location out of the loop
-  store i32 %b, i32* %p, !dbg !10
+  store i32 %b, ptr %p, !dbg !10
   %Next = add i32 %j, 1
   %cond = icmp eq i32 %Next, 0
   br i1 %cond, label %Out, label %Loop

diff  --git a/llvm/test/Transforms/LICM/pr23608.ll b/llvm/test/Transforms/LICM/pr23608.ll
index 8d1c20bfbc7ac..181c22879219a 100644
--- a/llvm/test/Transforms/LICM/pr23608.ll
+++ b/llvm/test/Transforms/LICM/pr23608.ll
@@ -7,7 +7,7 @@ target triple = "x86_64-unknown-linux-gnu"
 
 %struct.PyFrameObject = type { i32 }
 
- at a = common global %struct.PyFrameObject* null, align 8
+ at a = common global ptr null, align 8
 @__msan_origin_tls = external thread_local(initialexec) global i32
 
 define void @fn1() {
@@ -15,20 +15,19 @@ define void @fn1() {
 ; NO_ASSUME-NEXT:  entry:
 ; NO_ASSUME-NEXT:    br label [[INDIRECTGOTO:%.*]]
 ; NO_ASSUME:       while.cond:
-; NO_ASSUME-NEXT:    [[TMP:%.*]] = load %struct.PyFrameObject*, %struct.PyFrameObject** @a, align 8
-; NO_ASSUME-NEXT:    [[F_IBLOCK:%.*]] = getelementptr inbounds [[STRUCT_PYFRAMEOBJECT:%.*]], %struct.PyFrameObject* [[TMP]], i64 0, i32 0
+; NO_ASSUME-NEXT:    [[TMP:%.*]] = load ptr, ptr @a, align 8
 ; NO_ASSUME-NEXT:    br label [[BB2:%.*]]
 ; NO_ASSUME:       bb:
 ; NO_ASSUME-NEXT:    call void @__msan_warning_noreturn()
 ; NO_ASSUME-NEXT:    unreachable
 ; NO_ASSUME:       bb2:
-; NO_ASSUME-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[F_IBLOCK]] to i64
+; NO_ASSUME-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[TMP]] to i64
 ; NO_ASSUME-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[TMP4]], 0
 ; NO_ASSUME-NEXT:    br i1 [[TOBOOL]], label [[BB13:%.*]], label [[BB15:%.*]]
 ; NO_ASSUME:       bb13:
-; NO_ASSUME-NEXT:    [[F_IBLOCK_LCSSA:%.*]] = phi i32* [ [[F_IBLOCK]], [[BB2]] ]
-; NO_ASSUME-NEXT:    [[TMP4_LE:%.*]] = ptrtoint i32* [[F_IBLOCK_LCSSA]] to i64
-; NO_ASSUME-NEXT:    [[TMP8_LE:%.*]] = inttoptr i64 [[TMP4_LE]] to i32*
+; NO_ASSUME-NEXT:    [[F_IBLOCK_LCSSA:%.*]] = phi ptr [ [[TMP]], [[BB2]] ]
+; NO_ASSUME-NEXT:    [[TMP4_LE:%.*]] = ptrtoint ptr [[F_IBLOCK_LCSSA]] to i64
+; NO_ASSUME-NEXT:    [[TMP8_LE:%.*]] = inttoptr i64 [[TMP4_LE]] to ptr
 ; NO_ASSUME-NEXT:    call void @__msan_warning_noreturn()
 ; NO_ASSUME-NEXT:    unreachable
 ; NO_ASSUME:       bb15:
@@ -36,29 +35,28 @@ define void @fn1() {
 ; NO_ASSUME:       while.end:
 ; NO_ASSUME-NEXT:    ret void
 ; NO_ASSUME:       indirectgoto:
-; NO_ASSUME-NEXT:    indirectbr i8* null, [label [[INDIRECTGOTO]], label %while.cond]
+; NO_ASSUME-NEXT:    indirectbr ptr null, [label [[INDIRECTGOTO]], label %while.cond]
 ;
 ; USE_ASSUME-LABEL: @fn1(
 ; USE_ASSUME-NEXT:  entry:
 ; USE_ASSUME-NEXT:    br label [[INDIRECTGOTO:%.*]]
 ; USE_ASSUME:       while.cond:
-; USE_ASSUME-NEXT:    [[TMP:%.*]] = load %struct.PyFrameObject*, %struct.PyFrameObject** @a, align 8
-; USE_ASSUME-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(i64* inttoptr (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665) to i64*), i64 8), "nonnull"(i64* inttoptr (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665) to i64*)), "align"(i64* inttoptr (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665) to i64*), i64 8) ]
-; USE_ASSUME-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(i32* inttoptr (i64 add (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665), i64 35184372088832) to i32*), i64 4), "nonnull"(i32* inttoptr (i64 add (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665), i64 35184372088832) to i32*)), "align"(i32* inttoptr (i64 add (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665), i64 35184372088832) to i32*), i64 8) ]
-; USE_ASSUME-NEXT:    [[F_IBLOCK:%.*]] = getelementptr inbounds [[STRUCT_PYFRAMEOBJECT:%.*]], %struct.PyFrameObject* [[TMP]], i64 0, i32 0
+; USE_ASSUME-NEXT:    [[TMP:%.*]] = load ptr, ptr @a, align 8
+; USE_ASSUME-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr inttoptr (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665) to ptr), i64 8), "nonnull"(ptr inttoptr (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665) to ptr)), "align"(ptr inttoptr (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665) to ptr), i64 8) ]
+; USE_ASSUME-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr inttoptr (i64 add (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665), i64 35184372088832) to ptr), i64 4), "nonnull"(ptr inttoptr (i64 add (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665), i64 35184372088832) to ptr)), "align"(ptr inttoptr (i64 add (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665), i64 35184372088832) to ptr), i64 8) ]
 ; USE_ASSUME-NEXT:    br label [[BB2:%.*]]
 ; USE_ASSUME:       bb:
 ; USE_ASSUME-NEXT:    call void @__msan_warning_noreturn()
 ; USE_ASSUME-NEXT:    unreachable
 ; USE_ASSUME:       bb2:
-; USE_ASSUME-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(%struct.PyFrameObject* [[TMP]], i64 4), "nonnull"(%struct.PyFrameObject* [[TMP]]), "align"(%struct.PyFrameObject* [[TMP]], i64 4) ]
-; USE_ASSUME-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[F_IBLOCK]] to i64
+; USE_ASSUME-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP]], i64 4), "nonnull"(ptr [[TMP]]), "align"(ptr [[TMP]], i64 4) ]
+; USE_ASSUME-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[TMP]] to i64
 ; USE_ASSUME-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[TMP4]], 0
 ; USE_ASSUME-NEXT:    br i1 [[TOBOOL]], label [[BB13:%.*]], label [[BB15:%.*]]
 ; USE_ASSUME:       bb13:
-; USE_ASSUME-NEXT:    [[F_IBLOCK_LCSSA:%.*]] = phi i32* [ [[F_IBLOCK]], [[BB2]] ]
-; USE_ASSUME-NEXT:    [[TMP4_LE:%.*]] = ptrtoint i32* [[F_IBLOCK_LCSSA]] to i64
-; USE_ASSUME-NEXT:    [[TMP8_LE:%.*]] = inttoptr i64 [[TMP4_LE]] to i32*
+; USE_ASSUME-NEXT:    [[F_IBLOCK_LCSSA:%.*]] = phi ptr [ [[TMP]], [[BB2]] ]
+; USE_ASSUME-NEXT:    [[TMP4_LE:%.*]] = ptrtoint ptr [[F_IBLOCK_LCSSA]] to i64
+; USE_ASSUME-NEXT:    [[TMP8_LE:%.*]] = inttoptr i64 [[TMP4_LE]] to ptr
 ; USE_ASSUME-NEXT:    call void @__msan_warning_noreturn()
 ; USE_ASSUME-NEXT:    unreachable
 ; USE_ASSUME:       bb15:
@@ -66,16 +64,15 @@ define void @fn1() {
 ; USE_ASSUME:       while.end:
 ; USE_ASSUME-NEXT:    ret void
 ; USE_ASSUME:       indirectgoto:
-; USE_ASSUME-NEXT:    indirectbr i8* null, [label [[INDIRECTGOTO]], label %while.cond]
+; USE_ASSUME-NEXT:    indirectbr ptr null, [label [[INDIRECTGOTO]], label %while.cond]
 ;
 entry:
   br label %indirectgoto
 
 while.cond:                                       ; preds = %indirectgoto, %bb15
-  %tmp = load %struct.PyFrameObject*, %struct.PyFrameObject** @a, align 8
-  %_msld = load i64, i64* inttoptr (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665) to i64*), align 8
-  %tmp1 = load i32, i32* inttoptr (i64 add (i64 and (i64 ptrtoint (%struct.PyFrameObject** @a to i64), i64 -70368744177665), i64 35184372088832) to i32*), align 8
-  %f_iblock = getelementptr inbounds %struct.PyFrameObject, %struct.PyFrameObject* %tmp, i64 0, i32 0
+  %tmp = load ptr, ptr @a, align 8
+  %_msld = load i64, ptr inttoptr (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665) to ptr), align 8
+  %tmp1 = load i32, ptr inttoptr (i64 add (i64 and (i64 ptrtoint (ptr @a to i64), i64 -70368744177665), i64 35184372088832) to ptr), align 8
   br label %bb2
 
 bb:                                               ; preds = %while.cond
@@ -83,14 +80,14 @@ bb:                                               ; preds = %while.cond
   unreachable
 
 bb2:                                              ; preds = %while.cond
-  %tmp3 = load i32, i32* %f_iblock, align 4
-  %tmp4 = ptrtoint i32* %f_iblock to i64
-  %tmp8 = inttoptr i64 %tmp4 to i32*
+  %tmp3 = load i32, ptr %tmp, align 4
+  %tmp4 = ptrtoint ptr %tmp to i64
+  %tmp8 = inttoptr i64 %tmp4 to ptr
   %tobool = icmp eq i64 %tmp4, 0
   br i1 %tobool, label %bb13, label %bb15
 
 bb13:                                             ; preds = %bb2
-  %.lcssa7 = phi i32* [ %tmp8, %bb2 ]
+  %.lcssa7 = phi ptr [ %tmp8, %bb2 ]
   call void @__msan_warning_noreturn()
   unreachable
 
@@ -101,7 +98,7 @@ while.end:                                        ; preds = %bb15
   ret void
 
 indirectgoto:                                     ; preds = %indirectgoto, %entry
-  indirectbr i8* null, [label %indirectgoto, label %while.cond]
+  indirectbr ptr null, [label %indirectgoto, label %while.cond]
 }
 
 declare void @__msan_warning_noreturn()

diff  --git a/llvm/test/Transforms/LICM/pr26843.ll b/llvm/test/Transforms/LICM/pr26843.ll
index 0301f2793e334..bbb501d69079b 100644
--- a/llvm/test/Transforms/LICM/pr26843.ll
+++ b/llvm/test/Transforms/LICM/pr26843.ll
@@ -8,7 +8,7 @@ target triple = "i686-pc-windows-msvc18.0.0"
 ; Make sure the store to v is not sunk past the memset
 ; CHECK-LABEL: @main
 ; CHECK: for.body:
-; CHECK-NEXT: store i32 1, i32* @v
+; CHECK-NEXT: store i32 1, ptr @v
 ; CHECK-NEXT: tail call void @llvm.memset
 ; CHECK: end:
 ; CHECK-NEXT: ret i32 0
@@ -18,8 +18,8 @@ entry:
   br label %for.body
  
 for.body:
-  store i32 1, i32* @v, align 4
-  tail call void @llvm.memset.p0i8.i32(i8* align 4 bitcast (i32* @v to i8*), i8 0, i32 4, i1 false)
+  store i32 1, ptr @v, align 4
+  tail call void @llvm.memset.p0.i32(ptr align 4 @v, i8 0, i32 4, i1 false)
   br label %for.latch
   
 for.latch:
@@ -29,4 +29,4 @@ end:
   ret i32 0
 }
 
-declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i1)
+declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1)

diff  --git a/llvm/test/Transforms/LICM/pr27262.ll b/llvm/test/Transforms/LICM/pr27262.ll
index 9ba42d5dd7986..a130b520ed498 100644
--- a/llvm/test/Transforms/LICM/pr27262.ll
+++ b/llvm/test/Transforms/LICM/pr27262.ll
@@ -6,21 +6,21 @@ target triple = "i686-pc-windows-msvc18.0.0"
 ; Make sure the store to v is not sunk past the memset
 ; CHECK-LABEL: @main
 ; CHECK: for.body:
-; CHECK-NEXT: store i8 1, i8* %p
-; CHECK-NEXT: store i8 2, i8* %p1
+; CHECK-NEXT: store i8 1, ptr %p
+; CHECK-NEXT: store i8 2, ptr %p1
 ; CHECK-NEXT: call void @llvm.memset
 ; CHECK: end:
 ; CHECK-NEXT: ret i32 0
 
-define i32 @main(i1 %k, i8* %p) {
+define i32 @main(i1 %k, ptr %p) {
 entry:
-  %p1 = getelementptr i8, i8* %p, i32 1
+  %p1 = getelementptr i8, ptr %p, i32 1
   br label %for.body
  
 for.body:
-  store i8 1, i8* %p, align 1
-  store i8 2, i8* %p1, align 1
-  call void @llvm.memset.p0i8.i32(i8* %p, i8 255, i32 4, i1 false)
+  store i8 1, ptr %p, align 1
+  store i8 2, ptr %p1, align 1
+  call void @llvm.memset.p0.i32(ptr %p, i8 255, i32 4, i1 false)
   br label %for.latch
   
 for.latch:
@@ -30,4 +30,4 @@ end:
   ret i32 0
 }
 
-declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i1)
+declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1)

diff  --git a/llvm/test/Transforms/LICM/pr36228.ll b/llvm/test/Transforms/LICM/pr36228.ll
index 2a86168621c69..5cb961a0f6744 100644
--- a/llvm/test/Transforms/LICM/pr36228.ll
+++ b/llvm/test/Transforms/LICM/pr36228.ll
@@ -4,37 +4,35 @@
 ; See PR36228.
 
 declare void @check(i8)
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i32, i1)
+declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i32, i1)
 
 ; CHECK-LABEL: define void @buggy
-define void @buggy(i8* %src, i1* %kOne) {
+define void @buggy(ptr %src, ptr %kOne) {
 entry:
   %dst = alloca [1 x i8], align 1
-  %0 = getelementptr inbounds [1 x i8], [1 x i8]* %dst, i64 0, i64 0
-  store i8 42, i8* %0, align 1
-  %src16 = bitcast i8* %src to i16*
-  %srcval = load i16, i16* %src16
+  store i8 42, ptr %dst, align 1
+  %srcval = load i16, ptr %src
   br label %while.cond
 
 while.cond:                                       ; preds = %if.end, %entry
-  %dp.0 = phi i8* [ %0, %entry ], [ %dp.1, %if.end ]
-  %1 = load volatile i1, i1* %kOne, align 4
-  br i1 %1, label %if.else, label %if.then
+  %dp.0 = phi ptr [ %dst, %entry ], [ %dp.1, %if.end ]
+  %0 = load volatile i1, ptr %kOne, align 4
+  br i1 %0, label %if.else, label %if.then
 
 if.then:                                          ; preds = %while.cond
-  store i8 9, i8* %dp.0, align 1
+  store i8 9, ptr %dp.0, align 1
   br label %if.end
 
 if.else:                                          ; preds = %while.cond
-  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dp.0, i8* %src, i64 2, i32 1, i1 false)
-  %dp.new = getelementptr inbounds i8, i8* %dp.0, i64 1
+  call void @llvm.memcpy.p0.p0.i64(ptr %dp.0, ptr %src, i64 2, i32 1, i1 false)
+  %dp.new = getelementptr inbounds i8, ptr %dp.0, i64 1
   br label %if.end
 
 if.end:                                           ; preds = %if.else, %if.then
-  %dp.1 = phi i8* [ %dp.0, %if.then ], [ %dp.new, %if.else ]
-  ; CHECK: %2 = load i8, i8* %0
-  %2 = load i8, i8* %0, align 1
-  ; CHECK-NEXT: call void @check(i8 %2)
-  call void @check(i8 %2)
+  %dp.1 = phi ptr [ %dp.0, %if.then ], [ %dp.new, %if.else ]
+  ; CHECK: %1 = load i8, ptr %dst
+  %1 = load i8, ptr %dst, align 1
+  ; CHECK-NEXT: call void @check(i8 %1)
+  call void @check(i8 %1)
   br label %while.cond
 }

diff  --git a/llvm/test/Transforms/LICM/pr37323.ll b/llvm/test/Transforms/LICM/pr37323.ll
index 4930199fef24f..3d43b22449714 100644
--- a/llvm/test/Transforms/LICM/pr37323.ll
+++ b/llvm/test/Transforms/LICM/pr37323.ll
@@ -16,11 +16,11 @@ entry:
   br label %for.cond
 
 for.cond:                                         ; preds = %if.end, %for.cond1, %entry
-  %0 = phi i16 [ undef, %entry ], [ ptrtoint (i16* @c to i16), %if.end ], [ %.mux, %for.cond1 ]
+  %0 = phi i16 [ undef, %entry ], [ ptrtoint (ptr @c to i16), %if.end ], [ %.mux, %for.cond1 ]
   br i1 undef, label %for.cond1, label %for.end8
 
 for.cond1:                                        ; preds = %if.end, %for.cond
-  %.mux = select i1 undef, i16 undef, i16 ptrtoint (i16* @c to i16)
+  %.mux = select i1 undef, i16 undef, i16 ptrtoint (ptr @c to i16)
   br i1 undef, label %for.cond, label %if.end
 
 if.end:                                           ; preds = %for.cond1

diff  --git a/llvm/test/Transforms/LICM/pr38513.ll b/llvm/test/Transforms/LICM/pr38513.ll
index 0ed6ae1061ada..a08194cd4145a 100644
--- a/llvm/test/Transforms/LICM/pr38513.ll
+++ b/llvm/test/Transforms/LICM/pr38513.ll
@@ -7,16 +7,15 @@ define void @f1() {
   br label %bb1
 
 bb1:                                              ; preds = %bb6, %0
-  store i16 undef, i16* undef
+  store i16 undef, ptr undef
   br label %bb2
 
 bb2:                                              ; preds = %bb8, %bb1
-  %_tmp18.fca.0.gep = getelementptr inbounds [3 x i16], [3 x i16]* %lc1.10, i32 0, i32 0
-  %_tmp18.fca.0.load = load i16, i16* %_tmp18.fca.0.gep
-  %_tmp18.fca.1.gep = getelementptr inbounds [3 x i16], [3 x i16]* %lc1.10, i32 0, i32 1
-  %_tmp18.fca.1.load = load i16, i16* %_tmp18.fca.1.gep
-  %_tmp18.fca.2.gep = getelementptr inbounds [3 x i16], [3 x i16]* %lc1.10, i32 0, i32 2
-  %_tmp18.fca.2.load = load i16, i16* %_tmp18.fca.2.gep
+  %_tmp18.fca.0.load = load i16, ptr %lc1.10
+  %_tmp18.fca.1.gep = getelementptr inbounds [3 x i16], ptr %lc1.10, i32 0, i32 1
+  %_tmp18.fca.1.load = load i16, ptr %_tmp18.fca.1.gep
+  %_tmp18.fca.2.gep = getelementptr inbounds [3 x i16], ptr %lc1.10, i32 0, i32 2
+  %_tmp18.fca.2.load = load i16, ptr %_tmp18.fca.2.gep
   br label %bb8
 
 bb8:                                              ; preds = %bb2

diff  --git a/llvm/test/Transforms/LICM/pr40317.ll b/llvm/test/Transforms/LICM/pr40317.ll
index 82c791f3bde68..fb9283814d1c0 100644
--- a/llvm/test/Transforms/LICM/pr40317.ll
+++ b/llvm/test/Transforms/LICM/pr40317.ll
@@ -11,17 +11,17 @@ target triple = "s390x-ibm-linux"
 @g_18 = external dso_local global i64, align 8
 
 ; Function Attrs: argmemonly nounwind
-declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #1
+declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1) #1
 
 ; CHECK-LABEL: @func_94
 ; CHECK: bb:
-; CHECK: tail call void @llvm.memset.p0i8.i64
+; CHECK: tail call void @llvm.memset.p0.i64
 ; CHECK: load i32
 ; CHECK: bb6.licm:
 ; Function Attrs: noreturn nounwind
-define dso_local void @func_94(i16 %arg, i64* nocapture %arg1) local_unnamed_addr #3 {
+define dso_local void @func_94(i16 %arg, ptr nocapture %arg1) local_unnamed_addr #3 {
 bb:
-  tail call void @llvm.memset.p0i8.i64(i8* align 8 undef, i8 0, i64 80, i1 false)
+  tail call void @llvm.memset.p0.i64(ptr align 8 undef, i8 0, i64 80, i1 false)
   br label %bb3
 
 bb3:                                              ; preds = %bb13, %bb
@@ -29,11 +29,11 @@ bb3:                                              ; preds = %bb13, %bb
   br i1 %tmp5, label %bb6, label %bb13
 
 bb6:                                              ; preds = %bb3
-  %tmp7 = load i32, i32* getelementptr inbounds (%0, %0* @0, i64 0, i32 1, i32 2), align 1, !tbaa !11
+  %tmp7 = load i32, ptr getelementptr inbounds (%0, ptr @0, i64 0, i32 1, i32 2), align 1, !tbaa !11
   %tmp8 = zext i32 %tmp7 to i64
   %sext = shl i64 %tmp8, 56
   %tmp10 = ashr exact i64 %sext, 56
-  store i64 %tmp10, i64* %arg1, align 8, !tbaa !12
+  store i64 %tmp10, ptr %arg1, align 8, !tbaa !12
   br label %bb13
 
 bb13:                                             ; preds = %bb3, %bb6

diff  --git a/llvm/test/Transforms/LICM/pr42969.ll b/llvm/test/Transforms/LICM/pr42969.ll
index 428e64b9a6408..b3b07a3e59efb 100644
--- a/llvm/test/Transforms/LICM/pr42969.ll
+++ b/llvm/test/Transforms/LICM/pr42969.ll
@@ -1,6 +1,6 @@
 ; RUN: opt %s -S -scoped-noalias-aa -licm | FileCheck %s
 
-define i16 @main(i1 %a_b_mayalias, i16* %a, i16* %b) {
+define i16 @main(i1 %a_b_mayalias, ptr %a, ptr %b) {
 ; CHECK:       scalar.body:
 ; CHECK-NEXT:    [[J:%.*]] = phi i64
 ; CHECK-NEXT:    [[TMP3:%.*]] = load i16
@@ -17,10 +17,10 @@ outer:                                            ; preds = %scalar.cleanup, %en
 
 vector.ph:                                        ; preds = %outer
 ; MemoryUse(4) MayAlias
-  %tmp1 = load i16, i16* %a, align 1, !alias.scope !0, !tbaa !7
+  %tmp1 = load i16, ptr %a, align 1, !alias.scope !0, !tbaa !7
   %tmp2 = add i16 %tmp1, 1
 ; 1 = MemoryDef(4)
-  store i16 %tmp2, i16* %b, align 1, !alias.scope !3, !noalias !0, !tbaa !7
+  store i16 %tmp2, ptr %b, align 1, !alias.scope !3, !noalias !0, !tbaa !7
   br label %vector.body
 
 vector.body:                                      ; preds = %vector.body, %vector.ph
@@ -41,10 +41,10 @@ scalar.body:                                      ; preds = %scalar.body, %scala
 ; 3 = MemoryPhi({scalar.ph,5},{scalar.body,2})
   %j = phi i64 [ %j.next, %scalar.body ], [ %j.start, %scalar.ph ]
 ; MemoryUse(3) MayAlias
-  %tmp3 = load i16, i16* %a, align 1, !tbaa !7
+  %tmp3 = load i16, ptr %a, align 1, !tbaa !7
   %result = add i16 %tmp3, 1
 ; 2 = MemoryDef(3)
-  store i16 %result, i16* %b, align 1, !tbaa !7
+  store i16 %result, ptr %b, align 1, !tbaa !7
   %j.next = add nuw nsw i64 %j, 1
   %cmp2 = icmp ult i64 %j.next, 20
   br i1 %cmp2, label %scalar.body, label %scalar.cleanup

diff  --git a/llvm/test/Transforms/LICM/pr50367.ll b/llvm/test/Transforms/LICM/pr50367.ll
index e660d9f626e13..3f2b1a5303874 100644
--- a/llvm/test/Transforms/LICM/pr50367.ll
+++ b/llvm/test/Transforms/LICM/pr50367.ll
@@ -1,6 +1,6 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt -S -passes='loop-mssa(licm)' < %s | FileCheck %s
- at e = external dso_local global i32*, align 8
+ at e = external dso_local global ptr, align 8
 
 define void @main() {
 ; CHECK-LABEL: @main(
@@ -25,13 +25,13 @@ loop2:
   br i1 undef, label %loop2.latch, label %loop.latch
 
 loop2.latch:
-  store i32 0, i32* null, align 4
+  store i32 0, ptr null, align 4
   br label %loop2
 
 loop.latch:
-  store i32* null, i32** @e, align 8, !tbaa !0
-  %ptr = load i32*, i32** @e, align 8, !tbaa !0
-  store i32 0, i32* %ptr, align 4, !tbaa !4
+  store ptr null, ptr @e, align 8, !tbaa !0
+  %ptr = load ptr, ptr @e, align 8, !tbaa !0
+  store i32 0, ptr %ptr, align 4, !tbaa !4
   br label %loop1
 }
 

diff  --git a/llvm/test/Transforms/LICM/pr51333.ll b/llvm/test/Transforms/LICM/pr51333.ll
index 8832959e6c5a7..0ee4336c7fa5b 100644
--- a/llvm/test/Transforms/LICM/pr51333.ll
+++ b/llvm/test/Transforms/LICM/pr51333.ll
@@ -4,14 +4,14 @@
 ; This used to assert because was have a MemoryDef for what turns out to be
 ; a readnone call after EarlyCSE.
 
- at fn_ptr = external global void ()*, align 1
+ at fn_ptr = external global ptr, align 1
 
 define void @test() {
 ; CHECK-LABEL: @test(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[DO_BODY:%.*]]
 ; CHECK:       do.body:
-; CHECK-NEXT:    store void ()* @readnone_fn, void ()** @fn_ptr, align 8
+; CHECK-NEXT:    store ptr @readnone_fn, ptr @fn_ptr, align 8
 ; CHECK-NEXT:    call void @readnone_fn()
 ; CHECK-NEXT:    call void @foo()
 ; CHECK-NEXT:    br label [[DO_BODY]]
@@ -20,8 +20,8 @@ entry:
   br label %do.body
 
 do.body:
-  store void ()* @readnone_fn, void ()** @fn_ptr
-  %fn = load void ()*, void ()** @fn_ptr
+  store ptr @readnone_fn, ptr @fn_ptr
+  %fn = load ptr, ptr @fn_ptr
   call void %fn()
   call void @foo()
   br label %do.body

diff  --git a/llvm/test/Transforms/LICM/pr55672.ll b/llvm/test/Transforms/LICM/pr55672.ll
index b78d9073ad4ae..b95036ccb093f 100644
--- a/llvm/test/Transforms/LICM/pr55672.ll
+++ b/llvm/test/Transforms/LICM/pr55672.ll
@@ -1,18 +1,17 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt -S -passes='licm' < %s | FileCheck %s
 
-define void @test_01(i8 addrspace(1)* addrspace(1)* %arg, i32 %arg2) {
+define void @test_01(ptr addrspace(1) %arg, i32 %arg2) {
 ; CHECK-LABEL: @test_01(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP103:%.*]] = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* [[ARG:%.*]] unordered, align 8, !dereferenceable_or_null !0, !align !1
-; CHECK-NEXT:    [[TMP117:%.*]] = icmp eq i8 addrspace(1)* [[TMP103]], null
-; CHECK-NEXT:    [[TMP118:%.*]] = getelementptr inbounds i8, i8 addrspace(1)* [[TMP103]], i64 8
-; CHECK-NEXT:    [[TMP119:%.*]] = bitcast i8 addrspace(1)* [[TMP118]] to i32 addrspace(1)*
+; CHECK-NEXT:    [[TMP103:%.*]] = load atomic ptr addrspace(1), ptr addrspace(1) [[ARG:%.*]] unordered, align 8, !dereferenceable_or_null !0, !align !1
+; CHECK-NEXT:    [[TMP117:%.*]] = icmp eq ptr addrspace(1) [[TMP103]], null
+; CHECK-NEXT:    [[TMP118:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP103]], i64 8
 ; CHECK-NEXT:    br i1 [[TMP117]], label [[FAIL:%.*]], label [[PREHEADER:%.*]]
 ; CHECK:       fail:
 ; CHECK-NEXT:    ret void
 ; CHECK:       preheader:
-; CHECK-NEXT:    [[TMP157:%.*]] = load atomic i32, i32 addrspace(1)* [[TMP119]] unordered, align 8
+; CHECK-NEXT:    [[TMP157:%.*]] = load atomic i32, ptr addrspace(1) [[TMP118]] unordered, align 8
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[TMP151:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[TMP163:%.*]], [[LOOP]] ]
@@ -24,10 +23,9 @@ define void @test_01(i8 addrspace(1)* addrspace(1)* %arg, i32 %arg2) {
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
 entry:
-  %tmp103 = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* %arg unordered, align 8, !dereferenceable_or_null !0, !align !1
-  %tmp117 = icmp eq i8 addrspace(1)* %tmp103, null
-  %tmp118 = getelementptr inbounds i8, i8 addrspace(1)* %tmp103, i64 8
-  %tmp119 = bitcast i8 addrspace(1)* %tmp118 to i32 addrspace(1)*
+  %tmp103 = load atomic ptr addrspace(1), ptr addrspace(1) %arg unordered, align 8, !dereferenceable_or_null !0, !align !1
+  %tmp117 = icmp eq ptr addrspace(1) %tmp103, null
+  %tmp118 = getelementptr inbounds i8, ptr addrspace(1) %tmp103, i64 8
   br i1 %tmp117, label %fail, label %preheader
 
 fail:                                             ; preds = %entry
@@ -40,7 +38,7 @@ loop:                                             ; preds = %loop, %preheader
   %tmp151 = phi i32 [ 0, %preheader ], [ %tmp163, %loop ]
   %tmp152 = icmp ult i32 %tmp151, %arg2
   call void (i1, ...) @llvm.experimental.guard(i1 %tmp152) [ "deopt"() ]
-  %tmp157 = load atomic i32, i32 addrspace(1)* %tmp119 unordered, align 8
+  %tmp157 = load atomic i32, ptr addrspace(1) %tmp118 unordered, align 8
   %tmp158 = icmp ult i32 %tmp151, %tmp157
   call void (i1, ...) @llvm.experimental.guard(i1 %tmp158) [ "deopt"() ]
   %tmp163 = add i32 %tmp151, 1
@@ -48,13 +46,12 @@ loop:                                             ; preds = %loop, %preheader
 }
 
 ; FIXME: should be able to hoist load just as test_01
-define void @test_02(i8 addrspace(1)* addrspace(1)* %arg, i32 %arg2) {
+define void @test_02(ptr addrspace(1) %arg, i32 %arg2) {
 ; CHECK-LABEL: @test_02(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP103:%.*]] = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* [[ARG:%.*]] unordered, align 8, !dereferenceable_or_null !0, !align !1
-; CHECK-NEXT:    [[TMP117:%.*]] = icmp eq i8 addrspace(1)* [[TMP103]], null
-; CHECK-NEXT:    [[TMP118:%.*]] = getelementptr inbounds i8, i8 addrspace(1)* [[TMP103]], i64 8
-; CHECK-NEXT:    [[TMP119:%.*]] = bitcast i8 addrspace(1)* [[TMP118]] to i32 addrspace(1)*
+; CHECK-NEXT:    [[TMP103:%.*]] = load atomic ptr addrspace(1), ptr addrspace(1) [[ARG:%.*]] unordered, align 8, !dereferenceable_or_null !0, !align !1
+; CHECK-NEXT:    [[TMP117:%.*]] = icmp eq ptr addrspace(1) [[TMP103]], null
+; CHECK-NEXT:    [[TMP118:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP103]], i64 8
 ; CHECK-NEXT:    [[FREEZE:%.*]] = freeze i1 [[TMP117]]
 ; CHECK-NEXT:    br i1 [[FREEZE]], label [[FAIL:%.*]], label [[PREHEADER:%.*]]
 ; CHECK:       fail:
@@ -65,17 +62,16 @@ define void @test_02(i8 addrspace(1)* addrspace(1)* %arg, i32 %arg2) {
 ; CHECK-NEXT:    [[TMP151:%.*]] = phi i32 [ 0, [[PREHEADER]] ], [ [[TMP163:%.*]], [[LOOP]] ]
 ; CHECK-NEXT:    [[TMP152:%.*]] = icmp ult i32 [[TMP151]], [[ARG2:%.*]]
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[TMP152]]) [ "deopt"() ]
-; CHECK-NEXT:    [[TMP157:%.*]] = load atomic i32, i32 addrspace(1)* [[TMP119]] unordered, align 8
+; CHECK-NEXT:    [[TMP157:%.*]] = load atomic i32, ptr addrspace(1) [[TMP118]] unordered, align 8
 ; CHECK-NEXT:    [[TMP158:%.*]] = icmp ult i32 [[TMP151]], [[TMP157]]
 ; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[TMP158]]) [ "deopt"() ]
 ; CHECK-NEXT:    [[TMP163]] = add i32 [[TMP151]], 1
 ; CHECK-NEXT:    br label [[LOOP]]
 ;
 entry:
-  %tmp103 = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* %arg unordered, align 8, !dereferenceable_or_null !0, !align !1
-  %tmp117 = icmp eq i8 addrspace(1)* %tmp103, null
-  %tmp118 = getelementptr inbounds i8, i8 addrspace(1)* %tmp103, i64 8
-  %tmp119 = bitcast i8 addrspace(1)* %tmp118 to i32 addrspace(1)*
+  %tmp103 = load atomic ptr addrspace(1), ptr addrspace(1) %arg unordered, align 8, !dereferenceable_or_null !0, !align !1
+  %tmp117 = icmp eq ptr addrspace(1) %tmp103, null
+  %tmp118 = getelementptr inbounds i8, ptr addrspace(1) %tmp103, i64 8
   %freeze = freeze i1 %tmp117
   br i1 %freeze, label %fail, label %preheader
 
@@ -89,7 +85,7 @@ loop:                                             ; preds = %loop, %preheader
   %tmp151 = phi i32 [ 0, %preheader ], [ %tmp163, %loop ]
   %tmp152 = icmp ult i32 %tmp151, %arg2
   call void (i1, ...) @llvm.experimental.guard(i1 %tmp152) [ "deopt"() ]
-  %tmp157 = load atomic i32, i32 addrspace(1)* %tmp119 unordered, align 8
+  %tmp157 = load atomic i32, ptr addrspace(1) %tmp118 unordered, align 8
   %tmp158 = icmp ult i32 %tmp151, %tmp157
   call void (i1, ...) @llvm.experimental.guard(i1 %tmp158) [ "deopt"() ]
   %tmp163 = add i32 %tmp151, 1

diff  --git a/llvm/test/Transforms/LICM/pragma-licm-disable.ll b/llvm/test/Transforms/LICM/pragma-licm-disable.ll
index 16c0125ebe82b..453202984f2d2 100644
--- a/llvm/test/Transforms/LICM/pragma-licm-disable.ll
+++ b/llvm/test/Transforms/LICM/pragma-licm-disable.ll
@@ -6,13 +6,13 @@
 ; CHECK: entry:
 ; CHECK-NOT: load
 ; CHECK: do.body:
-; CHECK: load i64, i64* bitcast (i32** @in to i64*)
+; CHECK: load i64, ptr @in
 
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-pc-windows-msvc"
 
- at in = internal unnamed_addr global i32* null, align 8
- at out = internal unnamed_addr global i32* null, align 8
+ at in = internal unnamed_addr global ptr null, align 8
+ at out = internal unnamed_addr global ptr null, align 8
 
 define void @licm_disable(i32 %N) {
 entry:
@@ -20,8 +20,8 @@ entry:
 
 do.body:                                          ; preds = %entry
   %i.0 = phi i32 [ 0, %entry ], [ %inc, %do.body ]
-  %v1 = load i64, i64* bitcast (i32** @in to i64*), align 8
-  store i64 %v1, i64* bitcast (i32** @out to i64*), align 8
+  %v1 = load i64, ptr @in, align 8
+  store i64 %v1, ptr @out, align 8
   %inc = add nsw i32 %i.0, 1
   %cmp = icmp slt i32 %inc, %N
   br i1 %cmp, label %do.body, label %do.end, !llvm.loop !1

diff  --git a/llvm/test/Transforms/LICM/preheader-safe.ll b/llvm/test/Transforms/LICM/preheader-safe.ll
index dcad1671b7edf..f27e0b7c9f46c 100644
--- a/llvm/test/Transforms/LICM/preheader-safe.ll
+++ b/llvm/test/Transforms/LICM/preheader-safe.ll
@@ -5,7 +5,7 @@ declare void @use_nothrow(i64 %a) nounwind
 declare void @use(i64 %a)
 declare void @maythrow()
 
-define void @nothrow(i64 %x, i64 %y, i1* %cond) {
+define void @nothrow(i64 %x, i64 %y, ptr %cond) {
 ; CHECK-LABEL: nothrow
 ; CHECK-LABEL: entry
 ; CHECK: %div = udiv i64 %x, %y
@@ -24,7 +24,7 @@ loop2:
 }
 
 ; The udiv is guarantee to execute if the loop is
-define void @throw_header_after(i64 %x, i64 %y, i1* %cond) {
+define void @throw_header_after(i64 %x, i64 %y, ptr %cond) {
 ; CHECK-LABEL: throw_header_after
 ; CHECK: %div = udiv i64 %x, %y
 ; CHECK-LABEL: loop
@@ -37,10 +37,10 @@ loop:                                         ; preds = %entry, %for.inc
   call void @use(i64 %div)
   br label %loop
 }
-define void @throw_header_after_rec(i64* %xp, i64* %yp, i1* %cond) {
+define void @throw_header_after_rec(ptr %xp, ptr %yp, ptr %cond) {
 ; CHECK-LABEL: throw_header_after_rec
-; CHECK: %x = load i64, i64* %xp
-; CHECK: %y = load i64, i64* %yp
+; CHECK: %x = load i64, ptr %xp
+; CHECK: %y = load i64, ptr %yp
 ; CHECK: %div = udiv i64 %x, %y
 ; CHECK-LABEL: loop
 ; CHECK: call void @use(i64 %div)
@@ -48,8 +48,8 @@ entry:
   br label %loop
 
 loop:                                         ; preds = %entry, %for.inc
-  %x = load i64, i64* %xp
-  %y = load i64, i64* %yp
+  %x = load i64, ptr %xp
+  %y = load i64, ptr %yp
   %div = udiv i64 %x, %y
   call void @use(i64 %div) readonly
   br label %loop
@@ -57,11 +57,11 @@ loop:                                         ; preds = %entry, %for.inc
 
 ; Similiar to the above, but the hoistable instruction (%y in this case)
 ; happens not to be the first instruction in the block.
-define void @throw_header_after_nonfirst(i64* %xp, i64* %yp, i1* %cond) {
+define void @throw_header_after_nonfirst(ptr %xp, ptr %yp, ptr %cond) {
 ; CHECK-LABEL: throw_header_after_nonfirst
-; CHECK: %y = load i64, i64* %yp
+; CHECK: %y = load i64, ptr %yp
 ; CHECK-LABEL: loop
-; CHECK: %x = load i64, i64* %gep
+; CHECK: %x = load i64, ptr %gep
 ; CHECK: %div = udiv i64 %x, %y
 ; CHECK: call void @use(i64 %div)
 entry:
@@ -69,16 +69,16 @@ entry:
 
 loop:                                         ; preds = %entry, %for.inc
   %iv = phi i64 [0, %entry], [%div, %loop]
-  %gep = getelementptr i64, i64* %xp, i64 %iv
-  %x = load i64, i64* %gep
-  %y = load i64, i64* %yp
+  %gep = getelementptr i64, ptr %xp, i64 %iv
+  %x = load i64, ptr %gep
+  %y = load i64, ptr %yp
   %div = udiv i64 %x, %y
   call void @use(i64 %div) readonly
   br label %loop
 }
 
 ; Negative test
-define void @throw_header_before(i64 %x, i64 %y, i1* %cond) {
+define void @throw_header_before(i64 %x, i64 %y, ptr %cond) {
 ; CHECK-LABEL: throw_header_before
 ; CHECK-LABEL: loop
 ; CHECK: %div = udiv i64 %x, %y

diff  --git a/llvm/test/Transforms/LICM/promote-atomic.ll b/llvm/test/Transforms/LICM/promote-atomic.ll
index 86107d738cea6..7ce81ee270cea 100644
--- a/llvm/test/Transforms/LICM/promote-atomic.ll
+++ b/llvm/test/Transforms/LICM/promote-atomic.ll
@@ -1,30 +1,30 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt -S -licm < %s | FileCheck %s
 
-%class.LiveThread = type { i64, %class.LiveThread* }
+%class.LiveThread = type { i64, ptr }
 
 @globallive = external dso_local global i64, align 8
 
 ; The store should not be sunk (via scalar promotion) past the cmpxchg.
 
-define void @test(%class.LiveThread* %live_thread) {
+define void @test(ptr %live_thread) {
 ; CHECK-LABEL: @test(
-; CHECK-NEXT:    [[NEXT_UNPROCESSED_:%.*]] = getelementptr inbounds [[CLASS_LIVETHREAD:%.*]], %class.LiveThread* [[LIVE_THREAD:%.*]], i64 0, i32 1
+; CHECK-NEXT:    [[NEXT_UNPROCESSED_:%.*]] = getelementptr inbounds [[CLASS_LIVETHREAD:%.*]], ptr [[LIVE_THREAD:%.*]], i64 0, i32 1
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
-; CHECK-NEXT:    store %class.LiveThread* undef, %class.LiveThread** [[NEXT_UNPROCESSED_]], align 8
-; CHECK-NEXT:    [[XCHG:%.*]] = cmpxchg weak i64* @globallive, i64 undef, i64 undef release monotonic, align 8
+; CHECK-NEXT:    store ptr undef, ptr [[NEXT_UNPROCESSED_]], align 8
+; CHECK-NEXT:    [[XCHG:%.*]] = cmpxchg weak ptr @globallive, i64 undef, i64 undef release monotonic, align 8
 ; CHECK-NEXT:    [[DONE:%.*]] = extractvalue { i64, i1 } [[XCHG]], 1
 ; CHECK-NEXT:    br i1 [[DONE]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    ret void
 ;
-  %next_unprocessed_ = getelementptr inbounds %class.LiveThread, %class.LiveThread* %live_thread, i64 0, i32 1
+  %next_unprocessed_ = getelementptr inbounds %class.LiveThread, ptr %live_thread, i64 0, i32 1
   br label %loop
 
 loop:
-  store %class.LiveThread* undef, %class.LiveThread** %next_unprocessed_, align 8
-  %xchg = cmpxchg weak i64* @globallive, i64 undef, i64 undef release monotonic, align 8
+  store ptr undef, ptr %next_unprocessed_, align 8
+  %xchg = cmpxchg weak ptr @globallive, i64 undef, i64 undef release monotonic, align 8
   %done = extractvalue { i64, i1 } %xchg, 1
   br i1 %done, label %exit, label %loop
 

diff  --git a/llvm/test/Transforms/LICM/promote-capture.ll b/llvm/test/Transforms/LICM/promote-capture.ll
index 7d4e5868ea525..5cbe158e47a3c 100644
--- a/llvm/test/Transforms/LICM/promote-capture.ll
+++ b/llvm/test/Transforms/LICM/promote-capture.ll
@@ -2,14 +2,14 @@
 ; RUN: opt -S -passes='loop-mssa(licm)' < %s | FileCheck %s
 
 declare i1 @cond(i32 %v) readnone
-declare void @capture(i32* %p) readnone
+declare void @capture(ptr %p) readnone
 
 define void @test_captured_after_loop(i32 %len) {
 ; CHECK-LABEL: @test_captured_after_loop(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[COUNT:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    store i32 0, i32* [[COUNT]], align 4
-; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, i32* [[COUNT]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[COUNT]], align 4
+; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]
@@ -26,13 +26,13 @@ define void @test_captured_after_loop(i32 %len) {
 ; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[C_INC1_LCSSA:%.*]] = phi i32 [ [[C_INC1]], [[LATCH]] ]
-; CHECK-NEXT:    store i32 [[C_INC1_LCSSA]], i32* [[COUNT]], align 4
-; CHECK-NEXT:    call void @capture(i32* [[COUNT]])
+; CHECK-NEXT:    store i32 [[C_INC1_LCSSA]], ptr [[COUNT]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[COUNT]])
 ; CHECK-NEXT:    ret void
 ;
 entry:
   %count = alloca i32
-  store i32 0, i32* %count
+  store i32 0, ptr %count
   br label %loop
 
 loop:
@@ -41,9 +41,9 @@ loop:
   br i1 %cond, label %if, label %latch
 
 if:
-  %c = load i32, i32* %count
+  %c = load i32, ptr %count
   %c.inc = add i32 %c, 1
-  store i32 %c.inc, i32* %count
+  store i32 %c.inc, ptr %count
   br label %latch
 
 latch:
@@ -52,7 +52,7 @@ latch:
   br i1 %cmp, label %exit, label %loop
 
 exit:
-  call void @capture(i32* %count)
+  call void @capture(ptr %count)
   ret void
 }
 
@@ -60,8 +60,8 @@ define void @test_captured_in_loop(i32 %len) {
 ; CHECK-LABEL: @test_captured_in_loop(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[COUNT:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    store i32 0, i32* [[COUNT]], align 4
-; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, i32* [[COUNT]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[COUNT]], align 4
+; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]
@@ -70,8 +70,8 @@ define void @test_captured_in_loop(i32 %len) {
 ; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]
 ; CHECK:       if:
 ; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 1
-; CHECK-NEXT:    store i32 [[C_INC]], i32* [[COUNT]], align 4
-; CHECK-NEXT:    call void @capture(i32* [[COUNT]])
+; CHECK-NEXT:    store i32 [[C_INC]], ptr [[COUNT]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[COUNT]])
 ; CHECK-NEXT:    br label [[LATCH]]
 ; CHECK:       latch:
 ; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]
@@ -83,7 +83,7 @@ define void @test_captured_in_loop(i32 %len) {
 ;
 entry:
   %count = alloca i32
-  store i32 0, i32* %count
+  store i32 0, ptr %count
   br label %loop
 
 loop:
@@ -92,10 +92,10 @@ loop:
   br i1 %cond, label %if, label %latch
 
 if:
-  %c = load i32, i32* %count
+  %c = load i32, ptr %count
   %c.inc = add i32 %c, 1
-  store i32 %c.inc, i32* %count
-  call void @capture(i32* %count)
+  store i32 %c.inc, ptr %count
+  call void @capture(ptr %count)
   br label %latch
 
 latch:
@@ -111,9 +111,9 @@ define void @test_captured_before_loop(i32 %len) {
 ; CHECK-LABEL: @test_captured_before_loop(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[COUNT:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    store i32 0, i32* [[COUNT]], align 4
-; CHECK-NEXT:    call void @capture(i32* [[COUNT]])
-; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, i32* [[COUNT]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[COUNT]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[COUNT]])
+; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]
@@ -122,7 +122,7 @@ define void @test_captured_before_loop(i32 %len) {
 ; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]
 ; CHECK:       if:
 ; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 1
-; CHECK-NEXT:    store i32 [[C_INC]], i32* [[COUNT]], align 4
+; CHECK-NEXT:    store i32 [[C_INC]], ptr [[COUNT]], align 4
 ; CHECK-NEXT:    br label [[LATCH]]
 ; CHECK:       latch:
 ; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]
@@ -134,8 +134,8 @@ define void @test_captured_before_loop(i32 %len) {
 ;
 entry:
   %count = alloca i32
-  store i32 0, i32* %count
-  call void @capture(i32* %count)
+  store i32 0, ptr %count
+  call void @capture(ptr %count)
   br label %loop
 
 loop:
@@ -144,9 +144,9 @@ loop:
   br i1 %cond, label %if, label %latch
 
 if:
-  %c = load i32, i32* %count
+  %c = load i32, ptr %count
   %c.inc = add i32 %c, 1
-  store i32 %c.inc, i32* %count
+  store i32 %c.inc, ptr %count
   br label %latch
 
 latch:
@@ -160,12 +160,12 @@ exit:
 
 ; Should not get promoted, because the pointer is captured and may not
 ; be thread-local.
-define void @test_captured_before_loop_byval(i32* byval(i32) align 4 %count, i32 %len) {
+define void @test_captured_before_loop_byval(ptr byval(i32) align 4 %count, i32 %len) {
 ; CHECK-LABEL: @test_captured_before_loop_byval(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    store i32 0, i32* [[COUNT:%.*]], align 4
-; CHECK-NEXT:    call void @capture(i32* [[COUNT]])
-; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, i32* [[COUNT]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[COUNT:%.*]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[COUNT]])
+; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]
@@ -174,7 +174,7 @@ define void @test_captured_before_loop_byval(i32* byval(i32) align 4 %count, i32
 ; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]
 ; CHECK:       if:
 ; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 1
-; CHECK-NEXT:    store i32 [[C_INC]], i32* [[COUNT]], align 4
+; CHECK-NEXT:    store i32 [[C_INC]], ptr [[COUNT]], align 4
 ; CHECK-NEXT:    br label [[LATCH]]
 ; CHECK:       latch:
 ; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]
@@ -185,8 +185,8 @@ define void @test_captured_before_loop_byval(i32* byval(i32) align 4 %count, i32
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  store i32 0, i32* %count
-  call void @capture(i32* %count)
+  store i32 0, ptr %count
+  call void @capture(ptr %count)
   br label %loop
 
 loop:
@@ -195,9 +195,9 @@ loop:
   br i1 %cond, label %if, label %latch
 
 if:
-  %c = load i32, i32* %count
+  %c = load i32, ptr %count
   %c.inc = add i32 %c, 1
-  store i32 %c.inc, i32* %count
+  store i32 %c.inc, ptr %count
   br label %latch
 
 latch:
@@ -209,11 +209,11 @@ exit:
   ret void
 }
 
-define void @test_captured_after_loop_byval(i32* byval(i32) align 4 %count, i32 %len) {
+define void @test_captured_after_loop_byval(ptr byval(i32) align 4 %count, i32 %len) {
 ; CHECK-LABEL: @test_captured_after_loop_byval(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    store i32 0, i32* [[COUNT:%.*]], align 4
-; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, i32* [[COUNT]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[COUNT:%.*]], align 4
+; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]
@@ -230,12 +230,12 @@ define void @test_captured_after_loop_byval(i32* byval(i32) align 4 %count, i32
 ; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[C_INC1_LCSSA:%.*]] = phi i32 [ [[C_INC1]], [[LATCH]] ]
-; CHECK-NEXT:    store i32 [[C_INC1_LCSSA]], i32* [[COUNT]], align 4
-; CHECK-NEXT:    call void @capture(i32* [[COUNT]])
+; CHECK-NEXT:    store i32 [[C_INC1_LCSSA]], ptr [[COUNT]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[COUNT]])
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  store i32 0, i32* %count
+  store i32 0, ptr %count
   br label %loop
 
 loop:
@@ -244,9 +244,9 @@ loop:
   br i1 %cond, label %if, label %latch
 
 if:
-  %c = load i32, i32* %count
+  %c = load i32, ptr %count
   %c.inc = add i32 %c, 1
-  store i32 %c.inc, i32* %count
+  store i32 %c.inc, ptr %count
   br label %latch
 
 latch:
@@ -255,6 +255,6 @@ latch:
   br i1 %cmp, label %exit, label %loop
 
 exit:
-  call void @capture(i32* %count)
+  call void @capture(ptr %count)
   ret void
 }

diff  --git a/llvm/test/Transforms/LICM/promote-order.ll b/llvm/test/Transforms/LICM/promote-order.ll
index 4eb2ff56aca09..6cb129e0a72a1 100644
--- a/llvm/test/Transforms/LICM/promote-order.ll
+++ b/llvm/test/Transforms/LICM/promote-order.ll
@@ -6,12 +6,12 @@
 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"
 target triple = "x86_64-apple-macosx10.8.0"
 
- at p = external global i8*
+ at p = external global ptr
 
-define i32* @_Z4doiti(i32 %n, float* %tmp1, i32* %tmp3) nounwind {
+define ptr @_Z4doiti(i32 %n, ptr %tmp1, ptr %tmp3) nounwind {
 ; CHECK-LABEL: for.body.lr.ph:
-; CHECK: store float 1.000000e+00, float* %tmp1
-; CHECK: store i32 1, i32* %tmp3
+; CHECK: store float 1.000000e+00, ptr %tmp1
+; CHECK: store i32 1, ptr %tmp3
 ; CHECK-LABEL: for.cond.for.end_crit_edge:
 
 entry:
@@ -23,19 +23,19 @@ for.body.lr.ph:                                   ; preds = %entry
 
 for.body:                                         ; preds = %for.body, %for.body.lr.ph
   %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
-  store float 1.000000e+00, float* %tmp1, align 4, !tbaa !1
-  store i32 1, i32* %tmp3, align 4, !tbaa !2
+  store float 1.000000e+00, ptr %tmp1, align 4, !tbaa !1
+  store i32 1, ptr %tmp3, align 4, !tbaa !2
   %inc = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
 
 for.cond.for.end_crit_edge:                       ; preds = %for.body
-  %split = phi i32* [ %tmp3, %for.body ]
+  %split = phi ptr [ %tmp3, %for.body ]
   br label %for.end
 
 for.end:                                          ; preds = %for.cond.for.end_crit_edge, %entry
-  %r.0.lcssa = phi i32* [ %split, %for.cond.for.end_crit_edge ], [ undef, %entry ]
-  ret i32* %r.0.lcssa
+  %r.0.lcssa = phi ptr [ %split, %for.cond.for.end_crit_edge ], [ undef, %entry ]
+  ret ptr %r.0.lcssa
 }
 
 !0 = !{!"minimal TBAA"}

diff  --git a/llvm/test/Transforms/LICM/promote-tls.ll b/llvm/test/Transforms/LICM/promote-tls.ll
index d7d23273acf08..4e4eecc40a10d 100644
--- a/llvm/test/Transforms/LICM/promote-tls.ll
+++ b/llvm/test/Transforms/LICM/promote-tls.ll
@@ -8,30 +8,29 @@
 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"
 target triple = "x86_64-linux-generic"
 
- at p = external global i8*
+ at p = external global ptr
 
-declare i8* @malloc(i64)
+declare ptr @malloc(i64)
 
 ; Exercise the TLS case
-define i32* @test(i32 %n) {
+define ptr @test(i32 %n) {
 ; CHECK-LABEL: @test(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[MEM:%.*]] = call noalias dereferenceable(16) i8* @malloc(i64 16)
-; CHECK-NEXT:    [[ADDR:%.*]] = bitcast i8* [[MEM]] to i32*
+; CHECK-NEXT:    [[MEM:%.*]] = call noalias dereferenceable(16) ptr @malloc(i64 16)
 ; CHECK-NEXT:    br label [[FOR_BODY_LR_PH:%.*]]
 ; CHECK:       for.body.lr.ph:
-; CHECK-NEXT:    [[ADDR_PROMOTED:%.*]] = load i32, i32* [[ADDR]], align 4
+; CHECK-NEXT:    [[ADDR_PROMOTED:%.*]] = load i32, ptr [[MEM]], align 4
 ; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]
 ; CHECK:       for.header:
 ; CHECK-NEXT:    [[NEW1:%.*]] = phi i32 [ [[ADDR_PROMOTED]], [[FOR_BODY_LR_PH]] ], [ [[NEW:%.*]], [[FOR_BODY:%.*]] ]
 ; CHECK-NEXT:    [[I_02:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[GUARD:%.*]] = load atomic i8*, i8** @p monotonic, align 8
-; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq i8* [[GUARD]], null
+; CHECK-NEXT:    [[GUARD:%.*]] = load atomic ptr, ptr @p monotonic, align 8
+; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq ptr [[GUARD]], null
 ; CHECK-NEXT:    br i1 [[EXITCMP]], label [[FOR_BODY]], label [[EARLY_EXIT:%.*]]
 ; CHECK:       early-exit:
 ; CHECK-NEXT:    [[NEW1_LCSSA:%.*]] = phi i32 [ [[NEW1]], [[FOR_HEADER]] ]
-; CHECK-NEXT:    store i32 [[NEW1_LCSSA]], i32* [[ADDR]], align 4
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    store i32 [[NEW1_LCSSA]], ptr [[MEM]], align 4
+; CHECK-NEXT:    ret ptr null
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[NEW]] = add i32 [[NEW1]], 1
 ; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_02]], 1
@@ -39,14 +38,13 @@ define i32* @test(i32 %n) {
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_HEADER]], label [[FOR_COND_FOR_END_CRIT_EDGE:%.*]]
 ; CHECK:       for.cond.for.end_crit_edge:
 ; CHECK-NEXT:    [[NEW_LCSSA:%.*]] = phi i32 [ [[NEW]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[SPLIT:%.*]] = phi i32* [ [[ADDR]], [[FOR_BODY]] ]
-; CHECK-NEXT:    store i32 [[NEW_LCSSA]], i32* [[ADDR]], align 4
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    [[SPLIT:%.*]] = phi ptr [ [[MEM]], [[FOR_BODY]] ]
+; CHECK-NEXT:    store i32 [[NEW_LCSSA]], ptr [[MEM]], align 4
+; CHECK-NEXT:    ret ptr null
 ;
 entry:
   ;; ignore the required null check for simplicity
-  %mem = call dereferenceable(16) noalias i8* @malloc(i64 16)
-  %addr = bitcast i8* %mem to i32*
+  %mem = call dereferenceable(16) noalias ptr @malloc(i64 16)
   br label %for.body.lr.ph
 
 for.body.lr.ph:                                   ; preds = %entry
@@ -54,47 +52,46 @@ for.body.lr.ph:                                   ; preds = %entry
 
 for.header:
   %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
-  %old = load i32, i32* %addr, align 4
+  %old = load i32, ptr %mem, align 4
   ; deliberate impossible to analyze branch
-  %guard = load atomic i8*, i8** @p monotonic, align 8
-  %exitcmp = icmp eq i8* %guard, null
+  %guard = load atomic ptr, ptr @p monotonic, align 8
+  %exitcmp = icmp eq ptr %guard, null
   br i1 %exitcmp, label %for.body, label %early-exit
 
 early-exit:
-  ret i32* null
+  ret ptr null
 
 for.body:
   %new = add i32 %old, 1
-  store i32 %new, i32* %addr, align 4
+  store i32 %new, ptr %mem, align 4
   %inc = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.header, label %for.cond.for.end_crit_edge
 
 for.cond.for.end_crit_edge:                       ; preds = %for.body
-  %split = phi i32* [ %addr, %for.body ]
-  ret i32* null
+  %split = phi ptr [ %mem, %for.body ]
+  ret ptr null
 }
 
 ; Stack allocations can also be thread-local
-define i32* @test2(i32 %n) {
+define ptr @test2(i32 %n) {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[MEM:%.*]] = alloca i8, i32 16, align 1
-; CHECK-NEXT:    [[ADDR:%.*]] = bitcast i8* [[MEM]] to i32*
 ; CHECK-NEXT:    br label [[FOR_BODY_LR_PH:%.*]]
 ; CHECK:       for.body.lr.ph:
-; CHECK-NEXT:    [[ADDR_PROMOTED:%.*]] = load i32, i32* [[ADDR]], align 4
+; CHECK-NEXT:    [[ADDR_PROMOTED:%.*]] = load i32, ptr [[MEM]], align 4
 ; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]
 ; CHECK:       for.header:
 ; CHECK-NEXT:    [[NEW1:%.*]] = phi i32 [ [[ADDR_PROMOTED]], [[FOR_BODY_LR_PH]] ], [ [[NEW:%.*]], [[FOR_BODY:%.*]] ]
 ; CHECK-NEXT:    [[I_02:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[GUARD:%.*]] = load atomic i8*, i8** @p monotonic, align 8
-; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq i8* [[GUARD]], null
+; CHECK-NEXT:    [[GUARD:%.*]] = load atomic ptr, ptr @p monotonic, align 8
+; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq ptr [[GUARD]], null
 ; CHECK-NEXT:    br i1 [[EXITCMP]], label [[FOR_BODY]], label [[EARLY_EXIT:%.*]]
 ; CHECK:       early-exit:
 ; CHECK-NEXT:    [[NEW1_LCSSA:%.*]] = phi i32 [ [[NEW1]], [[FOR_HEADER]] ]
-; CHECK-NEXT:    store i32 [[NEW1_LCSSA]], i32* [[ADDR]], align 4
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    store i32 [[NEW1_LCSSA]], ptr [[MEM]], align 4
+; CHECK-NEXT:    ret ptr null
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[NEW]] = add i32 [[NEW1]], 1
 ; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_02]], 1
@@ -102,13 +99,12 @@ define i32* @test2(i32 %n) {
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_HEADER]], label [[FOR_COND_FOR_END_CRIT_EDGE:%.*]]
 ; CHECK:       for.cond.for.end_crit_edge:
 ; CHECK-NEXT:    [[NEW_LCSSA:%.*]] = phi i32 [ [[NEW]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[SPLIT:%.*]] = phi i32* [ [[ADDR]], [[FOR_BODY]] ]
-; CHECK-NEXT:    store i32 [[NEW_LCSSA]], i32* [[ADDR]], align 4
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    [[SPLIT:%.*]] = phi ptr [ [[MEM]], [[FOR_BODY]] ]
+; CHECK-NEXT:    store i32 [[NEW_LCSSA]], ptr [[MEM]], align 4
+; CHECK-NEXT:    ret ptr null
 ;
 entry:
   %mem = alloca i8, i32 16
-  %addr = bitcast i8* %mem to i32*
   br label %for.body.lr.ph
 
 for.body.lr.ph:                                   ; preds = %entry
@@ -116,49 +112,48 @@ for.body.lr.ph:                                   ; preds = %entry
 
 for.header:
   %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
-  %old = load i32, i32* %addr, align 4
+  %old = load i32, ptr %mem, align 4
   ; deliberate impossible to analyze branch
-  %guard = load atomic i8*, i8** @p monotonic, align 8
-  %exitcmp = icmp eq i8* %guard, null
+  %guard = load atomic ptr, ptr @p monotonic, align 8
+  %exitcmp = icmp eq ptr %guard, null
   br i1 %exitcmp, label %for.body, label %early-exit
 
 early-exit:
-  ret i32* null
+  ret ptr null
 
 for.body:
   %new = add i32 %old, 1
-  store i32 %new, i32* %addr, align 4
+  store i32 %new, ptr %mem, align 4
   %inc = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.header, label %for.cond.for.end_crit_edge
 
 for.cond.for.end_crit_edge:                       ; preds = %for.body
-  %split = phi i32* [ %addr, %for.body ]
-  ret i32* null
+  %split = phi ptr [ %mem, %for.body ]
+  ret ptr null
 }
 
-declare noalias i8* @custom_malloc(i64)
+declare noalias ptr @custom_malloc(i64)
 
 ; Custom allocation function marked via noalias.
-define i32* @test_custom_malloc(i32 %n) {
+define ptr @test_custom_malloc(i32 %n) {
 ; CHECK-LABEL: @test_custom_malloc(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[MEM:%.*]] = call noalias dereferenceable(16) i8* @custom_malloc(i64 16)
-; CHECK-NEXT:    [[ADDR:%.*]] = bitcast i8* [[MEM]] to i32*
+; CHECK-NEXT:    [[MEM:%.*]] = call noalias dereferenceable(16) ptr @custom_malloc(i64 16)
 ; CHECK-NEXT:    br label [[FOR_BODY_LR_PH:%.*]]
 ; CHECK:       for.body.lr.ph:
-; CHECK-NEXT:    [[ADDR_PROMOTED:%.*]] = load i32, i32* [[ADDR]], align 4
+; CHECK-NEXT:    [[ADDR_PROMOTED:%.*]] = load i32, ptr [[MEM]], align 4
 ; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]
 ; CHECK:       for.header:
 ; CHECK-NEXT:    [[NEW1:%.*]] = phi i32 [ [[ADDR_PROMOTED]], [[FOR_BODY_LR_PH]] ], [ [[NEW:%.*]], [[FOR_BODY:%.*]] ]
 ; CHECK-NEXT:    [[I_02:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[GUARD:%.*]] = load volatile i8*, i8** @p, align 8
-; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq i8* [[GUARD]], null
+; CHECK-NEXT:    [[GUARD:%.*]] = load volatile ptr, ptr @p, align 8
+; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq ptr [[GUARD]], null
 ; CHECK-NEXT:    br i1 [[EXITCMP]], label [[FOR_BODY]], label [[EARLY_EXIT:%.*]]
 ; CHECK:       early-exit:
 ; CHECK-NEXT:    [[NEW1_LCSSA:%.*]] = phi i32 [ [[NEW1]], [[FOR_HEADER]] ]
-; CHECK-NEXT:    store i32 [[NEW1_LCSSA]], i32* [[ADDR]], align 4
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    store i32 [[NEW1_LCSSA]], ptr [[MEM]], align 4
+; CHECK-NEXT:    ret ptr null
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[NEW]] = add i32 [[NEW1]], 1
 ; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_02]], 1
@@ -166,13 +161,12 @@ define i32* @test_custom_malloc(i32 %n) {
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_HEADER]], label [[FOR_COND_FOR_END_CRIT_EDGE:%.*]]
 ; CHECK:       for.cond.for.end_crit_edge:
 ; CHECK-NEXT:    [[NEW_LCSSA:%.*]] = phi i32 [ [[NEW]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[SPLIT:%.*]] = phi i32* [ [[ADDR]], [[FOR_BODY]] ]
-; CHECK-NEXT:    store i32 [[NEW_LCSSA]], i32* [[ADDR]], align 4
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    [[SPLIT:%.*]] = phi ptr [ [[MEM]], [[FOR_BODY]] ]
+; CHECK-NEXT:    store i32 [[NEW_LCSSA]], ptr [[MEM]], align 4
+; CHECK-NEXT:    ret ptr null
 ;
 entry:
-  %mem = call dereferenceable(16) noalias i8* @custom_malloc(i64 16)
-  %addr = bitcast i8* %mem to i32*
+  %mem = call dereferenceable(16) noalias ptr @custom_malloc(i64 16)
   br label %for.body.lr.ph
 
 for.body.lr.ph:                                   ; preds = %entry
@@ -180,60 +174,58 @@ for.body.lr.ph:                                   ; preds = %entry
 
 for.header:
   %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
-  %old = load i32, i32* %addr, align 4
+  %old = load i32, ptr %mem, align 4
   ; deliberate impossible to analyze branch
-  %guard = load volatile i8*, i8** @p
-  %exitcmp = icmp eq i8* %guard, null
+  %guard = load volatile ptr, ptr @p
+  %exitcmp = icmp eq ptr %guard, null
   br i1 %exitcmp, label %for.body, label %early-exit
 
 early-exit:
-  ret i32* null
+  ret ptr null
 
 for.body:
   %new = add i32 %old, 1
-  store i32 %new, i32* %addr, align 4
+  store i32 %new, ptr %mem, align 4
   %inc = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.header, label %for.cond.for.end_crit_edge
 
 for.cond.for.end_crit_edge:                       ; preds = %for.body
-  %split = phi i32* [ %addr, %for.body ]
-  ret i32* null
+  %split = phi ptr [ %mem, %for.body ]
+  ret ptr null
 }
 
-declare i8* @not_malloc(i64)
+declare ptr @not_malloc(i64)
 
 ; Negative test - not an allocation function.
-define i32* @test_neg_not_malloc(i32 %n) {
+define ptr @test_neg_not_malloc(i32 %n) {
 ; CHECK-LABEL: @test_neg_not_malloc(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[MEM:%.*]] = call dereferenceable(16) i8* @not_malloc(i64 16)
-; CHECK-NEXT:    [[ADDR:%.*]] = bitcast i8* [[MEM]] to i32*
+; CHECK-NEXT:    [[MEM:%.*]] = call dereferenceable(16) ptr @not_malloc(i64 16)
 ; CHECK-NEXT:    br label [[FOR_BODY_LR_PH:%.*]]
 ; CHECK:       for.body.lr.ph:
 ; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]
 ; CHECK:       for.header:
 ; CHECK-NEXT:    [[I_02:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ]
-; CHECK-NEXT:    [[OLD:%.*]] = load i32, i32* [[ADDR]], align 4
-; CHECK-NEXT:    [[GUARD:%.*]] = load volatile i8*, i8** @p, align 8
-; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq i8* [[GUARD]], null
+; CHECK-NEXT:    [[OLD:%.*]] = load i32, ptr [[MEM]], align 4
+; CHECK-NEXT:    [[GUARD:%.*]] = load volatile ptr, ptr @p, align 8
+; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq ptr [[GUARD]], null
 ; CHECK-NEXT:    br i1 [[EXITCMP]], label [[FOR_BODY]], label [[EARLY_EXIT:%.*]]
 ; CHECK:       early-exit:
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    ret ptr null
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[NEW:%.*]] = add i32 [[OLD]], 1
-; CHECK-NEXT:    store i32 [[NEW]], i32* [[ADDR]], align 4
+; CHECK-NEXT:    store i32 [[NEW]], ptr [[MEM]], align 4
 ; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_02]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[INC]], [[N:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_HEADER]], label [[FOR_COND_FOR_END_CRIT_EDGE:%.*]]
 ; CHECK:       for.cond.for.end_crit_edge:
-; CHECK-NEXT:    [[SPLIT:%.*]] = phi i32* [ [[ADDR]], [[FOR_BODY]] ]
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    [[SPLIT:%.*]] = phi ptr [ [[MEM]], [[FOR_BODY]] ]
+; CHECK-NEXT:    ret ptr null
 ;
 entry:
   ;; ignore the required null check for simplicity
-  %mem = call dereferenceable(16) i8* @not_malloc(i64 16)
-  %addr = bitcast i8* %mem to i32*
+  %mem = call dereferenceable(16) ptr @not_malloc(i64 16)
   br label %for.body.lr.ph
 
 for.body.lr.ph:                                   ; preds = %entry
@@ -241,59 +233,57 @@ for.body.lr.ph:                                   ; preds = %entry
 
 for.header:
   %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
-  %old = load i32, i32* %addr, align 4
+  %old = load i32, ptr %mem, align 4
   ; deliberate impossible to analyze branch
-  %guard = load volatile i8*, i8** @p
-  %exitcmp = icmp eq i8* %guard, null
+  %guard = load volatile ptr, ptr @p
+  %exitcmp = icmp eq ptr %guard, null
   br i1 %exitcmp, label %for.body, label %early-exit
 
 early-exit:
-  ret i32* null
+  ret ptr null
 
 for.body:
   %new = add i32 %old, 1
-  store i32 %new, i32* %addr, align 4
+  store i32 %new, ptr %mem, align 4
   %inc = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.header, label %for.cond.for.end_crit_edge
 
 for.cond.for.end_crit_edge:                       ; preds = %for.body
-  %split = phi i32* [ %addr, %for.body ]
-  ret i32* null
+  %split = phi ptr [ %mem, %for.body ]
+  ret ptr null
 }
 
 ; Negative test - can't speculate load since branch
 ; may control alignment
-define i32* @test_neg2(i32 %n) {
+define ptr @test_neg2(i32 %n) {
 ; CHECK-LABEL: @test_neg2(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[MEM:%.*]] = call noalias dereferenceable(16) i8* @malloc(i64 16)
-; CHECK-NEXT:    [[ADDR:%.*]] = bitcast i8* [[MEM]] to i32*
+; CHECK-NEXT:    [[MEM:%.*]] = call noalias dereferenceable(16) ptr @malloc(i64 16)
 ; CHECK-NEXT:    br label [[FOR_BODY_LR_PH:%.*]]
 ; CHECK:       for.body.lr.ph:
 ; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]
 ; CHECK:       for.header:
 ; CHECK-NEXT:    [[I_02:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY:%.*]] ]
-; CHECK-NEXT:    [[GUARD:%.*]] = load volatile i8*, i8** @p, align 8
-; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq i8* [[GUARD]], null
+; CHECK-NEXT:    [[GUARD:%.*]] = load volatile ptr, ptr @p, align 8
+; CHECK-NEXT:    [[EXITCMP:%.*]] = icmp eq ptr [[GUARD]], null
 ; CHECK-NEXT:    br i1 [[EXITCMP]], label [[FOR_BODY]], label [[EARLY_EXIT:%.*]]
 ; CHECK:       early-exit:
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    ret ptr null
 ; CHECK:       for.body:
-; CHECK-NEXT:    [[OLD:%.*]] = load i32, i32* [[ADDR]], align 4
+; CHECK-NEXT:    [[OLD:%.*]] = load i32, ptr [[MEM]], align 4
 ; CHECK-NEXT:    [[NEW:%.*]] = add i32 [[OLD]], 1
-; CHECK-NEXT:    store i32 [[NEW]], i32* [[ADDR]], align 4
+; CHECK-NEXT:    store i32 [[NEW]], ptr [[MEM]], align 4
 ; CHECK-NEXT:    [[INC]] = add nsw i32 [[I_02]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[INC]], [[N:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_HEADER]], label [[FOR_COND_FOR_END_CRIT_EDGE:%.*]]
 ; CHECK:       for.cond.for.end_crit_edge:
-; CHECK-NEXT:    [[SPLIT:%.*]] = phi i32* [ [[ADDR]], [[FOR_BODY]] ]
-; CHECK-NEXT:    ret i32* null
+; CHECK-NEXT:    [[SPLIT:%.*]] = phi ptr [ [[MEM]], [[FOR_BODY]] ]
+; CHECK-NEXT:    ret ptr null
 ;
 entry:
   ;; ignore the required null check for simplicity
-  %mem = call dereferenceable(16) noalias i8* @malloc(i64 16)
-  %addr = bitcast i8* %mem to i32*
+  %mem = call dereferenceable(16) noalias ptr @malloc(i64 16)
   br label %for.body.lr.ph
 
 for.body.lr.ph:                                   ; preds = %entry
@@ -302,22 +292,22 @@ for.body.lr.ph:                                   ; preds = %entry
 for.header:
   %i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
   ; deliberate impossible to analyze branch
-  %guard = load volatile i8*, i8** @p
-  %exitcmp = icmp eq i8* %guard, null
+  %guard = load volatile ptr, ptr @p
+  %exitcmp = icmp eq ptr %guard, null
   br i1 %exitcmp, label %for.body, label %early-exit
 
 early-exit:
-  ret i32* null
+  ret ptr null
 
 for.body:
-  %old = load i32, i32* %addr, align 4
+  %old = load i32, ptr %mem, align 4
   %new = add i32 %old, 1
-  store i32 %new, i32* %addr, align 4
+  store i32 %new, ptr %mem, align 4
   %inc = add nsw i32 %i.02, 1
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.header, label %for.cond.for.end_crit_edge
 
 for.cond.for.end_crit_edge:                       ; preds = %for.body
-  %split = phi i32* [ %addr, %for.body ]
-  ret i32* null
+  %split = phi ptr [ %mem, %for.body ]
+  ret ptr null
 }

diff  --git a/llvm/test/Transforms/LICM/read-only-calls.ll b/llvm/test/Transforms/LICM/read-only-calls.ll
index a947f5156a412..6214e45160425 100644
--- a/llvm/test/Transforms/LICM/read-only-calls.ll
+++ b/llvm/test/Transforms/LICM/read-only-calls.ll
@@ -8,60 +8,60 @@
 ; This prevents hoisting load that doesn't alias with any other memory
 ; operations.
 
-declare void @foo(i64, i32*) readonly
+declare void @foo(i64, ptr) readonly
 
 ; hoist the load out with the n2-threshold
 ; since it doesn't alias with the store.
 ; default AST mechanism clumps all memory locations in one set because of the
 ; readonly call
-define void @test1(i32* %ptr) {
+define void @test1(ptr %ptr) {
 ; CHECK-LABEL: @test1(
 ; CHECK-LABEL: entry:
-; CHECK:         %val = load i32, i32* %ptr
+; CHECK:         %val = load i32, ptr %ptr
 ; CHECK-LABEL: loop:
 entry:
   br label %loop
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  %val = load i32, i32* %ptr
-  call void @foo(i64 4, i32* %ptr)
-  %p2 = getelementptr i32, i32* %ptr, i32 1
-  store volatile i32 0, i32* %p2
+  %val = load i32, ptr %ptr
+  call void @foo(i64 4, ptr %ptr)
+  %p2 = getelementptr i32, ptr %ptr, i32 1
+  store volatile i32 0, ptr %p2
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; can hoist out load with the default AST and the alias analysis mechanism.
-define void @test2(i32* %ptr) {
+define void @test2(ptr %ptr) {
 ; CHECK-LABEL: @test2(
 ; CHECK-LABEL: entry:
-; CHECK:         %val = load i32, i32* %ptr
+; CHECK:         %val = load i32, ptr %ptr
 ; CHECK-LABEL: loop:
 entry:
   br label %loop
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  %val = load i32, i32* %ptr
-  call void @foo(i64 4, i32* %ptr)
+  %val = load i32, ptr %ptr
+  call void @foo(i64 4, ptr %ptr)
   %x.inc = add i32 %x, %val
   br label %loop
 }
 
 ; cannot hoist load since not guaranteed to execute
-define void @test3(i32* %ptr) {
+define void @test3(ptr %ptr) {
 ; CHECK-LABEL: @test3(
 ; CHECK-LABEL: entry:
 ; CHECK-LABEL: loop:
-; CHECK:         %val = load i32, i32* %ptr
+; CHECK:         %val = load i32, ptr %ptr
 entry:
   br label %loop
 
 loop:
   %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
-  call void @foo(i64 4, i32* %ptr)
-  %val = load i32, i32* %ptr
+  call void @foo(i64 4, ptr %ptr)
+  %val = load i32, ptr %ptr
   %x.inc = add i32 %x, %val
   br label %loop
 }

diff  --git a/llvm/test/Transforms/LICM/scalar-promote-memmodel.ll b/llvm/test/Transforms/LICM/scalar-promote-memmodel.ll
index 33076b39e908b..2a6e8d35f40f5 100644
--- a/llvm/test/Transforms/LICM/scalar-promote-memmodel.ll
+++ b/llvm/test/Transforms/LICM/scalar-promote-memmodel.ll
@@ -11,7 +11,7 @@ define void @bar(i32 %n, i32 %b) nounwind uwtable ssp {
 ; CHECK-LABEL: @bar(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[B:%.*]], 0
-; CHECK-NEXT:    [[G_PROMOTED:%.*]] = load i32, i32* @g, align 4
+; CHECK-NEXT:    [[G_PROMOTED:%.*]] = load i32, ptr @g, align 4
 ; CHECK-NEXT:    br label [[FOR_COND:%.*]]
 ; CHECK:       for.cond:
 ; CHECK-NEXT:    [[INC2:%.*]] = phi i32 [ [[G_PROMOTED]], [[ENTRY:%.*]] ], [ [[INC1:%.*]], [[FOR_INC:%.*]] ]
@@ -22,7 +22,7 @@ define void @bar(i32 %n, i32 %b) nounwind uwtable ssp {
 ; CHECK-NEXT:    br i1 [[TOBOOL]], label [[FOR_INC]], label [[IF_THEN:%.*]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[INC2]], 1
-; CHECK-NEXT:    store i32 [[INC]], i32* @g, align 4
+; CHECK-NEXT:    store i32 [[INC]], ptr @g, align 4
 ; CHECK-NEXT:    br label [[FOR_INC]]
 ; CHECK:       for.inc:
 ; CHECK-NEXT:    [[INC1]] = phi i32 [ [[INC]], [[IF_THEN]] ], [ [[INC2]], [[FOR_BODY]] ]
@@ -44,9 +44,9 @@ for.body:                                         ; preds = %for.cond
   br i1 %tobool, label %for.inc, label %if.then
 
 if.then:                                          ; preds = %for.body
-  %tmp3 = load i32, i32* @g, align 4
+  %tmp3 = load i32, ptr @g, align 4
   %inc = add nsw i32 %tmp3, 1
-  store i32 %inc, i32* @g, align 4
+  store i32 %inc, ptr @g, align 4
   br label %for.inc
 
 

diff  --git a/llvm/test/Transforms/LICM/scalar-promote-opaque-ptrs.ll b/llvm/test/Transforms/LICM/scalar-promote-opaque-ptrs.ll
index b239b6fb02960..64bbd4fa2800b 100644
--- a/llvm/test/Transforms/LICM/scalar-promote-opaque-ptrs.ll
+++ b/llvm/test/Transforms/LICM/scalar-promote-opaque-ptrs.ll
@@ -2,7 +2,7 @@
 ; RUN: opt -passes=licm -opaque-pointers -S %s | FileCheck %s
 target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
 
- at X = global i32 7   ; <i32*> [#uses=4]
+ at X = global i32 7   ; <ptr> [#uses=4]
 
 define void @test1(i32 %i) {
 ; CHECK-LABEL: @test1(
@@ -26,9 +26,9 @@ Entry:
 
 Loop:   ; preds = %Loop, %0
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]    ; <i32> [#uses=1]
-  %x = load i32, i32* @X   ; <i32> [#uses=1]
+  %x = load i32, ptr @X   ; <i32> [#uses=1]
   %x2 = add i32 %x, 1   ; <i32> [#uses=1]
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
   %Next = add i32 %j, 1   ; <i32> [#uses=2]
   %cond = icmp eq i32 %Next, 0    ; <i1> [#uses=1]
   br i1 %cond, label %Out, label %Loop
@@ -55,11 +55,11 @@ Entry:
   br label %Loop
 
 Loop:   ; preds = %Loop, %0
-  %X1 = getelementptr i32, i32* @X, i64 1    ; <i32*> [#uses=1]
-  %A = load i32, i32* %X1    ; <i32> [#uses=1]
+  %X1 = getelementptr i32, ptr @X, i64 1    ; <ptr> [#uses=1]
+  %A = load i32, ptr %X1    ; <i32> [#uses=1]
   %V = add i32 %A, 1    ; <i32> [#uses=1]
-  %X2 = getelementptr i32, i32* @X, i64 1    ; <i32*> [#uses=1]
-  store i32 %V, i32* %X2
+  %X2 = getelementptr i32, ptr @X, i64 1    ; <ptr> [#uses=1]
+  store i32 %V, ptr %X2
   br i1 false, label %Loop, label %Exit
 
 Exit:   ; preds = %Loop
@@ -80,9 +80,9 @@ define void @test3(i32 %i) {
   br label %Loop
 Loop:
   ; Should not promote this to a register
-  %x = load volatile i32, i32* @X
+  %x = load volatile i32, ptr @X
   %x2 = add i32 %x, 1
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
   br i1 true, label %Out, label %Loop
 
 Out:    ; preds = %Loop
@@ -103,9 +103,9 @@ define void @test3b(i32 %i) {
 ;
   br label %Loop
 Loop:
-  %x = load i32, i32* @X
+  %x = load i32, ptr @X
   %x2 = add i32 %x, 1
-  store volatile i32 %x2, i32* @X
+  store volatile i32 %x2, ptr @X
   br i1 true, label %Out, label %Loop
 
 Out:    ; preds = %Loop
@@ -115,7 +115,7 @@ Out:    ; preds = %Loop
 ; PR8041
 ; Should have promoted 'handle2' accesses.
 ; Should not have promoted offsetx1 loads.
-define void @test4(i8* %x, i8 %n) {
+define void @test4(ptr %x, i8 %n) {
 ; CHECK-LABEL: @test4(
 ; CHECK-NEXT:    [[HANDLE1:%.*]] = alloca ptr, align 8
 ; CHECK-NEXT:    [[HANDLE2:%.*]] = alloca ptr, align 8
@@ -143,29 +143,29 @@ define void @test4(i8* %x, i8 %n) {
 ; CHECK-NEXT:    store ptr [[NEWOFFSETX2_LCSSA_LCSSA]], ptr [[HANDLE2]], align 8
 ; CHECK-NEXT:    ret void
 ;
-  %handle1 = alloca i8*
-  %handle2 = alloca i8*
-  store i8* %x, i8** %handle1
+  %handle1 = alloca ptr
+  %handle2 = alloca ptr
+  store ptr %x, ptr %handle1
   br label %loop
 
 loop:
-  %tmp = getelementptr i8, i8* %x, i64 8
-  store i8* %tmp, i8** %handle2
+  %tmp = getelementptr i8, ptr %x, i64 8
+  store ptr %tmp, ptr %handle2
   br label %subloop
 
 subloop:
   %count = phi i8 [ 0, %loop ], [ %nextcount, %subloop ]
-  %offsetx2 = load i8*, i8** %handle2
-  store i8 %n, i8* %offsetx2
-  %newoffsetx2 = getelementptr i8, i8* %offsetx2, i64 -1
-  store i8* %newoffsetx2, i8** %handle2
+  %offsetx2 = load ptr, ptr %handle2
+  store i8 %n, ptr %offsetx2
+  %newoffsetx2 = getelementptr i8, ptr %offsetx2, i64 -1
+  store ptr %newoffsetx2, ptr %handle2
   %nextcount = add i8 %count, 1
   %innerexitcond = icmp sge i8 %nextcount, 8
   br i1 %innerexitcond, label %innerexit, label %subloop
 
 innerexit:
-  %offsetx1 = load i8*, i8** %handle1
-  %val = load i8, i8* %offsetx1
+  %offsetx1 = load ptr, ptr %handle1
+  %val = load i8, ptr %offsetx1
   %cond = icmp eq i8 %val, %n
   br i1 %cond, label %exit, label %loop
 
@@ -173,7 +173,7 @@ exit:
   ret void
 }
 
-define void @test5(i32 %i, i32** noalias %P2) {
+define void @test5(i32 %i, ptr noalias %P2) {
 ; CHECK-LABEL: @test5(
 ; CHECK-NEXT:  Entry:
 ; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load i32, ptr @X, align 4
@@ -196,11 +196,11 @@ Entry:
 
 Loop:   ; preds = %Loop, %0
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]    ; <i32> [#uses=1]
-  %x = load i32, i32* @X   ; <i32> [#uses=1]
+  %x = load i32, ptr @X   ; <i32> [#uses=1]
   %x2 = add i32 %x, 1   ; <i32> [#uses=1]
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
 
-  store atomic i32* @X, i32** %P2 monotonic, align 8
+  store atomic ptr @X, ptr %P2 monotonic, align 8
 
   %Next = add i32 %j, 1   ; <i32> [#uses=2]
   %cond = icmp eq i32 %Next, 0    ; <i1> [#uses=1]
@@ -213,7 +213,7 @@ Out:
 
 
 ; PR14753 - Preserve TBAA tags when promoting values in a loop.
-define void @test6(i32 %n, float* nocapture %a, i32* %gi) {
+define void @test6(i32 %n, ptr nocapture %a, ptr %gi) {
 ; CHECK-LABEL: @test6(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    store i32 0, ptr [[GI:%.*]], align 4, !tbaa [[TBAA0:![0-9]+]]
@@ -239,7 +239,7 @@ define void @test6(i32 %n, float* nocapture %a, i32* %gi) {
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  store i32 0, i32* %gi, align 4, !tbaa !0
+  store i32 0, ptr %gi, align 4, !tbaa !0
   %cmp1 = icmp slt i32 0, %n
   br i1 %cmp1, label %for.body.lr.ph, label %for.end
 
@@ -249,11 +249,11 @@ for.body.lr.ph:                                   ; preds = %entry
 for.body:                                         ; preds = %for.body.lr.ph, %for.body
   %storemerge2 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
   %idxprom = sext i32 %storemerge2 to i64
-  %arrayidx = getelementptr inbounds float, float* %a, i64 %idxprom
-  store float 0.000000e+00, float* %arrayidx, align 4, !tbaa !3
-  %0 = load i32, i32* %gi, align 4, !tbaa !0
+  %arrayidx = getelementptr inbounds float, ptr %a, i64 %idxprom
+  store float 0.000000e+00, ptr %arrayidx, align 4, !tbaa !3
+  %0 = load i32, ptr %gi, align 4, !tbaa !0
   %inc = add nsw i32 %0, 1
-  store i32 %inc, i32* %gi, align 4, !tbaa !0
+  store i32 %inc, ptr %gi, align 4, !tbaa !0
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
 
@@ -266,7 +266,7 @@ for.end:                                          ; preds = %for.cond.for.end_cr
 }
 
 declare i32 @opaque(i32) argmemonly
-declare void @capture(i32*)
+declare void @capture(ptr)
 
 ; We can promote even if opaque may throw.
 define i32 @test7() {
@@ -291,20 +291,20 @@ define i32 @test7() {
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 
 loop:
   %j = phi i32 [ 0, %entry ], [ %next, %loop ]
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   %x2 = call i32 @opaque(i32 %x) ; Note this does not capture %local
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -336,17 +336,17 @@ define i32 @test7bad() {
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 loop:
   %j = phi i32 [ 0, %entry ], [ %next, %else ]
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   %x2 = call i32 @opaque(i32 %x) ; Note this does not capture %local
   %cmp = icmp eq i32 %x2, 0
   br i1 %cmp, label %if, label %else
 
 if:
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   br label %else
 
 else:
@@ -355,7 +355,7 @@ else:
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -385,21 +385,21 @@ define i32 @test8() {
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 
 loop:
   %j = phi i32 [ 0, %entry ], [ %next, %loop ]
   %throwaway = call i32 @opaque(i32 %j)
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   %x2 = call i32 @opaque(i32 %x)
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -435,7 +435,7 @@ define i32 @test9() {
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 
 loop:
@@ -445,18 +445,18 @@ loop:
   br i1 %cmp, label %if, label %else
 
 if:
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   br label %else
 
 else:
   %x2 = phi i32 [ 0, %loop ], [ %x, %if]
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -487,8 +487,8 @@ define i32 @test9bad(i32 %i) {
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
-  %notderef = getelementptr i32, i32* %local, i32 %i
+  call void @capture(ptr %local)
+  %notderef = getelementptr i32, ptr %local, i32 %i
   br label %loop
 
 loop:
@@ -498,18 +498,18 @@ loop:
   br i1 %cmp, label %if, label %else
 
 if:
-  %x = load i32, i32* %notderef
+  %x = load i32, ptr %notderef
   br label %else
 
 else:
   %x2 = phi i32 [ 0, %loop ], [ %x, %if]
-  store i32 %x2, i32* %notderef
+  store i32 %x2, ptr %notderef
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %notderef
+  %ret = load i32, ptr %notderef
   ret i32 %ret
 }
 
@@ -536,9 +536,9 @@ Entry:
 
 Loop:   ; preds = %Loop, %0
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]    ; <i32> [#uses=1]
-  %x = load atomic i32, i32* @X unordered, align 4
+  %x = load atomic i32, ptr @X unordered, align 4
   %x2 = add i32 %x, 1
-  store atomic i32 %x2, i32* @X unordered, align 4
+  store atomic i32 %x2, ptr @X unordered, align 4
   %Next = add i32 %j, 1
   %cond = icmp eq i32 %Next, 0
   br i1 %cond, label %Out, label %Loop
@@ -583,9 +583,9 @@ Loop:   ; preds = %Loop, %0
   %early.test = icmp ult i32 %j, 32
   br i1 %early.test, label %body, label %Early
 body:
-  %x = load i32, i32* @X   ; <i32> [#uses=1]
+  %x = load i32, ptr @X   ; <i32> [#uses=1]
   %x2 = add i32 %x, 1   ; <i32> [#uses=1]
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
   %Next = add i32 %j, 1   ; <i32> [#uses=2]
   %cond = icmp eq i32 %Next, 0    ; <i1> [#uses=1]
   br i1 %cond, label %Out, label %Loop

diff  --git a/llvm/test/Transforms/LICM/scalar-promote-unwind.ll b/llvm/test/Transforms/LICM/scalar-promote-unwind.ll
index 4b57e4029fbf3..f50bb10a40be4 100644
--- a/llvm/test/Transforms/LICM/scalar-promote-unwind.ll
+++ b/llvm/test/Transforms/LICM/scalar-promote-unwind.ll
@@ -7,16 +7,16 @@ target triple = "x86_64-unknown-linux-gnu"
 
 ; Make sure we don't hoist the store out of the loop; %a would
 ; have the wrong value if f() unwinds
-define void @test1(i32* nocapture noalias %a, i1 zeroext %y) uwtable {
+define void @test1(ptr nocapture noalias %a, i1 zeroext %y) uwtable {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, i32* [[A:%.*]], align 4
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, ptr [[A:%.*]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_INC:%.*]] ]
 ; CHECK-NEXT:    [[I_03:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_INC]] ]
 ; CHECK-NEXT:    [[ADD]] = add nsw i32 [[ADD1]], 1
-; CHECK-NEXT:    store i32 [[ADD]], i32* [[A]], align 4
+; CHECK-NEXT:    store i32 [[ADD]], ptr [[A]], align 4
 ; CHECK-NEXT:    br i1 [[Y:%.*]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    tail call void @f()
@@ -33,9 +33,9 @@ entry:
 
 for.body:
   %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
-  %0 = load i32, i32* %a, align 4
+  %0 = load i32, ptr %a, align 4
   %add = add nsw i32 %0, 1
-  store i32 %add, i32* %a, align 4
+  store i32 %add, ptr %a, align 4
   br i1 %y, label %if.then, label %for.inc
 
 
@@ -58,7 +58,7 @@ define void @test_alloca(i1 zeroext %y) uwtable {
 ; CHECK-LABEL: @test_alloca(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, i32* [[A]], align 4
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, ptr [[A]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_INC:%.*]] ]
@@ -74,7 +74,7 @@ define void @test_alloca(i1 zeroext %y) uwtable {
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.cond.cleanup:
 ; CHECK-NEXT:    [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_INC]] ]
-; CHECK-NEXT:    store i32 [[ADD_LCSSA]], i32* [[A]], align 4
+; CHECK-NEXT:    store i32 [[ADD_LCSSA]], ptr [[A]], align 4
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -83,9 +83,9 @@ entry:
 
 for.body:
   %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
-  %0 = load i32, i32* %a, align 4
+  %0 = load i32, ptr %a, align 4
   %add = add nsw i32 %0, 1
-  store i32 %add, i32* %a, align 4
+  store i32 %add, ptr %a, align 4
   br i1 %y, label %if.then, label %for.inc
 
 if.then:
@@ -102,10 +102,10 @@ for.cond.cleanup:
 }
 
 ; byval memory cannot be accessed on unwind either.
-define void @test_byval(i32* byval(i32) %a, i1 zeroext %y) uwtable {
+define void @test_byval(ptr byval(i32) %a, i1 zeroext %y) uwtable {
 ; CHECK-LABEL: @test_byval(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, i32* [[A:%.*]], align 4
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, ptr [[A:%.*]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_INC:%.*]] ]
@@ -121,7 +121,7 @@ define void @test_byval(i32* byval(i32) %a, i1 zeroext %y) uwtable {
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.cond.cleanup:
 ; CHECK-NEXT:    [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_INC]] ]
-; CHECK-NEXT:    store i32 [[ADD_LCSSA]], i32* [[A]], align 4
+; CHECK-NEXT:    store i32 [[ADD_LCSSA]], ptr [[A]], align 4
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -129,9 +129,9 @@ entry:
 
 for.body:
   %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
-  %0 = load i32, i32* %a, align 4
+  %0 = load i32, ptr %a, align 4
   %add = add nsw i32 %0, 1
-  store i32 %add, i32* %a, align 4
+  store i32 %add, ptr %a, align 4
   br i1 %y, label %if.then, label %for.inc
 
 if.then:
@@ -148,16 +148,16 @@ for.cond.cleanup:
 }
 
 ; TODO: sret could be specified to not be accessed on unwind either.
-define void @test_sret(i32* noalias sret(i32) %a, i1 zeroext %y) uwtable {
+define void @test_sret(ptr noalias sret(i32) %a, i1 zeroext %y) uwtable {
 ; CHECK-LABEL: @test_sret(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, i32* [[A:%.*]], align 4
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, ptr [[A:%.*]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_INC:%.*]] ]
 ; CHECK-NEXT:    [[I_03:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_INC]] ]
 ; CHECK-NEXT:    [[ADD]] = add nsw i32 [[ADD1]], 1
-; CHECK-NEXT:    store i32 [[ADD]], i32* [[A]], align 4
+; CHECK-NEXT:    store i32 [[ADD]], ptr [[A]], align 4
 ; CHECK-NEXT:    br i1 [[Y:%.*]], label [[IF_THEN:%.*]], label [[FOR_INC]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    tail call void @f()
@@ -174,9 +174,9 @@ entry:
 
 for.body:
   %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
-  %0 = load i32, i32* %a, align 4
+  %0 = load i32, ptr %a, align 4
   %add = add nsw i32 %0, 1
-  store i32 %add, i32* %a, align 4
+  store i32 %add, ptr %a, align 4
   br i1 %y, label %if.then, label %for.inc
 
 if.then:
@@ -198,7 +198,7 @@ define void @test3(i1 zeroext %y) uwtable {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, i32* [[A]], align 4
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, ptr [[A]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
@@ -210,7 +210,7 @@ define void @test3(i1 zeroext %y) uwtable {
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.cond.cleanup:
 ; CHECK-NEXT:    [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
-; CHECK-NEXT:    store i32 [[ADD_LCSSA]], i32* [[A]], align 4
+; CHECK-NEXT:    store i32 [[ADD_LCSSA]], ptr [[A]], align 4
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -219,10 +219,10 @@ entry:
 
 for.body:
   %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
-  %0 = load i32, i32* %a, align 4
+  %0 = load i32, ptr %a, align 4
   %add = add nsw i32 %0, 1
   tail call void @f()
-  store i32 %add, i32* %a, align 4
+  store i32 %add, ptr %a, align 4
   %inc = add nuw nsw i32 %i.03, 1
   %exitcond = icmp eq i32 %inc, 10000
   br i1 %exitcond, label %for.cond.cleanup, label %for.body
@@ -236,7 +236,7 @@ define void @test3b(i1 zeroext %y) uwtable {
 ; CHECK-LABEL: @test3b(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load atomic i32, i32* [[A]] unordered, align 4
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load atomic i32, ptr [[A]] unordered, align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
@@ -248,7 +248,7 @@ define void @test3b(i1 zeroext %y) uwtable {
 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
 ; CHECK:       for.cond.cleanup:
 ; CHECK-NEXT:    [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
-; CHECK-NEXT:    store atomic i32 [[ADD_LCSSA]], i32* [[A]] unordered, align 4
+; CHECK-NEXT:    store atomic i32 [[ADD_LCSSA]], ptr [[A]] unordered, align 4
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -257,10 +257,10 @@ entry:
 
 for.body:
   %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
-  %0 = load atomic i32, i32* %a unordered, align 4
+  %0 = load atomic i32, ptr %a unordered, align 4
   %add = add nsw i32 %0, 1
   tail call void @f()
-  store atomic i32 %add, i32* %a unordered, align 4
+  store atomic i32 %add, ptr %a unordered, align 4
   %inc = add nuw nsw i32 %i.03, 1
   %exitcond = icmp eq i32 %inc, 10000
   br i1 %exitcond, label %for.cond.cleanup, label %for.body
@@ -269,17 +269,17 @@ for.cond.cleanup:
   ret void
 }
 
- at _ZTIi = external constant i8*
+ at _ZTIi = external constant ptr
 
 ; In this test, the loop is within a try block. There is an explicit unwind edge out of the loop.
 ; Make sure this edge is treated as a loop exit, and that the loads and stores are promoted as
 ; expected
-define void @loop_within_tryblock() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+define void @loop_within_tryblock() personality ptr @__gxx_personality_v0 {
 ; CHECK-LABEL: @loop_within_tryblock(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    store i32 0, i32* [[A]], align 4
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, i32* [[A]], align 4
+; CHECK-NEXT:    store i32 0, ptr [[A]], align 4
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i32, ptr [[A]], align 4
 ; CHECK-NEXT:    br label [[FOR_COND:%.*]]
 ; CHECK:       for.cond:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_INC:%.*]] ]
@@ -297,36 +297,35 @@ define void @loop_within_tryblock() personality i8* bitcast (i32 (...)* @__gxx_p
 ; CHECK-NEXT:    br label [[FOR_COND]]
 ; CHECK:       lpad:
 ; CHECK-NEXT:    [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[TMP0:%.*]] = landingpad { i8*, i32 }
-; CHECK-NEXT:    catch i8* bitcast (i8** @_ZTIi to i8*)
-; CHECK-NEXT:    store i32 [[ADD_LCSSA]], i32* [[A]], align 4
-; CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { i8*, i32 } [[TMP0]], 0
-; CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { i8*, i32 } [[TMP0]], 1
+; CHECK-NEXT:    [[TMP0:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT:    catch ptr @_ZTIi
+; CHECK-NEXT:    store i32 [[ADD_LCSSA]], ptr [[A]], align 4
+; CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { ptr, i32 } [[TMP0]], 0
+; CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP0]], 1
 ; CHECK-NEXT:    br label [[CATCH_DISPATCH:%.*]]
 ; CHECK:       catch.dispatch:
-; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
+; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for(ptr @_ZTIi)
 ; CHECK-NEXT:    [[MATCHES:%.*]] = icmp eq i32 [[TMP2]], [[TMP3]]
 ; CHECK-NEXT:    br i1 [[MATCHES]], label [[CATCH:%.*]], label [[EH_RESUME:%.*]]
 ; CHECK:       catch:
-; CHECK-NEXT:    [[TMP4:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP1]])
-; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i8* [[TMP4]] to i32*
-; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
+; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP1]])
+; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[TMP4]], align 4
 ; CHECK-NEXT:    call void @__cxa_end_catch()
 ; CHECK-NEXT:    br label [[TRY_CONT:%.*]]
 ; CHECK:       try.cont:
 ; CHECK-NEXT:    ret void
 ; CHECK:       for.end:
 ; CHECK-NEXT:    [[ADD1_LCSSA:%.*]] = phi i32 [ [[ADD1]], [[FOR_COND]] ]
-; CHECK-NEXT:    store i32 [[ADD1_LCSSA]], i32* [[A]], align 4
+; CHECK-NEXT:    store i32 [[ADD1_LCSSA]], ptr [[A]], align 4
 ; CHECK-NEXT:    br label [[TRY_CONT]]
 ; CHECK:       eh.resume:
-; CHECK-NEXT:    [[LPAD_VAL:%.*]] = insertvalue { i8*, i32 } undef, i8* [[TMP1]], 0
-; CHECK-NEXT:    [[LPAD_VAL3:%.*]] = insertvalue { i8*, i32 } [[LPAD_VAL]], i32 [[TMP2]], 1
-; CHECK-NEXT:    resume { i8*, i32 } [[LPAD_VAL3]]
+; CHECK-NEXT:    [[LPAD_VAL:%.*]] = insertvalue { ptr, i32 } undef, ptr [[TMP1]], 0
+; CHECK-NEXT:    [[LPAD_VAL3:%.*]] = insertvalue { ptr, i32 } [[LPAD_VAL]], i32 [[TMP2]], 1
+; CHECK-NEXT:    resume { ptr, i32 } [[LPAD_VAL3]]
 ;
 entry:
   %a = alloca i32, align 4
-  store i32 0, i32* %a, align 4
+  store i32 0, ptr %a, align 4
   br label %for.cond
 
 for.cond:
@@ -335,9 +334,9 @@ for.cond:
   br i1 %cmp, label %for.body, label %for.end
 
 for.body:
-  %0 = load i32, i32* %a, align 4
+  %0 = load i32, ptr %a, align 4
   %add = add nsw i32 %0, 1
-  store i32 %add, i32* %a, align 4
+  store i32 %add, ptr %a, align 4
   invoke void @boo()
   to label %invoke.cont unwind label %lpad
 
@@ -349,21 +348,20 @@ for.inc:
   br label %for.cond
 
 lpad:
-  %1 = landingpad { i8*, i32 }
-  catch i8* bitcast (i8** @_ZTIi to i8*)
-  %2 = extractvalue { i8*, i32 } %1, 0
-  %3 = extractvalue { i8*, i32 } %1, 1
+  %1 = landingpad { ptr, i32 }
+  catch ptr @_ZTIi
+  %2 = extractvalue { ptr, i32 } %1, 0
+  %3 = extractvalue { ptr, i32 } %1, 1
   br label %catch.dispatch
 
 catch.dispatch:
-  %4 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) #3
+  %4 = call i32 @llvm.eh.typeid.for(ptr @_ZTIi) #3
   %matches = icmp eq i32 %3, %4
   br i1 %matches, label %catch, label %eh.resume
 
 catch:
-  %5 = call i8* @__cxa_begin_catch(i8* %2) #3
-  %6 = bitcast i8* %5 to i32*
-  %7 = load i32, i32* %6, align 4
+  %5 = call ptr @__cxa_begin_catch(ptr %2) #3
+  %6 = load i32, ptr %5, align 4
   call void @__cxa_end_catch() #3
   br label %try.cont
 
@@ -374,19 +372,18 @@ for.end:
   br label %try.cont
 
 eh.resume:
-  %lpad.val = insertvalue { i8*, i32 } undef, i8* %2, 0
-  %lpad.val3 = insertvalue { i8*, i32 } %lpad.val, i32 %3, 1
-  resume { i8*, i32 } %lpad.val3
+  %lpad.val = insertvalue { ptr, i32 } undef, ptr %2, 0
+  %lpad.val3 = insertvalue { ptr, i32 } %lpad.val, i32 %3, 1
+  resume { ptr, i32 } %lpad.val3
 }
 
 
 ; The malloc'ed memory is not capture and therefore promoted.
-define void @malloc_no_capture() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+define void @malloc_no_capture() #0 personality ptr @__gxx_personality_v0 {
 ; CHECK-LABEL: @malloc_no_capture(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[CALL:%.*]] = call i8* @malloc(i64 4)
-; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i8* [[CALL]] to i32*
-; CHECK-NEXT:    [[DOTPROMOTED:%.*]] = load i32, i32* [[TMP0]], align 4
+; CHECK-NEXT:    [[CALL:%.*]] = call ptr @malloc(i64 4)
+; CHECK-NEXT:    [[DOTPROMOTED:%.*]] = load i32, ptr [[CALL]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[DOTPROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_LATCH:%.*]] ]
@@ -404,35 +401,33 @@ define void @malloc_no_capture() #0 personality i8* bitcast (i32 (...)* @__gxx_p
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
 ; CHECK:       for.end:
 ; CHECK-NEXT:    [[ADD_LCSSA2:%.*]] = phi i32 [ [[ADD]], [[FOR_LATCH]] ]
-; CHECK-NEXT:    store i32 [[ADD_LCSSA2]], i32* [[TMP0]], align 4
+; CHECK-NEXT:    store i32 [[ADD_LCSSA2]], ptr [[CALL]], align 4
 ; CHECK-NEXT:    br label [[FUN_RET:%.*]]
 ; CHECK:       lpad:
 ; CHECK-NEXT:    [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_CALL]] ]
-; CHECK-NEXT:    [[TMP1:%.*]] = landingpad { i8*, i32 }
-; CHECK-NEXT:    catch i8* null
-; CHECK-NEXT:    store i32 [[ADD_LCSSA]], i32* [[TMP0]], align 4
-; CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 0
-; CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 1
+; CHECK-NEXT:    [[TMP1:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT:    catch ptr null
+; CHECK-NEXT:    store i32 [[ADD_LCSSA]], ptr [[CALL]], align 4
+; CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0
+; CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1
 ; CHECK-NEXT:    br label [[CATCH:%.*]]
 ; CHECK:       catch:
-; CHECK-NEXT:    [[TMP4:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP2]])
-; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i32* [[TMP0]] to i8*
-; CHECK-NEXT:    call void @free(i8* [[TMP5]])
+; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP2]])
+; CHECK-NEXT:    call void @free(ptr [[CALL]])
 ; CHECK-NEXT:    call void @__cxa_end_catch()
 ; CHECK-NEXT:    br label [[FUN_RET]]
 ; CHECK:       fun.ret:
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %call = call i8* @malloc(i64 4)
-  %0 = bitcast i8* %call to i32*
+  %call = call ptr @malloc(i64 4)
   br label %for.body
 
 for.body:
   %i.0 = phi i32 [ 0, %entry  ], [ %inc, %for.latch ]
-  %1 = load i32, i32* %0, align 4
-  %add = add nsw i32 %1, 1
-  store i32 %add, i32* %0, align 4
+  %0 = load i32, ptr %call, align 4
+  %add = add nsw i32 %0, 1
+  store i32 %add, ptr %call, align 4
   br label %for.call
 
 for.call:
@@ -451,16 +446,15 @@ for.end:
   br label %fun.ret
 
 lpad:
-  %2 = landingpad { i8*, i32 }
-  catch i8* null
-  %3 = extractvalue { i8*, i32 } %2, 0
-  %4 = extractvalue { i8*, i32 } %2, 1
+  %1 = landingpad { ptr, i32 }
+  catch ptr null
+  %2 = extractvalue { ptr, i32 } %1, 0
+  %3 = extractvalue { ptr, i32 } %1, 1
   br label %catch
 
 catch:
-  %5 = call i8* @__cxa_begin_catch(i8* %3) #4
-  %6 = bitcast i32* %0 to i8*
-  call void @free(i8* %6)
+  %4 = call ptr @__cxa_begin_catch(ptr %2) #4
+  call void @free(ptr %call)
   call void @__cxa_end_catch()
   br label %fun.ret
 
@@ -469,18 +463,17 @@ fun.ret:
 }
 
 ; The malloc'ed memory can be captured and therefore only loads can be promoted.
-define void @malloc_capture(i32** noalias %A) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+define void @malloc_capture(ptr noalias %A) personality ptr @__gxx_personality_v0 {
 ; CHECK-LABEL: @malloc_capture(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[CALL:%.*]] = call i8* @malloc(i64 4)
-; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i8* [[CALL]] to i32*
-; CHECK-NEXT:    [[DOTPROMOTED:%.*]] = load i32, i32* [[TMP0]], align 4
+; CHECK-NEXT:    [[CALL:%.*]] = call ptr @malloc(i64 4)
+; CHECK-NEXT:    [[DOTPROMOTED:%.*]] = load i32, ptr [[CALL]], align 4
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[ADD1:%.*]] = phi i32 [ [[DOTPROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_LATCH:%.*]] ]
 ; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[INC:%.*]], [[FOR_LATCH]] ]
 ; CHECK-NEXT:    [[ADD]] = add nsw i32 [[ADD1]], 1
-; CHECK-NEXT:    store i32 [[ADD]], i32* [[TMP0]], align 4
+; CHECK-NEXT:    store i32 [[ADD]], ptr [[CALL]], align 4
 ; CHECK-NEXT:    br label [[FOR_CALL:%.*]]
 ; CHECK:       for.call:
 ; CHECK-NEXT:    invoke void @boo_readnone()
@@ -488,37 +481,35 @@ define void @malloc_capture(i32** noalias %A) personality i8* bitcast (i32 (...)
 ; CHECK:       invoke.cont:
 ; CHECK-NEXT:    br label [[FOR_LATCH]]
 ; CHECK:       for.latch:
-; CHECK-NEXT:    store i32* [[TMP0]], i32** [[A:%.*]], align 8
+; CHECK-NEXT:    store ptr [[CALL]], ptr [[A:%.*]], align 8
 ; CHECK-NEXT:    [[INC]] = add i32 [[I_0]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_0]], 1024
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
 ; CHECK:       for.end:
 ; CHECK-NEXT:    br label [[FUN_RET:%.*]]
 ; CHECK:       lpad:
-; CHECK-NEXT:    [[TMP1:%.*]] = landingpad { i8*, i32 }
-; CHECK-NEXT:    catch i8* null
-; CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 0
-; CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { i8*, i32 } [[TMP1]], 1
+; CHECK-NEXT:    [[TMP1:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT:    catch ptr null
+; CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0
+; CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1
 ; CHECK-NEXT:    br label [[CATCH:%.*]]
 ; CHECK:       catch:
-; CHECK-NEXT:    [[TMP4:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP2]])
-; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i32* [[TMP0]] to i8*
-; CHECK-NEXT:    call void @free(i8* [[TMP5]])
+; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @__cxa_begin_catch(ptr [[TMP2]])
+; CHECK-NEXT:    call void @free(ptr [[CALL]])
 ; CHECK-NEXT:    call void @__cxa_end_catch()
 ; CHECK-NEXT:    br label [[FUN_RET]]
 ; CHECK:       fun.ret:
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %call = call i8* @malloc(i64 4)
-  %0 = bitcast i8* %call to i32*
+  %call = call ptr @malloc(i64 4)
   br label %for.body
 
 for.body:
   %i.0 = phi i32 [ 0, %entry  ], [ %inc, %for.latch ]
-  %1 = load i32, i32* %0, align 4
-  %add = add nsw i32 %1, 1
-  store i32 %add, i32* %0, align 4
+  %0 = load i32, ptr %call, align 4
+  %add = add nsw i32 %0, 1
+  store i32 %add, ptr %call, align 4
   br label %for.call
 
 for.call:
@@ -529,7 +520,7 @@ invoke.cont:
   br label %for.latch
 
 for.latch:
-  store i32* %0, i32** %A
+  store ptr %call, ptr %A
   %inc = add i32 %i.0, 1
   %cmp = icmp slt i32 %i.0, 1024
   br i1 %cmp, label %for.body, label %for.end
@@ -538,16 +529,15 @@ for.end:
   br label %fun.ret
 
 lpad:
-  %2 = landingpad { i8*, i32 }
-  catch i8* null
-  %3 = extractvalue { i8*, i32 } %2, 0
-  %4 = extractvalue { i8*, i32 } %2, 1
+  %1 = landingpad { ptr, i32 }
+  catch ptr null
+  %2 = extractvalue { ptr, i32 } %1, 0
+  %3 = extractvalue { ptr, i32 } %1, 1
   br label %catch
 
 catch:
-  %5 = call i8* @__cxa_begin_catch(i8* %3) #4
-  %6 = bitcast i32* %0 to i8*
-  call void @free(i8* %6)
+  %4 = call ptr @__cxa_begin_catch(ptr %2) #4
+  call void @free(ptr %call)
   call void @__cxa_end_catch()
   br label %fun.ret
 
@@ -556,10 +546,10 @@ fun.ret:
 }
 
 ; Function Attrs: nounwind
-declare noalias i8* @malloc(i64)
+declare noalias ptr @malloc(i64)
 
 ; Function Attrs: nounwind
-declare void @free(i8* nocapture)
+declare void @free(ptr nocapture)
 
 declare void @boo()
 
@@ -570,10 +560,10 @@ declare void @boo_readnone() readnone
 
 declare i32 @__gxx_personality_v0(...)
 
-declare i8* @__cxa_begin_catch(i8*)
+declare ptr @__cxa_begin_catch(ptr)
 
 declare void @__cxa_end_catch()
 
-declare i32 @llvm.eh.typeid.for(i8*)
+declare i32 @llvm.eh.typeid.for(ptr)
 
 declare void @f() uwtable

diff  --git a/llvm/test/Transforms/LICM/scalar-promote.ll b/llvm/test/Transforms/LICM/scalar-promote.ll
index 760d1397142ba..df1d3699d329c 100644
--- a/llvm/test/Transforms/LICM/scalar-promote.ll
+++ b/llvm/test/Transforms/LICM/scalar-promote.ll
@@ -3,12 +3,12 @@
 ; RUN: opt -aa-pipeline=tbaa,basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' -S %s | FileCheck %s
 target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
 
- at X = global i32 7   ; <i32*> [#uses=4]
+ at X = global i32 7   ; <ptr> [#uses=4]
 
 define void @test1(i32 %i) {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  Entry:
-; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    [[X21:%.*]] = phi i32 [ [[X_PROMOTED]], [[ENTRY:%.*]] ], [ [[X2:%.*]], [[LOOP]] ]
@@ -19,7 +19,7 @@ define void @test1(i32 %i) {
 ; CHECK-NEXT:    br i1 [[COND]], label [[OUT:%.*]], label [[LOOP]]
 ; CHECK:       Out:
 ; CHECK-NEXT:    [[X2_LCSSA:%.*]] = phi i32 [ [[X2]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 [[X2_LCSSA]], i32* @X, align 4
+; CHECK-NEXT:    store i32 [[X2_LCSSA]], ptr @X, align 4
 ; CHECK-NEXT:    ret void
 ;
 Entry:
@@ -27,9 +27,9 @@ Entry:
 
 Loop:   ; preds = %Loop, %0
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]    ; <i32> [#uses=1]
-  %x = load i32, i32* @X   ; <i32> [#uses=1]
+  %x = load i32, ptr @X   ; <i32> [#uses=1]
   %x2 = add i32 %x, 1   ; <i32> [#uses=1]
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
   %Next = add i32 %j, 1   ; <i32> [#uses=2]
   %cond = icmp eq i32 %Next, 0    ; <i1> [#uses=1]
   br i1 %cond, label %Out, label %Loop
@@ -41,7 +41,7 @@ Out:
 define void @test2(i32 %i) {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  Entry:
-; CHECK-NEXT:    [[DOTPROMOTED:%.*]] = load i32, i32* getelementptr inbounds (i32, i32* @X, i64 1), align 4
+; CHECK-NEXT:    [[DOTPROMOTED:%.*]] = load i32, ptr getelementptr inbounds (i32, ptr @X, i64 1), align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    [[V1:%.*]] = phi i32 [ [[V:%.*]], [[LOOP]] ], [ [[DOTPROMOTED]], [[ENTRY:%.*]] ]
@@ -49,18 +49,18 @@ define void @test2(i32 %i) {
 ; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[EXIT:%.*]]
 ; CHECK:       Exit:
 ; CHECK-NEXT:    [[V_LCSSA:%.*]] = phi i32 [ [[V]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 [[V_LCSSA]], i32* getelementptr inbounds (i32, i32* @X, i64 1), align 4
+; CHECK-NEXT:    store i32 [[V_LCSSA]], ptr getelementptr inbounds (i32, ptr @X, i64 1), align 4
 ; CHECK-NEXT:    ret void
 ;
 Entry:
   br label %Loop
 
 Loop:   ; preds = %Loop, %0
-  %X1 = getelementptr i32, i32* @X, i64 1    ; <i32*> [#uses=1]
-  %A = load i32, i32* %X1    ; <i32> [#uses=1]
+  %X1 = getelementptr i32, ptr @X, i64 1    ; <ptr> [#uses=1]
+  %A = load i32, ptr %X1    ; <i32> [#uses=1]
   %V = add i32 %A, 1    ; <i32> [#uses=1]
-  %X2 = getelementptr i32, i32* @X, i64 1    ; <i32*> [#uses=1]
-  store i32 %V, i32* %X2
+  %X2 = getelementptr i32, ptr @X, i64 1    ; <ptr> [#uses=1]
+  store i32 %V, ptr %X2
   br i1 false, label %Loop, label %Exit
 
 Exit:   ; preds = %Loop
@@ -71,9 +71,9 @@ define void @test3(i32 %i) {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
-; CHECK-NEXT:    [[X:%.*]] = load volatile i32, i32* @X, align 4
+; CHECK-NEXT:    [[X:%.*]] = load volatile i32, ptr @X, align 4
 ; CHECK-NEXT:    [[X2:%.*]] = add i32 [[X]], 1
-; CHECK-NEXT:    store i32 [[X2]], i32* @X, align 4
+; CHECK-NEXT:    store i32 [[X2]], ptr @X, align 4
 ; CHECK-NEXT:    br i1 true, label [[OUT:%.*]], label [[LOOP]]
 ; CHECK:       Out:
 ; CHECK-NEXT:    ret void
@@ -81,9 +81,9 @@ define void @test3(i32 %i) {
   br label %Loop
 Loop:
   ; Should not promote this to a register
-  %x = load volatile i32, i32* @X
+  %x = load volatile i32, ptr @X
   %x2 = add i32 %x, 1
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
   br i1 true, label %Out, label %Loop
 
 Out:    ; preds = %Loop
@@ -95,18 +95,18 @@ define void @test3b(i32 %i) {
 ; CHECK-LABEL: @test3b(
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
-; CHECK-NEXT:    [[X:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[X:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    [[X2:%.*]] = add i32 [[X]], 1
-; CHECK-NEXT:    store volatile i32 [[X2]], i32* @X, align 4
+; CHECK-NEXT:    store volatile i32 [[X2]], ptr @X, align 4
 ; CHECK-NEXT:    br i1 true, label [[OUT:%.*]], label [[LOOP]]
 ; CHECK:       Out:
 ; CHECK-NEXT:    ret void
 ;
   br label %Loop
 Loop:
-  %x = load i32, i32* @X
+  %x = load i32, ptr @X
   %x2 = add i32 %x, 1
-  store volatile i32 %x2, i32* @X
+  store volatile i32 %x2, ptr @X
   br i1 true, label %Out, label %Loop
 
 Out:    ; preds = %Loop
@@ -116,57 +116,57 @@ Out:    ; preds = %Loop
 ; PR8041
 ; Should have promoted 'handle2' accesses.
 ; Should not have promoted offsetx1 loads.
-define void @test4(i8* %x, i8 %n) {
+define void @test4(ptr %x, i8 %n) {
 ; CHECK-LABEL: @test4(
-; CHECK-NEXT:    [[HANDLE1:%.*]] = alloca i8*, align 8
-; CHECK-NEXT:    [[HANDLE2:%.*]] = alloca i8*, align 8
-; CHECK-NEXT:    store i8* [[X:%.*]], i8** [[HANDLE1]], align 8
-; CHECK-NEXT:    [[TMP:%.*]] = getelementptr i8, i8* [[X]], i64 8
-; CHECK-NEXT:    [[OFFSETX1:%.*]] = load i8*, i8** [[HANDLE1]], align 8
+; CHECK-NEXT:    [[HANDLE1:%.*]] = alloca ptr, align 8
+; CHECK-NEXT:    [[HANDLE2:%.*]] = alloca ptr, align 8
+; CHECK-NEXT:    store ptr [[X:%.*]], ptr [[HANDLE1]], align 8
+; CHECK-NEXT:    [[TMP:%.*]] = getelementptr i8, ptr [[X]], i64 8
+; CHECK-NEXT:    [[OFFSETX1:%.*]] = load ptr, ptr [[HANDLE1]], align 8
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    br label [[SUBLOOP:%.*]]
 ; CHECK:       subloop:
-; CHECK-NEXT:    [[NEWOFFSETX21:%.*]] = phi i8* [ [[TMP]], [[LOOP]] ], [ [[NEWOFFSETX2:%.*]], [[SUBLOOP]] ]
+; CHECK-NEXT:    [[NEWOFFSETX21:%.*]] = phi ptr [ [[TMP]], [[LOOP]] ], [ [[NEWOFFSETX2:%.*]], [[SUBLOOP]] ]
 ; CHECK-NEXT:    [[COUNT:%.*]] = phi i8 [ 0, [[LOOP]] ], [ [[NEXTCOUNT:%.*]], [[SUBLOOP]] ]
-; CHECK-NEXT:    store i8 [[N:%.*]], i8* [[NEWOFFSETX21]], align 1
-; CHECK-NEXT:    [[NEWOFFSETX2]] = getelementptr i8, i8* [[NEWOFFSETX21]], i64 -1
+; CHECK-NEXT:    store i8 [[N:%.*]], ptr [[NEWOFFSETX21]], align 1
+; CHECK-NEXT:    [[NEWOFFSETX2]] = getelementptr i8, ptr [[NEWOFFSETX21]], i64 -1
 ; CHECK-NEXT:    [[NEXTCOUNT]] = add i8 [[COUNT]], 1
 ; CHECK-NEXT:    [[INNEREXITCOND:%.*]] = icmp sge i8 [[NEXTCOUNT]], 8
 ; CHECK-NEXT:    br i1 [[INNEREXITCOND]], label [[INNEREXIT:%.*]], label [[SUBLOOP]]
 ; CHECK:       innerexit:
-; CHECK-NEXT:    [[NEWOFFSETX2_LCSSA:%.*]] = phi i8* [ [[NEWOFFSETX2]], [[SUBLOOP]] ]
-; CHECK-NEXT:    [[VAL:%.*]] = load i8, i8* [[OFFSETX1]], align 1
+; CHECK-NEXT:    [[NEWOFFSETX2_LCSSA:%.*]] = phi ptr [ [[NEWOFFSETX2]], [[SUBLOOP]] ]
+; CHECK-NEXT:    [[VAL:%.*]] = load i8, ptr [[OFFSETX1]], align 1
 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i8 [[VAL]], [[N]]
 ; CHECK-NEXT:    br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    [[NEWOFFSETX2_LCSSA_LCSSA:%.*]] = phi i8* [ [[NEWOFFSETX2_LCSSA]], [[INNEREXIT]] ]
-; CHECK-NEXT:    store i8* [[NEWOFFSETX2_LCSSA_LCSSA]], i8** [[HANDLE2]], align 8
+; CHECK-NEXT:    [[NEWOFFSETX2_LCSSA_LCSSA:%.*]] = phi ptr [ [[NEWOFFSETX2_LCSSA]], [[INNEREXIT]] ]
+; CHECK-NEXT:    store ptr [[NEWOFFSETX2_LCSSA_LCSSA]], ptr [[HANDLE2]], align 8
 ; CHECK-NEXT:    ret void
 ;
-  %handle1 = alloca i8*
-  %handle2 = alloca i8*
-  store i8* %x, i8** %handle1
+  %handle1 = alloca ptr
+  %handle2 = alloca ptr
+  store ptr %x, ptr %handle1
   br label %loop
 
 loop:
-  %tmp = getelementptr i8, i8* %x, i64 8
-  store i8* %tmp, i8** %handle2
+  %tmp = getelementptr i8, ptr %x, i64 8
+  store ptr %tmp, ptr %handle2
   br label %subloop
 
 subloop:
   %count = phi i8 [ 0, %loop ], [ %nextcount, %subloop ]
-  %offsetx2 = load i8*, i8** %handle2
-  store i8 %n, i8* %offsetx2
-  %newoffsetx2 = getelementptr i8, i8* %offsetx2, i64 -1
-  store i8* %newoffsetx2, i8** %handle2
+  %offsetx2 = load ptr, ptr %handle2
+  store i8 %n, ptr %offsetx2
+  %newoffsetx2 = getelementptr i8, ptr %offsetx2, i64 -1
+  store ptr %newoffsetx2, ptr %handle2
   %nextcount = add i8 %count, 1
   %innerexitcond = icmp sge i8 %nextcount, 8
   br i1 %innerexitcond, label %innerexit, label %subloop
 
 innerexit:
-  %offsetx1 = load i8*, i8** %handle1
-  %val = load i8, i8* %offsetx1
+  %offsetx1 = load ptr, ptr %handle1
+  %val = load i8, ptr %offsetx1
   %cond = icmp eq i8 %val, %n
   br i1 %cond, label %exit, label %loop
 
@@ -174,22 +174,22 @@ exit:
   ret void
 }
 
-define void @test5(i32 %i, i32** noalias %P2) {
+define void @test5(i32 %i, ptr noalias %P2) {
 ; CHECK-LABEL: @test5(
 ; CHECK-NEXT:  Entry:
-; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    [[X21:%.*]] = phi i32 [ [[X_PROMOTED]], [[ENTRY:%.*]] ], [ [[X2:%.*]], [[LOOP]] ]
 ; CHECK-NEXT:    [[J:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[NEXT:%.*]], [[LOOP]] ]
 ; CHECK-NEXT:    [[X2]] = add i32 [[X21]], 1
-; CHECK-NEXT:    store atomic i32* @X, i32** [[P2:%.*]] monotonic, align 8
+; CHECK-NEXT:    store atomic ptr @X, ptr [[P2:%.*]] monotonic, align 8
 ; CHECK-NEXT:    [[NEXT]] = add i32 [[J]], 1
 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[NEXT]], 0
 ; CHECK-NEXT:    br i1 [[COND]], label [[OUT:%.*]], label [[LOOP]]
 ; CHECK:       Out:
 ; CHECK-NEXT:    [[X2_LCSSA:%.*]] = phi i32 [ [[X2]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 [[X2_LCSSA]], i32* @X, align 4
+; CHECK-NEXT:    store i32 [[X2_LCSSA]], ptr @X, align 4
 ; CHECK-NEXT:    ret void
 ;
 Entry:
@@ -197,11 +197,11 @@ Entry:
 
 Loop:   ; preds = %Loop, %0
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]    ; <i32> [#uses=1]
-  %x = load i32, i32* @X   ; <i32> [#uses=1]
+  %x = load i32, ptr @X   ; <i32> [#uses=1]
   %x2 = add i32 %x, 1   ; <i32> [#uses=1]
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
 
-  store atomic i32* @X, i32** %P2 monotonic, align 8
+  store atomic ptr @X, ptr %P2 monotonic, align 8
 
   %Next = add i32 %j, 1   ; <i32> [#uses=2]
   %cond = icmp eq i32 %Next, 0    ; <i1> [#uses=1]
@@ -214,33 +214,33 @@ Out:
 
 
 ; PR14753 - Preserve TBAA tags when promoting values in a loop.
-define void @test6(i32 %n, float* nocapture %a, i32* %gi) {
+define void @test6(i32 %n, ptr nocapture %a, ptr %gi) {
 ; CHECK-LABEL: @test6(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    store i32 0, i32* [[GI:%.*]], align 4, !tbaa [[TBAA0:![0-9]+]]
+; CHECK-NEXT:    store i32 0, ptr [[GI:%.*]], align 4, !tbaa [[TBAA0:![0-9]+]]
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 0, [[N:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[FOR_BODY_LR_PH:%.*]], label [[FOR_END:%.*]]
 ; CHECK:       for.body.lr.ph:
-; CHECK-NEXT:    [[GI_PROMOTED:%.*]] = load i32, i32* [[GI]], align 4, !tbaa [[TBAA0]]
+; CHECK-NEXT:    [[GI_PROMOTED:%.*]] = load i32, ptr [[GI]], align 4, !tbaa [[TBAA0]]
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[INC1:%.*]] = phi i32 [ [[GI_PROMOTED]], [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
 ; CHECK-NEXT:    [[STOREMERGE2:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC]], [[FOR_BODY]] ]
 ; CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[STOREMERGE2]] to i64
-; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 [[IDXPROM]]
-; CHECK-NEXT:    store float 0.000000e+00, float* [[ARRAYIDX]], align 4, !tbaa [[TBAA4:![0-9]+]]
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[A:%.*]], i64 [[IDXPROM]]
+; CHECK-NEXT:    store float 0.000000e+00, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA4:![0-9]+]]
 ; CHECK-NEXT:    [[INC]] = add nsw i32 [[INC1]], 1
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[INC]], [[N]]
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_FOR_END_CRIT_EDGE:%.*]]
 ; CHECK:       for.cond.for.end_crit_edge:
 ; CHECK-NEXT:    [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[FOR_BODY]] ]
-; CHECK-NEXT:    store i32 [[INC_LCSSA]], i32* [[GI]], align 4, !tbaa [[TBAA0]]
+; CHECK-NEXT:    store i32 [[INC_LCSSA]], ptr [[GI]], align 4, !tbaa [[TBAA0]]
 ; CHECK-NEXT:    br label [[FOR_END]]
 ; CHECK:       for.end:
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  store i32 0, i32* %gi, align 4, !tbaa !0
+  store i32 0, ptr %gi, align 4, !tbaa !0
   %cmp1 = icmp slt i32 0, %n
   br i1 %cmp1, label %for.body.lr.ph, label %for.end
 
@@ -250,11 +250,11 @@ for.body.lr.ph:                                   ; preds = %entry
 for.body:                                         ; preds = %for.body.lr.ph, %for.body
   %storemerge2 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
   %idxprom = sext i32 %storemerge2 to i64
-  %arrayidx = getelementptr inbounds float, float* %a, i64 %idxprom
-  store float 0.000000e+00, float* %arrayidx, align 4, !tbaa !3
-  %0 = load i32, i32* %gi, align 4, !tbaa !0
+  %arrayidx = getelementptr inbounds float, ptr %a, i64 %idxprom
+  store float 0.000000e+00, ptr %arrayidx, align 4, !tbaa !3
+  %0 = load i32, ptr %gi, align 4, !tbaa !0
   %inc = add nsw i32 %0, 1
-  store i32 %inc, i32* %gi, align 4, !tbaa !0
+  store i32 %inc, ptr %gi, align 4, !tbaa !0
   %cmp = icmp slt i32 %inc, %n
   br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
 
@@ -267,15 +267,15 @@ for.end:                                          ; preds = %for.cond.for.end_cr
 }
 
 declare i32 @opaque(i32) argmemonly
-declare void @capture(i32*)
+declare void @capture(ptr)
 
 ; We can promote even if opaque may throw.
 define i32 @test7() {
 ; CHECK-LABEL: @test7(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    call void @capture(i32* [[LOCAL]])
-; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[LOCAL]])
+; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X21:%.*]] = phi i32 [ [[LOCAL_PROMOTED]], [[ENTRY:%.*]] ], [ [[X2:%.*]], [[LOOP]] ]
@@ -286,26 +286,26 @@ define i32 @test7() {
 ; CHECK-NEXT:    br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[X2_LCSSA:%.*]] = phi i32 [ [[X2]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 [[X2_LCSSA]], i32* [[LOCAL]], align 4
-; CHECK-NEXT:    [[RET:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    store i32 [[X2_LCSSA]], ptr [[LOCAL]], align 4
+; CHECK-NEXT:    [[RET:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    ret i32 [[RET]]
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 
 loop:
   %j = phi i32 [ 0, %entry ], [ %next, %loop ]
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   %x2 = call i32 @opaque(i32 %x) ; Note this does not capture %local
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -315,8 +315,8 @@ define i32 @test7bad() {
 ; CHECK-LABEL: @test7bad(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    call void @capture(i32* [[LOCAL]])
-; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[LOCAL]])
+; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X22:%.*]] = phi i32 [ [[LOCAL_PROMOTED]], [[ENTRY:%.*]] ], [ [[X21:%.*]], [[ELSE:%.*]] ]
@@ -325,7 +325,7 @@ define i32 @test7bad() {
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X2]], 0
 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[ELSE]]
 ; CHECK:       if:
-; CHECK-NEXT:    store i32 [[X2]], i32* [[LOCAL]], align 4
+; CHECK-NEXT:    store i32 [[X2]], ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    br label [[ELSE]]
 ; CHECK:       else:
 ; CHECK-NEXT:    [[X21]] = phi i32 [ [[X2]], [[IF]] ], [ [[X22]], [[LOOP]] ]
@@ -333,22 +333,22 @@ define i32 @test7bad() {
 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[NEXT]], 0
 ; CHECK-NEXT:    br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    [[RET:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    [[RET:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    ret i32 [[RET]]
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 loop:
   %j = phi i32 [ 0, %entry ], [ %next, %else ]
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   %x2 = call i32 @opaque(i32 %x) ; Note this does not capture %local
   %cmp = icmp eq i32 %x2, 0
   br i1 %cmp, label %if, label %else
 
 if:
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   br label %else
 
 else:
@@ -357,7 +357,7 @@ else:
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -368,8 +368,8 @@ define i32 @test8() {
 ; CHECK-LABEL: @test8(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    call void @capture(i32* [[LOCAL]])
-; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[LOCAL]])
+; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X21:%.*]] = phi i32 [ [[LOCAL_PROMOTED]], [[ENTRY:%.*]] ], [ [[X2:%.*]], [[LOOP]] ]
@@ -381,27 +381,27 @@ define i32 @test8() {
 ; CHECK-NEXT:    br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[X2_LCSSA:%.*]] = phi i32 [ [[X2]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 [[X2_LCSSA]], i32* [[LOCAL]], align 4
-; CHECK-NEXT:    [[RET:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    store i32 [[X2_LCSSA]], ptr [[LOCAL]], align 4
+; CHECK-NEXT:    [[RET:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    ret i32 [[RET]]
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 
 loop:
   %j = phi i32 [ 0, %entry ], [ %next, %loop ]
   %throwaway = call i32 @opaque(i32 %j)
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   %x2 = call i32 @opaque(i32 %x)
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -413,8 +413,8 @@ define i32 @test9() {
 ; CHECK-LABEL: @test9(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    call void @capture(i32* [[LOCAL]])
-; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    call void @capture(ptr [[LOCAL]])
+; CHECK-NEXT:    [[LOCAL_PROMOTED:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[X21:%.*]] = phi i32 [ [[LOCAL_PROMOTED]], [[ENTRY:%.*]] ], [ [[X2:%.*]], [[ELSE:%.*]] ]
@@ -431,13 +431,13 @@ define i32 @test9() {
 ; CHECK-NEXT:    br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[X2_LCSSA:%.*]] = phi i32 [ [[X2]], [[ELSE]] ]
-; CHECK-NEXT:    store i32 [[X2_LCSSA]], i32* [[LOCAL]], align 4
-; CHECK-NEXT:    [[RET:%.*]] = load i32, i32* [[LOCAL]], align 4
+; CHECK-NEXT:    store i32 [[X2_LCSSA]], ptr [[LOCAL]], align 4
+; CHECK-NEXT:    [[RET:%.*]] = load i32, ptr [[LOCAL]], align 4
 ; CHECK-NEXT:    ret i32 [[RET]]
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
+  call void @capture(ptr %local)
   br label %loop
 
 loop:
@@ -447,18 +447,18 @@ loop:
   br i1 %cmp, label %if, label %else
 
 if:
-  %x = load i32, i32* %local
+  %x = load i32, ptr %local
   br label %else
 
 else:
   %x2 = phi i32 [ 0, %loop ], [ %x, %if]
-  store i32 %x2, i32* %local
+  store i32 %x2, ptr %local
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %local
+  %ret = load i32, ptr %local
   ret i32 %ret
 }
 
@@ -466,8 +466,8 @@ define i32 @test9bad(i32 %i) {
 ; CHECK-LABEL: @test9bad(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[LOCAL:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    call void @capture(i32* [[LOCAL]])
-; CHECK-NEXT:    [[NOTDEREF:%.*]] = getelementptr i32, i32* [[LOCAL]], i32 [[I:%.*]]
+; CHECK-NEXT:    call void @capture(ptr [[LOCAL]])
+; CHECK-NEXT:    [[NOTDEREF:%.*]] = getelementptr i32, ptr [[LOCAL]], i32 [[I:%.*]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[J:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[ELSE:%.*]] ]
@@ -475,22 +475,22 @@ define i32 @test9bad(i32 %i) {
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[J2]], 0
 ; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[ELSE]]
 ; CHECK:       if:
-; CHECK-NEXT:    [[X:%.*]] = load i32, i32* [[NOTDEREF]], align 4
+; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[NOTDEREF]], align 4
 ; CHECK-NEXT:    br label [[ELSE]]
 ; CHECK:       else:
 ; CHECK-NEXT:    [[X2:%.*]] = phi i32 [ 0, [[LOOP]] ], [ [[X]], [[IF]] ]
-; CHECK-NEXT:    store i32 [[X2]], i32* [[NOTDEREF]], align 4
+; CHECK-NEXT:    store i32 [[X2]], ptr [[NOTDEREF]], align 4
 ; CHECK-NEXT:    [[NEXT]] = add i32 [[J]], 1
 ; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[NEXT]], 0
 ; CHECK-NEXT:    br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]
 ; CHECK:       exit:
-; CHECK-NEXT:    [[RET:%.*]] = load i32, i32* [[NOTDEREF]], align 4
+; CHECK-NEXT:    [[RET:%.*]] = load i32, ptr [[NOTDEREF]], align 4
 ; CHECK-NEXT:    ret i32 [[RET]]
 ;
 entry:
   %local = alloca i32
-  call void @capture(i32* %local)
-  %notderef = getelementptr i32, i32* %local, i32 %i
+  call void @capture(ptr %local)
+  %notderef = getelementptr i32, ptr %local, i32 %i
   br label %loop
 
 loop:
@@ -500,25 +500,25 @@ loop:
   br i1 %cmp, label %if, label %else
 
 if:
-  %x = load i32, i32* %notderef
+  %x = load i32, ptr %notderef
   br label %else
 
 else:
   %x2 = phi i32 [ 0, %loop ], [ %x, %if]
-  store i32 %x2, i32* %notderef
+  store i32 %x2, ptr %notderef
   %next = add i32 %j, 1
   %cond = icmp eq i32 %next, 0
   br i1 %cond, label %exit, label %loop
 
 exit:
-  %ret = load i32, i32* %notderef
+  %ret = load i32, ptr %notderef
   ret i32 %ret
 }
 
 define void @test10(i32 %i) {
 ; CHECK-LABEL: @test10(
 ; CHECK-NEXT:  Entry:
-; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load atomic i32, i32* @X unordered, align 4
+; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load atomic i32, ptr @X unordered, align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    [[X21:%.*]] = phi i32 [ [[X_PROMOTED]], [[ENTRY:%.*]] ], [ [[X2:%.*]], [[LOOP]] ]
@@ -529,7 +529,7 @@ define void @test10(i32 %i) {
 ; CHECK-NEXT:    br i1 [[COND]], label [[OUT:%.*]], label [[LOOP]]
 ; CHECK:       Out:
 ; CHECK-NEXT:    [[X2_LCSSA:%.*]] = phi i32 [ [[X2]], [[LOOP]] ]
-; CHECK-NEXT:    store atomic i32 [[X2_LCSSA]], i32* @X unordered, align 4
+; CHECK-NEXT:    store atomic i32 [[X2_LCSSA]], ptr @X unordered, align 4
 ; CHECK-NEXT:    ret void
 ;
 Entry:
@@ -538,9 +538,9 @@ Entry:
 
 Loop:   ; preds = %Loop, %0
   %j = phi i32 [ 0, %Entry ], [ %Next, %Loop ]    ; <i32> [#uses=1]
-  %x = load atomic i32, i32* @X unordered, align 4
+  %x = load atomic i32, ptr @X unordered, align 4
   %x2 = add i32 %x, 1
-  store atomic i32 %x2, i32* @X unordered, align 4
+  store atomic i32 %x2, ptr @X unordered, align 4
   %Next = add i32 %j, 1
   %cond = icmp eq i32 %Next, 0
   br i1 %cond, label %Out, label %Loop
@@ -555,7 +555,7 @@ Out:
 define void @test11(i32 %i) {
 ; CHECK-LABEL: @test11(
 ; CHECK-NEXT:  Entry:
-; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[X_PROMOTED:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    [[X21:%.*]] = phi i32 [ [[X_PROMOTED]], [[ENTRY:%.*]] ], [ [[X2:%.*]], [[BODY:%.*]] ]
@@ -569,11 +569,11 @@ define void @test11(i32 %i) {
 ; CHECK-NEXT:    br i1 [[COND]], label [[OUT:%.*]], label [[LOOP]]
 ; CHECK:       Early:
 ; CHECK-NEXT:    [[X21_LCSSA:%.*]] = phi i32 [ [[X21]], [[LOOP]] ]
-; CHECK-NEXT:    store i32 [[X21_LCSSA]], i32* @X, align 4
+; CHECK-NEXT:    store i32 [[X21_LCSSA]], ptr @X, align 4
 ; CHECK-NEXT:    ret void
 ; CHECK:       Out:
 ; CHECK-NEXT:    [[X2_LCSSA:%.*]] = phi i32 [ [[X2]], [[BODY]] ]
-; CHECK-NEXT:    store i32 [[X2_LCSSA]], i32* @X, align 4
+; CHECK-NEXT:    store i32 [[X2_LCSSA]], ptr @X, align 4
 ; CHECK-NEXT:    ret void
 ;
 Entry:
@@ -585,9 +585,9 @@ Loop:   ; preds = %Loop, %0
   %early.test = icmp ult i32 %j, 32
   br i1 %early.test, label %body, label %Early
 body:
-  %x = load i32, i32* @X   ; <i32> [#uses=1]
+  %x = load i32, ptr @X   ; <i32> [#uses=1]
   %x2 = add i32 %x, 1   ; <i32> [#uses=1]
-  store i32 %x2, i32* @X
+  store i32 %x2, ptr @X
   %Next = add i32 %j, 1   ; <i32> [#uses=2]
   %cond = icmp eq i32 %Next, 0    ; <i1> [#uses=1]
   br i1 %cond, label %Out, label %Loop
@@ -599,11 +599,11 @@ Out:
 
 }
 
-define i8 @test_hoistable_existing_load_sinkable_store_writeonly(i8* dereferenceable(8) %ptr, i8 %start) writeonly {
+define i8 @test_hoistable_existing_load_sinkable_store_writeonly(ptr dereferenceable(8) %ptr, i8 %start) writeonly {
 ; CHECK: Function Attrs: writeonly
 ; CHECK-LABEL: @test_hoistable_existing_load_sinkable_store_writeonly(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i8, i8* [[PTR:%.*]], align 1
+; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i8, ptr [[PTR:%.*]], align 1
 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
 ; CHECK:       loop.header:
 ; CHECK-NEXT:    [[INC1:%.*]] = phi i8 [ [[PTR_PROMOTED]], [[ENTRY:%.*]] ], [ [[INC1]], [[LOOP_LATCH:%.*]] ]
@@ -611,7 +611,7 @@ define i8 @test_hoistable_existing_load_sinkable_store_writeonly(i8* dereference
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[I]], 4
 ; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]
 ; CHECK:       loop.latch:
-; CHECK-NEXT:    store i8 [[INC1]], i8* [[PTR]], align 1
+; CHECK-NEXT:    store i8 [[INC1]], ptr [[PTR]], align 1
 ; CHECK-NEXT:    [[ADD]] = add i8 [[I]], [[INC1]]
 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
 ; CHECK:       exit:
@@ -628,8 +628,8 @@ loop.header:
 
 loop.latch:
   %div = sdiv i8 %i, 3
-  %inc = load i8, i8* %ptr
-  store i8 %inc, i8* %ptr
+  %inc = load i8, ptr %ptr
+  store i8 %inc, ptr %ptr
   %add = add i8 %i, %inc
   br label %loop.header
 
@@ -656,7 +656,7 @@ define void @test_sink_store_only() writeonly {
 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[DIV1_LCSSA:%.*]] = phi i8 [ [[DIV1]], [[LOOP_HEADER]] ]
-; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], i8* @glb, align 1
+; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], ptr @glb, align 1
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -669,7 +669,7 @@ loop.header:
 
 loop.latch:
   %div = sdiv i8 %i, 3
-  store i8 %div, i8* @glb, align 1
+  store i8 %div, ptr @glb, align 1
   %add = add i8 %i, 4
   br label %loop.header
 
@@ -694,7 +694,7 @@ define void @test_sink_store_to_local_object_only_loop_must_execute() writeonly
 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[DIV1_LCSSA:%.*]] = phi i8 [ [[DIV1]], [[LOOP_HEADER]] ]
-; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], i8* [[A]], align 1
+; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], ptr [[A]], align 1
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -708,7 +708,7 @@ loop.header:
 
 loop.latch:
   %div = sdiv i8 %i, 3
-  store i8 %div, i8* %a, align 1
+  store i8 %div, ptr %a, align 1
   %add = add i8 %i, 4
   br label %loop.header
 
@@ -723,7 +723,7 @@ define void @test_sink_store_to_local_object_only_loop_may_not_execute(i8 %n) wr
 ; CHECK-LABEL: @test_sink_store_to_local_object_only_loop_may_not_execute(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A:%.*]] = alloca i8, align 1
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i8, i8* [[A]], align 1
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i8, ptr [[A]], align 1
 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
 ; CHECK:       loop.header:
 ; CHECK-NEXT:    [[DIV1:%.*]] = phi i8 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[DIV:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -736,7 +736,7 @@ define void @test_sink_store_to_local_object_only_loop_may_not_execute(i8 %n) wr
 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[DIV1_LCSSA:%.*]] = phi i8 [ [[DIV1]], [[LOOP_HEADER]] ]
-; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], i8* [[A]], align 1
+; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], ptr [[A]], align 1
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -750,7 +750,7 @@ loop.header:
 
 loop.latch:
   %div = sdiv i8 %i, 3
-  store i8 %div, i8* %a, align 1
+  store i8 %div, ptr %a, align 1
   %add = add i8 %i, 4
   br label %loop.header
 
@@ -758,14 +758,14 @@ exit:
   ret void
 }
 
-declare dereferenceable(8) noalias i8* @alloc_writeonly() writeonly
+declare dereferenceable(8) noalias ptr @alloc_writeonly() writeonly
 
 define void @test_sink_store_to_noalias_call_object_only_loop_may_not_execute1(i8 %n) writeonly {
 ; CHECK: Function Attrs: writeonly
 ; CHECK-LABEL: @test_sink_store_to_noalias_call_object_only_loop_may_not_execute1(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[A:%.*]] = call noalias dereferenceable(8) i8* @alloc_writeonly()
-; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i8, i8* [[A]], align 1
+; CHECK-NEXT:    [[A:%.*]] = call noalias dereferenceable(8) ptr @alloc_writeonly()
+; CHECK-NEXT:    [[A_PROMOTED:%.*]] = load i8, ptr [[A]], align 1
 ; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
 ; CHECK:       loop.header:
 ; CHECK-NEXT:    [[DIV1:%.*]] = phi i8 [ [[A_PROMOTED]], [[ENTRY:%.*]] ], [ [[DIV:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -778,11 +778,11 @@ define void @test_sink_store_to_noalias_call_object_only_loop_may_not_execute1(i
 ; CHECK-NEXT:    br label [[LOOP_HEADER]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[DIV1_LCSSA:%.*]] = phi i8 [ [[DIV1]], [[LOOP_HEADER]] ]
-; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], i8* [[A]], align 1
+; CHECK-NEXT:    store i8 [[DIV1_LCSSA]], ptr [[A]], align 1
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %a = call dereferenceable(8) noalias i8* @alloc_writeonly()
+  %a = call dereferenceable(8) noalias ptr @alloc_writeonly()
   br label %loop.header
 
 loop.header:
@@ -792,7 +792,7 @@ loop.header:
 
 loop.latch:
   %div = sdiv i8 %i, 3
-  store i8 %div, i8* %a, align 1
+  store i8 %div, ptr %a, align 1
   %add = add i8 %i, 4
   br label %loop.header
 
@@ -813,7 +813,7 @@ define void @test_sink_store_only_no_phi_needed() writeonly {
 ; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[DIV_LCSSA:%.*]] = phi i8 [ [[DIV]], [[LOOP]] ]
-; CHECK-NEXT:    store i8 [[DIV_LCSSA]], i8* @glb, align 1
+; CHECK-NEXT:    store i8 [[DIV_LCSSA]], ptr @glb, align 1
 ; CHECK-NEXT:    ret void
 ;
 entry:
@@ -823,7 +823,7 @@ loop:
   %i = phi i8 [ 0, %entry ], [ %add, %loop ]
   %cmp = icmp ult i8 %i, 4
   %div = sdiv i8 %i, 3
-  store i8 %div, i8* @glb, align 1
+  store i8 %div, ptr @glb, align 1
   %add = add i8 %i, 4
   br i1 %cmp, label %loop, label %exit
 
@@ -831,7 +831,7 @@ exit:
   ret void
 }
 
-define void @sink_store_lcssa_phis(i32* %ptr, i1 %c) {
+define void @sink_store_lcssa_phis(ptr %ptr, i1 %c) {
 ; CHECK-LABEL: @sink_store_lcssa_phis(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP_1_HEADER:%.*]]
@@ -849,7 +849,7 @@ define void @sink_store_lcssa_phis(i32* %ptr, i1 %c) {
 ; CHECK-NEXT:    br label [[LOOP_3_HEADER]]
 ; CHECK:       loop.2.latch:
 ; CHECK-NEXT:    [[I_11_LCSSA:%.*]] = phi i32 [ [[I_11]], [[LOOP_3_HEADER]] ]
-; CHECK-NEXT:    store i32 [[I_11_LCSSA]], i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    store i32 [[I_11_LCSSA]], ptr [[PTR:%.*]], align 4
 ; CHECK-NEXT:    br label [[LOOP_2_HEADER]]
 ; CHECK:       loop.1.latch:
 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_1_HEADER]], label [[EXIT:%.*]]
@@ -870,7 +870,7 @@ loop.3.header:
   br i1 true, label %loop.3.latch, label %loop.2.latch
 
 loop.3.latch:
-  store i32 %i.1, i32* %ptr, align 4
+  store i32 %i.1, ptr %ptr, align 4
   br label %loop.3.header
 
 loop.2.latch:
@@ -884,9 +884,9 @@ exit:
 }
 
 ; TODO: The store can be promoted, as sret memory is writable.
-define void @sret_cond_store(i32* sret(i32) noalias %ptr) {
+define void @sret_cond_store(ptr sret(i32) noalias %ptr) {
 ; CHECK-LABEL: @sret_cond_store(
-; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i32, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    [[PTR_PROMOTED:%.*]] = load i32, ptr [[PTR:%.*]], align 4
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
 ; CHECK-NEXT:    [[V_INC1:%.*]] = phi i32 [ [[V_INC:%.*]], [[LOOP_LATCH:%.*]] ], [ [[PTR_PROMOTED]], [[TMP0:%.*]] ]
@@ -894,7 +894,7 @@ define void @sret_cond_store(i32* sret(i32) noalias %ptr) {
 ; CHECK-NEXT:    br i1 [[C]], label [[LOOP_LATCH]], label [[EXIT:%.*]]
 ; CHECK:       loop.latch:
 ; CHECK-NEXT:    [[V_INC]] = add i32 [[V_INC1]], 1
-; CHECK-NEXT:    store i32 [[V_INC]], i32* [[PTR]], align 4
+; CHECK-NEXT:    store i32 [[V_INC]], ptr [[PTR]], align 4
 ; CHECK-NEXT:    br label [[LOOP]]
 ; CHECK:       exit:
 ; CHECK-NEXT:    ret void
@@ -902,13 +902,13 @@ define void @sret_cond_store(i32* sret(i32) noalias %ptr) {
   br label %loop
 
 loop:
-  %v = load i32, i32* %ptr
+  %v = load i32, ptr %ptr
   %c = icmp ult i32 %v, 10
   br i1 %c, label %loop.latch, label %exit
 
 loop.latch:
   %v.inc = add i32 %v, 1
-  store i32 %v.inc, i32* %ptr
+  store i32 %v.inc, ptr %ptr
   br label %loop
 
 exit:

diff  --git a/llvm/test/Transforms/LICM/sink-debuginfo-preserve.ll b/llvm/test/Transforms/LICM/sink-debuginfo-preserve.ll
index ea28ab4aefcc8..76b5febef95e7 100644
--- a/llvm/test/Transforms/LICM/sink-debuginfo-preserve.ll
+++ b/llvm/test/Transforms/LICM/sink-debuginfo-preserve.ll
@@ -17,7 +17,7 @@
 ; }
 
 ; CHECK: bb22:
-; CHECK-NEXT: store i32 0, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @g_390, i64 0, i64 1), align 4, !dbg [[storeLocation:![0-9]+]] 
+; CHECK-NEXT: store i32 0, ptr getelementptr inbounds ([2 x i32], ptr @g_390, i64 0, i64 1), align 4, !dbg [[storeLocation:![0-9]+]] 
 ; CHECK: [[storeLocation]] = !DILocation(line: 0
 
 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@@ -30,7 +30,7 @@ target triple = "x86_64-apple-macosx10.15.0"
 
 define i32 @main() local_unnamed_addr !dbg !22 {
 bb:
-  %i = load volatile i32, i32* @b, align 4, !dbg !37, !tbaa !40
+  %i = load volatile i32, ptr @b, align 4, !dbg !37, !tbaa !40
   %i1 = icmp sgt i32 %i, -9, !dbg !44
   br i1 %i1, label %bb2, label %bb4, !dbg !45
 
@@ -41,7 +41,7 @@ bb3:                                              ; preds = %bb8
   br label %bb4, !dbg !45
 
 bb4:                                              ; preds = %bb3, %bb
-  %i5 = load volatile i32, i32* @c, align 4, !dbg !46, !tbaa !40
+  %i5 = load volatile i32, ptr @c, align 4, !dbg !46, !tbaa !40
   %i6 = icmp slt i32 %i5, 6, !dbg !47
   br i1 %i6, label %bb7, label %bb23, !dbg !48
 
@@ -49,26 +49,26 @@ bb7:                                              ; preds = %bb4
   br label %bb13, !dbg !48
 
 bb8:                                              ; preds = %bb8, %bb2
-  %i9 = load volatile i32, i32* @b, align 4, !dbg !49, !tbaa !40
+  %i9 = load volatile i32, ptr @b, align 4, !dbg !49, !tbaa !40
   %i10 = add nsw i32 %i9, -1, !dbg !49
-  store volatile i32 %i10, i32* @b, align 4, !dbg !49, !tbaa !40
-  %i11 = load volatile i32, i32* @b, align 4, !dbg !37, !tbaa !40
+  store volatile i32 %i10, ptr @b, align 4, !dbg !49, !tbaa !40
+  %i11 = load volatile i32, ptr @b, align 4, !dbg !37, !tbaa !40
   %i12 = icmp sgt i32 %i11, -9, !dbg !44
   br i1 %i12, label %bb8, label %bb3, !dbg !45, !llvm.loop !50
 
 bb13:                                             ; preds = %bb17, %bb7
-  store i32 0, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @g_390, i64 0, i64 1), align 4, !dbg !53, !tbaa !40
-  %i14 = load volatile i32, i32* @b, align 4, !dbg !54, !tbaa !40
+  store i32 0, ptr getelementptr inbounds ([2 x i32], ptr @g_390, i64 0, i64 1), align 4, !dbg !53, !tbaa !40
+  %i14 = load volatile i32, ptr @b, align 4, !dbg !54, !tbaa !40
   %i15 = icmp eq i32 %i14, 0, !dbg !54
   br i1 %i15, label %bb16, label %bb17, !dbg !55
 
 bb16:                                             ; preds = %bb13
-  store i32 0, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @g_390, i64 0, i64 1), align 4, !dbg !56, !tbaa !40
+  store i32 0, ptr getelementptr inbounds ([2 x i32], ptr @g_390, i64 0, i64 1), align 4, !dbg !56, !tbaa !40
   br label %bb17
 
 bb17:                                             ; preds = %bb16, %bb13
-  %i18 = load volatile i32, i32* @c, align 4, !dbg !57, !tbaa !40
-  %i20 = load volatile i32, i32* @c, align 4, !dbg !46, !tbaa !40
+  %i18 = load volatile i32, ptr @c, align 4, !dbg !57, !tbaa !40
+  %i20 = load volatile i32, ptr @c, align 4, !dbg !46, !tbaa !40
   %i21 = icmp slt i32 %i20, 6, !dbg !47
   br i1 %i21, label %bb13, label %bb22, !dbg !48, !llvm.loop !58
 

diff  --git a/llvm/test/Transforms/LICM/sink-foldable.ll b/llvm/test/Transforms/LICM/sink-foldable.ll
index cdeb02a124404..3b2ea4cc15243 100644
--- a/llvm/test/Transforms/LICM/sink-foldable.ll
+++ b/llvm/test/Transforms/LICM/sink-foldable.ll
@@ -5,7 +5,7 @@
 
 target triple = "aarch64--linux-gnueabi"
 
-define i8** @test1(i32 %j, i8** readonly %P, i8* readnone %Q) {
+define ptr @test1(i32 %j, ptr readonly %P, ptr readnone %Q) {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP0:%.*]] = icmp slt i32 0, [[J:%.*]]
@@ -13,29 +13,29 @@ define i8** @test1(i32 %j, i8** readonly %P, i8* readnone %Q) {
 ; CHECK:       for.body.lr.ph:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
-; CHECK-NEXT:    [[P_ADDR:%.*]] = phi i8** [ [[P:%.*]], [[FOR_BODY_LR_PH]] ], [ [[ARRAYIDX0:%.*]], [[IF_END:%.*]] ]
+; CHECK-NEXT:    [[P_ADDR:%.*]] = phi ptr [ [[P:%.*]], [[FOR_BODY_LR_PH]] ], [ [[ARRAYIDX0:%.*]], [[IF_END:%.*]] ]
 ; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[I_ADD:%.*]], [[IF_END]] ]
 ; CHECK-NEXT:    [[I0_EXT:%.*]] = sext i32 [[I0]] to i64
-; CHECK-NEXT:    [[ARRAYIDX0]] = getelementptr inbounds i8*, i8** [[P_ADDR]], i64 [[I0_EXT]]
-; CHECK-NEXT:    [[L0:%.*]] = load i8*, i8** [[ARRAYIDX0]], align 8
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8* [[L0]], [[Q:%.*]]
+; CHECK-NEXT:    [[ARRAYIDX0]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i64 [[I0_EXT]]
+; CHECK-NEXT:    [[L0:%.*]] = load ptr, ptr [[ARRAYIDX0]], align 8
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt ptr [[L0]], [[Q:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOPEXIT0:%.*]], label [[IF_END]]
 ; CHECK:       if.end:
-; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8*, i8** [[ARRAYIDX0]], i64 1
-; CHECK-NEXT:    [[L1:%.*]] = load i8*, i8** [[ARRAYIDX1]], align 8
-; CHECK-NEXT:    [[CMP4:%.*]] = icmp ugt i8* [[L1]], [[Q]]
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds ptr, ptr [[ARRAYIDX0]], i64 1
+; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr [[ARRAYIDX1]], align 8
+; CHECK-NEXT:    [[CMP4:%.*]] = icmp ugt ptr [[L1]], [[Q]]
 ; CHECK-NEXT:    [[I_ADD]] = add nsw i32 [[I0]], 2
 ; CHECK-NEXT:    br i1 [[CMP4]], label [[LOOPEXIT1:%.*]], label [[FOR_BODY]]
 ; CHECK:       loopexit0:
-; CHECK-NEXT:    [[P1:%.*]] = phi i8** [ [[ARRAYIDX0]], [[FOR_BODY]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi ptr [ [[ARRAYIDX0]], [[FOR_BODY]] ]
 ; CHECK-NEXT:    br label [[RETURN]]
 ; CHECK:       loopexit1:
-; CHECK-NEXT:    [[ARRAYIDX0_LCSSA:%.*]] = phi i8** [ [[ARRAYIDX0]], [[IF_END]] ]
-; CHECK-NEXT:    [[ARRAYIDX1_LE:%.*]] = getelementptr inbounds i8*, i8** [[ARRAYIDX0_LCSSA]], i64 1
+; CHECK-NEXT:    [[ARRAYIDX0_LCSSA:%.*]] = phi ptr [ [[ARRAYIDX0]], [[IF_END]] ]
+; CHECK-NEXT:    [[ARRAYIDX1_LE:%.*]] = getelementptr inbounds ptr, ptr [[ARRAYIDX0_LCSSA]], i64 1
 ; CHECK-NEXT:    br label [[RETURN]]
 ; CHECK:       return:
-; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i8** [ [[P1]], [[LOOPEXIT0]] ], [ [[ARRAYIDX1_LE]], [[LOOPEXIT1]] ], [ null, [[ENTRY:%.*]] ]
-; CHECK-NEXT:    ret i8** [[RETVAL_0]]
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi ptr [ [[P1]], [[LOOPEXIT0]] ], [ [[ARRAYIDX1_LE]], [[LOOPEXIT1]] ], [ null, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    ret ptr [[RETVAL_0]]
 ;
 entry:
   %cmp0 = icmp slt i32 0, %j
@@ -45,123 +45,123 @@ for.body.lr.ph:
   br label %for.body
 
 for.body:
-  %P.addr = phi i8** [ %P, %for.body.lr.ph ], [ %arrayidx0, %if.end  ]
+  %P.addr = phi ptr [ %P, %for.body.lr.ph ], [ %arrayidx0, %if.end  ]
   %i0 = phi i32 [ 0, %for.body.lr.ph ], [ %i.add, %if.end]
 
   %i0.ext = sext i32 %i0 to i64
-  %arrayidx0 = getelementptr inbounds i8*, i8** %P.addr, i64 %i0.ext
-  %l0 = load i8*, i8** %arrayidx0, align 8
-  %cmp1 = icmp ugt i8* %l0, %Q
+  %arrayidx0 = getelementptr inbounds ptr, ptr %P.addr, i64 %i0.ext
+  %l0 = load ptr, ptr %arrayidx0, align 8
+  %cmp1 = icmp ugt ptr %l0, %Q
   br i1 %cmp1, label %loopexit0, label %if.end
 
 if.end:                                           ; preds = %for.body
-  %arrayidx1 = getelementptr inbounds i8*, i8** %arrayidx0, i64 1
-  %l1 = load i8*, i8** %arrayidx1, align 8
-  %cmp4 = icmp ugt i8* %l1, %Q
+  %arrayidx1 = getelementptr inbounds ptr, ptr %arrayidx0, i64 1
+  %l1 = load ptr, ptr %arrayidx1, align 8
+  %cmp4 = icmp ugt ptr %l1, %Q
   %i.add = add nsw i32 %i0, 2
   br i1 %cmp4, label %loopexit1, label %for.body
 
 loopexit0:
-  %p1 = phi i8** [%arrayidx0, %for.body]
+  %p1 = phi ptr [%arrayidx0, %for.body]
   br label %return
 
 loopexit1:
-  %p2 = phi i8** [%arrayidx1, %if.end]
+  %p2 = phi ptr [%arrayidx1, %if.end]
   br label  %return
 
 return:
-  %retval.0 = phi i8** [ %p1, %loopexit0 ], [%p2, %loopexit1], [ null, %entry ]
-  ret i8** %retval.0
+  %retval.0 = phi ptr [ %p1, %loopexit0 ], [%p2, %loopexit1], [ null, %entry ]
+  ret ptr %retval.0
 }
 
-define i8** @test2(i32 %j, i8** readonly %P, i8* readnone %Q) {
+define ptr @test2(i32 %j, ptr readonly %P, ptr readnone %Q) {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.cond:
 ; CHECK-NEXT:    [[I_ADDR_0:%.*]] = phi i32 [ [[ADD:%.*]], [[IF_END:%.*]] ]
-; CHECK-NEXT:    [[P_ADDR_0:%.*]] = phi i8** [ [[ADD_PTR:%.*]], [[IF_END]] ]
+; CHECK-NEXT:    [[P_ADDR_0:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[IF_END]] ]
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_ADDR_0]], [[J:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[LOOPEXIT0:%.*]]
 ; CHECK:       for.body:
-; CHECK-NEXT:    [[P_ADDR:%.*]] = phi i8** [ [[P:%.*]], [[ENTRY:%.*]] ], [ [[P_ADDR_0]], [[FOR_COND:%.*]] ]
+; CHECK-NEXT:    [[P_ADDR:%.*]] = phi ptr [ [[P:%.*]], [[ENTRY:%.*]] ], [ [[P_ADDR_0]], [[FOR_COND:%.*]] ]
 ; CHECK-NEXT:    [[I_ADDR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_ADDR_0]], [[FOR_COND]] ]
 ; CHECK-NEXT:    [[IDX_EXT:%.*]] = sext i32 [[I_ADDR]] to i64
-; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds i8*, i8** [[P_ADDR]], i64 [[IDX_EXT]]
-; CHECK-NEXT:    [[L0:%.*]] = load i8*, i8** [[ADD_PTR]], align 8
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8* [[L0]], [[Q:%.*]]
+; CHECK-NEXT:    [[ADD_PTR]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i64 [[IDX_EXT]]
+; CHECK-NEXT:    [[L0:%.*]] = load ptr, ptr [[ADD_PTR]], align 8
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt ptr [[L0]], [[Q:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOPEXIT1:%.*]], label [[IF_END]]
 ; CHECK:       if.end:
 ; CHECK-NEXT:    [[ADD_I:%.*]] = add i32 [[I_ADDR]], 1
 ; CHECK-NEXT:    [[IDX2_EXT:%.*]] = sext i32 [[ADD_I]] to i64
-; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds i8*, i8** [[ADD_PTR]], i64 [[IDX2_EXT]]
-; CHECK-NEXT:    [[L1:%.*]] = load i8*, i8** [[ARRAYIDX2]], align 8
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i8* [[L1]], [[Q]]
+; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds ptr, ptr [[ADD_PTR]], i64 [[IDX2_EXT]]
+; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr [[ARRAYIDX2]], align 8
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt ptr [[L1]], [[Q]]
 ; CHECK-NEXT:    [[ADD]] = add nsw i32 [[ADD_I]], 1
 ; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOPEXIT2:%.*]], label [[FOR_COND]]
 ; CHECK:       loopexit0:
-; CHECK-NEXT:    [[P0:%.*]] = phi i8** [ null, [[FOR_COND]] ]
+; CHECK-NEXT:    [[P0:%.*]] = phi ptr [ null, [[FOR_COND]] ]
 ; CHECK-NEXT:    br label [[RETURN:%.*]]
 ; CHECK:       loopexit1:
-; CHECK-NEXT:    [[P1:%.*]] = phi i8** [ [[ADD_PTR]], [[FOR_BODY]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi ptr [ [[ADD_PTR]], [[FOR_BODY]] ]
 ; CHECK-NEXT:    br label [[RETURN]]
 ; CHECK:       loopexit2:
 ; CHECK-NEXT:    [[IDX2_EXT_LCSSA:%.*]] = phi i64 [ [[IDX2_EXT]], [[IF_END]] ]
-; CHECK-NEXT:    [[ADD_PTR_LCSSA:%.*]] = phi i8** [ [[ADD_PTR]], [[IF_END]] ]
-; CHECK-NEXT:    [[ARRAYIDX2_LE:%.*]] = getelementptr inbounds i8*, i8** [[ADD_PTR_LCSSA]], i64 [[IDX2_EXT_LCSSA]]
+; CHECK-NEXT:    [[ADD_PTR_LCSSA:%.*]] = phi ptr [ [[ADD_PTR]], [[IF_END]] ]
+; CHECK-NEXT:    [[ARRAYIDX2_LE:%.*]] = getelementptr inbounds ptr, ptr [[ADD_PTR_LCSSA]], i64 [[IDX2_EXT_LCSSA]]
 ; CHECK-NEXT:    br label [[RETURN]]
 ; CHECK:       return:
-; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i8** [ [[P1]], [[LOOPEXIT1]] ], [ [[ARRAYIDX2_LE]], [[LOOPEXIT2]] ], [ [[P0]], [[LOOPEXIT0]] ]
-; CHECK-NEXT:    ret i8** [[RETVAL_0]]
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi ptr [ [[P1]], [[LOOPEXIT1]] ], [ [[ARRAYIDX2_LE]], [[LOOPEXIT2]] ], [ [[P0]], [[LOOPEXIT0]] ]
+; CHECK-NEXT:    ret ptr [[RETVAL_0]]
 ;
 entry:
   br label %for.body
 
 for.cond:
   %i.addr.0 = phi i32 [ %add, %if.end ]
-  %P.addr.0 = phi i8** [ %add.ptr, %if.end ]
+  %P.addr.0 = phi ptr [ %add.ptr, %if.end ]
   %cmp = icmp slt i32 %i.addr.0, %j
   br i1 %cmp, label %for.body, label %loopexit0
 
 for.body:
-  %P.addr = phi i8** [ %P, %entry ], [ %P.addr.0, %for.cond ]
+  %P.addr = phi ptr [ %P, %entry ], [ %P.addr.0, %for.cond ]
   %i.addr = phi i32 [ 0, %entry ], [ %i.addr.0, %for.cond ]
 
   %idx.ext = sext i32 %i.addr to i64
-  %add.ptr = getelementptr inbounds i8*, i8** %P.addr, i64 %idx.ext
-  %l0 = load i8*, i8** %add.ptr, align 8
+  %add.ptr = getelementptr inbounds ptr, ptr %P.addr, i64 %idx.ext
+  %l0 = load ptr, ptr %add.ptr, align 8
 
-  %cmp1 = icmp ugt i8* %l0, %Q
+  %cmp1 = icmp ugt ptr %l0, %Q
   br i1 %cmp1, label %loopexit1, label %if.end
 
 if.end:
   %add.i = add i32 %i.addr, 1
   %idx2.ext = sext i32 %add.i to i64
-  %arrayidx2 = getelementptr inbounds i8*, i8** %add.ptr, i64 %idx2.ext
-  %l1 = load i8*, i8** %arrayidx2, align 8
-  %cmp2 = icmp ugt i8* %l1, %Q
+  %arrayidx2 = getelementptr inbounds ptr, ptr %add.ptr, i64 %idx2.ext
+  %l1 = load ptr, ptr %arrayidx2, align 8
+  %cmp2 = icmp ugt ptr %l1, %Q
   %add = add nsw i32 %add.i, 1
   br i1 %cmp2, label %loopexit2, label %for.cond
 
 loopexit0:
-  %p0 = phi i8** [ null, %for.cond ]
+  %p0 = phi ptr [ null, %for.cond ]
   br label %return
 
 loopexit1:
-  %p1 = phi i8** [ %add.ptr, %for.body ]
+  %p1 = phi ptr [ %add.ptr, %for.body ]
   br label %return
 
 loopexit2:
-  %p2 = phi i8** [ %arrayidx2, %if.end ]
+  %p2 = phi ptr [ %arrayidx2, %if.end ]
   br label %return
 
 return:
-  %retval.0 = phi i8** [ %p1, %loopexit1 ], [ %p2, %loopexit2 ], [ %p0, %loopexit0 ]
-  ret i8** %retval.0
+  %retval.0 = phi ptr [ %p1, %loopexit1 ], [ %p2, %loopexit2 ], [ %p0, %loopexit0 ]
+  ret ptr %retval.0
 }
 
 
-define i8** @test3(i64 %j, i8** readonly %P, i8* readnone %Q) {
+define ptr @test3(i64 %j, ptr readonly %P, ptr readnone %Q) {
 ; CHECK-LABEL: @test3(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP0:%.*]] = icmp slt i64 0, [[J:%.*]]
@@ -169,34 +169,34 @@ define i8** @test3(i64 %j, i8** readonly %P, i8* readnone %Q) {
 ; CHECK:       for.body.lr.ph:
 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
 ; CHECK:       for.body:
-; CHECK-NEXT:    [[P_ADDR:%.*]] = phi i8** [ [[P:%.*]], [[FOR_BODY_LR_PH]] ], [ [[ARRAYIDX0:%.*]], [[IF_END:%.*]] ]
+; CHECK-NEXT:    [[P_ADDR:%.*]] = phi ptr [ [[P:%.*]], [[FOR_BODY_LR_PH]] ], [ [[ARRAYIDX0:%.*]], [[IF_END:%.*]] ]
 ; CHECK-NEXT:    [[I0:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[I_ADD:%.*]], [[IF_END]] ]
 ; CHECK-NEXT:    [[I0_EXT:%.*]] = sext i32 [[I0]] to i64
-; CHECK-NEXT:    [[ARRAYIDX0]] = getelementptr inbounds i8*, i8** [[P_ADDR]], i64 [[I0_EXT]]
-; CHECK-NEXT:    [[L0:%.*]] = load i8*, i8** [[ARRAYIDX0]], align 8
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i8* [[L0]], [[Q:%.*]]
+; CHECK-NEXT:    [[ARRAYIDX0]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i64 [[I0_EXT]]
+; CHECK-NEXT:    [[L0:%.*]] = load ptr, ptr [[ARRAYIDX0]], align 8
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt ptr [[L0]], [[Q:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP1]], label [[LOOPEXIT0:%.*]], label [[IF_END]]
 ; CHECK:       if.end:
 ; CHECK-NEXT:    [[ADD:%.*]] = add i64 [[I0_EXT]], 1
 ; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i64 [[ADD]] to i32
-; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8*, i8** [[P_ADDR]], i32 [[TRUNC]]
-; CHECK-NEXT:    [[L1:%.*]] = load i8*, i8** [[ARRAYIDX1]], align 8
-; CHECK-NEXT:    [[CMP4:%.*]] = icmp ugt i8* [[L1]], [[Q]]
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i32 [[TRUNC]]
+; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr [[ARRAYIDX1]], align 8
+; CHECK-NEXT:    [[CMP4:%.*]] = icmp ugt ptr [[L1]], [[Q]]
 ; CHECK-NEXT:    [[I_ADD]] = add nsw i32 [[I0]], 2
 ; CHECK-NEXT:    br i1 [[CMP4]], label [[LOOPEXIT1:%.*]], label [[FOR_BODY]]
 ; CHECK:       loopexit0:
-; CHECK-NEXT:    [[P1:%.*]] = phi i8** [ [[ARRAYIDX0]], [[FOR_BODY]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi ptr [ [[ARRAYIDX0]], [[FOR_BODY]] ]
 ; CHECK-NEXT:    br label [[RETURN]]
 ; CHECK:       loopexit1:
 ; CHECK-NEXT:    [[ADD_LCSSA:%.*]] = phi i64 [ [[ADD]], [[IF_END]] ]
-; CHECK-NEXT:    [[P_ADDR_LCSSA:%.*]] = phi i8** [ [[P_ADDR]], [[IF_END]] ]
+; CHECK-NEXT:    [[P_ADDR_LCSSA:%.*]] = phi ptr [ [[P_ADDR]], [[IF_END]] ]
 ; CHECK-NEXT:    [[TRUNC_LE:%.*]] = trunc i64 [[ADD_LCSSA]] to i32
-; CHECK-NEXT:    [[ARRAYIDX1_LE:%.*]] = getelementptr inbounds i8*, i8** [[P_ADDR_LCSSA]], i32 [[TRUNC_LE]]
+; CHECK-NEXT:    [[ARRAYIDX1_LE:%.*]] = getelementptr inbounds ptr, ptr [[P_ADDR_LCSSA]], i32 [[TRUNC_LE]]
 ; CHECK-NEXT:    call void @dummy(i32 [[TRUNC_LE]])
 ; CHECK-NEXT:    br label [[RETURN]]
 ; CHECK:       return:
-; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i8** [ [[P1]], [[LOOPEXIT0]] ], [ [[ARRAYIDX1_LE]], [[LOOPEXIT1]] ], [ null, [[ENTRY:%.*]] ]
-; CHECK-NEXT:    ret i8** [[RETVAL_0]]
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi ptr [ [[P1]], [[LOOPEXIT0]] ], [ [[ARRAYIDX1_LE]], [[LOOPEXIT1]] ], [ null, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    ret ptr [[RETVAL_0]]
 ;
 entry:
   %cmp0 = icmp slt i64 0, %j
@@ -206,36 +206,36 @@ for.body.lr.ph:
   br label %for.body
 
 for.body:
-  %P.addr = phi i8** [ %P, %for.body.lr.ph ], [ %arrayidx0, %if.end  ]
+  %P.addr = phi ptr [ %P, %for.body.lr.ph ], [ %arrayidx0, %if.end  ]
   %i0 = phi i32 [ 0, %for.body.lr.ph ], [ %i.add, %if.end]
 
   %i0.ext = sext i32 %i0 to i64
-  %arrayidx0 = getelementptr inbounds i8*, i8** %P.addr, i64 %i0.ext
-  %l0 = load i8*, i8** %arrayidx0, align 8
-  %cmp1 = icmp ugt i8* %l0, %Q
+  %arrayidx0 = getelementptr inbounds ptr, ptr %P.addr, i64 %i0.ext
+  %l0 = load ptr, ptr %arrayidx0, align 8
+  %cmp1 = icmp ugt ptr %l0, %Q
   br i1 %cmp1, label %loopexit0, label %if.end
 
 if.end:                                           ; preds = %for.body
   %add = add i64 %i0.ext, 1
   %trunc = trunc i64 %add to i32
-  %arrayidx1 = getelementptr inbounds i8*, i8** %P.addr, i32 %trunc
-  %l1 = load i8*, i8** %arrayidx1, align 8
-  %cmp4 = icmp ugt i8* %l1, %Q
+  %arrayidx1 = getelementptr inbounds ptr, ptr %P.addr, i32 %trunc
+  %l1 = load ptr, ptr %arrayidx1, align 8
+  %cmp4 = icmp ugt ptr %l1, %Q
   %i.add = add nsw i32 %i0, 2
   br i1 %cmp4, label %loopexit1, label %for.body
 
 loopexit0:
-  %p1 = phi i8** [%arrayidx0, %for.body]
+  %p1 = phi ptr [%arrayidx0, %for.body]
   br label %return
 
 loopexit1:
-  %p2 = phi i8** [%arrayidx1, %if.end]
+  %p2 = phi ptr [%arrayidx1, %if.end]
   call void @dummy(i32 %trunc)
   br label  %return
 
 return:
-  %retval.0 = phi i8** [ %p1, %loopexit0 ], [%p2, %loopexit1], [ null, %entry ]
-  ret i8** %retval.0
+  %retval.0 = phi ptr [ %p1, %loopexit0 ], [%p2, %loopexit1], [ null, %entry ]
+  ret ptr %retval.0
 }
 
 declare void @dummy(i32)

diff  --git a/llvm/test/Transforms/LICM/sink-promote.ll b/llvm/test/Transforms/LICM/sink-promote.ll
index ac05af5a6400d..bca11c94895a6 100644
--- a/llvm/test/Transforms/LICM/sink-promote.ll
+++ b/llvm/test/Transforms/LICM/sink-promote.ll
@@ -4,7 +4,7 @@
 ; a memory location in a loop.
 ; Store can be sunk out of exit block containing indirectbr instructions after
 ; D50925. Updated to use an argument instead of undef, due to PR38989.
-define void @test12(i32* %ptr) {
+define void @test12(ptr %ptr) {
 ; CHECK-LABEL: @test12
 ; CHECK: store
 ; CHECK-NEXT: br label %lab4
@@ -38,13 +38,13 @@ lab21:
 ; CHECK: lab21:
 ; CHECK-NOT: store
 ; CHECK: br i1 false, label %lab21, label %lab22
-  store i32 36127957, i32* %ptr, align 4
+  store i32 36127957, ptr %ptr, align 4
   br i1 undef, label %lab21, label %lab22
 
 lab22:
 ; CHECK: lab22:
 ; CHECK-NOT: store
-; CHECK-NEXT: indirectbr i8* undef
-  indirectbr i8* undef, [label %lab5, label %lab6, label %lab7]
+; CHECK-NEXT: indirectbr ptr undef
+  indirectbr ptr undef, [label %lab5, label %lab6, label %lab7]
 }
 

diff  --git a/llvm/test/Transforms/LICM/sink-with-coroutine.ll b/llvm/test/Transforms/LICM/sink-with-coroutine.ll
index 04cca14a4ef3c..008fcf8afc36e 100644
--- a/llvm/test/Transforms/LICM/sink-with-coroutine.ll
+++ b/llvm/test/Transforms/LICM/sink-with-coroutine.ll
@@ -16,11 +16,11 @@ define i64 @licm(i64 %n) #0 {
 ; CHECK-NEXT:    i8 0, label [[AWAIT_READY]]
 ; CHECK-NEXT:    ]
 ; CHECK:       await.ready:
-; CHECK-NEXT:    store i64 1, i64* [[P]], align 4
+; CHECK-NEXT:    store i64 1, ptr [[P]], align 4
 ; CHECK-NEXT:    [[T6:%.*]] = icmp ult i64 [[T5]], [[N:%.*]]
 ; CHECK-NEXT:    br i1 [[T6]], label [[LOOP]], label [[BB2]]
 ; CHECK:       bb2:
-; CHECK-NEXT:    [[RES:%.*]] = call i1 @llvm.coro.end(i8* null, i1 false)
+; CHECK-NEXT:    [[RES:%.*]] = call i1 @llvm.coro.end(ptr null, i1 false)
 ; CHECK-NEXT:    ret i64 0
 ;
 entry:
@@ -39,14 +39,14 @@ loop:
   ]
 
 await.ready:
-  store i64 1, i64* %p
+  store i64 1, ptr %p
   %t6 = icmp ult i64 %t5, %n
   br i1 %t6, label %loop, label %bb2
 
 bb2:
-  %res = call i1 @llvm.coro.end(i8* null, i1 false)
+  %res = call i1 @llvm.coro.end(ptr null, i1 false)
   ret i64 0
 }
 
 declare i8  @llvm.coro.suspend(token, i1)
-declare i1  @llvm.coro.end(i8*, i1)
+declare i1  @llvm.coro.end(ptr, i1)

diff  --git a/llvm/test/Transforms/LICM/sinking-debugify.ll b/llvm/test/Transforms/LICM/sinking-debugify.ll
index eb768a5e05b38..b3c0be30841d8 100644
--- a/llvm/test/Transforms/LICM/sinking-debugify.ll
+++ b/llvm/test/Transforms/LICM/sinking-debugify.ll
@@ -10,18 +10,16 @@
 ; turned into an "implicit location" using DW_OP_stack_value.
 define void @test11() {
 ; CHECK-LABEL: @test11(
-; CHECK-NEXT:    br label [[LOOP:%.*]], !dbg [[DBG12:![0-9]+]]
+; CHECK-NEXT:    br label [[LOOP:%.*]], !dbg [[DBG11:![0-9]+]]
 ; CHECK:       Loop:
-; CHECK-NEXT:    call void @llvm.dbg.value(metadata %Ty* @X2, metadata [[META9:![0-9]+]], metadata !DIExpression()), !dbg [[DBG13:![0-9]+]]
-; CHECK-NEXT:    call void @llvm.dbg.value(metadata %Ty* @X2, metadata [[META11:![0-9]+]], metadata !DIExpression(DW_OP_plus_uconst, 4, DW_OP_stack_value)), !dbg [[DBG14:![0-9]+]]
-; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[OUT:%.*]], !dbg [[DBG15:![0-9]+]]
+; CHECK-NEXT:    call void @llvm.dbg.value(metadata ptr @X2, metadata [[META9:![0-9]+]], metadata !DIExpression(DW_OP_plus_uconst, 4, DW_OP_stack_value)), !dbg [[DBG12:![0-9]+]]
+; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[OUT:%.*]], !dbg [[DBG13:![0-9]+]]
 ; CHECK:       Out:
-; CHECK-NEXT:    ret void, !dbg [[DBG16:![0-9]+]]
+; CHECK-NEXT:    ret void, !dbg [[DBG14:![0-9]+]]
 ;
   br label %Loop
 Loop:
-  %dead1 = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
-  %dead2 = getelementptr %Ty, %Ty* @X2, i64 0, i32 1
+  %dead2 = getelementptr %Ty, ptr @X2, i64 0, i32 1
   br i1 false, label %Loop, label %Out
 Out:
   ret void

diff  --git a/llvm/test/Transforms/LICM/sinking.ll b/llvm/test/Transforms/LICM/sinking.ll
index 63d97afe150ba..037c12b30cfca 100644
--- a/llvm/test/Transforms/LICM/sinking.ll
+++ b/llvm/test/Transforms/LICM/sinking.ll
@@ -2,24 +2,24 @@
 ; RUN: opt < %s -basic-aa -licm -S -verify-memoryssa | FileCheck %s
 
 
-declare i32 @strlen(i8*) readonly nounwind willreturn
+declare i32 @strlen(ptr) readonly nounwind willreturn
 
 declare void @foo()
 
 ; Sink readonly function.
-define i32 @test1(i8* %P) {
+define i32 @test1(ptr %P) {
 ; CHECK-LABEL: @test1(
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[OUT:%.*]]
 ; CHECK:       Out:
-; CHECK-NEXT:    [[A_LE:%.*]] = call i32 @strlen(i8* [[P:%.*]]) #[[ATTR3:[0-9]+]]
+; CHECK-NEXT:    [[A_LE:%.*]] = call i32 @strlen(ptr [[P:%.*]]) #[[ATTR3:[0-9]+]]
 ; CHECK-NEXT:    ret i32 [[A_LE]]
 ;
   br label %Loop
 
 Loop:		; preds = %Loop, %0
-  %A = call i32 @strlen( i8* %P ) readonly
+  %A = call i32 @strlen( ptr %P ) readonly
   br i1 false, label %Loop, label %Out
 
 Out:		; preds = %Loop
@@ -72,21 +72,21 @@ Out:		; preds = %Loop
   ret i32 %A
 }
 
-define double @test2c(double* %P) {
+define double @test2c(ptr %P) {
 ; CHECK-LABEL: @test2c(
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    call void @foo()
 ; CHECK-NEXT:    br i1 true, label [[LOOP]], label [[OUT:%.*]]
 ; CHECK:       Out:
-; CHECK-NEXT:    [[A_LE:%.*]] = load double, double* [[P:%.*]], align 8, !invariant.load !0
+; CHECK-NEXT:    [[A_LE:%.*]] = load double, ptr [[P:%.*]], align 8, !invariant.load !0
 ; CHECK-NEXT:    ret double [[A_LE]]
 ;
   br label %Loop
 
 Loop:		; preds = %Loop, %0
   call void @foo( )
-  %A = load double, double* %P, !invariant.load !{}
+  %A = load double, ptr %P, !invariant.load !{}
   br i1 true, label %Loop, label %Out
 
 Out:		; preds = %Loop
@@ -158,7 +158,7 @@ Out:		; preds = %Loop
 ; result of the load is only used outside of the loop, sink the load instead of
 ; hoisting it!
 ;
- at X = global i32 5		; <i32*> [#uses=1]
+ at X = global i32 5		; <ptr> [#uses=1]
 
 define i32 @test5(i32 %N) {
 ; CHECK-LABEL: @test5(
@@ -170,14 +170,14 @@ define i32 @test5(i32 %N) {
 ; CHECK-NEXT:    [[TMP_1:%.*]] = icmp ne i32 [[N_ADDR_0_PN]], 1
 ; CHECK-NEXT:    br i1 [[TMP_1]], label [[LOOP]], label [[OUT:%.*]]
 ; CHECK:       Out:
-; CHECK-NEXT:    [[TMP_6_LE:%.*]] = load i32, i32* @X, align 4
+; CHECK-NEXT:    [[TMP_6_LE:%.*]] = load i32, ptr @X, align 4
 ; CHECK-NEXT:    ret i32 [[TMP_6_LE]]
 ;
 Entry:
   br label %Loop
 Loop:		; preds = %Loop, %Entry
   %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ]
-  %tmp.6 = load i32, i32* @X		; <i32> [#uses=1]
+  %tmp.6 = load i32, ptr @X		; <i32> [#uses=1]
   %dec = add i32 %N_addr.0.pn, -1		; <i32> [#uses=1]
   %tmp.1 = icmp ne i32 %N_addr.0.pn, 1		; <i1> [#uses=1]
   br i1 %tmp.1, label %Loop, label %Out
@@ -201,14 +201,12 @@ define i32 @test6() {
 ; CHECK:       Loop:
 ; CHECK-NEXT:    br i1 false, label [[LOOP]], label [[OUT:%.*]]
 ; CHECK:       Out:
-; CHECK-NEXT:    [[DEAD_LE:%.*]] = getelementptr [[TY:%.*]], %Ty* @X2, i64 0, i32 0
-; CHECK-NEXT:    [[SUNK2_LE:%.*]] = load i32, i32* [[DEAD_LE]], align 4
+; CHECK-NEXT:    [[SUNK2_LE:%.*]] = load i32, ptr @X2, align 4
 ; CHECK-NEXT:    ret i32 [[SUNK2_LE]]
 ;
   br label %Loop
 Loop:
-  %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
-  %sunk2 = load i32, i32* %dead
+  %sunk2 = load i32, ptr @X2
   br i1 false, label %Loop, label %Out
 Out:		; preds = %Loop
   ret i32 %sunk2
@@ -262,15 +260,15 @@ Out2:		; preds = %ContLoop
 ; This testcase checks to make sure we can sink values which are only live on
 ; some exits out of the loop, and that we can do so without breaking dominator
 ; info.
-define i32 @test8(i1 %C1, i1 %C2, i32* %P, i32* %Q) {
+define i32 @test8(i1 %C1, i1 %C2, ptr %P, ptr %Q) {
 ; CHECK-LABEL: @test8(
 ; CHECK-NEXT:  Entry:
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       Loop:
 ; CHECK-NEXT:    br i1 [[C1:%.*]], label [[CONT:%.*]], label [[EXIT1:%.*]]
 ; CHECK:       Cont:
-; CHECK-NEXT:    [[X:%.*]] = load i32, i32* [[P:%.*]], align 4
-; CHECK-NEXT:    store i32 [[X]], i32* [[Q:%.*]], align 4
+; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[P:%.*]], align 4
+; CHECK-NEXT:    store i32 [[X]], ptr [[Q:%.*]], align 4
 ; CHECK-NEXT:    br i1 [[C2:%.*]], label [[LOOP]], label [[EXIT2:%.*]]
 ; CHECK:       exit1:
 ; CHECK-NEXT:    ret i32 0
@@ -284,8 +282,8 @@ Entry:
 Loop:		; preds = %Cont, %Entry
   br i1 %C1, label %Cont, label %exit1
 Cont:		; preds = %Loop
-  %X = load i32, i32* %P		; <i32> [#uses=2]
-  store i32 %X, i32* %Q
+  %X = load i32, ptr %P		; <i32> [#uses=2]
+  store i32 %X, ptr %Q
   %V = add i32 %X, 1		; <i32> [#uses=1]
   br i1 %C2, label %Loop, label %exit2
 exit1:		; preds = %Loop
@@ -374,8 +372,7 @@ define void @test11() {
 ;
   br label %Loop
 Loop:
-  %dead1 = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
-  %dead2 = getelementptr %Ty, %Ty* @X2, i64 0, i32 1
+  %dead2 = getelementptr %Ty, ptr @X2, i64 0, i32 1
   br i1 false, label %Loop, label %Out
 Out:
   ret void
@@ -385,34 +382,34 @@ Out:
 
 ; Test a *many* way nested loop with multiple exit blocks both of which exit
 ; multiple loop nests. This exercises LCSSA corner cases.
-define i32 @PR18753(i1* %a, i1* %b, i1* %c, i1* %d) {
+define i32 @PR18753(ptr %a, ptr %b, ptr %c, ptr %d) {
 ; CHECK-LABEL: @PR18753(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[L1_HEADER:%.*]]
 ; CHECK:       l1.header:
 ; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[L1_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
-; CHECK-NEXT:    [[ARRAYIDX_I:%.*]] = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 [[IV]]
+; CHECK-NEXT:    [[ARRAYIDX_I:%.*]] = getelementptr inbounds [1 x i32], ptr @c, i64 0, i64 [[IV]]
 ; CHECK-NEXT:    br label [[L2_HEADER:%.*]]
 ; CHECK:       l2.header:
-; CHECK-NEXT:    [[X0:%.*]] = load i1, i1* [[C:%.*]], align 4
+; CHECK-NEXT:    [[X0:%.*]] = load i1, ptr [[C:%.*]], align 4
 ; CHECK-NEXT:    br i1 [[X0]], label [[L1_LATCH]], label [[L3_PREHEADER:%.*]]
 ; CHECK:       l3.preheader:
 ; CHECK-NEXT:    br label [[L3_HEADER:%.*]]
 ; CHECK:       l3.header:
-; CHECK-NEXT:    [[X1:%.*]] = load i1, i1* [[D:%.*]], align 4
+; CHECK-NEXT:    [[X1:%.*]] = load i1, ptr [[D:%.*]], align 4
 ; CHECK-NEXT:    br i1 [[X1]], label [[L2_LATCH:%.*]], label [[L4_PREHEADER:%.*]]
 ; CHECK:       l4.preheader:
 ; CHECK-NEXT:    br label [[L4_HEADER:%.*]]
 ; CHECK:       l4.header:
-; CHECK-NEXT:    [[X2:%.*]] = load i1, i1* [[A:%.*]], align 1
+; CHECK-NEXT:    [[X2:%.*]] = load i1, ptr [[A:%.*]], align 1
 ; CHECK-NEXT:    br i1 [[X2]], label [[L3_LATCH:%.*]], label [[L4_BODY:%.*]]
 ; CHECK:       l4.body:
-; CHECK-NEXT:    call void @f(i32* [[ARRAYIDX_I]])
-; CHECK-NEXT:    [[X3:%.*]] = load i1, i1* [[B:%.*]], align 1
+; CHECK-NEXT:    call void @f(ptr [[ARRAYIDX_I]])
+; CHECK-NEXT:    [[X3:%.*]] = load i1, ptr [[B:%.*]], align 1
 ; CHECK-NEXT:    br i1 [[X3]], label [[L4_LATCH:%.*]], label [[EXIT:%.*]]
 ; CHECK:       l4.latch:
 ; CHECK-NEXT:    call void @g()
-; CHECK-NEXT:    [[X4:%.*]] = load i1, i1* [[B]], align 4
+; CHECK-NEXT:    [[X4:%.*]] = load i1, ptr [[B]], align 4
 ; CHECK-NEXT:    br i1 [[X4]], label [[L4_HEADER]], label [[EXIT]]
 ; CHECK:       l3.latch:
 ; CHECK-NEXT:    br label [[L3_HEADER]]
@@ -431,36 +428,36 @@ entry:
 
 l1.header:
   %iv = phi i64 [ %iv.next, %l1.latch ], [ 0, %entry ]
-  %arrayidx.i = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 %iv
+  %arrayidx.i = getelementptr inbounds [1 x i32], ptr @c, i64 0, i64 %iv
   br label %l2.header
 
 l2.header:
-  %x0 = load i1, i1* %c, align 4
+  %x0 = load i1, ptr %c, align 4
   br i1 %x0, label %l1.latch, label %l3.preheader
 
 l3.preheader:
   br label %l3.header
 
 l3.header:
-  %x1 = load i1, i1* %d, align 4
+  %x1 = load i1, ptr %d, align 4
   br i1 %x1, label %l2.latch, label %l4.preheader
 
 l4.preheader:
   br label %l4.header
 
 l4.header:
-  %x2 = load i1, i1* %a
+  %x2 = load i1, ptr %a
   br i1 %x2, label %l3.latch, label %l4.body
 
 l4.body:
-  call void @f(i32* %arrayidx.i)
-  %x3 = load i1, i1* %b
+  call void @f(ptr %arrayidx.i)
+  %x3 = load i1, ptr %b
   %l = trunc i64 %iv to i32
   br i1 %x3, label %l4.latch, label %exit
 
 l4.latch:
   call void @g()
-  %x4 = load i1, i1* %b, align 4
+  %x4 = load i1, ptr %b, align 4
   br i1 %x4, label %l4.header, label %exit
 
 l3.latch:
@@ -500,10 +497,10 @@ define void @test13() {
 ; CHECK:       lab38:
 ; CHECK-NEXT:    ret void
 ; CHECK:       lab59:
-; CHECK-NEXT:    indirectbr i8* undef, [label [[LAB60]], label %lab38]
+; CHECK-NEXT:    indirectbr ptr undef, [label [[LAB60]], label %lab38]
 ; CHECK:       lab60:
-; CHECK-NEXT:    store i32 2145244101, i32* undef, align 4
-; CHECK-NEXT:    indirectbr i8* undef, [label [[LAB21:%.*]], label %lab19]
+; CHECK-NEXT:    store i32 2145244101, ptr undef, align 4
+; CHECK-NEXT:    indirectbr ptr undef, [label [[LAB21:%.*]], label %lab19]
 ;
   br label %lab59
 
@@ -523,11 +520,11 @@ lab38:
   ret void
 
 lab59:
-  indirectbr i8* undef, [label %lab60, label %lab38]
+  indirectbr ptr undef, [label %lab60, label %lab38]
 
 lab60:
-  store i32 2145244101, i32* undef, align 4
-  indirectbr i8* undef, [label %lab21, label %lab19]
+  store i32 2145244101, ptr undef, align 4
+  indirectbr ptr undef, [label %lab21, label %lab19]
 }
 
 ; Check if LICM can sink a sinkable instruction the exit blocks through
@@ -622,7 +619,7 @@ Out12:
 
 ; Sink through a non-trivially replacable PHI node which use the same sinkable
 ; instruction multiple times.
-define i32 @test16(i1 %c, i8** %P, i32* %P2, i64 %V) {
+define i32 @test16(i1 %c, ptr %P, ptr %P2, i64 %V) {
 ; CHECK-LABEL: @test16(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP_PH:%.*]]
@@ -802,19 +799,19 @@ Out12:
 ; Do not sink an instruction through a non-trivially replacable PHI, to avoid
 ; assert while splitting predecessors, if the terminator of predecessor is an
 ; indirectbr.
-define i32 @test19(i1 %cond, i1 %cond2, i8* %address, i32 %v1) nounwind {
+define i32 @test19(i1 %cond, i1 %cond2, ptr %address, i32 %v1) nounwind {
 ; CHECK-LABEL: @test19(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[INDIRECT_GOTO_DEST:%.*]] = select i1 [[COND:%.*]], i8* blockaddress(@test19, [[EXIT:%.*]]), i8* [[ADDRESS:%.*]]
-; CHECK-NEXT:    [[INDIRECT_GOTO_DEST2:%.*]] = select i1 [[COND2:%.*]], i8* blockaddress(@test19, [[EXIT]]), i8* [[ADDRESS]]
+; CHECK-NEXT:    [[INDIRECT_GOTO_DEST:%.*]] = select i1 [[COND:%.*]], ptr blockaddress(@test19, [[EXIT:%.*]]), ptr [[ADDRESS:%.*]]
+; CHECK-NEXT:    [[INDIRECT_GOTO_DEST2:%.*]] = select i1 [[COND2:%.*]], ptr blockaddress(@test19, [[EXIT]]), ptr [[ADDRESS]]
 ; CHECK-NEXT:    br label [[L0:%.*]]
 ; CHECK:       L0:
 ; CHECK-NEXT:    [[V2:%.*]] = call i32 @getv()
 ; CHECK-NEXT:    [[SINKABLE:%.*]] = mul i32 [[V1:%.*]], [[V2]]
 ; CHECK-NEXT:    [[SINKABLE2:%.*]] = add i32 [[V1]], [[V2]]
-; CHECK-NEXT:    indirectbr i8* [[INDIRECT_GOTO_DEST]], [label [[L1:%.*]], label %exit]
+; CHECK-NEXT:    indirectbr ptr [[INDIRECT_GOTO_DEST]], [label [[L1:%.*]], label %exit]
 ; CHECK:       L1:
-; CHECK-NEXT:    indirectbr i8* [[INDIRECT_GOTO_DEST2]], [label [[L0]], label %exit]
+; CHECK-NEXT:    indirectbr ptr [[INDIRECT_GOTO_DEST2]], [label [[L0]], label %exit]
 ; CHECK:       exit:
 ; CHECK-NEXT:    [[R:%.*]] = phi i32 [ [[SINKABLE]], [[L0]] ], [ [[SINKABLE2]], [[L1]] ]
 ; CHECK-NEXT:    ret i32 [[R]]
@@ -822,15 +819,15 @@ define i32 @test19(i1 %cond, i1 %cond2, i8* %address, i32 %v1) nounwind {
 entry:
   br label %L0
 L0:
-  %indirect.goto.dest = select i1 %cond, i8* blockaddress(@test19, %exit), i8* %address
+  %indirect.goto.dest = select i1 %cond, ptr blockaddress(@test19, %exit), ptr %address
   %v2 = call i32 @getv()
   %sinkable = mul i32 %v1, %v2
   %sinkable2 = add i32 %v1, %v2
-  indirectbr i8* %indirect.goto.dest, [label %L1, label %exit]
+  indirectbr ptr %indirect.goto.dest, [label %L1, label %exit]
 
 L1:
-  %indirect.goto.dest2 = select i1 %cond2, i8* blockaddress(@test19, %exit), i8* %address
-  indirectbr i8* %indirect.goto.dest2, [label %L0, label %exit]
+  %indirect.goto.dest2 = select i1 %cond2, ptr blockaddress(@test19, %exit), ptr %address
+  indirectbr ptr %indirect.goto.dest2, [label %L0, label %exit]
 
 exit:
   %r = phi i32 [%sinkable, %L0], [%sinkable2, %L1]
@@ -840,7 +837,7 @@ exit:
 
 ; Do not sink through a non-trivially replacable PHI if splitting predecessors
 ; not allowed in SplitBlockPredecessors().
-define void @test20(i32* %s, i1 %b, i32 %v1, i32 %v2) personality i32 (...)* @__CxxFrameHandler3 {
+define void @test20(ptr %s, i1 %b, i32 %v1, i32 %v2) personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @test20(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
@@ -858,7 +855,7 @@ define void @test20(i32* %s, i1 %b, i32 %v1, i32 %v2) personality i32 (...)* @__
 ; CHECK:       catch.dispatch:
 ; CHECK-NEXT:    [[DOTLCSSA1:%.*]] = phi i32 [ [[SINKABLE]], [[WHILE_BODY]] ], [ [[SINKABLE2]], [[WHILE_BODY2]] ]
 ; CHECK-NEXT:    [[CP:%.*]] = cleanuppad within none []
-; CHECK-NEXT:    store i32 [[DOTLCSSA1]], i32* [[S:%.*]], align 4
+; CHECK-NEXT:    store i32 [[DOTLCSSA1]], ptr [[S:%.*]], align 4
 ; CHECK-NEXT:    cleanupret from [[CP]] unwind to caller
 ; CHECK:       try.cont:
 ; CHECK-NEXT:    ret void
@@ -879,7 +876,7 @@ while.body2:
 catch.dispatch:
   %.lcssa1 = phi i32 [ %sinkable, %while.body ], [ %sinkable2, %while.body2 ]
   %cp = cleanuppad within none []
-  store i32 %.lcssa1, i32* %s
+  store i32 %.lcssa1, ptr %s
   cleanupret from %cp unwind to caller
 try.cont:
   ret void
@@ -888,7 +885,7 @@ try.cont:
 ; The sinkable call should be sunk into an exit block split. After splitting
 ; the exit block, BlockColor for new blocks should be added properly so
 ; that we should be able to access valid ColorVector.
-define i32 @test21_pr36184(i8* %P) personality i32 (...)* @__CxxFrameHandler3 {
+define i32 @test21_pr36184(ptr %P) personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @test21_pr36184(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[LOOP_PH:%.*]]
@@ -902,7 +899,7 @@ define i32 @test21_pr36184(i8* %P) personality i32 (...)* @__CxxFrameHandler3 {
 ; CHECK-NEXT:    [[IDX_PH:%.*]] = phi i32 [ 0, [[CONTLOOP]] ]
 ; CHECK-NEXT:    br label [[OUT:%.*]]
 ; CHECK:       Out.split.loop.exit1:
-; CHECK-NEXT:    [[SINKABLECALL_LE:%.*]] = call i32 @strlen(i8* [[P:%.*]]) #[[ATTR3]]
+; CHECK-NEXT:    [[SINKABLECALL_LE:%.*]] = call i32 @strlen(ptr [[P:%.*]]) #[[ATTR3]]
 ; CHECK-NEXT:    br label [[OUT]]
 ; CHECK:       Out:
 ; CHECK-NEXT:    [[IDX:%.*]] = phi i32 [ [[IDX_PH]], [[OUT_SPLIT_LOOP_EXIT]] ], [ [[SINKABLECALL_LE]], [[OUT_SPLIT_LOOP_EXIT1]] ]
@@ -915,7 +912,7 @@ loop.ph:
   br label %Loop
 
 Loop:
-  %sinkableCall = call i32 @strlen( i8* %P ) readonly
+  %sinkableCall = call i32 @strlen( ptr %P ) readonly
   br i1 undef, label %ContLoop, label %Out
 
 ContLoop:
@@ -927,7 +924,7 @@ Out:
 }
 
 ; We do not support splitting a landingpad block if BlockColors is not empty.
-define void @test22(i1 %b, i32 %v1, i32 %v2) personality i32 (...)* @__CxxFrameHandler3 {
+define void @test22(i1 %b, i32 %v1, i32 %v2) personality ptr @__CxxFrameHandler3 {
 ; CHECK-LABEL: @test22(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
@@ -943,8 +940,8 @@ define void @test22(i1 %b, i32 %v1, i32 %v2) personality i32 (...)* @__CxxFrameH
 ; CHECK-NEXT:    to label [[WHILE_COND]] unwind label [[LPADBB]]
 ; CHECK:       lpadBB:
 ; CHECK-NEXT:    [[DOTLCSSA1:%.*]] = phi i32 [ 0, [[WHILE_BODY]] ], [ [[MUL]], [[WHILE_BODY2]] ]
-; CHECK-NEXT:    [[TMP0:%.*]] = landingpad { i8*, i32 }
-; CHECK-NEXT:    catch i8* null
+; CHECK-NEXT:    [[TMP0:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT:    catch ptr null
 ; CHECK-NEXT:    br label [[LPADBBSUCC1:%.*]]
 ; CHECK:       lpadBBSucc1:
 ; CHECK-NEXT:    ret void
@@ -967,8 +964,8 @@ while.body2:
   to label %while.cond unwind label %lpadBB
 lpadBB:
   %.lcssa1 = phi i32 [ 0, %while.body ], [ %mul, %while.body2 ]
-  landingpad { i8*, i32 }
-  catch i8* null
+  landingpad { ptr, i32 }
+  catch ptr null
   br label %lpadBBSucc1
 
 lpadBBSucc1:
@@ -978,12 +975,12 @@ try.cont:
   ret void
 }
 
-define i32 @not_willreturn(i8* %p) {
+define i32 @not_willreturn(ptr %p) {
 ; CHECK-LABEL: @not_willreturn(
 ; CHECK-NEXT:    [[X:%.*]] = call i32 @getv() #[[ATTR5:[0-9]+]]
 ; CHECK-NEXT:    br label [[LOOP:%.*]]
 ; CHECK:       loop:
-; CHECK-NEXT:    store volatile i8 0, i8* [[P:%.*]], align 1
+; CHECK-NEXT:    store volatile i8 0, ptr [[P:%.*]], align 1
 ; CHECK-NEXT:    br i1 true, label [[LOOP]], label [[OUT:%.*]]
 ; CHECK:       out:
 ; CHECK-NEXT:    [[X_LCSSA:%.*]] = phi i32 [ [[X]], [[LOOP]] ]
@@ -993,7 +990,7 @@ define i32 @not_willreturn(i8* %p) {
 
 loop:
   %x = call i32 @getv() nounwind readnone
-  store volatile i8 0, i8* %p
+  store volatile i8 0, ptr %p
   br i1 true, label %loop, label %out
 
 out:
@@ -1005,5 +1002,5 @@ declare void @may_throw2()
 declare i32 @__CxxFrameHandler3(...)
 declare i32 @getv()
 declare i1 @getc()
-declare void @f(i32*)
+declare void @f(ptr)
 declare void @g()

diff  --git a/llvm/test/Transforms/LICM/speculate.ll b/llvm/test/Transforms/LICM/speculate.ll
index dc6059cfe8ae5..7b669cf339ebe 100644
--- a/llvm/test/Transforms/LICM/speculate.ll
+++ b/llvm/test/Transforms/LICM/speculate.ll
@@ -7,21 +7,21 @@
 ; CHECK:      %div = udiv i64 %x, 2
 ; CHECK-NEXT: br label %for.body
 
-define void @safe_udiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
+define void @safe_udiv(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {
 entry:
   br label %for.body
 
 for.body:                                         ; preds = %entry, %for.inc
   %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.02
+  %0 = load i32, ptr %arrayidx, align 4
   %tobool = icmp eq i32 %0, 0
   br i1 %tobool, label %for.inc, label %if.then
 
 if.then:                                          ; preds = %for.body
   %div = udiv i64 %x, 2
-  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
-  store i64 %div, i64* %arrayidx1, align 8
+  %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.02
+  store i64 %div, ptr %arrayidx1, align 8
   br label %for.inc
 
 for.inc:                                          ; preds = %if.then, %for.body
@@ -39,21 +39,21 @@ for.end:                                          ; preds = %for.inc, %entry
 ; CHECK-NOT:  udiv
 ; CHECK: for.body:
 
-define void @unsafe_udiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
+define void @unsafe_udiv(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {
 entry:
   br label %for.body
 
 for.body:                                         ; preds = %entry, %for.inc
   %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.02
+  %0 = load i32, ptr %arrayidx, align 4
   %tobool = icmp eq i32 %0, 0
   br i1 %tobool, label %for.inc, label %if.then
 
 if.then:                                          ; preds = %for.body
   %div = udiv i64 %x, %m
-  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
-  store i64 %div, i64* %arrayidx1, align 8
+  %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.02
+  store i64 %div, ptr %arrayidx1, align 8
   br label %for.inc
 
 for.inc:                                          ; preds = %if.then, %for.body
@@ -72,22 +72,22 @@ for.end:                                          ; preds = %for.inc, %entry
 ; CHECK:      %div = sdiv i64 %x, 2
 ; CHECK-NEXT: br label %for.body
 
-define void @safe_sdiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
+define void @safe_sdiv(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {
 entry:
   %and = and i64 %m, -3
   br label %for.body
 
 for.body:                                         ; preds = %entry, %for.inc
   %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.02
+  %0 = load i32, ptr %arrayidx, align 4
   %tobool = icmp eq i32 %0, 0
   br i1 %tobool, label %for.inc, label %if.then
 
 if.then:                                          ; preds = %for.body
   %div = sdiv i64 %x, 2
-  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
-  store i64 %div, i64* %arrayidx1, align 8
+  %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.02
+  store i64 %div, ptr %arrayidx1, align 8
   br label %for.inc
 
 for.inc:                                          ; preds = %if.then, %for.body
@@ -105,22 +105,22 @@ for.end:                                          ; preds = %for.inc, %entry
 ; CHECK-NOT:  sdiv
 ; CHECK: for.body:
 
-define void @unsafe_sdiv_a(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
+define void @unsafe_sdiv_a(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {
 entry:
   %or = or i64 %m, 1
   br label %for.body
 
 for.body:                                         ; preds = %entry, %for.inc
   %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.02
+  %0 = load i32, ptr %arrayidx, align 4
   %tobool = icmp eq i32 %0, 0
   br i1 %tobool, label %for.inc, label %if.then
 
 if.then:                                          ; preds = %for.body
   %div = sdiv i64 %x, %or
-  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
-  store i64 %div, i64* %arrayidx1, align 8
+  %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.02
+  store i64 %div, ptr %arrayidx1, align 8
   br label %for.inc
 
 for.inc:                                          ; preds = %if.then, %for.body
@@ -138,22 +138,22 @@ for.end:                                          ; preds = %for.inc, %entry
 ; CHECK-NOT:  sdiv
 ; CHECK: for.body:
 
-define void @unsafe_sdiv_b(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
+define void @unsafe_sdiv_b(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {
 entry:
   %and = and i64 %m, -3
   br label %for.body
 
 for.body:                                         ; preds = %entry, %for.inc
   %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
-  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
-  %0 = load i32, i32* %arrayidx, align 4
+  %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.02
+  %0 = load i32, ptr %arrayidx, align 4
   %tobool = icmp eq i32 %0, 0
   br i1 %tobool, label %for.inc, label %if.then
 
 if.then:                                          ; preds = %for.body
   %div = sdiv i64 %x, %and
-  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
-  store i64 %div, i64* %arrayidx1, align 8
+  %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.02
+  store i64 %div, ptr %arrayidx1, align 8
   br label %for.inc
 
 for.inc:                                          ; preds = %if.then, %for.body
@@ -167,7 +167,7 @@ for.end:                                          ; preds = %for.inc, %entry
 
 ; SDiv is unsafe to speculate inside an infinite loop.
 
-define void @unsafe_sdiv_c(i64 %a, i64 %b, i64* %p) {
+define void @unsafe_sdiv_c(i64 %a, i64 %b, ptr %p) {
 entry:
 ; CHECK: entry:
 ; CHECK-NOT: sdiv
@@ -180,7 +180,7 @@ for.body:
 
 if.then:
   %d = sdiv i64 %a, %b
-  store i64 %d, i64* %p
+  store i64 %d, ptr %p
   br label %backedge
 
 backedge:

diff  --git a/llvm/test/Transforms/LICM/store-hoisting.ll b/llvm/test/Transforms/LICM/store-hoisting.ll
index f6cf6e12350b6..3b36f299eaef5 100644
--- a/llvm/test/Transforms/LICM/store-hoisting.ll
+++ b/llvm/test/Transforms/LICM/store-hoisting.ll
@@ -1,16 +1,16 @@
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck %s
 
-define void @test(i32* %loc) {
+define void @test(ptr %loc) {
 ; CHECK-LABEL: @test
 ; CHECK-LABEL: entry:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: loop:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -19,17 +19,17 @@ exit:
   ret void
 }
 
-define void @test_multiexit(i32* %loc, i1 %earlycnd) {
+define void @test_multiexit(ptr %loc, i1 %earlycnd) {
 ; CHECK-LABEL: @test_multiexit
 ; CHECK-LABEL: entry:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: loop:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   br i1 %earlycnd, label %exit1, label %backedge
   
@@ -43,35 +43,35 @@ exit2:
   ret void
 }
 
-define i32* @false_negative_2use(i32* %loc) {
+define ptr @false_negative_2use(ptr %loc) {
 ; CHECK-LABEL: @false_negative_2use
 ; CHECK-LABEL: entry:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: loop:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
 
 exit:
-  ret i32* %loc
+  ret ptr %loc
 }
 
-define void @neg_lv_value(i32* %loc) {
+define void @neg_lv_value(ptr %loc) {
 ; CHECK-LABEL: @neg_lv_value
 ; CHECK-LABEL: exit:
-; CHECK: store i32 %iv.lcssa, i32* %loc
+; CHECK: store i32 %iv.lcssa, ptr %loc
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 %iv, i32* %loc
+  store i32 %iv, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -80,18 +80,18 @@ exit:
   ret void
 }
 
-define void @neg_lv_addr(i32* %loc) {
+define void @neg_lv_addr(ptr %loc) {
 ; CHECK-LABEL: @neg_lv_addr
 ; CHECK-LABEL: loop:
-; CHECK: store i32 0, i32* %p
+; CHECK: store i32 0, ptr %p
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  %p = getelementptr i32, i32* %loc, i32 %iv
-  store i32 0, i32* %p
+  %p = getelementptr i32, ptr %loc, i32 %iv
+  store i32 0, ptr %p
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -100,17 +100,17 @@ exit:
   ret void
 }
 
-define void @neg_mod(i32* %loc) {
+define void @neg_mod(ptr %loc) {
 ; CHECK-LABEL: @neg_mod
 ; CHECK-LABEL: exit:
-; CHECK: store i32 %iv.lcssa, i32* %loc
+; CHECK: store i32 %iv.lcssa, ptr %loc
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
-  store i32 %iv, i32* %loc
+  store i32 0, ptr %loc
+  store i32 %iv, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -120,19 +120,19 @@ exit:
 }
 
 ; Hoisting the store is actually valid here, as it dominates the load.
-define void @neg_ref(i32* %loc) {
+define void @neg_ref(ptr %loc) {
 ; CHECK-LABEL: @neg_ref
 ; CHECK-LABEL: exit1:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit2:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
-  store i32 0, i32* %loc
-  %v = load i32, i32* %loc
+  store i32 0, ptr %loc
+  %v = load i32, ptr %loc
   %earlycnd = icmp eq i32 %v, 198
   br i1 %earlycnd, label %exit1, label %backedge
   
@@ -148,20 +148,20 @@ exit2:
 }
 
 ; Hoisting the store here leads to a miscompile.
-define void @neg_ref2(i32* %loc) {
+define void @neg_ref2(ptr %loc) {
 ; CHECK-LABEL: @neg_ref2
 ; CHECK-LABEL: exit1:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit2:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 entry:
-  store i32 198, i32* %loc
+  store i32 198, ptr %loc
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %backedge]
-  %v = load i32, i32* %loc
-  store i32 0, i32* %loc
+  %v = load i32, ptr %loc
+  store i32 0, ptr %loc
   %earlycnd = icmp eq i32 %v, 198
   br i1 %earlycnd, label %exit1, label %backedge
   
@@ -178,17 +178,17 @@ exit2:
 
 declare void @modref()
 
-define void @neg_modref(i32* %loc) {
+define void @neg_modref(ptr %loc) {
 ; CHECK-LABEL: @neg_modref
 ; CHECK-LABEL: loop:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   call void @modref()
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
@@ -198,17 +198,17 @@ exit:
   ret void
 }
 
-define void @neg_fence(i32* %loc) {
+define void @neg_fence(ptr %loc) {
 ; CHECK-LABEL: @neg_fence
 ; CHECK-LABEL: loop:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   fence seq_cst
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
@@ -218,17 +218,17 @@ exit:
   ret void
 }
 
-define void @neg_volatile(i32* %loc) {
+define void @neg_volatile(ptr %loc) {
 ; CHECK-LABEL: @neg_volatile
 ; CHECK-LABEL: loop:
-; CHECK: store volatile i32 0, i32* %loc
+; CHECK: store volatile i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store volatile i32 0, i32* %loc
+  store volatile i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -237,17 +237,17 @@ exit:
   ret void
 }
 
-define void @neg_release(i32* %loc) {
+define void @neg_release(ptr %loc) {
 ; CHECK-LABEL: @neg_release
 ; CHECK-LABEL: loop:
-; CHECK: store atomic i32 0, i32* %loc release, align 4
+; CHECK: store atomic i32 0, ptr %loc release, align 4
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store atomic i32 0, i32* %loc release, align 4
+  store atomic i32 0, ptr %loc release, align 4
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -256,17 +256,17 @@ exit:
   ret void
 }
 
-define void @neg_seq_cst(i32* %loc) {
+define void @neg_seq_cst(ptr %loc) {
 ; CHECK-LABEL: @neg_seq_cst
 ; CHECK-LABEL: loop:
-; CHECK: store atomic i32 0, i32* %loc seq_cst, align 4
+; CHECK: store atomic i32 0, ptr %loc seq_cst, align 4
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store atomic i32 0, i32* %loc seq_cst, align 4
+  store atomic i32 0, ptr %loc seq_cst, align 4
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -277,21 +277,21 @@ exit:
 
 declare void @maythrow() inaccessiblememonly
 
-define void @neg_early_exit(i32* %loc) {
+define void @neg_early_exit(ptr %loc) {
 ; CHECK-LABEL: @neg_early_exit
 ; CHECK-LABEL: body:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %body]
-  %is_null = icmp eq i32* %loc, null
+  %is_null = icmp eq ptr %loc, null
   br i1 %is_null, label %exit, label %body
 body:
   call void @maythrow()
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -300,10 +300,10 @@ exit:
   ret void
 }
 
-define void @neg_early_throw(i32* %loc) {
+define void @neg_early_throw(ptr %loc) {
 ; CHECK-LABEL: @neg_early_throw
 ; CHECK-LABEL: loop:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
@@ -311,7 +311,7 @@ entry:
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
   call void @maythrow()
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -320,17 +320,17 @@ exit:
   ret void
 }
 
-define void @test_late_throw(i32* %loc) {
+define void @test_late_throw(ptr %loc) {
 ; CHECK-LABEL: @test_late_throw
 ; CHECK-LABEL: entry:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: loop:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   call void @maythrow()
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
@@ -342,18 +342,18 @@ exit:
 
 ; TODO: could validly hoist the store here since we know what value
 ; the load must observe.
-define i32 @test_dominated_read(i32* %loc) {
+define i32 @test_dominated_read(ptr %loc) {
 ; CHECK-LABEL: @test_dominated_read
 ; CHECK-LABEL: entry:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: loop:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
-  %reload = load i32, i32* %loc
+  store i32 0, ptr %loc
+  %reload = load i32, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -364,17 +364,17 @@ exit:
 
 ; TODO: could validly hoist the store since we already hoisted the load and
 ; it's no longer in the loop.
-define i32 @test_dominating_read(i32* %loc) {
+define i32 @test_dominating_read(ptr %loc) {
 ; CHECK-LABEL: @test_dominating_read
 ; CHECK-LABEL: exit:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  %reload = load i32, i32* %loc
-  store i32 0, i32* %loc
+  %reload = load i32, ptr %loc
+  store i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -386,17 +386,17 @@ exit:
 declare void @readonly() readonly
 
 ; TODO: can legally hoist since value read by call is known
-define void @test_dominated_readonly(i32* %loc) {
+define void @test_dominated_readonly(ptr %loc) {
 ; CHECK-LABEL: @test_dominated_readonly
 ; CHECK-LABEL: loop:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   call void @readonly()
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
@@ -409,19 +409,19 @@ exit:
 ; While technically possible to hoist the store to %loc, this runs across
 ; a funemental limitation of alias sets since both stores and the call are
 ; within the same alias set and we can't distinguish them cheaply.
-define void @test_aliasset_fn(i32* %loc, i32* %loc2) {
+define void @test_aliasset_fn(ptr %loc, ptr %loc2) {
 ; CHECK-LABEL: @test_aliasset_fn
 ; CHECK-LABEL: loop:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
 
 loop:
   %iv = phi i32 [0, %entry], [%iv.next, %loop]
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   call void @readonly()
-  store i32 %iv, i32* %loc2
+  store i32 %iv, ptr %loc2
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit
@@ -433,10 +433,10 @@ exit:
 
 ; If we can't tell if the value is read before the write, we can't hoist the
 ; write over the potential read (since we don't know the value read)
-define void @neg_may_read(i32* %loc, i1 %maybe) {
+define void @neg_may_read(ptr %loc, i1 %maybe) {
 ; CHECK-LABEL: @neg_may_read
 ; CHECK-LABEL: loop:
-; CHECK: store i32 0, i32* %loc
+; CHECK: store i32 0, ptr %loc
 ; CHECK-LABEL: exit:
 entry:
   br label %loop
@@ -449,7 +449,7 @@ taken:
   call void @readonly()
   br label %merge
 merge:
-  store i32 0, i32* %loc
+  store i32 0, ptr %loc
   %iv.next = add i32 %iv, 1
   %cmp = icmp slt i32 %iv, 200
   br i1 %cmp, label %loop, label %exit

diff  --git a/llvm/test/Transforms/LICM/strlen.ll b/llvm/test/Transforms/LICM/strlen.ll
index d14a082d3c492..fd709f650d4e4 100644
--- a/llvm/test/Transforms/LICM/strlen.ll
+++ b/llvm/test/Transforms/LICM/strlen.ll
@@ -1,19 +1,19 @@
 ; RUN: opt -S -inferattrs -basic-aa -licm < %s | FileCheck %s
 
-define void @test(i64* noalias %loc, i8* noalias %a) {
+define void @test(ptr noalias %loc, ptr noalias %a) {
 ; CHECK-LABEL: @test
 ; CHECK: @strlen
 ; CHECK-LABEL: loop:
   br label %loop
 
 loop:
-  %res = call i64 @strlen(i8* %a)
-  store i64 %res, i64* %loc
+  %res = call i64 @strlen(ptr %a)
+  store i64 %res, ptr %loc
   br label %loop
 }
 
-; CHECK: declare i64 @strlen(i8* nocapture) #0
+; CHECK: declare i64 @strlen(ptr nocapture) #0
 ; CHECK: attributes #0 = { argmemonly mustprogress nofree nounwind readonly willreturn }
-declare i64 @strlen(i8*)
+declare i64 @strlen(ptr)
 
 

diff  --git a/llvm/test/Transforms/LICM/unrolled-deeply-nested.ll b/llvm/test/Transforms/LICM/unrolled-deeply-nested.ll
index 87a0104c6c452..ad6f18059a59b 100644
--- a/llvm/test/Transforms/LICM/unrolled-deeply-nested.ll
+++ b/llvm/test/Transforms/LICM/unrolled-deeply-nested.ll
@@ -6,20 +6,14 @@
 ; RUN: opt -S -aa-pipeline=basic-aa -passes='require<opt-remark-emit>,loop-mssa(licm)' < %s | FileCheck %s
 ; RUN: opt -S -basic-aa -licm < %s | FileCheck %s
 
-define i32 @test(i32* %a, i64 %n.0, i64 %n.0.0, i64 %n.0.0.0, i64 %n.0.0.0.0) nounwind uwtable readonly {
+define i32 @test(ptr %a, i64 %n.0, i64 %n.0.0, i64 %n.0.0.0, i64 %n.0.0.0.0) nounwind uwtable readonly {
 ; CHECK-LABEL: define i32 @test
 entry:
   %b = alloca i32
   %c = alloca i32
-  %a.i8 = bitcast i32* %a to i8*
-  %b.i8 = bitcast i32* %b to i8*
-  %c.i8 = bitcast i32* %c to i8*
   br label %l.0.header
 ; CHECK: %b = alloca i32
 ; CHECK: %c = alloca i32
-; CHECK: %[[AI8:.*]] = bitcast i32* %a to i8*
-; CHECK: %[[BI8:.*]] = bitcast i32* %b to i8*
-; CHECK: %[[CI8:.*]] = bitcast i32* %c to i8*
 ; CHECK-NOT: load
 ; CHECK: br
 
@@ -27,15 +21,15 @@ l.0.header:
   %iv.0 = phi i64 [ %iv.0.next, %l.0.latch ], [ 0, %entry ]
   %iv.0.next = add i64 %iv.0, 1
   %exitcond.0 = icmp eq i64 %iv.0.next, %n.0
-  %a.val = load i32, i32* %a
-  store i32 %a.val, i32* %b
+  %a.val = load i32, ptr %a
+  store i32 %a.val, ptr %b
   %c.val = trunc i64 %iv.0 to i32
-  store i32 %c.val, i32* %c
+  store i32 %c.val, ptr %c
   br label %l.0.0.header
-; CHECK: %[[AV:.*]] = load i32, i32* %a
-; CHECK: store i32 %[[AV]], i32* %b
+; CHECK: %[[AV:.*]] = load i32, ptr %a
+; CHECK: store i32 %[[AV]], ptr %b
 ; CHECK: %[[CT:.*]] = trunc i64 {{.*}} to i32
-; CHECK: store i32 %[[CT]], i32* %c
+; CHECK: store i32 %[[CT]], ptr %c
 ; CHECK: br
 
 l.0.0.header:
@@ -49,11 +43,11 @@ l.0.0.0.header:
   %iv.0.0.0 = phi i64 [ %iv.0.0.0.next, %l.0.0.0.header ], [ 0, %l.0.0.header ]
   %iv.0.0.0.next = add i64 %iv.0.0.0, 1
   %exitcond.0.0.0 = icmp eq i64 %iv.0.0.0.next, %n.0.0.0
-  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a.i8, i8* %c.i8, i64 4, i1 false)
-  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b.i8, i8* %c.i8, i64 4, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr %a, ptr %c, i64 4, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr %b, ptr %c, i64 4, i1 false)
   br i1 %exitcond.0.0.0, label %l.0.0.0.header, label %l.0.0.latch
-; CHECK: call void @llvm.memcpy.{{.*}}(i8* %[[AI8]], i8* %[[CI8]], i64 4
-; CHECK: call void @llvm.memcpy.{{.*}}(i8* %[[BI8]], i8* %[[CI8]], i64 4
+; CHECK: call void @llvm.memcpy.{{.*}}(ptr %a, ptr %c, i64 4
+; CHECK: call void @llvm.memcpy.{{.*}}(ptr %b, ptr %c, i64 4
 ; CHECK: br
 
 l.0.0.latch:
@@ -61,9 +55,9 @@ l.0.0.latch:
 ; CHECK: br
 
 l.0.latch:
-  %b.val = load i32, i32* %b
+  %b.val = load i32, ptr %b
   br i1 %exitcond.0, label %exit, label %l.0.header
-; CHECK: %[[BV:.*]] = load i32, i32* %b
+; CHECK: %[[BV:.*]] = load i32, ptr %b
 ; CHECK: br
 
 exit:
@@ -73,4 +67,4 @@ exit:
 ; CHECK: ret i32 %[[LCSSA]]
 }
 
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1)
+declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1)

diff  --git a/llvm/test/Transforms/LICM/update-scev.ll b/llvm/test/Transforms/LICM/update-scev.ll
index d9ee51cd0b5e6..d4e41a39b9c30 100644
--- a/llvm/test/Transforms/LICM/update-scev.ll
+++ b/llvm/test/Transforms/LICM/update-scev.ll
@@ -3,16 +3,16 @@
 
 declare void @clobber()
 
-define void @f_0(i1* %loc) {
+define void @f_0(ptr %loc) {
 ; IR-AFTER-TRANSFORM-LABEL: @f_0(
 ; IR-AFTER-TRANSFORM: loop.outer:
 ; IR-AFTER-TRANSFORM-NEXT:  call void @clobber()
-; IR-AFTER-TRANSFORM-NEXT:  %cond = load i1, i1* %loc
+; IR-AFTER-TRANSFORM-NEXT:  %cond = load i1, ptr %loc
 ; IR-AFTER-TRANSFORM-NEXT:  br label %loop.inner
 
 ; SCEV-EXPRS: Classifying expressions for: @f_0
 ; SCEV-EXPRS: Classifying expressions for: @f_0
-; SCEV-EXPRS:  %cond = load i1, i1* %loc
+; SCEV-EXPRS:  %cond = load i1, ptr %loc
 ; SCEV-EXPRS-NEXT:   -->  {{.*}} LoopDispositions: { %loop.outer: Variant, %loop.inner: Invariant }
 
 entry:
@@ -23,7 +23,7 @@ loop.outer:
   br label %loop.inner
 
 loop.inner:
-  %cond = load i1, i1* %loc
+  %cond = load i1, ptr %loc
   br i1 %cond, label %loop.inner, label %leave.inner
 
 leave.inner:

diff  --git a/llvm/test/Transforms/LICM/volatile-alias.ll b/llvm/test/Transforms/LICM/volatile-alias.ll
index 9d12f7fd9638f..94bf4780d89c3 100644
--- a/llvm/test/Transforms/LICM/volatile-alias.ll
+++ b/llvm/test/Transforms/LICM/volatile-alias.ll
@@ -3,52 +3,52 @@
 ; The objects *p and *q are aliased to each other, but even though *q is
 ; volatile, *p can be considered invariant in the loop. Check if it is moved
 ; out of the loop.
-; CHECK: load i32, i32* %p
+; CHECK: load i32, ptr %p
 ; CHECK: for.body:
-; CHECK: load volatile i32, i32* %q
+; CHECK: load volatile i32, ptr %q
 
 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"
 
 ; Function Attrs: nounwind uwtable
-define i32 @foo(i32* dereferenceable(4) nonnull %p, i32* %q, i32 %n) #0 {
+define i32 @foo(ptr dereferenceable(4) nonnull %p, ptr %q, i32 %n) #0 {
 entry:
-  %p.addr = alloca i32*, align 8
-  %q.addr = alloca i32*, align 8
+  %p.addr = alloca ptr, align 8
+  %q.addr = alloca ptr, align 8
   %n.addr = alloca i32, align 4
   %i = alloca i32, align 4
   %s = alloca i32, align 4
-  store i32* %p, i32** %p.addr, align 8
-  store i32* %q, i32** %q.addr, align 8
-  store i32 %n, i32* %n.addr, align 4
-  store i32 0, i32* %s, align 4
-  store i32 0, i32* %i, align 4
+  store ptr %p, ptr %p.addr, align 8
+  store ptr %q, ptr %q.addr, align 8
+  store i32 %n, ptr %n.addr, align 4
+  store i32 0, ptr %s, align 4
+  store i32 0, ptr %i, align 4
   br label %for.cond
 
 for.cond:                                         ; preds = %for.inc, %entry
-  %0 = load i32, i32* %i, align 4
-  %1 = load i32, i32* %n.addr, align 4
+  %0 = load i32, ptr %i, align 4
+  %1 = load i32, ptr %n.addr, align 4
   %cmp = icmp slt i32 %0, %1
   br i1 %cmp, label %for.body, label %for.end
 
 for.body:                                         ; preds = %for.cond
-  %2 = load i32*, i32** %p.addr, align 8
-  %3 = load i32, i32* %2, align 4
-  %4 = load i32*, i32** %q.addr, align 8
-  %5 = load volatile i32, i32* %4, align 4
+  %2 = load ptr, ptr %p.addr, align 8
+  %3 = load i32, ptr %2, align 4
+  %4 = load ptr, ptr %q.addr, align 8
+  %5 = load volatile i32, ptr %4, align 4
   %add = add nsw i32 %3, %5
-  %6 = load i32, i32* %s, align 4
+  %6 = load i32, ptr %s, align 4
   %add1 = add nsw i32 %6, %add
-  store i32 %add1, i32* %s, align 4
+  store i32 %add1, ptr %s, align 4
   br label %for.inc
 
 for.inc:                                          ; preds = %for.body
-  %7 = load i32, i32* %i, align 4
+  %7 = load i32, ptr %i, align 4
   %inc = add nsw i32 %7, 1
-  store i32 %inc, i32* %i, align 4
+  store i32 %inc, ptr %i, align 4
   br label %for.cond
 
 for.end:                                          ; preds = %for.cond
-  %8 = load i32, i32* %s, align 4
+  %8 = load i32, ptr %s, align 4
   ret i32 %8
 }
 


        


More information about the llvm-commits mailing list