36 changes: 18 additions & 18 deletions llvm/test/Analysis/ScopedNoAliasAA/basic2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,31 @@
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-unknown-linux-gnu"

define void @foo2(float* nocapture %a, float* nocapture %b, float* nocapture readonly %c) #0 {
define void @foo2(ptr nocapture %a, ptr nocapture %b, ptr nocapture readonly %c) #0 {
entry:
; CHECK-LABEL: Function: foo2
%0 = load float, float* %c, align 4, !alias.scope !0
%arrayidx.i = getelementptr inbounds float, float* %a, i64 5
store float %0, float* %arrayidx.i, align 4, !alias.scope !5, !noalias !4
%arrayidx1.i = getelementptr inbounds float, float* %b, i64 8
store float %0, float* %arrayidx1.i, align 4, !alias.scope !0, !noalias !5
%1 = load float, float* %c, align 4
%arrayidx = getelementptr inbounds float, float* %a, i64 7
store float %1, float* %arrayidx, align 4
%0 = load float, ptr %c, align 4, !alias.scope !0
%arrayidx.i = getelementptr inbounds float, ptr %a, i64 5
store float %0, ptr %arrayidx.i, align 4, !alias.scope !5, !noalias !4
%arrayidx1.i = getelementptr inbounds float, ptr %b, i64 8
store float %0, ptr %arrayidx1.i, align 4, !alias.scope !0, !noalias !5
%1 = load float, ptr %c, align 4
%arrayidx = getelementptr inbounds float, ptr %a, i64 7
store float %1, ptr %arrayidx, align 4
ret void

; CHECK: MayAlias: %0 = load float, float* %c, align 4, !alias.scope !0 <-> store float %0, float* %arrayidx.i, align 4, !alias.scope !4, !noalia
; CHECK: MayAlias: %0 = load float, ptr %c, align 4, !alias.scope !0 <-> store float %0, ptr %arrayidx.i, align 4, !alias.scope !4, !noalia
; CHECK: s !5
; CHECK: MayAlias: %0 = load float, float* %c, align 4, !alias.scope !0 <-> store float %0, float* %arrayidx1.i, align 4, !alias.scope !0, !noali
; CHECK: MayAlias: %0 = load float, ptr %c, align 4, !alias.scope !0 <-> store float %0, ptr %arrayidx1.i, align 4, !alias.scope !0, !noali
; CHECK: as !4
; CHECK: MayAlias: %0 = load float, float* %c, align 4, !alias.scope !0 <-> store float %1, float* %arrayidx, align 4
; CHECK: MayAlias: %1 = load float, float* %c, align 4 <-> store float %0, float* %arrayidx.i, align 4, !alias.scope !4, !noalias !5
; CHECK: MayAlias: %1 = load float, float* %c, align 4 <-> store float %0, float* %arrayidx1.i, align 4, !alias.scope !0, !noalias !4
; CHECK: MayAlias: %1 = load float, float* %c, align 4 <-> store float %1, float* %arrayidx, align 4
; CHECK: NoAlias: store float %0, float* %arrayidx1.i, align 4, !alias.scope !0, !noalias !4 <-> store float %0, float* %arrayidx.i, align
; CHECK: MayAlias: %0 = load float, ptr %c, align 4, !alias.scope !0 <-> store float %1, ptr %arrayidx, align 4
; CHECK: MayAlias: %1 = load float, ptr %c, align 4 <-> store float %0, ptr %arrayidx.i, align 4, !alias.scope !4, !noalias !5
; CHECK: MayAlias: %1 = load float, ptr %c, align 4 <-> store float %0, ptr %arrayidx1.i, align 4, !alias.scope !0, !noalias !4
; CHECK: MayAlias: %1 = load float, ptr %c, align 4 <-> store float %1, ptr %arrayidx, align 4
; CHECK: NoAlias: store float %0, ptr %arrayidx1.i, align 4, !alias.scope !0, !noalias !4 <-> store float %0, ptr %arrayidx.i, align
; CHECK: 4, !alias.scope !4, !noalias !5
; CHECK: NoAlias: store float %1, float* %arrayidx, align 4 <-> store float %0, float* %arrayidx.i, align 4, !alias.scope !4, !noalias !5
; CHECK: MayAlias: store float %1, float* %arrayidx, align 4 <-> store float %0, float* %arrayidx1.i, align 4, !alias.scope !0, !noalias !
; CHECK: NoAlias: store float %1, ptr %arrayidx, align 4 <-> store float %0, ptr %arrayidx.i, align 4, !alias.scope !4, !noalias !5
; CHECK: MayAlias: store float %1, ptr %arrayidx, align 4 <-> store float %0, ptr %arrayidx1.i, align 4, !alias.scope !0, !noalias !
; CHECK: 4
}

