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