1d1c7f51aSGui Andrade; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*fe7f5f91SVitaly Buka; RUN: opt < %s -msan-check-access-address=0 -msan-track-origins=1 -msan-eager-checks -S -passes='module(msan)' 2>&1 | FileCheck -allow-deprecated-dag-overlap --check-prefix=CHECK %s 3*fe7f5f91SVitaly Buka; RUN: opt < %s -msan-check-access-address=0 -msan-track-origins=1 -S -passes='msan<eager-checks>' 2>&1 | FileCheck -allow-deprecated-dag-overlap --check-prefix=CHECK %s 4d1c7f51aSGui Andrade 5d1c7f51aSGui Andradetarget 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" 6d1c7f51aSGui Andradetarget triple = "x86_64-unknown-linux-gnu" 7d1c7f51aSGui Andrade 8d1c7f51aSGui Andradedefine noundef i32 @NormalRet() nounwind uwtable sanitize_memory { 9d1c7f51aSGui Andrade; CHECK-LABEL: @NormalRet( 1005e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 11d1c7f51aSGui Andrade; CHECK-NEXT: ret i32 123 12d1c7f51aSGui Andrade; 13d1c7f51aSGui Andrade ret i32 123 14d1c7f51aSGui Andrade} 15d1c7f51aSGui Andrade 16d1c7f51aSGui Andradedefine i32 @PartialRet() nounwind uwtable sanitize_memory { 17d1c7f51aSGui Andrade; CHECK-LABEL: @PartialRet( 1805e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 1921c3df4bSMatt Arsenault; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8 2021c3df4bSMatt Arsenault; CHECK-NEXT: store i32 0, ptr @__msan_retval_origin_tls, align 4 21d1c7f51aSGui Andrade; CHECK-NEXT: ret i32 123 22d1c7f51aSGui Andrade; 23d1c7f51aSGui Andrade ret i32 123 24d1c7f51aSGui Andrade} 25d1c7f51aSGui Andrade 26d1c7f51aSGui Andradedefine noundef i32 @LoadedRet() nounwind uwtable sanitize_memory { 27d1c7f51aSGui Andrade; CHECK-LABEL: @LoadedRet( 2805e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 2921c3df4bSMatt Arsenault; CHECK-NEXT: [[P:%.*]] = inttoptr i64 0 to ptr 3021c3df4bSMatt Arsenault; CHECK-NEXT: [[O:%.*]] = load i32, ptr [[P]], align 4 3121c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[P]] to i64 32d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP2:%.*]] = xor i64 [[TMP1]], 87960930222080 3321c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr 34d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP2]], 17592186044416 3521c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr 3621c3df4bSMatt Arsenault; CHECK-NEXT: [[_MSLD:%.*]] = load i32, ptr [[TMP3]], align 4 3721c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4 38d1c7f51aSGui Andrade; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[_MSLD]], 0 3960a8db6dSVitaly Buka; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF0:![0-9]+]] 40d1c7f51aSGui Andrade; CHECK: 7: 4160a8db6dSVitaly Buka; CHECK-NEXT: call void @__msan_warning_with_origin_noreturn(i32 [[TMP6]]) #[[ATTR3:[0-9]+]] 42d1c7f51aSGui Andrade; CHECK-NEXT: unreachable 43d1c7f51aSGui Andrade; CHECK: 8: 44d1c7f51aSGui Andrade; CHECK-NEXT: ret i32 [[O]] 45d1c7f51aSGui Andrade; 4621c3df4bSMatt Arsenault %p = inttoptr i64 0 to ptr 4721c3df4bSMatt Arsenault %o = load i32, ptr %p 48d1c7f51aSGui Andrade ret i32 %o 49d1c7f51aSGui Andrade} 50d1c7f51aSGui Andrade 51d1c7f51aSGui Andrade 52d1c7f51aSGui Andradedefine void @NormalArg(i32 noundef %a) nounwind uwtable sanitize_memory { 53d1c7f51aSGui Andrade; CHECK-LABEL: @NormalArg( 5405e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 5521c3df4bSMatt Arsenault; CHECK-NEXT: [[P:%.*]] = inttoptr i64 0 to ptr 5621c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[P]] to i64 57d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP2:%.*]] = xor i64 [[TMP1]], 87960930222080 5821c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr 59d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP2]], 17592186044416 6021c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr 6121c3df4bSMatt Arsenault; CHECK-NEXT: store i32 0, ptr [[TMP3]], align 4 6221c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[A:%.*]], ptr [[P]], align 4 63d1c7f51aSGui Andrade; CHECK-NEXT: ret void 64d1c7f51aSGui Andrade; 6521c3df4bSMatt Arsenault %p = inttoptr i64 0 to ptr 6621c3df4bSMatt Arsenault store i32 %a, ptr %p 67d1c7f51aSGui Andrade ret void 68d1c7f51aSGui Andrade} 69d1c7f51aSGui Andrade 7066b650f3SVitaly Bukadefine void @NormalArgAfterNoUndef(i32 noundef %a, i32 %b) nounwind uwtable sanitize_memory { 7166b650f3SVitaly Buka; CHECK-LABEL: @NormalArgAfterNoUndef( 7221c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8 7321c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4 7466b650f3SVitaly Buka; CHECK-NEXT: call void @llvm.donothing() 7521c3df4bSMatt Arsenault; CHECK-NEXT: [[P:%.*]] = inttoptr i64 0 to ptr 7621c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[P]] to i64 7766b650f3SVitaly Buka; CHECK-NEXT: [[TMP4:%.*]] = xor i64 [[TMP3]], 87960930222080 7821c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr 7966b650f3SVitaly Buka; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP4]], 17592186044416 8021c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr 8121c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP5]], align 4 8266b650f3SVitaly Buka; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 8366b650f3SVitaly Buka; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF0]] 8466b650f3SVitaly Buka; CHECK: 8: 8521c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[TMP2]], ptr [[TMP7]], align 4 8666b650f3SVitaly Buka; CHECK-NEXT: br label [[TMP9]] 8766b650f3SVitaly Buka; CHECK: 9: 8821c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[B:%.*]], ptr [[P]], align 4 8966b650f3SVitaly Buka; CHECK-NEXT: ret void 9066b650f3SVitaly Buka; 9121c3df4bSMatt Arsenault %p = inttoptr i64 0 to ptr 9221c3df4bSMatt Arsenault store i32 %b, ptr %p 9366b650f3SVitaly Buka ret void 9466b650f3SVitaly Buka} 9566b650f3SVitaly Buka 96d1c7f51aSGui Andradedefine void @PartialArg(i32 %a) nounwind uwtable sanitize_memory { 97d1c7f51aSGui Andrade; CHECK-LABEL: @PartialArg( 9821c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 9921c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4 10005e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 10121c3df4bSMatt Arsenault; CHECK-NEXT: [[P:%.*]] = inttoptr i64 0 to ptr 10221c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[P]] to i64 103d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP4:%.*]] = xor i64 [[TMP3]], 87960930222080 10421c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr 105d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP4]], 17592186044416 10621c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr 10721c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP5]], align 4 108d1c7f51aSGui Andrade; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 10960a8db6dSVitaly Buka; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF0]] 110d1c7f51aSGui Andrade; CHECK: 8: 11121c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[TMP2]], ptr [[TMP7]], align 4 112d1c7f51aSGui Andrade; CHECK-NEXT: br label [[TMP9]] 113d1c7f51aSGui Andrade; CHECK: 9: 11421c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[A:%.*]], ptr [[P]], align 4 115d1c7f51aSGui Andrade; CHECK-NEXT: ret void 116d1c7f51aSGui Andrade; 11721c3df4bSMatt Arsenault %p = inttoptr i64 0 to ptr 11821c3df4bSMatt Arsenault store i32 %a, ptr %p 119d1c7f51aSGui Andrade ret void 120d1c7f51aSGui Andrade} 121d1c7f51aSGui Andrade 122d1c7f51aSGui Andradedefine void @CallNormal() nounwind uwtable sanitize_memory { 123d1c7f51aSGui Andrade; CHECK-LABEL: @CallNormal( 12405e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 12560a8db6dSVitaly Buka; CHECK-NEXT: [[R:%.*]] = call i32 @NormalRet() #[[ATTR0:[0-9]+]] 12660a8db6dSVitaly Buka; CHECK-NEXT: call void @NormalArg(i32 [[R]]) #[[ATTR0]] 127d1c7f51aSGui Andrade; CHECK-NEXT: ret void 128d1c7f51aSGui Andrade; 129d1c7f51aSGui Andrade %r = call i32 @NormalRet() nounwind uwtable sanitize_memory 130d1c7f51aSGui Andrade call void @NormalArg(i32 %r) nounwind uwtable sanitize_memory 131d1c7f51aSGui Andrade ret void 132d1c7f51aSGui Andrade} 133d1c7f51aSGui Andrade 13466b650f3SVitaly Bukadefine void @CallNormalArgAfterNoUndef() nounwind uwtable sanitize_memory { 13566b650f3SVitaly Buka; CHECK-LABEL: @CallNormalArgAfterNoUndef( 13666b650f3SVitaly Buka; CHECK-NEXT: call void @llvm.donothing() 13766b650f3SVitaly Buka; CHECK-NEXT: [[R:%.*]] = call i32 @NormalRet() #[[ATTR0]] 13821c3df4bSMatt Arsenault; CHECK-NEXT: store i32 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8 13966b650f3SVitaly Buka; CHECK-NEXT: call void @NormalArgAfterNoUndef(i32 [[R]], i32 [[R]]) #[[ATTR0]] 14066b650f3SVitaly Buka; CHECK-NEXT: ret void 14166b650f3SVitaly Buka; 14266b650f3SVitaly Buka %r = call i32 @NormalRet() nounwind uwtable sanitize_memory 14366b650f3SVitaly Buka call void @NormalArgAfterNoUndef(i32 %r, i32 %r) nounwind uwtable sanitize_memory 14466b650f3SVitaly Buka ret void 14566b650f3SVitaly Buka} 14666b650f3SVitaly Buka 147d1c7f51aSGui Andradedefine void @CallWithLoaded() nounwind uwtable sanitize_memory { 148d1c7f51aSGui Andrade; CHECK-LABEL: @CallWithLoaded( 14905e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 15021c3df4bSMatt Arsenault; CHECK-NEXT: [[P:%.*]] = inttoptr i64 0 to ptr 15121c3df4bSMatt Arsenault; CHECK-NEXT: [[O:%.*]] = load i32, ptr [[P]], align 4 15221c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[P]] to i64 153d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP2:%.*]] = xor i64 [[TMP1]], 87960930222080 15421c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr 155d1c7f51aSGui Andrade; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP2]], 17592186044416 15621c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr 15721c3df4bSMatt Arsenault; CHECK-NEXT: [[_MSLD:%.*]] = load i32, ptr [[TMP3]], align 4 15821c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4 159d1c7f51aSGui Andrade; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[_MSLD]], 0 16060a8db6dSVitaly Buka; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF0]] 161d1c7f51aSGui Andrade; CHECK: 7: 16260a8db6dSVitaly Buka; CHECK-NEXT: call void @__msan_warning_with_origin_noreturn(i32 [[TMP6]]) #[[ATTR3]] 163d1c7f51aSGui Andrade; CHECK-NEXT: unreachable 164d1c7f51aSGui Andrade; CHECK: 8: 16560a8db6dSVitaly Buka; CHECK-NEXT: call void @NormalArg(i32 [[O]]) #[[ATTR0]] 166d1c7f51aSGui Andrade; CHECK-NEXT: ret void 167d1c7f51aSGui Andrade; 16821c3df4bSMatt Arsenault %p = inttoptr i64 0 to ptr 16921c3df4bSMatt Arsenault %o = load i32, ptr %p 170d1c7f51aSGui Andrade call void @NormalArg(i32 %o) nounwind uwtable sanitize_memory 171d1c7f51aSGui Andrade ret void 172d1c7f51aSGui Andrade} 173d1c7f51aSGui Andrade 174d1c7f51aSGui Andradedefine void @CallPartial() nounwind uwtable sanitize_memory { 175d1c7f51aSGui Andrade; CHECK-LABEL: @CallPartial( 17605e3ab41SGui Andrade; CHECK-NEXT: call void @llvm.donothing() 17721c3df4bSMatt Arsenault; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8 17860a8db6dSVitaly Buka; CHECK-NEXT: [[R:%.*]] = call i32 @PartialRet() #[[ATTR0]] 17921c3df4bSMatt Arsenault; CHECK-NEXT: [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8 18021c3df4bSMatt Arsenault; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_retval_origin_tls, align 4 18121c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[_MSRET]], ptr @__msan_param_tls, align 8 18221c3df4bSMatt Arsenault; CHECK-NEXT: store i32 [[TMP1]], ptr @__msan_param_origin_tls, align 4 18360a8db6dSVitaly Buka; CHECK-NEXT: call void @PartialArg(i32 [[R]]) #[[ATTR0]] 184d1c7f51aSGui Andrade; CHECK-NEXT: ret void 185d1c7f51aSGui Andrade; 186d1c7f51aSGui Andrade %r = call i32 @PartialRet() nounwind uwtable sanitize_memory 187d1c7f51aSGui Andrade call void @PartialArg(i32 %r) nounwind uwtable sanitize_memory 188d1c7f51aSGui Andrade ret void 189d1c7f51aSGui Andrade} 190