Expand Down
20 changes: 10 additions & 10 deletions llvm/test/Analysis/StackSafetyAnalysis/Inputs/ipa-alias.ll
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux"

attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" }

@InterposableAliasWrite1 = linkonce dso_local alias void(i8*), void(i8*)* @Write1
@InterposableAliasWrite1 = linkonce dso_local alias void(ptr), ptr @Write1

@PreemptableAliasWrite1 = dso_preemptable alias void(i8*), void(i8*)* @Write1
@AliasToPreemptableAliasWrite1 = dso_local alias void(i8*), void(i8*)* @PreemptableAliasWrite1
@PreemptableAliasWrite1 = dso_preemptable alias void(ptr), ptr @Write1
@AliasToPreemptableAliasWrite1 = dso_local alias void(ptr), ptr @PreemptableAliasWrite1

@AliasWrite1 = dso_local alias void(i8*), void(i8*)* @Write1
@AliasWrite1 = dso_local alias void(ptr), ptr @Write1

@BitcastAliasWrite1 = dso_local alias void(i32*), bitcast (void(i8*)* @Write1 to void(i32*)*)
@AliasToBitcastAliasWrite1 = dso_local alias void(i8*), bitcast (void(i32*)* @BitcastAliasWrite1 to void(i8*)*)
@BitcastAliasWrite1 = dso_local alias void(ptr), ptr @Write1
@AliasToBitcastAliasWrite1 = dso_local alias void(ptr), ptr @BitcastAliasWrite1


define dso_local void @Write1(i8* %p) #0 {
define dso_local void @Write1(ptr %p) #0 {
entry:
store i8 0, i8* %p, align 1
store i8 0, ptr %p, align 1
ret void
}

attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" }
116 changes: 56 additions & 60 deletions llvm/test/Analysis/StackSafetyAnalysis/Inputs/ipa.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,165 +3,161 @@ target triple = "aarch64-unknown-linux"

attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" }

define dso_local void @Write1(i8* %p) #0 {
define dso_local void @Write1(ptr %p) #0 {
entry:
store i8 0, i8* %p, align 1
store i8 0, ptr %p, align 1
ret void
}

define dso_local void @Write4(i8* %p) #0 {
define dso_local void @Write4(ptr %p) #0 {
entry:
%cast = bitcast i8* %p to i32*
store i32 0, i32* %cast, align 1
store i32 0, ptr %p, align 1
ret void
}

define dso_local void @Write4_2(i8* %p, i8* %q) #0 {
define dso_local void @Write4_2(ptr %p, ptr %q) #0 {
entry:
%cast0 = bitcast i8* %p to i32*
store i32 0, i32* %cast0, align 1
%cast1 = bitcast i8* %q to i32*
store i32 0, i32* %cast1, align 1
store i32 0, ptr %p, align 1
store i32 0, ptr %q, align 1
ret void
}

define dso_local void @Write8(i8* %p) #0 {
define dso_local void @Write8(ptr %p) #0 {
entry:
%cast0 = bitcast i8* %p to i64*
store i64 0, i64* %cast0, align 1
store i64 0, ptr %p, align 1
ret void
}

define dso_local i8* @WriteAndReturn8(i8* %p) #0 {
define dso_local ptr @WriteAndReturn8(ptr %p) #0 {
entry:
store i8 0, i8* %p, align 1
ret i8* %p
store i8 0, ptr %p, align 1
ret ptr %p
}

