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
}