xref: /llvm-project/llvm/test/Instrumentation/MemorySanitizer/msan_eager.ll (revision fe7f5f9126cea9ceba703d5bd07b766181f2bd72)
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