declare dso_local void @ExternalCall(i8* %p)
declare dso_local void @ExternalCall(ptr %p)

define dso_preemptable void @PreemptableWrite1(i8* %p) #0 {
define dso_preemptable void @PreemptableWrite1(ptr %p) #0 {
entry:
store i8 0, i8* %p, align 1
store i8 0, ptr %p, align 1
ret void
}

define linkonce dso_local void @InterposableWrite1(i8* %p) #0 {
define linkonce dso_local void @InterposableWrite1(ptr %p) #0 {
entry:
store i8 0, i8* %p, align 1
store i8 0, ptr %p, align 1
ret void
}

define dso_local i8* @ReturnDependent(i8* %p) #0 {
define dso_local ptr @ReturnDependent(ptr %p) #0 {
entry:
%p2 = getelementptr i8, i8* %p, i64 2
ret i8* %p2
%p2 = getelementptr i8, ptr %p, i64 2
ret ptr %p2
}

; access range [2, 6)
define dso_local void @Rec0(i8* %p) #0 {
define dso_local void @Rec0(ptr %p) #0 {
entry:
%p1 = getelementptr i8, i8* %p, i64 2
call void @Write4(i8* %p1)
%p1 = getelementptr i8, ptr %p, i64 2
call void @Write4(ptr %p1)
ret void
}

; access range [3, 7)
define dso_local void @Rec1(i8* %p) #0 {
define dso_local void @Rec1(ptr %p) #0 {
entry:
%p1 = getelementptr i8, i8* %p, i64 1
call void @Rec0(i8* %p1)
%p1 = getelementptr i8, ptr %p, i64 1
call void @Rec0(ptr %p1)
ret void
}

; access range [-2, 2)
define dso_local void @Rec2(i8* %p) #0 {
define dso_local void @Rec2(ptr %p) #0 {
entry:
%p1 = getelementptr i8, i8* %p, i64 -5
call void @Rec1(i8* %p1)
%p1 = getelementptr i8, ptr %p, i64 -5
call void @Rec1(ptr %p1)
ret void
}

; Recursive function that passes %acc unchanged => access range [0, 4).
define dso_local void @RecursiveNoOffset(i32* %p, i32 %size, i32* %acc) {
define dso_local void @RecursiveNoOffset(ptr %p, i32 %size, ptr %acc) {
entry:
%cmp = icmp eq i32 %size, 0
br i1 %cmp, label %return, label %if.end

if.end:
%load0 = load i32, i32* %p, align 4
%load1 = load i32, i32* %acc, align 4
%load0 = load i32, ptr %p, align 4
%load1 = load i32, ptr %acc, align 4
%add = add nsw i32 %load1, %load0
store i32 %add, i32* %acc, align 4
%add.ptr = getelementptr inbounds i32, i32* %p, i64 1
store i32 %add, ptr %acc, align 4
%add.ptr = getelementptr inbounds i32, ptr %p, i64 1
%sub = add nsw i32 %size, -1
tail call void @RecursiveNoOffset(i32* %add.ptr, i32 %sub, i32* %acc)
tail call void @RecursiveNoOffset(ptr %add.ptr, i32 %sub, ptr %acc)
ret void

return:
ret void
}

; Recursive function that advances %acc on each iteration => access range unlimited.
define dso_local void @RecursiveWithOffset(i32 %size, i32* %acc) {
define dso_local void @RecursiveWithOffset(i32 %size, ptr %acc) {
entry:
%cmp = icmp eq i32 %size, 0
br i1 %cmp, label %return, label %if.end

if.end:
store i32 0, i32* %acc, align 4
%acc2 = getelementptr inbounds i32, i32* %acc, i64 1
store i32 0, ptr %acc, align 4
%acc2 = getelementptr inbounds i32, ptr %acc, i64 1
%sub = add nsw i32 %size, -1
tail call void @RecursiveWithOffset(i32 %sub, i32* %acc2)
tail call void @RecursiveWithOffset(i32 %sub, ptr %acc2)
ret void

return:
ret void
}

define dso_local i64* @ReturnAlloca() {
define dso_local ptr @ReturnAlloca() {
entry:
%x = alloca i64, align 4
ret i64* %x
ret ptr %x
}

define dso_local void @Write1Private(i8* %p) #0 {
define dso_local void @Write1Private(ptr %p) #0 {
entry:
call void @Private(i8* %p)
call void @Private(ptr %p)
ret void
}

define dso_local void @Write1SameModule(i8* %p) #0 {
define dso_local void @Write1SameModule(ptr %p) #0 {
entry:
call void @Write1(i8* %p)
call void @Write1(ptr %p)
ret void
}

declare void @Write1Module0(i8* %p)
declare void @Write1Module0(ptr %p)

define dso_local void @Write1DiffModule(i8* %p) #0 {
define dso_local void @Write1DiffModule(ptr %p) #0 {
entry:
call void @Write1Module0(i8* %p)
call void @Write1Module0(ptr %p)
ret void
}

