1176bbcaeSNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*f497a00dSBjorn Pettersson; RUN: opt < %s -passes=dse -S | FileCheck %s 3176bbcaeSNikita Popov 4c603cefbSNikita Popovdefine void @write4to7(ptr nocapture %p) { 5176bbcaeSNikita Popov; CHECK-LABEL: @write4to7( 6176bbcaeSNikita Popov; CHECK-NEXT: entry: 7c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 8c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4 9c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false) 10c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1 11c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX1]], align 4 12176bbcaeSNikita Popov; CHECK-NEXT: ret void 13176bbcaeSNikita Popov; 14176bbcaeSNikita Popoventry: 15c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 16c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i1 false) 17c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1 18c603cefbSNikita Popov store i32 1, ptr %arrayidx1, align 4 19176bbcaeSNikita Popov ret void 20176bbcaeSNikita Popov} 21176bbcaeSNikita Popov 22c603cefbSNikita Popovdefine void @write4to7_weird_element_type(ptr nocapture %p) { 23f00941e0SNikita Popov; CHECK-LABEL: @write4to7_weird_element_type( 24f00941e0SNikita Popov; CHECK-NEXT: entry: 25c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 26c603cefbSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4 27c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP1]], i8 0, i64 24, i1 false) 28c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1 29c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX1]], align 4 30f00941e0SNikita Popov; CHECK-NEXT: ret void 31f00941e0SNikita Popov; 32f00941e0SNikita Popoventry: 33c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 34c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i1 false) 35c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1 36c603cefbSNikita Popov store i32 1, ptr %arrayidx1, align 4 37f00941e0SNikita Popov ret void 38f00941e0SNikita Popov} 39f00941e0SNikita Popov 40c603cefbSNikita Popovdefine void @write4to7_addrspace(ptr addrspace(1) nocapture %p) { 41e8170291SNikita Popov; CHECK-LABEL: @write4to7_addrspace( 42e8170291SNikita Popov; CHECK-NEXT: entry: 43c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[P:%.*]], i64 1 44c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[ARRAYIDX0]], i64 4 45c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p1.i64(ptr addrspace(1) align 4 [[TMP0]], i8 0, i64 24, i1 false) 46c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[P]], i64 1 47c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr addrspace(1) [[ARRAYIDX1]], align 4 48e8170291SNikita Popov; CHECK-NEXT: ret void 49e8170291SNikita Popov; 50e8170291SNikita Popoventry: 51c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 1 52c603cefbSNikita Popov call void @llvm.memset.p1.i64(ptr addrspace(1) align 4 %arrayidx0, i8 0, i64 28, i1 false) 53c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 1 54c603cefbSNikita Popov store i32 1, ptr addrspace(1) %arrayidx1, align 4 55e8170291SNikita Popov ret void 56e8170291SNikita Popov} 57e8170291SNikita Popov 58c603cefbSNikita Popovdefine void @write4to7_atomic(ptr nocapture %p) { 59176bbcaeSNikita Popov; CHECK-LABEL: @write4to7_atomic( 60176bbcaeSNikita Popov; CHECK-NEXT: entry: 61c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 62c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4 63c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4) 64c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 1 65c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[ARRAYIDX1]] unordered, align 4 66176bbcaeSNikita Popov; CHECK-NEXT: ret void 67176bbcaeSNikita Popov; 68176bbcaeSNikita Popoventry: 69c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 70c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i32 4) 71c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1 72c603cefbSNikita Popov store atomic i32 1, ptr %arrayidx1 unordered, align 4 73176bbcaeSNikita Popov ret void 74176bbcaeSNikita Popov} 75176bbcaeSNikita Popov 76c603cefbSNikita Popovdefine void @write0to3(ptr nocapture %p) { 77176bbcaeSNikita Popov; CHECK-LABEL: @write0to3( 78176bbcaeSNikita Popov; CHECK-NEXT: entry: 79c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 4 80c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false) 81c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[P]], align 4 82176bbcaeSNikita Popov; CHECK-NEXT: ret void 83176bbcaeSNikita Popov; 84176bbcaeSNikita Popoventry: 85c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %p, i8 0, i64 28, i1 false) 86c603cefbSNikita Popov store i32 1, ptr %p, align 4 87176bbcaeSNikita Popov ret void 88176bbcaeSNikita Popov} 89176bbcaeSNikita Popov 90c603cefbSNikita Popovdefine void @write0to3_atomic(ptr nocapture %p) { 91176bbcaeSNikita Popov; CHECK-LABEL: @write0to3_atomic( 92176bbcaeSNikita Popov; CHECK-NEXT: entry: 93c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 4 94c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4) 95c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[P]] unordered, align 4 96176bbcaeSNikita Popov; CHECK-NEXT: ret void 97176bbcaeSNikita Popov; 98176bbcaeSNikita Popoventry: 99c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 28, i32 4) 100c603cefbSNikita Popov store atomic i32 1, ptr %p unordered, align 4 101176bbcaeSNikita Popov ret void 102176bbcaeSNikita Popov} 103176bbcaeSNikita Popov 104176bbcaeSNikita Popov; Atomicity of the store is weaker from the memset 105c603cefbSNikita Popovdefine void @write0to3_atomic_weaker(ptr nocapture %p) { 106176bbcaeSNikita Popov; CHECK-LABEL: @write0to3_atomic_weaker( 107176bbcaeSNikita Popov; CHECK-NEXT: entry: 108c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 4 109c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4) 110c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[P]], align 4 111176bbcaeSNikita Popov; CHECK-NEXT: ret void 112176bbcaeSNikita Popov; 113176bbcaeSNikita Popoventry: 114c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 28, i32 4) 115c603cefbSNikita Popov store i32 1, ptr %p, align 4 116176bbcaeSNikita Popov ret void 117176bbcaeSNikita Popov} 118176bbcaeSNikita Popov 119c603cefbSNikita Popovdefine void @write0to7(ptr nocapture %p) { 120176bbcaeSNikita Popov; CHECK-LABEL: @write0to7( 121176bbcaeSNikita Popov; CHECK-NEXT: entry: 122c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 8 123c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false) 124c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P]], align 8 125176bbcaeSNikita Popov; CHECK-NEXT: ret void 126176bbcaeSNikita Popov; 127176bbcaeSNikita Popoventry: 128c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %p, i8 0, i64 32, i1 false) 129c603cefbSNikita Popov store i64 1, ptr %p, align 8 130176bbcaeSNikita Popov ret void 131176bbcaeSNikita Popov} 132176bbcaeSNikita Popov 133176bbcaeSNikita Popov; Changing the memset start and length is okay here because the 134176bbcaeSNikita Popov; store is a multiple of the memset element size 135c603cefbSNikita Popovdefine void @write0to7_atomic(ptr nocapture %p) { 136176bbcaeSNikita Popov; CHECK-LABEL: @write0to7_atomic( 137176bbcaeSNikita Popov; CHECK-NEXT: entry: 138c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 8 139c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4) 140c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 1, ptr [[P]] unordered, align 8 141176bbcaeSNikita Popov; CHECK-NEXT: ret void 142176bbcaeSNikita Popov; 143176bbcaeSNikita Popoventry: 144c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 32, i32 4) 145c603cefbSNikita Popov store atomic i64 1, ptr %p unordered, align 8 146176bbcaeSNikita Popov ret void 147176bbcaeSNikita Popov} 148176bbcaeSNikita Popov 149c603cefbSNikita Popovdefine void @write0to7_2(ptr nocapture %p) { 150176bbcaeSNikita Popov; CHECK-LABEL: @write0to7_2( 151176bbcaeSNikita Popov; CHECK-NEXT: entry: 152c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 153c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4 154c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i1 false) 155c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P]], align 8 156176bbcaeSNikita Popov; CHECK-NEXT: ret void 157176bbcaeSNikita Popov; 158176bbcaeSNikita Popoventry: 159c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 160c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i1 false) 161c603cefbSNikita Popov store i64 1, ptr %p, align 8 162176bbcaeSNikita Popov ret void 163176bbcaeSNikita Popov} 164176bbcaeSNikita Popov 165c603cefbSNikita Popovdefine void @write0to7_2_atomic(ptr nocapture %p) { 166176bbcaeSNikita Popov; CHECK-LABEL: @write0to7_2_atomic( 167176bbcaeSNikita Popov; CHECK-NEXT: entry: 168c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 169c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4 170c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 24, i32 4) 171c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 1, ptr [[P]] unordered, align 8 172176bbcaeSNikita Popov; CHECK-NEXT: ret void 173176bbcaeSNikita Popov; 174176bbcaeSNikita Popoventry: 175c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 176c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i32 4) 177c603cefbSNikita Popov store atomic i64 1, ptr %p unordered, align 8 178176bbcaeSNikita Popov ret void 179176bbcaeSNikita Popov} 180176bbcaeSNikita Popov 181176bbcaeSNikita Popov; We do not trim the beginning of the eariler write if the alignment of the 182176bbcaeSNikita Popov; start pointer is changed. 183c603cefbSNikita Popovdefine void @dontwrite0to3_align8(ptr nocapture %p) { 184176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to3_align8( 185176bbcaeSNikita Popov; CHECK-NEXT: entry: 186c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 32, i1 false) 187c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[P]], align 4 188176bbcaeSNikita Popov; CHECK-NEXT: ret void 189176bbcaeSNikita Popov; 190176bbcaeSNikita Popoventry: 191c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 8 %p, i8 0, i64 32, i1 false) 192c603cefbSNikita Popov store i32 1, ptr %p, align 4 193176bbcaeSNikita Popov ret void 194176bbcaeSNikita Popov} 195176bbcaeSNikita Popov 196c603cefbSNikita Popovdefine void @dontwrite0to3_align8_atomic(ptr nocapture %p) { 197176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to3_align8_atomic( 198176bbcaeSNikita Popov; CHECK-NEXT: entry: 199c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 32, i32 4) 200c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[P]] unordered, align 4 201176bbcaeSNikita Popov; CHECK-NEXT: ret void 202176bbcaeSNikita Popov; 203176bbcaeSNikita Popoventry: 204c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %p, i8 0, i64 32, i32 4) 205c603cefbSNikita Popov store atomic i32 1, ptr %p unordered, align 4 206176bbcaeSNikita Popov ret void 207176bbcaeSNikita Popov} 208176bbcaeSNikita Popov 209c603cefbSNikita Popovdefine void @dontwrite0to1(ptr nocapture %p) { 210176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to1( 211176bbcaeSNikita Popov; CHECK-NEXT: entry: 212c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[P:%.*]], i8 0, i64 32, i1 false) 213c603cefbSNikita Popov; CHECK-NEXT: store i16 1, ptr [[P]], align 4 214176bbcaeSNikita Popov; CHECK-NEXT: ret void 215176bbcaeSNikita Popov; 216176bbcaeSNikita Popoventry: 217c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %p, i8 0, i64 32, i1 false) 218c603cefbSNikita Popov store i16 1, ptr %p, align 4 219176bbcaeSNikita Popov ret void 220176bbcaeSNikita Popov} 221176bbcaeSNikita Popov 222c603cefbSNikita Popovdefine void @dontwrite0to1_atomic(ptr nocapture %p) { 223176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite0to1_atomic( 224176bbcaeSNikita Popov; CHECK-NEXT: entry: 225c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[P:%.*]], i8 0, i64 32, i32 4) 226c603cefbSNikita Popov; CHECK-NEXT: store atomic i16 1, ptr [[P]] unordered, align 4 227176bbcaeSNikita Popov; CHECK-NEXT: ret void 228176bbcaeSNikita Popov; 229176bbcaeSNikita Popoventry: 230c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 32, i32 4) 231c603cefbSNikita Popov store atomic i16 1, ptr %p unordered, align 4 232176bbcaeSNikita Popov ret void 233176bbcaeSNikita Popov} 234176bbcaeSNikita Popov 235c603cefbSNikita Popovdefine void @write2to10(ptr nocapture %p) { 236176bbcaeSNikita Popov; CHECK-LABEL: @write2to10( 237176bbcaeSNikita Popov; CHECK-NEXT: entry: 238c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 239c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4 240c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 28, i1 false) 241c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 1 242c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[ARRAYIDX2]], align 8 243176bbcaeSNikita Popov; CHECK-NEXT: ret void 244176bbcaeSNikita Popov; 245176bbcaeSNikita Popoventry: 246c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 247c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 32, i1 false) 248c603cefbSNikita Popov %arrayidx2 = getelementptr inbounds i16, ptr %p, i64 1 249c603cefbSNikita Popov store i64 1, ptr %arrayidx2, align 8 250176bbcaeSNikita Popov ret void 251176bbcaeSNikita Popov} 252176bbcaeSNikita Popov 253c603cefbSNikita Popovdefine void @write2to10_atomic(ptr nocapture %p) { 254176bbcaeSNikita Popov; CHECK-LABEL: @write2to10_atomic( 255176bbcaeSNikita Popov; CHECK-NEXT: entry: 256c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 257c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARRAYIDX0]], i64 4 258c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 28, i32 4) 259c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 1 260c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 1, ptr [[ARRAYIDX2]] unordered, align 8 261176bbcaeSNikita Popov; CHECK-NEXT: ret void 262176bbcaeSNikita Popov; 263176bbcaeSNikita Popoventry: 264c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 265c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 32, i32 4) 266c603cefbSNikita Popov %arrayidx2 = getelementptr inbounds i16, ptr %p, i64 1 267c603cefbSNikita Popov store atomic i64 1, ptr %arrayidx2 unordered, align 8 268176bbcaeSNikita Popov ret void 269176bbcaeSNikita Popov} 270176bbcaeSNikita Popov 271c603cefbSNikita Popovdefine void @write8To15AndThen0To7(ptr nocapture %P) { 272176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7( 273176bbcaeSNikita Popov; CHECK-NEXT: entry: 274c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16 275c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i1 false) 276c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1 277c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[BASE64_1]], align 4 278c603cefbSNikita Popov; CHECK-NEXT: store i64 2, ptr [[P]], align 4 279176bbcaeSNikita Popov; CHECK-NEXT: ret void 280176bbcaeSNikita Popov; 281176bbcaeSNikita Popoventry: 282176bbcaeSNikita Popov 283c603cefbSNikita Popov tail call void @llvm.memset.p0.i64(ptr align 8 %P, i8 0, i64 32, i1 false) 284176bbcaeSNikita Popov 285c603cefbSNikita Popov %base64_1 = getelementptr inbounds i64, ptr %P, i64 1 286176bbcaeSNikita Popov 287c603cefbSNikita Popov store i64 1, ptr %base64_1 288c603cefbSNikita Popov store i64 2, ptr %P 289176bbcaeSNikita Popov ret void 290176bbcaeSNikita Popov} 291176bbcaeSNikita Popov 292c603cefbSNikita Popovdefine void @write8To15AndThen0To7_atomic(ptr nocapture %P) { 293176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7_atomic( 294176bbcaeSNikita Popov; CHECK-NEXT: entry: 295c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16 296c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i32 8) 297c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1 298c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 1, ptr [[BASE64_1]] unordered, align 8 299c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 2, ptr [[P]] unordered, align 8 300176bbcaeSNikita Popov; CHECK-NEXT: ret void 301176bbcaeSNikita Popov; 302176bbcaeSNikita Popoventry: 303176bbcaeSNikita Popov 304c603cefbSNikita Popov tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8) 305176bbcaeSNikita Popov 306c603cefbSNikita Popov %base64_1 = getelementptr inbounds i64, ptr %P, i64 1 307176bbcaeSNikita Popov 308c603cefbSNikita Popov store atomic i64 1, ptr %base64_1 unordered, align 8 309c603cefbSNikita Popov store atomic i64 2, ptr %P unordered, align 8 310176bbcaeSNikita Popov ret void 311176bbcaeSNikita Popov} 312176bbcaeSNikita Popov 313c603cefbSNikita Popovdefine void @write8To15AndThen0To7_atomic_weaker(ptr nocapture %P) { 314176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7_atomic_weaker( 315176bbcaeSNikita Popov; CHECK-NEXT: entry: 316c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16 317c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i32 8) 318c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1 319c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 1, ptr [[BASE64_1]] unordered, align 8 320c603cefbSNikita Popov; CHECK-NEXT: store i64 2, ptr [[P]], align 8 321176bbcaeSNikita Popov; CHECK-NEXT: ret void 322176bbcaeSNikita Popov; 323176bbcaeSNikita Popoventry: 324176bbcaeSNikita Popov 325c603cefbSNikita Popov tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8) 326176bbcaeSNikita Popov 327c603cefbSNikita Popov %base64_1 = getelementptr inbounds i64, ptr %P, i64 1 328176bbcaeSNikita Popov 329c603cefbSNikita Popov store atomic i64 1, ptr %base64_1 unordered, align 8 330c603cefbSNikita Popov store i64 2, ptr %P, align 8 331176bbcaeSNikita Popov ret void 332176bbcaeSNikita Popov} 333176bbcaeSNikita Popov 334c603cefbSNikita Popovdefine void @write8To15AndThen0To7_atomic_weaker_2(ptr nocapture %P) { 335176bbcaeSNikita Popov; CHECK-LABEL: @write8To15AndThen0To7_atomic_weaker_2( 336176bbcaeSNikita Popov; CHECK-NEXT: entry: 337c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 16 338c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[TMP0]], i8 0, i64 16, i32 8) 339c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 1 340c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[BASE64_1]], align 8 341c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 2, ptr [[P]] unordered, align 8 342176bbcaeSNikita Popov; CHECK-NEXT: ret void 343176bbcaeSNikita Popov; 344176bbcaeSNikita Popoventry: 345176bbcaeSNikita Popov 346c603cefbSNikita Popov tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8) 347176bbcaeSNikita Popov 348c603cefbSNikita Popov %base64_1 = getelementptr inbounds i64, ptr %P, i64 1 349176bbcaeSNikita Popov 350c603cefbSNikita Popov store i64 1, ptr %base64_1, align 8 351c603cefbSNikita Popov store atomic i64 2, ptr %P unordered, align 8 352176bbcaeSNikita Popov ret void 353176bbcaeSNikita Popov} 354176bbcaeSNikita Popov 355c603cefbSNikita Popovdeclare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind 356c603cefbSNikita Popovdeclare void @llvm.memset.p1.i64(ptr addrspace(1) nocapture, i8, i64, i1) nounwind 357c603cefbSNikita Popovdeclare void @llvm.memset.element.unordered.atomic.p0.i64(ptr nocapture, i8, i64, i32) nounwind 358176bbcaeSNikita Popov 359c603cefbSNikita Popovdefine void @ow_begin_align1(ptr nocapture %p) { 360176bbcaeSNikita Popov; CHECK-LABEL: @ow_begin_align1( 361176bbcaeSNikita Popov; CHECK-NEXT: entry: 362c603cefbSNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1 363c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 7 364c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP0]], i8 0, i64 25, i1 false) 365c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P]], align 1 366176bbcaeSNikita Popov; CHECK-NEXT: ret void 367176bbcaeSNikita Popov; 368176bbcaeSNikita Popoventry: 369c603cefbSNikita Popov %p1 = getelementptr inbounds i8, ptr %p, i64 1 370c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 1 %p1, i8 0, i64 32, i1 false) 371c603cefbSNikita Popov store i64 1, ptr %p, align 1 372176bbcaeSNikita Popov ret void 373176bbcaeSNikita Popov} 374176bbcaeSNikita Popov 375c603cefbSNikita Popovdefine void @ow_end_align4(ptr nocapture %p) { 376176bbcaeSNikita Popov; CHECK-LABEL: @ow_end_align4( 377176bbcaeSNikita Popov; CHECK-NEXT: entry: 378c603cefbSNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1 379c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 4 380c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP0]], i8 0, i64 28, i1 false) 381c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P]], align 1 382176bbcaeSNikita Popov; CHECK-NEXT: ret void 383176bbcaeSNikita Popov; 384176bbcaeSNikita Popoventry: 385c603cefbSNikita Popov %p1 = getelementptr inbounds i8, ptr %p, i64 1 386c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %p1, i8 0, i64 32, i1 false) 387c603cefbSNikita Popov store i64 1, ptr %p, align 1 388176bbcaeSNikita Popov ret void 389176bbcaeSNikita Popov} 390176bbcaeSNikita Popov 391c603cefbSNikita Popovdefine void @ow_end_align8(ptr nocapture %p) { 392176bbcaeSNikita Popov; CHECK-LABEL: @ow_end_align8( 393176bbcaeSNikita Popov; CHECK-NEXT: entry: 394c603cefbSNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1 395c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[P1]], i8 0, i64 32, i1 false) 396c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P]], align 1 397176bbcaeSNikita Popov; CHECK-NEXT: ret void 398176bbcaeSNikita Popov; 399176bbcaeSNikita Popoventry: 400c603cefbSNikita Popov %p1 = getelementptr inbounds i8, ptr %p, i64 1 401c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 8 %p1, i8 0, i64 32, i1 false) 402c603cefbSNikita Popov store i64 1, ptr %p, align 1 403176bbcaeSNikita Popov ret void 404176bbcaeSNikita Popov} 405