xref: /llvm-project/llvm/test/Instrumentation/MemorySanitizer/msan_debug_info.ll (revision ab7dba233a058cc8310ef829929238b5d8440b30)
1c0ee9e1bSVitaly Buka; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2e7bac3b9SVitaly Buka; RUN: opt < %s -passes='module(msan)' -msan-instrumentation-with-call-threshold=0 -msan-track-origins=1 -S | FileCheck %s
3c0ee9e1bSVitaly Buka
4c0ee9e1bSVitaly 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"
5c0ee9e1bSVitaly Bukatarget triple = "x86_64-unknown-linux-gnu"
6c0ee9e1bSVitaly Buka
7c0ee9e1bSVitaly Buka!llvm.module.flags = !{!0}
8c0ee9e1bSVitaly Buka
9c0ee9e1bSVitaly Buka!0 = !{i32 2, !"Debug Info Version", i32 3}
10c0ee9e1bSVitaly Buka!2 = distinct !DISubprogram(name: "t", scope: !3, file: !3, line: 4, type: !4, spFlags: DISPFlagDefinition, unit: !6)
11c0ee9e1bSVitaly Buka!3 = !DIFile(filename: "tmp/noundef.cpp", directory: "/")
12c0ee9e1bSVitaly Buka!4 = !DISubroutineType(types: !5)
13c0ee9e1bSVitaly Buka!5 = !{}
14c0ee9e1bSVitaly Buka!6 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug)
15c0ee9e1bSVitaly Buka!10 = !DILocation(line: 9, column: 0, scope: !2)
16c0ee9e1bSVitaly Buka!11 = !DILocation(line: 9, column: 1, scope: !2)
17c0ee9e1bSVitaly Buka!12 = !DILocation(line: 9, column: 2, scope: !2)
18c0ee9e1bSVitaly Buka!13 = !DILocation(line: 9, column: 3, scope: !2)
19c0ee9e1bSVitaly Buka!14 = !DILocation(line: 9, column: 4, scope: !2)
20c0ee9e1bSVitaly Buka!15 = !DILocation(line: 9, column: 5, scope: !2)
21c0ee9e1bSVitaly Buka
2221c3df4bSMatt Arsenaultdefine void @Store(ptr nocapture %p, i32 %x) nounwind uwtable sanitize_memory {
23c0ee9e1bSVitaly Buka; CHECK-LABEL: @Store(
24c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
2521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__msan_param_tls, align 8, !dbg [[DBG1:![0-9]+]]
2621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
2721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8, !dbg [[DBG1]]
2821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4, !dbg [[DBG1]]
29a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
30a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_8(i64 zeroext [[TMP0]], i32 zeroext [[TMP1]]), !dbg [[DBG1]]
3121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[P:%.*]] to i64, !dbg [[DBG1]]
32a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP4]], 87960930222080, !dbg [[DBG1]]
3321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr, !dbg [[DBG1]]
34a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[TMP5]], 17592186044416, !dbg [[DBG1]]
3521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr, !dbg [[DBG1]]
3621c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP2]], ptr [[TMP6]], align 4, !dbg [[DBG1]]
3721c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_maybe_store_origin_4(i32 zeroext [[TMP2]], ptr [[P]], i32 zeroext [[TMP3]]), !dbg [[DBG1]]
3821c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[X:%.*]], ptr [[P]], align 4, !dbg [[DBG1]]
39a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
40c0ee9e1bSVitaly Buka;
41c0ee9e1bSVitaly Bukaentry:
4221c3df4bSMatt Arsenault  store i32 %x, ptr %p, align 4, !dbg !10
43c0ee9e1bSVitaly Buka  ret void
44c0ee9e1bSVitaly Buka}
45c0ee9e1bSVitaly Buka
4621c3df4bSMatt Arsenaultdefine void @LoadAndCmp(ptr nocapture %a) nounwind uwtable sanitize_memory {
47c0ee9e1bSVitaly Buka; CHECK-LABEL: @LoadAndCmp(
48c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
4921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
5021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
51a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
52a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_8(i64 zeroext [[TMP0]], i32 zeroext [[TMP1]]), !dbg [[DBG1]]
5321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A:%.*]], align 4, !dbg [[DBG1]]
5421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = ptrtoint ptr [[A]] to i64, !dbg [[DBG1]]
55a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = xor i64 [[TMP3]], 87960930222080, !dbg [[DBG1]]
5621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr, !dbg [[DBG1]]
57a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = add i64 [[TMP4]], 17592186044416, !dbg [[DBG1]]
5821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr, !dbg [[DBG1]]
5921c3df4bSMatt Arsenault; CHECK-NEXT:    [[_MSLD:%.*]] = load i32, ptr [[TMP5]], align 4, !dbg [[DBG1]]
6021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4, !dbg [[DBG1]]
61a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = xor i32 [[TMP2]], 0, !dbg [[DBG7:![0-9]+]]
62a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = or i32 [[_MSLD]], 0, !dbg [[DBG7]]
63a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 0, !dbg [[DBG7]]
64a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP12:%.*]] = xor i32 [[TMP10]], -1, !dbg [[DBG7]]
65a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP13:%.*]] = and i32 [[TMP12]], [[TMP9]], !dbg [[DBG7]]
66a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP14:%.*]] = icmp eq i32 [[TMP13]], 0, !dbg [[DBG7]]
67a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP_ICMP:%.*]] = and i1 [[TMP11]], [[TMP14]], !dbg [[DBG7]]
68a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[TMP2]], 0, !dbg [[DBG7]]
69a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP15:%.*]] = zext i1 [[_MSPROP_ICMP]] to i8, !dbg [[DBG8:![0-9]+]]
70a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_1(i8 zeroext [[TMP15]], i32 zeroext [[TMP8]]), !dbg [[DBG8]]
71a38e5a4bSVitaly Buka; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]], !dbg [[DBG8]]
72c0ee9e1bSVitaly Buka; CHECK:       if.then:
7321c3df4bSMatt Arsenault; CHECK-NEXT:    store i64 0, ptr @__msan_va_arg_overflow_size_tls, align 8
74a38e5a4bSVitaly Buka; CHECK-NEXT:    tail call void (...) @foo() #[[ATTR5:[0-9]+]]
75a38e5a4bSVitaly Buka; CHECK-NEXT:    br label [[IF_END]]
76c0ee9e1bSVitaly Buka; CHECK:       if.end:
77a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
78c0ee9e1bSVitaly Buka;
79c0ee9e1bSVitaly Bukaentry:
8021c3df4bSMatt Arsenault  %0 = load i32, ptr %a, align 4, !dbg !10
81c0ee9e1bSVitaly Buka  %tobool = icmp eq i32 %0, 0, !dbg !11
82c0ee9e1bSVitaly Buka  br i1 %tobool, label %if.end, label %if.then, !dbg !12
83c0ee9e1bSVitaly Buka
84c0ee9e1bSVitaly Bukaif.then:                                            tail call void (...) @foo() nounwind
85c0ee9e1bSVitaly Buka  br label %if.end
86c0ee9e1bSVitaly Buka
87c0ee9e1bSVitaly Bukaif.end:                                             ret void
88c0ee9e1bSVitaly Buka}
89c0ee9e1bSVitaly Buka
90c0ee9e1bSVitaly Bukadeclare void @foo(...)
91c0ee9e1bSVitaly Buka
92c0ee9e1bSVitaly Bukadefine i32 @ReturnInt() nounwind uwtable readnone sanitize_memory {
93c0ee9e1bSVitaly Buka; CHECK-LABEL: @ReturnInt(
94c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
95a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
9621c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 8, !dbg [[DBG1]]
9721c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_origin_tls, align 4, !dbg [[DBG1]]
98a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 123, !dbg [[DBG1]]
99c0ee9e1bSVitaly Buka;
100c0ee9e1bSVitaly Bukaentry:
101c0ee9e1bSVitaly Buka  ret i32 123, !dbg !10
102c0ee9e1bSVitaly Buka}
103c0ee9e1bSVitaly Buka
10421c3df4bSMatt Arsenaultdefine void @CopyRetVal(ptr nocapture %a) nounwind uwtable sanitize_memory {
105c0ee9e1bSVitaly Buka; CHECK-LABEL: @CopyRetVal(
106c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
10721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
10821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
109a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
11021c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 8, !dbg [[DBG1]]
111a38e5a4bSVitaly Buka; CHECK-NEXT:    [[CALL:%.*]] = tail call i32 @ReturnInt() #[[ATTR5]], !dbg [[DBG1]]
11221c3df4bSMatt Arsenault; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8, !dbg [[DBG7]]
11321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr @__msan_retval_origin_tls, align 4, !dbg [[DBG7]]
114a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_8(i64 zeroext [[TMP0]], i32 zeroext [[TMP1]]), !dbg [[DBG7]]
11521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = ptrtoint ptr [[A:%.*]] to i64, !dbg [[DBG7]]
116a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = xor i64 [[TMP3]], 87960930222080, !dbg [[DBG7]]
11721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr, !dbg [[DBG7]]
118a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = add i64 [[TMP4]], 17592186044416, !dbg [[DBG7]]
11921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr, !dbg [[DBG7]]
12021c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[_MSRET]], ptr [[TMP5]], align 4, !dbg [[DBG7]]
12121c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_maybe_store_origin_4(i32 zeroext [[_MSRET]], ptr [[A]], i32 zeroext [[TMP2]]), !dbg [[DBG7]]
12221c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[CALL]], ptr [[A]], align 4, !dbg [[DBG7]]
123a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
124c0ee9e1bSVitaly Buka;
125c0ee9e1bSVitaly Bukaentry:
126c0ee9e1bSVitaly Buka  %call = tail call i32 @ReturnInt() nounwind, !dbg !10
12721c3df4bSMatt Arsenault  store i32 %call, ptr %a, align 4, !dbg !11
128c0ee9e1bSVitaly Buka  ret void
129c0ee9e1bSVitaly Buka}
130c0ee9e1bSVitaly Buka
131c0ee9e1bSVitaly Buka
132c0ee9e1bSVitaly Buka
13321c3df4bSMatt Arsenaultdefine void @SExt(ptr nocapture %a, ptr nocapture %b) nounwind uwtable sanitize_memory {
134c0ee9e1bSVitaly Buka; CHECK-LABEL: @SExt(
135c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
13621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8, !dbg [[DBG1]]
13721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4, !dbg [[DBG1]]
13821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i64, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
13921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
140a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
141a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_8(i64 zeroext [[TMP0]], i32 zeroext [[TMP1]]), !dbg [[DBG1]]
14221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = load i16, ptr [[B:%.*]], align 2, !dbg [[DBG1]]
14321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = ptrtoint ptr [[B]] to i64, !dbg [[DBG1]]
144a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = xor i64 [[TMP5]], 87960930222080, !dbg [[DBG1]]
14521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr, !dbg [[DBG1]]
146a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = add i64 [[TMP6]], 17592186044416, !dbg [[DBG1]]
147a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = and i64 [[TMP8]], -4, !dbg [[DBG1]]
14821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP10:%.*]] = inttoptr i64 [[TMP9]] to ptr, !dbg [[DBG1]]
14921c3df4bSMatt Arsenault; CHECK-NEXT:    [[_MSLD:%.*]] = load i16, ptr [[TMP7]], align 2, !dbg [[DBG1]]
15021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 4, !dbg [[DBG1]]
151a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP:%.*]] = sext i16 [[_MSLD]] to i32, !dbg [[DBG7]]
152a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP12:%.*]] = sext i16 [[TMP4]] to i32, !dbg [[DBG7]]
153a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_8(i64 zeroext [[TMP2]], i32 zeroext [[TMP3]]), !dbg [[DBG8]]
15421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP13:%.*]] = ptrtoint ptr [[A:%.*]] to i64, !dbg [[DBG8]]
155a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP13]], 87960930222080, !dbg [[DBG8]]
15621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP15:%.*]] = inttoptr i64 [[TMP14]] to ptr, !dbg [[DBG8]]
157a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP16:%.*]] = add i64 [[TMP14]], 17592186044416, !dbg [[DBG8]]
15821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP17:%.*]] = inttoptr i64 [[TMP16]] to ptr, !dbg [[DBG8]]
15921c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[_MSPROP]], ptr [[TMP15]], align 4, !dbg [[DBG8]]
16021c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_maybe_store_origin_4(i32 zeroext [[_MSPROP]], ptr [[A]], i32 zeroext [[TMP11]]), !dbg [[DBG8]]
16121c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP12]], ptr [[A]], align 4, !dbg [[DBG8]]
162a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
163c0ee9e1bSVitaly Buka;
164c0ee9e1bSVitaly Bukaentry:
16521c3df4bSMatt Arsenault  %0 = load i16, ptr %b, align 2, !dbg !10
166c0ee9e1bSVitaly Buka  %1 = sext i16 %0 to i32, !dbg !11
16721c3df4bSMatt Arsenault  store i32 %1, ptr %a, align 4, !dbg !12
168c0ee9e1bSVitaly Buka  ret void
169c0ee9e1bSVitaly Buka}
170c0ee9e1bSVitaly Buka
17121c3df4bSMatt Arsenaultdefine void @MemSet(ptr nocapture %x) nounwind uwtable sanitize_memory {
172c0ee9e1bSVitaly Buka; CHECK-LABEL: @MemSet(
173c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
174a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
17521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @__msan_memset(ptr [[X:%.*]], i32 42, i64 10), !dbg [[DBG1]]
176a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
177c0ee9e1bSVitaly Buka;
178c0ee9e1bSVitaly Bukaentry:
17921c3df4bSMatt Arsenault  call void @llvm.memset.p0.i64(ptr %x, i8 42, i64 10, i1 false), !dbg !10
180c0ee9e1bSVitaly Buka  ret void
181c0ee9e1bSVitaly Buka}
182c0ee9e1bSVitaly Buka
18321c3df4bSMatt Arsenaultdeclare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind
184c0ee9e1bSVitaly Buka
185c0ee9e1bSVitaly Buka
186c0ee9e1bSVitaly Buka
18721c3df4bSMatt Arsenaultdefine void @MemCpy(ptr nocapture %x, ptr nocapture %y) nounwind uwtable sanitize_memory {
188c0ee9e1bSVitaly Buka; CHECK-LABEL: @MemCpy(
189c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
19021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8, !dbg [[DBG1]]
19121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4, !dbg [[DBG1]]
192a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
19321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = call ptr @__msan_memcpy(ptr [[X:%.*]], ptr [[Y:%.*]], i64 10), !dbg [[DBG1]]
194a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
195c0ee9e1bSVitaly Buka;
196c0ee9e1bSVitaly Bukaentry:
19721c3df4bSMatt Arsenault  call void @llvm.memcpy.p0.p0.i64(ptr %x, ptr %y, i64 10, i1 false), !dbg !10
198c0ee9e1bSVitaly Buka  ret void
199c0ee9e1bSVitaly Buka}
200c0ee9e1bSVitaly Buka
20121c3df4bSMatt Arsenaultdeclare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
202c0ee9e1bSVitaly Buka
203c0ee9e1bSVitaly Buka
20421c3df4bSMatt Arsenaultdefine void @MemSetInline(ptr nocapture %x) nounwind uwtable sanitize_memory {
205c0ee9e1bSVitaly Buka; CHECK-LABEL: @MemSetInline(
206c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
207a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
20821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @__msan_memset(ptr [[X:%.*]], i32 42, i64 10), !dbg [[DBG1]]
209a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
210c0ee9e1bSVitaly Buka;
211c0ee9e1bSVitaly Bukaentry:
21221c3df4bSMatt Arsenault  call void @llvm.memset.inline.p0.i64(ptr %x, i8 42, i64 10, i1 false), !dbg !10
213c0ee9e1bSVitaly Buka  ret void
214c0ee9e1bSVitaly Buka}
215c0ee9e1bSVitaly Buka
21621c3df4bSMatt Arsenaultdeclare void @llvm.memset.inline.p0.i64(ptr nocapture, i8, i64, i1) nounwind
217c0ee9e1bSVitaly Buka
218c0ee9e1bSVitaly Buka
21921c3df4bSMatt Arsenaultdefine void @MemCpyInline(ptr nocapture %x, ptr nocapture %y) nounwind uwtable sanitize_memory {
220c0ee9e1bSVitaly Buka; CHECK-LABEL: @MemCpyInline(
221c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
22221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8, !dbg [[DBG1]]
22321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4, !dbg [[DBG1]]
224a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
22521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = call ptr @__msan_memcpy(ptr [[X:%.*]], ptr [[Y:%.*]], i64 10), !dbg [[DBG1]]
226a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
227c0ee9e1bSVitaly Buka;
228c0ee9e1bSVitaly Bukaentry:
22921c3df4bSMatt Arsenault  call void @llvm.memcpy.inline.p0.p0.i64(ptr %x, ptr %y, i64 10, i1 false), !dbg !10
230c0ee9e1bSVitaly Buka  ret void
231c0ee9e1bSVitaly Buka}
232c0ee9e1bSVitaly Buka
23321c3df4bSMatt Arsenaultdeclare void @llvm.memcpy.inline.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
234c0ee9e1bSVitaly Buka
235c0ee9e1bSVitaly Buka
23621c3df4bSMatt Arsenaultdefine void @MemMove(ptr nocapture %x, ptr nocapture %y) nounwind uwtable sanitize_memory {
237c0ee9e1bSVitaly Buka; CHECK-LABEL: @MemMove(
238c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
23921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8, !dbg [[DBG1]]
24021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4, !dbg [[DBG1]]
241a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
24221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = call ptr @__msan_memmove(ptr [[X:%.*]], ptr [[Y:%.*]], i64 10), !dbg [[DBG1]]
243a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
244c0ee9e1bSVitaly Buka;
245c0ee9e1bSVitaly Bukaentry:
24621c3df4bSMatt Arsenault  call void @llvm.memmove.p0.p0.i64(ptr %x, ptr %y, i64 10, i1 false), !dbg !10
247c0ee9e1bSVitaly Buka  ret void
248c0ee9e1bSVitaly Buka}
249c0ee9e1bSVitaly Buka
25021c3df4bSMatt Arsenaultdeclare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
251c0ee9e1bSVitaly Buka
252c0ee9e1bSVitaly Buka
25321c3df4bSMatt Arsenaultdeclare void @llvm.memset.element.unordered.atomic.p0.i64(ptr nocapture writeonly, i8, i64, i32) nounwind
25421c3df4bSMatt Arsenaultdeclare void @llvm.memmove.element.unordered.atomic.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i32) nounwind
25521c3df4bSMatt Arsenaultdeclare void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i32) nounwind
256c0ee9e1bSVitaly Buka
25721c3df4bSMatt Arsenaultdefine void @atomic_memcpy(ptr nocapture %x, ptr nocapture %y) nounwind {
258c0ee9e1bSVitaly Buka; CHECK-LABEL: @atomic_memcpy(
259a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
26021c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 [[X:%.*]], ptr align 2 [[Y:%.*]], i64 16, i32 1), !dbg [[DBG1]]
261a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
262c0ee9e1bSVitaly Buka;
26321c3df4bSMatt Arsenault  call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 1 %x, ptr align 2 %y, i64 16, i32 1), !dbg !10
264c0ee9e1bSVitaly Buka  ret void
265c0ee9e1bSVitaly Buka}
266c0ee9e1bSVitaly Buka
26721c3df4bSMatt Arsenaultdefine void @atomic_memmove(ptr nocapture %x, ptr nocapture %y) nounwind {
268c0ee9e1bSVitaly Buka; CHECK-LABEL: @atomic_memmove(
269a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
27021c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memmove.element.unordered.atomic.p0.p0.i64(ptr align 1 [[X:%.*]], ptr align 2 [[Y:%.*]], i64 16, i32 1), !dbg [[DBG1]]
271a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
272c0ee9e1bSVitaly Buka;
27321c3df4bSMatt Arsenault  call void @llvm.memmove.element.unordered.atomic.p0.p0.i64(ptr align 1 %x, ptr align 2 %y, i64 16, i32 1), !dbg !10
274c0ee9e1bSVitaly Buka  ret void
275c0ee9e1bSVitaly Buka}
276c0ee9e1bSVitaly Buka
27721c3df4bSMatt Arsenaultdefine void @atomic_memset(ptr nocapture %x) nounwind {
278c0ee9e1bSVitaly Buka; CHECK-LABEL: @atomic_memset(
279a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
28021c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 [[X:%.*]], i8 88, i64 16, i32 1), !dbg [[DBG1]]
281a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
282c0ee9e1bSVitaly Buka;
28321c3df4bSMatt Arsenault  call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 1 %x, i8 88, i64 16, i32 1), !dbg !10
284c0ee9e1bSVitaly Buka  ret void
285c0ee9e1bSVitaly Buka}
286c0ee9e1bSVitaly Buka
287c0ee9e1bSVitaly Buka
288c0ee9e1bSVitaly Buka
289c0ee9e1bSVitaly Buka
290c0ee9e1bSVitaly Bukadefine i32 @Select(i32 %a, i32 %b, i1 %c) nounwind uwtable readnone sanitize_memory {
291c0ee9e1bSVitaly Buka; CHECK-LABEL: @Select(
292c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
29321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i1, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8, !dbg [[DBG1]]
29421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 16) to ptr), align 4, !dbg [[DBG1]]
29521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
29621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
29721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8, !dbg [[DBG1]]
29821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4, !dbg [[DBG1]]
299a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
300a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = select i1 [[C:%.*]], i32 [[TMP2]], i32 [[TMP4]], !dbg [[DBG1]]
301a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = xor i32 [[A:%.*]], [[B:%.*]], !dbg [[DBG1]]
302a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = or i32 [[TMP7]], [[TMP2]], !dbg [[DBG1]]
303a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = or i32 [[TMP8]], [[TMP4]], !dbg [[DBG1]]
304a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP_SELECT:%.*]] = select i1 [[TMP0]], i32 [[TMP9]], i32 [[TMP6]], !dbg [[DBG1]]
305a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = select i1 [[C]], i32 [[TMP3]], i32 [[TMP5]], !dbg [[DBG1]]
306a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = select i1 [[TMP0]], i32 [[TMP1]], i32 [[TMP10]], !dbg [[DBG1]]
307a38e5a4bSVitaly Buka; CHECK-NEXT:    [[COND:%.*]] = select i1 [[C]], i32 [[A]], i32 [[B]], !dbg [[DBG1]]
30821c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[_MSPROP_SELECT]], ptr @__msan_retval_tls, align 8
30921c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP11]], ptr @__msan_retval_origin_tls, align 4
310a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 [[COND]]
311c0ee9e1bSVitaly Buka;
312c0ee9e1bSVitaly Bukaentry:
313c0ee9e1bSVitaly Buka  %cond = select i1 %c, i32 %a, i32 %b, !dbg !10
314c0ee9e1bSVitaly Buka  ret i32 %cond
315c0ee9e1bSVitaly Buka}
316c0ee9e1bSVitaly Buka
317c0ee9e1bSVitaly Buka
318c0ee9e1bSVitaly Buka
319c0ee9e1bSVitaly Buka
320c0ee9e1bSVitaly Bukadefine <8 x i16> @SelectVector(<8 x i16> %a, <8 x i16> %b, <8 x i1> %c) nounwind uwtable readnone sanitize_memory {
321c0ee9e1bSVitaly Buka; CHECK-LABEL: @SelectVector(
322c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
32321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i1>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 32) to ptr), align 8, !dbg [[DBG1]]
32421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 32) to ptr), align 4, !dbg [[DBG1]]
32521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
32621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
32721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i16>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8, !dbg [[DBG1]]
32821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 16) to ptr), align 4, !dbg [[DBG1]]
329a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
330a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = select <8 x i1> [[C:%.*]], <8 x i16> [[TMP2]], <8 x i16> [[TMP4]], !dbg [[DBG1]]
331a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = xor <8 x i16> [[A:%.*]], [[B:%.*]], !dbg [[DBG1]]
332a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = or <8 x i16> [[TMP7]], [[TMP2]], !dbg [[DBG1]]
333a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = or <8 x i16> [[TMP8]], [[TMP4]], !dbg [[DBG1]]
334a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP_SELECT:%.*]] = select <8 x i1> [[TMP0]], <8 x i16> [[TMP9]], <8 x i16> [[TMP6]], !dbg [[DBG1]]
335a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = bitcast <8 x i1> [[C]] to i8, !dbg [[DBG1]]
336a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP10]], 0, !dbg [[DBG1]]
337a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP12:%.*]] = bitcast <8 x i1> [[TMP0]] to i8, !dbg [[DBG1]]
338a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP13:%.*]] = icmp ne i8 [[TMP12]], 0, !dbg [[DBG1]]
339a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP14:%.*]] = select i1 [[TMP11]], i32 [[TMP3]], i32 [[TMP5]], !dbg [[DBG1]]
340a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP15:%.*]] = select i1 [[TMP13]], i32 [[TMP1]], i32 [[TMP14]], !dbg [[DBG1]]
341a38e5a4bSVitaly Buka; CHECK-NEXT:    [[COND:%.*]] = select <8 x i1> [[C]], <8 x i16> [[A]], <8 x i16> [[B]], !dbg [[DBG1]]
34221c3df4bSMatt Arsenault; CHECK-NEXT:    store <8 x i16> [[_MSPROP_SELECT]], ptr @__msan_retval_tls, align 8
34321c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP15]], ptr @__msan_retval_origin_tls, align 4
344a38e5a4bSVitaly Buka; CHECK-NEXT:    ret <8 x i16> [[COND]]
345c0ee9e1bSVitaly Buka;
346c0ee9e1bSVitaly Bukaentry:
347c0ee9e1bSVitaly Buka  %cond = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b, !dbg !10
348c0ee9e1bSVitaly Buka  ret <8 x i16> %cond
349c0ee9e1bSVitaly Buka}
350c0ee9e1bSVitaly Buka
351c0ee9e1bSVitaly Buka
352c0ee9e1bSVitaly Buka
353c0ee9e1bSVitaly Buka
35421c3df4bSMatt Arsenaultdefine ptr @IntToPtr(i64 %x) nounwind uwtable readnone sanitize_memory {
355c0ee9e1bSVitaly Buka; CHECK-LABEL: @IntToPtr(
356c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
35721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
35821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
359a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
36021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = inttoptr i64 [[X:%.*]] to ptr, !dbg [[DBG1]]
36121c3df4bSMatt Arsenault; CHECK-NEXT:    store i64 [[TMP0]], ptr @__msan_retval_tls, align 8
36221c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP1]], ptr @__msan_retval_origin_tls, align 4
36321c3df4bSMatt Arsenault; CHECK-NEXT:    ret ptr [[TMP2]]
364c0ee9e1bSVitaly Buka;
365c0ee9e1bSVitaly Bukaentry:
36621c3df4bSMatt Arsenault  %0 = inttoptr i64 %x to ptr, !dbg !10
36721c3df4bSMatt Arsenault  ret ptr %0
368c0ee9e1bSVitaly Buka}
369c0ee9e1bSVitaly Buka
370c0ee9e1bSVitaly Buka
371c0ee9e1bSVitaly Buka
372c0ee9e1bSVitaly Buka
373c0ee9e1bSVitaly Buka
374c0ee9e1bSVitaly Bukadefine i32 @Div(i32 %a, i32 %b) nounwind uwtable readnone sanitize_memory {
375c0ee9e1bSVitaly Buka; CHECK-LABEL: @Div(
376c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
37721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8, !dbg [[DBG1]]
37821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 8) to ptr), align 4, !dbg [[DBG1]]
37921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
38021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
381a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
382a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_4(i32 zeroext [[TMP0]], i32 zeroext [[TMP1]]), !dbg [[DBG1]]
383a38e5a4bSVitaly Buka; CHECK-NEXT:    [[DIV:%.*]] = udiv i32 [[A:%.*]], [[B:%.*]], !dbg [[DBG1]]
38421c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP2]], ptr @__msan_retval_tls, align 8
38521c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP3]], ptr @__msan_retval_origin_tls, align 4
386a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 [[DIV]]
387c0ee9e1bSVitaly Buka;
388c0ee9e1bSVitaly Bukaentry:
389c0ee9e1bSVitaly Buka  %div = udiv i32 %a, %b, !dbg !10
390c0ee9e1bSVitaly Buka  ret i32 %div
391c0ee9e1bSVitaly Buka}
392c0ee9e1bSVitaly Buka
393c0ee9e1bSVitaly Buka
394c0ee9e1bSVitaly Buka
395c0ee9e1bSVitaly Buka
396c0ee9e1bSVitaly Buka
397c0ee9e1bSVitaly Buka
398c0ee9e1bSVitaly Buka
399c0ee9e1bSVitaly Bukadefine i32 @ShadowLoadAlignmentLarge() nounwind uwtable sanitize_memory {
400c0ee9e1bSVitaly Buka; CHECK-LABEL: @ShadowLoadAlignmentLarge(
401a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
402a38e5a4bSVitaly Buka; CHECK-NEXT:    [[Y:%.*]] = alloca i32, align 64, !dbg [[DBG1]]
40321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr [[Y]] to i64, !dbg [[DBG1]]
404a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = xor i64 [[TMP1]], 87960930222080, !dbg [[DBG1]]
40521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr, !dbg [[DBG1]]
406a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = add i64 [[TMP2]], 17592186044416, !dbg [[DBG1]]
407a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = and i64 [[TMP4]], -4, !dbg [[DBG1]]
40821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr, !dbg [[DBG1]]
40921c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 64 [[TMP3]], i8 -1, i64 4, i1 false), !dbg [[DBG1]]
41021c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_set_alloca_origin_with_descr(ptr [[Y]], i64 4, ptr @[[GLOB0:[0-9]+]], ptr @[[GLOB1:[0-9]+]]), !dbg [[DBG1]]
41121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP8:%.*]] = load volatile i32, ptr [[Y]], align 64, !dbg [[DBG7]]
41221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP9:%.*]] = ptrtoint ptr [[Y]] to i64, !dbg [[DBG7]]
413a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = xor i64 [[TMP9]], 87960930222080, !dbg [[DBG7]]
41421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP11:%.*]] = inttoptr i64 [[TMP10]] to ptr, !dbg [[DBG7]]
415a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP12:%.*]] = add i64 [[TMP10]], 17592186044416, !dbg [[DBG7]]
41621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP13:%.*]] = inttoptr i64 [[TMP12]] to ptr, !dbg [[DBG7]]
41721c3df4bSMatt Arsenault; CHECK-NEXT:    [[_MSLD:%.*]] = load i32, ptr [[TMP11]], align 64, !dbg [[DBG7]]
41821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 64, !dbg [[DBG7]]
41921c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[_MSLD]], ptr @__msan_retval_tls, align 8
42021c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP14]], ptr @__msan_retval_origin_tls, align 4
421a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 [[TMP8]]
422c0ee9e1bSVitaly Buka;
423c0ee9e1bSVitaly Buka  %y = alloca i32, align 64, !dbg !10
42421c3df4bSMatt Arsenault  %1 = load volatile i32, ptr %y, align 64, !dbg !11
425c0ee9e1bSVitaly Buka  ret i32 %1
426c0ee9e1bSVitaly Buka}
427c0ee9e1bSVitaly Buka
428c0ee9e1bSVitaly Buka
429c0ee9e1bSVitaly Buka
430c0ee9e1bSVitaly Bukadefine i32 @ExtractElement(<4 x i32> %vec, i32 %idx) sanitize_memory {
431c0ee9e1bSVitaly Buka; CHECK-LABEL: @ExtractElement(
43221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8, !dbg [[DBG1]]
43321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 16) to ptr), align 4, !dbg [[DBG1]]
43421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
43521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
436a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
437a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP:%.*]] = extractelement <4 x i32> [[TMP3]], i32 [[IDX:%.*]], !dbg [[DBG1]]
438a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_4(i32 zeroext [[TMP1]], i32 zeroext [[TMP2]]), !dbg [[DBG1]]
439a38e5a4bSVitaly Buka; CHECK-NEXT:    [[X:%.*]] = extractelement <4 x i32> [[VEC:%.*]], i32 [[IDX]], !dbg [[DBG1]]
44021c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[_MSPROP]], ptr @__msan_retval_tls, align 8
44121c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP4]], ptr @__msan_retval_origin_tls, align 4
442a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 [[X]]
443c0ee9e1bSVitaly Buka;
444c0ee9e1bSVitaly Buka  %x = extractelement <4 x i32> %vec, i32 %idx, !dbg !10
445c0ee9e1bSVitaly Buka  ret i32 %x
446c0ee9e1bSVitaly Buka}
447c0ee9e1bSVitaly Buka
448c0ee9e1bSVitaly Buka
449c0ee9e1bSVitaly Bukadefine <4 x i32> @InsertElement(<4 x i32> %vec, i32 %idx, i32 %x) sanitize_memory {
450c0ee9e1bSVitaly Buka; CHECK-LABEL: @InsertElement(
45121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8, !dbg [[DBG1]]
45221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 16) to ptr), align 4, !dbg [[DBG1]]
45321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
45421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
45521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 24) to ptr), align 8, !dbg [[DBG1]]
45621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 24) to ptr), align 4, !dbg [[DBG1]]
457a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
458a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP:%.*]] = insertelement <4 x i32> [[TMP3]], i32 [[TMP5]], i32 [[IDX:%.*]], !dbg [[DBG1]]
459a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = icmp ne i32 [[TMP5]], 0, !dbg [[DBG1]]
460a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = select i1 [[TMP7]], i32 [[TMP6]], i32 [[TMP4]], !dbg [[DBG1]]
461a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = icmp ne i32 [[TMP1]], 0, !dbg [[DBG1]]
462a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = select i1 [[TMP9]], i32 [[TMP2]], i32 [[TMP8]], !dbg [[DBG1]]
463a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @__msan_maybe_warning_4(i32 zeroext [[TMP1]], i32 zeroext [[TMP2]]), !dbg [[DBG1]]
464a38e5a4bSVitaly Buka; CHECK-NEXT:    [[VEC1:%.*]] = insertelement <4 x i32> [[VEC:%.*]], i32 [[X:%.*]], i32 [[IDX]], !dbg [[DBG1]]
46521c3df4bSMatt Arsenault; CHECK-NEXT:    store <4 x i32> [[_MSPROP]], ptr @__msan_retval_tls, align 8
46621c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP10]], ptr @__msan_retval_origin_tls, align 4
467a38e5a4bSVitaly Buka; CHECK-NEXT:    ret <4 x i32> [[VEC1]]
468c0ee9e1bSVitaly Buka;
469c0ee9e1bSVitaly Buka  %vec1 = insertelement <4 x i32> %vec, i32 %x, i32 %idx, !dbg !10
470c0ee9e1bSVitaly Buka  ret <4 x i32> %vec1
471c0ee9e1bSVitaly Buka}
472c0ee9e1bSVitaly Buka
473c0ee9e1bSVitaly Buka
474c0ee9e1bSVitaly Bukadefine <4 x i32> @ShuffleVector(<4 x i32> %vec, <4 x i32> %vec1) sanitize_memory {
475c0ee9e1bSVitaly Buka; CHECK-LABEL: @ShuffleVector(
47621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
47721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
47821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8, !dbg [[DBG1]]
47921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_origin_tls to i64), i64 16) to ptr), align 4, !dbg [[DBG1]]
480a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
481a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> [[TMP3]], <4 x i32> <i32 0, i32 4, i32 1, i32 5>, !dbg [[DBG1]]
482a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = bitcast <4 x i32> [[TMP3]] to i128, !dbg [[DBG1]]
483a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = icmp ne i128 [[TMP5]], 0, !dbg [[DBG1]]
484a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = select i1 [[TMP6]], i32 [[TMP4]], i32 [[TMP2]], !dbg [[DBG1]]
485a38e5a4bSVitaly Buka; CHECK-NEXT:    [[VEC2:%.*]] = shufflevector <4 x i32> [[VEC:%.*]], <4 x i32> [[VEC1:%.*]], <4 x i32> <i32 0, i32 4, i32 1, i32 5>, !dbg [[DBG1]]
48621c3df4bSMatt Arsenault; CHECK-NEXT:    store <4 x i32> [[_MSPROP]], ptr @__msan_retval_tls, align 8
48721c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP7]], ptr @__msan_retval_origin_tls, align 4
488a38e5a4bSVitaly Buka; CHECK-NEXT:    ret <4 x i32> [[VEC2]]
489c0ee9e1bSVitaly Buka;
490c0ee9e1bSVitaly Buka  %vec2 = shufflevector <4 x i32> %vec, <4 x i32> %vec1, <4 x i32> <i32 0, i32 4, i32 1, i32 5>, !dbg !10
491c0ee9e1bSVitaly Buka  ret <4 x i32> %vec2
492c0ee9e1bSVitaly Buka}
493c0ee9e1bSVitaly Buka
494c0ee9e1bSVitaly Buka
495c0ee9e1bSVitaly Buka
49621c3df4bSMatt Arsenault%struct.__va_list_tag = type { i32, i32, ptr, ptr }
49721c3df4bSMatt Arsenaultdeclare void @llvm.va_start(ptr) nounwind
498c0ee9e1bSVitaly Buka
499c0ee9e1bSVitaly Bukadefine void @VAStart(i32 %x, ...) sanitize_memory {
500c0ee9e1bSVitaly Buka; CHECK-LABEL: @VAStart(
501c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
50221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 8, !dbg [[DBG1]]
503a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = add i64 176, [[TMP0]], !dbg [[DBG1]]
504e0f7ef4bSEvgenii Stepanov; CHECK-NEXT:    [[TMP2:%.*]] = alloca i8, i64 [[TMP1]], align 8, !dbg [[DBG1]]
505e0f7ef4bSEvgenii Stepanov; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP2]], i8 0, i64 [[TMP1]], i1 false), !dbg [[DBG1]]
506e0f7ef4bSEvgenii Stepanov; CHECK-NEXT:    [[SRCSZ:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP1]], i64 800), !dbg [[DBG1]]
507e0f7ef4bSEvgenii Stepanov; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP2]], ptr align 8 @__msan_va_arg_tls, i64 [[SRCSZ]], i1 false), !dbg [[DBG1]]
508e0f7ef4bSEvgenii Stepanov; CHECK-NEXT:    [[TMP3:%.*]] = alloca i8, i64 [[TMP1]], align 8, !dbg [[DBG1]]
509e0f7ef4bSEvgenii Stepanov; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP3]], ptr align 8 @__msan_va_arg_origin_tls, i64 [[SRCSZ]], i1 false), !dbg [[DBG1]]
51021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
51121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr @__msan_param_origin_tls, align 4, !dbg [[DBG1]]
512a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
513a38e5a4bSVitaly Buka; CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32, align 4, !dbg [[DBG1]]
51421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP6:%.*]] = ptrtoint ptr [[X_ADDR]] to i64, !dbg [[DBG1]]
515a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = xor i64 [[TMP6]], 87960930222080, !dbg [[DBG1]]
51621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr, !dbg [[DBG1]]
517a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = add i64 [[TMP7]], 17592186044416, !dbg [[DBG1]]
518a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = and i64 [[TMP9]], -4, !dbg [[DBG1]]
51921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP11:%.*]] = inttoptr i64 [[TMP10]] to ptr, !dbg [[DBG1]]
52021c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP8]], i8 -1, i64 4, i1 false), !dbg [[DBG1]]
52121c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_set_alloca_origin_with_descr(ptr [[X_ADDR]], i64 4, ptr @[[GLOB2:[0-9]+]], ptr @[[GLOB3:[0-9]+]]), !dbg [[DBG1]]
522a38e5a4bSVitaly Buka; CHECK-NEXT:    [[VA:%.*]] = alloca [1 x %struct.__va_list_tag], align 16, !dbg [[DBG7]]
52321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP13:%.*]] = ptrtoint ptr [[VA]] to i64, !dbg [[DBG7]]
524a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP13]], 87960930222080, !dbg [[DBG7]]
52521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP15:%.*]] = inttoptr i64 [[TMP14]] to ptr, !dbg [[DBG7]]
526a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP16:%.*]] = add i64 [[TMP14]], 17592186044416, !dbg [[DBG7]]
527a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP17:%.*]] = and i64 [[TMP16]], -4, !dbg [[DBG7]]
52821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr, !dbg [[DBG7]]
52921c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[TMP15]], i8 -1, i64 24, i1 false), !dbg [[DBG7]]
53021c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_set_alloca_origin_with_descr(ptr [[VA]], i64 24, ptr @[[GLOB4:[0-9]+]], ptr @[[GLOB5:[0-9]+]]), !dbg [[DBG7]]
53121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP20:%.*]] = ptrtoint ptr [[X_ADDR]] to i64, !dbg [[DBG8]]
532a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP21:%.*]] = xor i64 [[TMP20]], 87960930222080, !dbg [[DBG8]]
53321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP22:%.*]] = inttoptr i64 [[TMP21]] to ptr, !dbg [[DBG8]]
534a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP23:%.*]] = add i64 [[TMP21]], 17592186044416, !dbg [[DBG8]]
53521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP24:%.*]] = inttoptr i64 [[TMP23]] to ptr, !dbg [[DBG8]]
53621c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[TMP4]], ptr [[TMP22]], align 4, !dbg [[DBG8]]
53721c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_maybe_store_origin_4(i32 zeroext [[TMP4]], ptr [[X_ADDR]], i32 zeroext [[TMP5]]), !dbg [[DBG8]]
53821c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 [[X:%.*]], ptr [[X_ADDR]], align 4, !dbg [[DBG8]]
53921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP26:%.*]] = ptrtoint ptr [[VA]] to i64, !dbg [[DBG11:![0-9]+]]
540a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP27:%.*]] = xor i64 [[TMP26]], 87960930222080, !dbg [[DBG11]]
54121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP28:%.*]] = inttoptr i64 [[TMP27]] to ptr, !dbg [[DBG11]]
542a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP29:%.*]] = add i64 [[TMP27]], 17592186044416, !dbg [[DBG11]]
54321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP30:%.*]] = inttoptr i64 [[TMP29]] to ptr, !dbg [[DBG11]]
54421c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP28]], i8 0, i64 24, i1 false), !dbg [[DBG11]]
545*ab7dba23SAlex Voicu; CHECK-NEXT:    call void @llvm.va_start.p0(ptr [[VA]]), !dbg [[DBG11]]
54621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP31:%.*]] = ptrtoint ptr [[VA]] to i64, !dbg [[DBG11]]
547a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP32:%.*]] = add i64 [[TMP31]], 16, !dbg [[DBG11]]
54821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP33:%.*]] = inttoptr i64 [[TMP32]] to ptr, !dbg [[DBG11]]
54921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP34:%.*]] = load ptr, ptr [[TMP33]], align 8, !dbg [[DBG11]]
55021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP35:%.*]] = ptrtoint ptr [[TMP34]] to i64, !dbg [[DBG11]]
551a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP36:%.*]] = xor i64 [[TMP35]], 87960930222080, !dbg [[DBG11]]
55221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP37:%.*]] = inttoptr i64 [[TMP36]] to ptr, !dbg [[DBG11]]
553a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP38:%.*]] = add i64 [[TMP36]], 17592186044416, !dbg [[DBG11]]
55421c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP39:%.*]] = inttoptr i64 [[TMP38]] to ptr, !dbg [[DBG11]]
55521c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[TMP37]], ptr align 16 [[TMP2]], i64 176, i1 false), !dbg [[DBG11]]
55621c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[TMP39]], ptr align 16 [[TMP3]], i64 176, i1 false), !dbg [[DBG11]]
55721c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP41:%.*]] = ptrtoint ptr [[VA]] to i64, !dbg [[DBG11]]
558a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP42:%.*]] = add i64 [[TMP41]], 8, !dbg [[DBG11]]
55921c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP43:%.*]] = inttoptr i64 [[TMP42]] to ptr, !dbg [[DBG11]]
56021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP44:%.*]] = load ptr, ptr [[TMP43]], align 8, !dbg [[DBG11]]
56121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP45:%.*]] = ptrtoint ptr [[TMP44]] to i64, !dbg [[DBG11]]
562a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP46:%.*]] = xor i64 [[TMP45]], 87960930222080, !dbg [[DBG11]]
56321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP47:%.*]] = inttoptr i64 [[TMP46]] to ptr, !dbg [[DBG11]]
564a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP48:%.*]] = add i64 [[TMP46]], 17592186044416, !dbg [[DBG11]]
56521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP49:%.*]] = inttoptr i64 [[TMP48]] to ptr, !dbg [[DBG11]]
56621c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP50:%.*]] = getelementptr i8, ptr [[TMP2]], i32 176, !dbg [[DBG11]]
56721c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[TMP47]], ptr align 16 [[TMP50]], i64 [[TMP0]], i1 false), !dbg [[DBG11]]
56821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP51:%.*]] = getelementptr i8, ptr [[TMP3]], i32 176, !dbg [[DBG11]]
56921c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[TMP49]], ptr align 16 [[TMP51]], i64 [[TMP0]], i1 false), !dbg [[DBG11]]
570a38e5a4bSVitaly Buka; CHECK-NEXT:    ret void
571c0ee9e1bSVitaly Buka;
572c0ee9e1bSVitaly Bukaentry:
573c0ee9e1bSVitaly Buka  %x.addr = alloca i32, align 4, !dbg !10
574c0ee9e1bSVitaly Buka  %va = alloca [1 x %struct.__va_list_tag], align 16, !dbg !11
57521c3df4bSMatt Arsenault  store i32 %x, ptr %x.addr, align 4, !dbg !12
57621c3df4bSMatt Arsenault  call void @llvm.va_start(ptr %va), !dbg !15
577c0ee9e1bSVitaly Buka  ret void
578c0ee9e1bSVitaly Buka}
579c0ee9e1bSVitaly Buka
580c0ee9e1bSVitaly Buka
581c0ee9e1bSVitaly Buka
582c0ee9e1bSVitaly Bukadefine i32 @NoSanitizeMemory(i32 %x) uwtable {
583c0ee9e1bSVitaly Buka; CHECK-LABEL: @NoSanitizeMemory(
584c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
585a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
586a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = xor i32 [[X:%.*]], 0, !dbg [[DBG1]]
587a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i32 -1, [[TMP0]], !dbg [[DBG1]]
588a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 0, !dbg [[DBG1]]
589a38e5a4bSVitaly Buka; CHECK-NEXT:    [[_MSPROP_ICMP:%.*]] = and i1 false, [[TMP2]], !dbg [[DBG1]]
590a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[X]], 0, !dbg [[DBG1]]
591a38e5a4bSVitaly Buka; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]], !dbg [[DBG7]]
592c0ee9e1bSVitaly Buka; CHECK:       if.then:
593a38e5a4bSVitaly Buka; CHECK-NEXT:    tail call void @bar(), !dbg [[DBG8]]
594a38e5a4bSVitaly Buka; CHECK-NEXT:    br label [[IF_END]]
595c0ee9e1bSVitaly Buka; CHECK:       if.end:
59621c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 8
59721c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_origin_tls, align 4
598a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 [[X]]
599c0ee9e1bSVitaly Buka;
600c0ee9e1bSVitaly Bukaentry:
601c0ee9e1bSVitaly Buka  %tobool = icmp eq i32 %x, 0, !dbg !10
602c0ee9e1bSVitaly Buka  br i1 %tobool, label %if.end, label %if.then, !dbg !11
603c0ee9e1bSVitaly Buka
604c0ee9e1bSVitaly Bukaif.then:                                            tail call void @bar(), !dbg !12
605c0ee9e1bSVitaly Buka  br label %if.end
606c0ee9e1bSVitaly Buka
607c0ee9e1bSVitaly Bukaif.end:                                             ret i32 %x
608c0ee9e1bSVitaly Buka}
609c0ee9e1bSVitaly Buka
610c0ee9e1bSVitaly Bukadeclare void @bar()
611c0ee9e1bSVitaly Buka
612c0ee9e1bSVitaly Buka
613c0ee9e1bSVitaly Buka
614c0ee9e1bSVitaly Buka
615c0ee9e1bSVitaly Bukadefine i32 @NoSanitizeMemoryAlloca() {
616c0ee9e1bSVitaly Buka; CHECK-LABEL: @NoSanitizeMemoryAlloca(
617c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
618a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
619a38e5a4bSVitaly Buka; CHECK-NEXT:    [[P:%.*]] = alloca i32, align 4, !dbg [[DBG1]]
62021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[P]] to i64, !dbg [[DBG1]]
621a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = xor i64 [[TMP0]], 87960930222080, !dbg [[DBG1]]
62221c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = inttoptr i64 [[TMP1]] to ptr, !dbg [[DBG1]]
623a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[TMP1]], 17592186044416, !dbg [[DBG1]]
624a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], -4, !dbg [[DBG1]]
62521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr, !dbg [[DBG1]]
62621c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP2]], i8 0, i64 4, i1 false), !dbg [[DBG1]]
62721c3df4bSMatt Arsenault; CHECK-NEXT:    store i64 0, ptr @__msan_param_tls, align 8, !dbg [[DBG7]]
62821c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 8, !dbg [[DBG7]]
62921c3df4bSMatt Arsenault; CHECK-NEXT:    [[X:%.*]] = call i32 @NoSanitizeMemoryAllocaHelper(ptr [[P]]), !dbg [[DBG7]]
63021c3df4bSMatt Arsenault; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8
63121c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr @__msan_retval_origin_tls, align 4
63221c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 8
63321c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_origin_tls, align 4
634a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 [[X]]
635c0ee9e1bSVitaly Buka;
636c0ee9e1bSVitaly Bukaentry:
637c0ee9e1bSVitaly Buka  %p = alloca i32, align 4, !dbg !10
63821c3df4bSMatt Arsenault  %x = call i32 @NoSanitizeMemoryAllocaHelper(ptr %p), !dbg !11
639c0ee9e1bSVitaly Buka  ret i32 %x
640c0ee9e1bSVitaly Buka}
641c0ee9e1bSVitaly Buka
64221c3df4bSMatt Arsenaultdeclare i32 @NoSanitizeMemoryAllocaHelper(ptr %p)
643c0ee9e1bSVitaly Buka
644c0ee9e1bSVitaly Buka
645c0ee9e1bSVitaly Buka
646c0ee9e1bSVitaly Buka
647c0ee9e1bSVitaly Bukadefine i32 @NoSanitizeMemoryUndef() {
648c0ee9e1bSVitaly Buka; CHECK-LABEL: @NoSanitizeMemoryUndef(
649c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
650a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
65121c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_param_tls, align 8, !dbg [[DBG1]]
65221c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 8, !dbg [[DBG1]]
653a38e5a4bSVitaly Buka; CHECK-NEXT:    [[X:%.*]] = call i32 @NoSanitizeMemoryUndefHelper(i32 undef), !dbg [[DBG1]]
65421c3df4bSMatt Arsenault; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8
65521c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr @__msan_retval_origin_tls, align 4
65621c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 8
65721c3df4bSMatt Arsenault; CHECK-NEXT:    store i32 0, ptr @__msan_retval_origin_tls, align 4
658a38e5a4bSVitaly Buka; CHECK-NEXT:    ret i32 [[X]]
659c0ee9e1bSVitaly Buka;
660c0ee9e1bSVitaly Bukaentry:
661c0ee9e1bSVitaly Buka  %x = call i32 @NoSanitizeMemoryUndefHelper(i32 undef), !dbg !10
662c0ee9e1bSVitaly Buka  ret i32 %x
663c0ee9e1bSVitaly Buka}
664c0ee9e1bSVitaly Buka
665c0ee9e1bSVitaly Bukadeclare i32 @NoSanitizeMemoryUndefHelper(i32 %x)
666c0ee9e1bSVitaly Buka
66721c3df4bSMatt Arsenaultdeclare void @llvm.lifetime.start.p0(i64 immarg %0, ptr nocapture %1)
66821c3df4bSMatt Arsenaultdeclare void @llvm.lifetime.end.p0(i64 immarg %0, ptr nocapture %1)
66921c3df4bSMatt Arsenaultdeclare void @foo8(ptr nocapture)
670c0ee9e1bSVitaly Buka
671c0ee9e1bSVitaly Buka
672c0ee9e1bSVitaly Bukadefine void @msan() sanitize_memory {
673c0ee9e1bSVitaly Buka; CHECK-LABEL: @msan(
674c0ee9e1bSVitaly Buka; CHECK-NEXT:  entry:
675a38e5a4bSVitaly Buka; CHECK-NEXT:    call void @llvm.donothing(), !dbg [[DBG1]]
676a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TEXT:%.*]] = alloca i8, align 1, !dbg [[DBG1]]
67721c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 1, ptr [[TEXT]]), !dbg [[DBG7]]
67821c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[TEXT]] to i64, !dbg [[DBG7]]
679a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = xor i64 [[TMP0]], 87960930222080, !dbg [[DBG7]]
68021c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = inttoptr i64 [[TMP1]] to ptr, !dbg [[DBG7]]
681a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[TMP1]], 17592186044416, !dbg [[DBG7]]
682a38e5a4bSVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = and i64 [[TMP3]], -4, !dbg [[DBG7]]
68321c3df4bSMatt Arsenault; CHECK-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr, !dbg [[DBG7]]
68421c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[TMP2]], i8 -1, i64 1, i1 false), !dbg [[DBG7]]
68521c3df4bSMatt Arsenault; CHECK-NEXT:    call void @__msan_set_alloca_origin_with_descr(ptr [[TEXT]], i64 1, ptr @[[GLOB6:[0-9]+]], ptr @[[GLOB7:[0-9]+]]), !dbg [[DBG7]]
68621c3df4bSMatt Arsenault; CHECK-NEXT:    store i64 0, ptr @__msan_param_tls, align 8, !dbg [[DBG8]]
68721c3df4bSMatt Arsenault; CHECK-NEXT:    call void @foo8(ptr [[TEXT]]), !dbg [[DBG8]]
68821c3df4bSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 1, ptr [[TEXT]]), !dbg
68921c3df4bSMatt Arsenault; CHECK-NEXT:    ret void, !dbg
690c0ee9e1bSVitaly Buka;
691c0ee9e1bSVitaly Bukaentry:
692c0ee9e1bSVitaly Buka  %text = alloca i8, align 1, !dbg !10
69321c3df4bSMatt Arsenault  call void @llvm.lifetime.start.p0(i64 1, ptr %text), !dbg !11
69421c3df4bSMatt Arsenault  call void @foo8(ptr %text), !dbg !12
69521c3df4bSMatt Arsenault  call void @llvm.lifetime.end.p0(i64 1, ptr %text), !dbg !13
696c0ee9e1bSVitaly Buka  ret void, !dbg !14
697c0ee9e1bSVitaly Buka}
698