define private dso_local void @Private(i8* %p) #0 {
define private dso_local void @Private(ptr %p) #0 {
entry:
%p1 = getelementptr i8, i8* %p, i64 -1
store i8 0, i8* %p1, align 1
%p1 = getelementptr i8, ptr %p, i64 -1
store i8 0, ptr %p1, align 1
ret void
}

define dso_local void @Write1Weak(i8* %p) #0 {
define dso_local void @Write1Weak(ptr %p) #0 {
entry:
call void @Weak(i8* %p)
call void @Weak(ptr %p)
ret void
}

define weak dso_local void @Weak(i8* %p) #0 {
define weak dso_local void @Weak(ptr %p) #0 {
entry:
%p1 = getelementptr i8, i8* %p, i64 -1
store i8 0, i8* %p1, align 1
%p1 = getelementptr i8, ptr %p, i64 -1
store i8 0, ptr %p1, align 1
ret void
}

6 changes: 3 additions & 3 deletions llvm/test/Analysis/StackSafetyAnalysis/i386-bug-fix.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f8
target triple = "i386-pc-linux-gnu"

; Function Attrs: mustprogress norecurse sanitize_address uwtable
define dso_local i32 @main(i32 %argc, i8** %argv) {
define dso_local i32 @main(i32 %argc, ptr %argv) {
entry:
%0 = alloca i32, align 4
%1 = alloca i8, i64 32, align 32
%2 = ptrtoint i8* %1 to i32
store i32 %2, i32* %0, align 4
%2 = ptrtoint ptr %1 to i32
store i32 %2, ptr %0, align 4
ret i32 0
}
28 changes: 14 additions & 14 deletions llvm/test/Analysis/StackSafetyAnalysis/ipa-alias.ll
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
; RUN: -r %t.summ1.bc,PreemptableAliasWrite1,px \
; RUN: -r %t.summ1.bc,Write1,px

; RUN: llvm-lto2 run -opaque-pointers=0 %t.summ0.bc %t.summ1.bc -o %t.lto -stack-safety-print -stack-safety-run -save-temps -thinlto-threads 1 -O0 \
; RUN: llvm-lto2 run %t.summ0.bc %t.summ1.bc -o %t.lto -stack-safety-print -stack-safety-run -save-temps -thinlto-threads 1 -O0 \
; RUN: $(cat %t.res.txt) \
; RUN: 2>&1 | FileCheck %s --check-prefixes=CHECK,GLOBAL,LTO

Expand All @@ -42,16 +42,16 @@ target triple = "aarch64-unknown-linux"

attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" }

declare void @PreemptableAliasWrite1(i8* %p)
declare void @AliasToPreemptableAliasWrite1(i8* %p)
declare void @PreemptableAliasWrite1(ptr %p)
declare void @AliasToPreemptableAliasWrite1(ptr %p)

declare void @InterposableAliasWrite1(i8* %p)
declare void @InterposableAliasWrite1(ptr %p)
; Aliases to interposable aliases are not allowed

declare void @AliasWrite1(i8* %p)
declare void @AliasWrite1(ptr %p)

declare void @BitcastAliasWrite1(i32* %p)
declare void @AliasToBitcastAliasWrite1(i8* %p)
declare void @BitcastAliasWrite1(ptr %p)
declare void @AliasToBitcastAliasWrite1(ptr %p)

; Call to dso_preemptable alias to a dso_local aliasee
define void @PreemptableAliasCall() #0 {
Expand All @@ -66,11 +66,11 @@ define void @PreemptableAliasCall() #0 {
; CHECK-EMPTY:
entry:
%x1 = alloca i8
call void @PreemptableAliasWrite1(i8* %x1)
call void @PreemptableAliasWrite1(ptr %x1)

%x2 = alloca i8
; Alias to a preemptable alias is not preemptable
call void @AliasToPreemptableAliasWrite1(i8* %x2)
call void @AliasToPreemptableAliasWrite1(ptr %x2)
ret void
}

