1dc640461SVitaly Buka; RUN: opt < %s -S -passes="msan<track-origins=1>" 2>&1 | FileCheck %s --implicit-check-not "call void @llvm.mem" --implicit-check-not " load" --implicit-check-not " store" 2dc640461SVitaly Buka 3dc640461SVitaly Bukatarget 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" 4dc640461SVitaly Bukatarget triple = "x86_64-unknown-linux-gnu" 5dc640461SVitaly Buka 6*21c3df4bSMatt Arsenaultdeclare void @FnByVal(ptr byval(i128) %p); 7*21c3df4bSMatt Arsenaultdeclare void @Fn(ptr %p); 8dc640461SVitaly Buka 9*21c3df4bSMatt Arsenaultdefine i128 @ByValArgument(i32, ptr byval(i128) %p) sanitize_memory { 10dc640461SVitaly Buka; CHECK-LABEL: @ByValArgument( 11dc640461SVitaly Buka; CHECK-NEXT: entry: 12*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %[[#]], ptr align 8 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), i64 16, i1 false) 13*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[#]], ptr align 4 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), i64 16, i1 false) 14*21c3df4bSMatt Arsenault; CHECK: [[X:%.*]] = load i128, ptr %p, align 8 15*21c3df4bSMatt Arsenault; CHECK: [[_MSLD:%.*]] = load i128, ptr %[[#]], align 8 16*21c3df4bSMatt Arsenault; CHECK: %[[#]] = load i32, ptr %[[#]], align 8 17*21c3df4bSMatt Arsenault; CHECK: store i128 [[_MSLD]], ptr @__msan_retval_tls, align 8 18*21c3df4bSMatt Arsenault; CHECK: store i32 %[[#]], ptr @__msan_retval_origin_tls, align 4 1988b05404SVitaly Buka; CHECK: ret i128 [[X]] 20dc640461SVitaly Buka; 21dc640461SVitaly Bukaentry: 22*21c3df4bSMatt Arsenault %x = load i128, ptr %p 23dc640461SVitaly Buka ret i128 %x 24dc640461SVitaly Buka} 25dc640461SVitaly Buka 26*21c3df4bSMatt Arsenaultdefine i128 @ByValArgumentNoSanitize(i32, ptr byval(i128) %p) { 27dc640461SVitaly Buka; CHECK-LABEL: @ByValArgumentNoSanitize( 28dc640461SVitaly Buka; CHECK-NEXT: entry: 29*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr align 8 %[[#]], i8 0, i64 16, i1 false) 30*21c3df4bSMatt Arsenault; CHECK: [[X:%.*]] = load i128, ptr %p, align 8 31*21c3df4bSMatt Arsenault; CHECK: store i128 0, ptr @__msan_retval_tls, align 8 32*21c3df4bSMatt Arsenault; CHECK: store i32 0, ptr @__msan_retval_origin_tls, align 4 3388b05404SVitaly Buka; CHECK: ret i128 [[X]] 34dc640461SVitaly Buka; 35dc640461SVitaly Bukaentry: 36*21c3df4bSMatt Arsenault %x = load i128, ptr %p 37dc640461SVitaly Buka ret i128 %x 38dc640461SVitaly Buka} 39dc640461SVitaly Buka 40*21c3df4bSMatt Arsenaultdefine void @ByValForward(i32, ptr byval(i128) %p) sanitize_memory { 41dc640461SVitaly Buka; CHECK-LABEL: @ByValForward( 42dc640461SVitaly Buka; CHECK-NEXT: entry: 43*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %[[#]], ptr align 8 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), i64 16, i1 false) 44*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[#]], ptr align 4 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), i64 16, i1 false) 45*21c3df4bSMatt Arsenault; CHECK: store i64 0, ptr @__msan_param_tls, align 8 46*21c3df4bSMatt Arsenault; CHECK: call void @Fn(ptr %p) 4788b05404SVitaly Buka; CHECK: ret void 48dc640461SVitaly Buka; 49dc640461SVitaly Bukaentry: 50*21c3df4bSMatt Arsenault call void @Fn(ptr %p) 51dc640461SVitaly Buka ret void 52dc640461SVitaly Buka} 53dc640461SVitaly Buka 54*21c3df4bSMatt Arsenaultdefine void @ByValForwardNoSanitize(i32, ptr byval(i128) %p) { 55dc640461SVitaly Buka; CHECK-LABEL: @ByValForwardNoSanitize( 56dc640461SVitaly Buka; CHECK-NEXT: entry: 57*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr align 8 %[[#]], i8 0, i64 16, i1 false) 58*21c3df4bSMatt Arsenault; CHECK: store i64 0, ptr @__msan_param_tls, align 8 59*21c3df4bSMatt Arsenault; CHECK: call void @Fn(ptr %p) 6088b05404SVitaly Buka; CHECK: ret void 61dc640461SVitaly Buka; 62dc640461SVitaly Bukaentry: 63*21c3df4bSMatt Arsenault call void @Fn(ptr %p) 64dc640461SVitaly Buka ret void 65dc640461SVitaly Buka} 66dc640461SVitaly Buka 67*21c3df4bSMatt Arsenaultdefine void @ByValForwardByVal(i32, ptr byval(i128) %p) sanitize_memory { 68dc640461SVitaly Buka; CHECK-LABEL: @ByValForwardByVal( 69dc640461SVitaly Buka; CHECK-NEXT: entry: 70*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %[[#]], ptr align 8 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), i64 16, i1 false) 71*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[#]], ptr align 4 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), i64 16, i1 false) 72*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr @__msan_param_tls, ptr %[[#]], i64 16, i1 false) 73*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 @__msan_param_origin_tls, ptr align 4 %[[#]], i64 16, i1 false) 74*21c3df4bSMatt Arsenault; CHECK: call void @FnByVal(ptr byval(i128) %p) 7588b05404SVitaly Buka; CHECK: ret void 76dc640461SVitaly Buka; 77dc640461SVitaly Bukaentry: 78*21c3df4bSMatt Arsenault call void @FnByVal(ptr byval(i128) %p) 79dc640461SVitaly Buka ret void 80dc640461SVitaly Buka} 81dc640461SVitaly Buka 82*21c3df4bSMatt Arsenaultdefine void @ByValForwardByValNoSanitize(i32, ptr byval(i128) %p) { 83dc640461SVitaly Buka; CHECK-LABEL: @ByValForwardByValNoSanitize( 84dc640461SVitaly Buka; CHECK-NEXT: entry: 85*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr align 8 %[[#]], i8 0, i64 16, i1 false) 86*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr @__msan_param_tls, i8 0, i64 16, i1 false) 87*21c3df4bSMatt Arsenault; CHECK: call void @FnByVal(ptr byval(i128) %p) 8888b05404SVitaly Buka; CHECK: ret void 89dc640461SVitaly Buka; 90dc640461SVitaly Bukaentry: 91*21c3df4bSMatt Arsenault call void @FnByVal(ptr byval(i128) %p) 92dc640461SVitaly Buka ret void 93dc640461SVitaly Buka} 94dc640461SVitaly Buka 95*21c3df4bSMatt Arsenaultdeclare void @FnByVal8(ptr byval(i8) %p); 96*21c3df4bSMatt Arsenaultdeclare void @Fn8(ptr %p); 9788b05404SVitaly Buka 98*21c3df4bSMatt Arsenaultdefine i8 @ByValArgument8(i32, ptr byval(i8) %p) sanitize_memory { 9988b05404SVitaly Buka; CHECK-LABEL: @ByValArgument8( 10088b05404SVitaly Buka; CHECK-NEXT: entry: 101*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %[[#]], ptr align 1 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), i64 1, i1 false) 102*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[#]], ptr align 4 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), i64 4, i1 false) 103*21c3df4bSMatt Arsenault; CHECK: [[X:%.*]] = load i8, ptr %p, align 1 104*21c3df4bSMatt Arsenault; CHECK: [[_MSLD:%.*]] = load i8, ptr %[[#]], align 1 105*21c3df4bSMatt Arsenault; CHECK: %[[#]] = load i32, ptr %[[#]], align 4 106*21c3df4bSMatt Arsenault; CHECK: store i8 [[_MSLD]], ptr @__msan_retval_tls, align 8 107*21c3df4bSMatt Arsenault; CHECK: store i32 %[[#]], ptr @__msan_retval_origin_tls, align 4 10888b05404SVitaly Buka; CHECK: ret i8 [[X]] 10988b05404SVitaly Buka; 11088b05404SVitaly Bukaentry: 111*21c3df4bSMatt Arsenault %x = load i8, ptr %p 11288b05404SVitaly Buka ret i8 %x 11388b05404SVitaly Buka} 11488b05404SVitaly Buka 115*21c3df4bSMatt Arsenaultdefine i8 @ByValArgumentNoSanitize8(i32, ptr byval(i8) %p) { 11688b05404SVitaly Buka; CHECK-LABEL: @ByValArgumentNoSanitize8( 11788b05404SVitaly Buka; CHECK-NEXT: entry: 118*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr align 1 %[[#]], i8 0, i64 1, i1 false) 119*21c3df4bSMatt Arsenault; CHECK: [[X:%.*]] = load i8, ptr %p, align 1 120*21c3df4bSMatt Arsenault; CHECK: store i8 0, ptr @__msan_retval_tls, align 8 121*21c3df4bSMatt Arsenault; CHECK: store i32 0, ptr @__msan_retval_origin_tls, align 4 12288b05404SVitaly Buka; CHECK: ret i8 [[X]] 12388b05404SVitaly Buka; 12488b05404SVitaly Bukaentry: 125*21c3df4bSMatt Arsenault %x = load i8, ptr %p 12688b05404SVitaly Buka ret i8 %x 12788b05404SVitaly Buka} 12888b05404SVitaly Buka 129*21c3df4bSMatt Arsenaultdefine void @ByValForward8(i32, ptr byval(i8) %p) sanitize_memory { 13088b05404SVitaly Buka; CHECK-LABEL: @ByValForward8( 13188b05404SVitaly Buka; CHECK-NEXT: entry: 132*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %[[#]], ptr align 1 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), i64 1, i1 false) 133*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[#]], ptr align 4 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), i64 4, i1 false) 134*21c3df4bSMatt Arsenault; CHECK: store i64 0, ptr @__msan_param_tls, align 8 135*21c3df4bSMatt Arsenault; CHECK: call void @Fn8(ptr %p) 13688b05404SVitaly Buka; CHECK: ret void 13788b05404SVitaly Buka; 13888b05404SVitaly Bukaentry: 139*21c3df4bSMatt Arsenault call void @Fn8(ptr %p) 14088b05404SVitaly Buka ret void 14188b05404SVitaly Buka} 14288b05404SVitaly Buka 143*21c3df4bSMatt Arsenaultdefine void @ByValForwardNoSanitize8(i32, ptr byval(i8) %p) { 14488b05404SVitaly Buka; CHECK-LABEL: @ByValForwardNoSanitize8( 14588b05404SVitaly Buka; CHECK-NEXT: entry: 146*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr align 1 %[[#]], i8 0, i64 1, i1 false) 147*21c3df4bSMatt Arsenault; CHECK: store i64 0, ptr @__msan_param_tls, align 8 148*21c3df4bSMatt Arsenault; CHECK: call void @Fn8(ptr %p) 14988b05404SVitaly Buka; CHECK: ret void 15088b05404SVitaly Buka; 15188b05404SVitaly Bukaentry: 152*21c3df4bSMatt Arsenault call void @Fn8(ptr %p) 15388b05404SVitaly Buka ret void 15488b05404SVitaly Buka} 15588b05404SVitaly Buka 156*21c3df4bSMatt Arsenaultdefine void @ByValForwardByVal8(i32, ptr byval(i8) %p) sanitize_memory { 15788b05404SVitaly Buka; CHECK-LABEL: @ByValForwardByVal8( 15888b05404SVitaly Buka; CHECK-NEXT: entry: 159*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %[[#]], ptr align 1 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), i64 1, i1 false) 160*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %[[#]], ptr align 4 inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), i64 4, i1 false) 161*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr @__msan_param_tls, ptr %[[#]], i64 1, i1 false) 162*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 @__msan_param_origin_tls, ptr align 4 %[[#]], i64 4, i1 false) 163*21c3df4bSMatt Arsenault; CHECK: call void @FnByVal8(ptr byval(i8) %p) 16488b05404SVitaly Buka; CHECK: ret void 16588b05404SVitaly Buka; 16688b05404SVitaly Bukaentry: 167*21c3df4bSMatt Arsenault call void @FnByVal8(ptr byval(i8) %p) 16888b05404SVitaly Buka ret void 16988b05404SVitaly Buka} 17088b05404SVitaly Buka 171*21c3df4bSMatt Arsenaultdefine void @ByValForwardByValNoSanitize8(i32, ptr byval(i8) %p) { 17288b05404SVitaly Buka; CHECK-LABEL: @ByValForwardByValNoSanitize8( 17388b05404SVitaly Buka; CHECK-NEXT: entry: 174*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr align 1 %[[#]], i8 0, i64 1, i1 false) 175*21c3df4bSMatt Arsenault; CHECK: call void @llvm.memset.p0.i64(ptr @__msan_param_tls, i8 0, i64 1, i1 false) 176*21c3df4bSMatt Arsenault; CHECK: call void @FnByVal8(ptr byval(i8) %p) 17788b05404SVitaly Buka; CHECK: ret void 17888b05404SVitaly Buka; 17988b05404SVitaly Bukaentry: 180*21c3df4bSMatt Arsenault call void @FnByVal8(ptr byval(i8) %p) 18188b05404SVitaly Buka ret void 18288b05404SVitaly Buka} 18388b05404SVitaly Buka 184