Expand All @@ -87,7 +87,7 @@ define void @InterposableAliasCall() #0 {
entry:
%x = alloca i8
; ThinLTO can resolve the prevailing implementation for interposable definitions.
call void @InterposableAliasWrite1(i8* %x)
call void @InterposableAliasWrite1(ptr %x)
ret void
}

Expand All @@ -102,7 +102,7 @@ define void @AliasCall() #0 {
; CHECK-EMPTY:
entry:
%x = alloca i8
call void @AliasWrite1(i8* %x)
call void @AliasWrite1(ptr %x)
ret void
}

Expand All @@ -119,9 +119,9 @@ define void @BitcastAliasCall() #0 {
; CHECK-EMPTY:
entry:
%x1 = alloca i32
call void @BitcastAliasWrite1(i32* %x1)
call void @BitcastAliasWrite1(ptr %x1)
%x2 = alloca i8
call void @AliasToBitcastAliasWrite1(i8* %x2)
call void @AliasToBitcastAliasWrite1(ptr %x2)
ret void
}

Expand All @@ -132,5 +132,5 @@ entry:
; CHECK-NEXT: p[]: [0,1){{$}}
; CHECK-NEXT: allocas uses:
; GLOBAL-NEXT: safe accesses:
; GLOBAL-NEXT: store i8 0, i8* %p, align 1
; GLOBAL-NEXT: store i8 0, ptr %p, align 1
; CHECK-EMPTY:
185 changes: 83 additions & 102 deletions llvm/test/Analysis/StackSafetyAnalysis/ipa.ll

Large diffs are not rendered by default.

610 changes: 284 additions & 326 deletions llvm/test/Analysis/StackSafetyAnalysis/lifetime.ll

Large diffs are not rendered by default.

461 changes: 208 additions & 253 deletions llvm/test/Analysis/StackSafetyAnalysis/local.ll

Large diffs are not rendered by default.

87 changes: 33 additions & 54 deletions llvm/test/Analysis/StackSafetyAnalysis/memintrin.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,22 @@
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare void @llvm.memset.p0i8.i64(i8* %dest, i8 %val, i64 %len, i1 %isvolatile)
declare void @llvm.memset.p0i8.i32(i8* %dest, i8 %val, i32 %len, i1 %isvolatile)
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i1 %isvolatile)
declare void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i1 %isvolatile)
declare void @llvm.memset.p0.i64(ptr %dest, i8 %val, i64 %len, i1 %isvolatile)
declare void @llvm.memset.p0.i32(ptr %dest, i8 %val, i32 %len, i1 %isvolatile)
declare void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %src, i32 %len, i1 %isvolatile)
declare void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %src, i32 %len, i1 %isvolatile)

define void @MemsetInBounds() {
; CHECK-LABEL: MemsetInBounds dso_preemptable{{$}}
; CHECK-NEXT: args uses:
; CHECK-NEXT: allocas uses:
; CHECK-NEXT: x[4]: [0,4){{$}}
; GLOBAL-NEXT: safe accesses:
; GLOBAL-NEXT: call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 4, i1 false)
; GLOBAL-NEXT: call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 4, i1 false)
; CHECK-EMPTY:
entry:
%x = alloca i32, align 4
%x1 = bitcast i32* %x to i8*
call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 4, i1 false)
call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 4, i1 false)
ret void
}

Expand All @@ -31,12 +30,11 @@ define void @VolatileMemsetInBounds() {
; CHECK-NEXT: allocas uses:
; CHECK-NEXT: x[4]: [0,4){{$}}
; GLOBAL-NEXT: safe accesses:
; GLOBAL-NEXT: call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 4, i1 true)
; GLOBAL-NEXT: call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 4, i1 true)
; CHECK-EMPTY:
entry:
%x = alloca i32, align 4
%x1 = bitcast i32* %x to i8*
call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 4, i1 true)
call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 4, i1 true)
ret void
}

Expand All @@ -49,8 +47,7 @@ define void @MemsetOutOfBounds() {
; CHECK-EMPTY:
entry:
%x = alloca i32, align 4
%x1 = bitcast i32* %x to i8*
call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 5, i1 false)
call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 5, i1 false)
ret void
}

Expand All @@ -63,8 +60,7 @@ define void @MemsetNonConst(i32 %size) {
; CHECK-EMPTY:
entry:
%x = alloca i32, align 4
%x1 = bitcast i32* %x to i8*
call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 %size, i1 false)
call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 %size, i1 false)
ret void
}

Expand All @@ -79,9 +75,8 @@ define void @MemsetNonConstInBounds(i1 zeroext %z) {
; CHECK-EMPTY:
entry:
%x = alloca i32, align 4
%x1 = bitcast i32* %x to i8*
%size = select i1 %z, i32 3, i32 4
call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 %size, i1 false)
call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 %size, i1 false)
ret void
}

Expand All @@ -96,11 +91,10 @@ define void @MemsetNonConstSize() {
entry:
%x = alloca i32, align 4
%y = alloca i32, align 4
%x1 = bitcast i32* %x to i8*
%xint = ptrtoint i32* %x to i32
%yint = ptrtoint i32* %y to i32
%xint = ptrtoint ptr %x to i32
%yint = ptrtoint ptr %y to i32
%d = sub i32 %xint, %yint
call void @llvm.memset.p0i8.i32(i8* %x1, i8 42, i32 %d, i1 false)
call void @llvm.memset.p0.i32(ptr %x, i8 42, i32 %d, i1 false)
ret void
}

Expand All @@ -111,14 +105,12 @@ define void @MemcpyInBounds() {
; CHECK-NEXT: x[4]: [0,4){{$}}
; CHECK-NEXT: y[4]: [0,4){{$}}
; GLOBAL-NEXT: safe accesses:
; GLOBAL-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %y1, i32 4, i1 false)
; GLOBAL-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %y, i32 4, i1 false)
; CHECK-EMPTY:
entry:
%x = alloca i32, align 4
%y = alloca i32, align 4
%x1 = bitcast i32* %x to i8*
%y1 = bitcast i32* %y to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %y1, i32 4, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %y, i32 4, i1 false)
ret void
}

Expand All @@ -133,9 +125,7 @@ define void @MemcpySrcOutOfBounds() {
entry:
%x = alloca i64, align 4
%y = alloca i32, align 4
%x1 = bitcast i64* %x to i8*
%y1 = bitcast i32* %y to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %y1, i32 5, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %y, i32 5, i1 false)
ret void
}

Expand All @@ -150,9 +140,7 @@ define void @MemcpyDstOutOfBounds() {
entry:
%x = alloca i32, align 4
%y = alloca i64, align 4
%x1 = bitcast i32* %x to i8*
%y1 = bitcast i64* %y to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %y1, i32 5, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %y, i32 5, i1 false)
ret void
}

Expand All @@ -167,9 +155,7 @@ define void @MemcpyBothOutOfBounds() {
entry:
%x = alloca i32, align 4
%y = alloca i64, align 4
%x1 = bitcast i32* %x to i8*
%y1 = bitcast i64* %y to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %y1, i32 9, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %y, i32 9, i1 false)
ret void
}

Expand All @@ -179,13 +165,12 @@ define void @MemcpySelfInBounds() {
; CHECK-NEXT: allocas uses:
; CHECK-NEXT: x[8]: [0,8){{$}}
; GLOBAL-NEXT: safe accesses
; GLOBAL-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %x2, i32 3, i1 false)
; GLOBAL-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %x2, i32 3, i1 false)
; CHECK-EMPTY:
entry:
%x = alloca i64, align 4
%x1 = bitcast i64* %x to i8*
%x2 = getelementptr i8, i8* %x1, i64 5
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %x2, i32 3, i1 false)
%x2 = getelementptr i8, ptr %x, i64 5
call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %x2, i32 3, i1 false)
ret void
}

Expand All @@ -198,9 +183,8 @@ define void @MemcpySelfSrcOutOfBounds() {
; CHECK-EMPTY:
entry:
%x = alloca i64, align 4
%x1 = bitcast i64* %x to i8*
%x2 = getelementptr i8, i8* %x1, i64 5
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %x2, i32 4, i1 false)
%x2 = getelementptr i8, ptr %x, i64 5
call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %x2, i32 4, i1 false)
ret void
}

Expand All @@ -213,9 +197,8 @@ define void @MemcpySelfDstOutOfBounds() {
; CHECK-EMPTY:
entry:
%x = alloca i64, align 4
%x1 = bitcast i64* %x to i8*
%x2 = getelementptr i8, i8* %x1, i64 5
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x2, i8* %x1, i32 4, i1 false)
%x2 = getelementptr i8, ptr %x, i64 5
call void @llvm.memcpy.p0.p0.i32(ptr %x2, ptr %x, i32 4, i1 false)
ret void
}

Expand All @@ -228,9 +211,8 @@ define void @MemmoveSelfBothOutOfBounds() {
; CHECK-EMPTY:
entry:
%x = alloca i64, align 4
%x1 = bitcast i64* %x to i8*
%x2 = getelementptr i8, i8* %x1, i64 5
call void @llvm.memmove.p0i8.p0i8.i32(i8* %x1, i8* %x2, i32 9, i1 false)
%x2 = getelementptr i8, ptr %x, i64 5
call void @llvm.memmove.p0.p0.i32(ptr %x, ptr %x2, i32 9, i1 false)
ret void
}

Expand All @@ -241,14 +223,13 @@ define void @MemsetInBoundsCast() {
; CHECK-NEXT: x[4]: [0,4){{$}}
; CHECK-NEXT: y[1]: empty-set{{$}}
; GLOBAL-NEXT: safe accesses:
; GLOBAL-NEXT: call void @llvm.memset.p0i8.i32(i8* %x1, i8 %yint, i32 4, i1 false)
; GLOBAL-NEXT: call void @llvm.memset.p0.i32(ptr %x, i8 %yint, i32 4, i1 false)
; CHECK-EMPTY:
entry:
%x = alloca i32, align 4
%y = alloca i8, align 1
%x1 = bitcast i32* %x to i8*
%yint = ptrtoint i8* %y to i8
call void @llvm.memset.p0i8.i32(i8* %x1, i8 %yint, i32 4, i1 false)
%yint = ptrtoint ptr %y to i8
call void @llvm.memset.p0.i32(ptr %x, i8 %yint, i32 4, i1 false)
ret void
}

Expand All @@ -260,15 +241,13 @@ define void @MemcpyInBoundsCast2(i8 %zint8) {
; CHECK-NEXT: y[256]: [0,255){{$}}
; CHECK-NEXT: z[1]: empty-set{{$}}
; GLOBAL-NEXT: safe accesses:
; GLOBAL-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %y1, i32 %zint32, i1 false)
; GLOBAL-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %y, i32 %zint32, i1 false)
; CHECK-EMPTY:
entry:
%x = alloca [256 x i8], align 4
%y = alloca [256 x i8], align 4
%z = alloca i8, align 1
%x1 = bitcast [256 x i8]* %x to i8*
%y1 = bitcast [256 x i8]* %y to i8*
%zint32 = zext i8 %zint8 to i32
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %x1, i8* %y1, i32 %zint32, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr %x, ptr %y, i32 %zint32, i1 false)
ret void
}