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 Popovtarget 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" 4176bbcaeSNikita Popov 5176bbcaeSNikita Popov%struct.vec2 = type { <4 x i32>, <4 x i32> } 6176bbcaeSNikita Popov%struct.vec2plusi = type { <4 x i32>, <4 x i32>, i32 } 7176bbcaeSNikita Popov 8176bbcaeSNikita Popov@glob1 = global %struct.vec2 zeroinitializer, align 16 9176bbcaeSNikita Popov@glob2 = global %struct.vec2plusi zeroinitializer, align 16 10176bbcaeSNikita Popov 11c603cefbSNikita Popovdefine void @write24to28(ptr nocapture %p) nounwind uwtable ssp { 12176bbcaeSNikita Popov; CHECK-LABEL: @write24to28( 13176bbcaeSNikita Popov; CHECK-NEXT: entry: 14c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 15c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[ARRAYIDX0]], i8 0, i64 24, i1 false) 16c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 7 17c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX1]], align 4 18176bbcaeSNikita Popov; CHECK-NEXT: ret void 19176bbcaeSNikita Popov; 20176bbcaeSNikita Popoventry: 21c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 22c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i1 false) 23c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 7 24c603cefbSNikita Popov store i32 1, ptr %arrayidx1, align 4 25176bbcaeSNikita Popov ret void 26176bbcaeSNikita Popov} 27176bbcaeSNikita Popov 28c603cefbSNikita Popovdefine void @write24to28_atomic(ptr nocapture %p) nounwind uwtable ssp { 29176bbcaeSNikita Popov; CHECK-LABEL: @write24to28_atomic( 30176bbcaeSNikita Popov; CHECK-NEXT: entry: 31c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 32c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[ARRAYIDX0]], i8 0, i64 24, i32 4) 33c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 7 34c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[ARRAYIDX1]] unordered, align 4 35176bbcaeSNikita Popov; CHECK-NEXT: ret void 36176bbcaeSNikita Popov; 37176bbcaeSNikita Popoventry: 38c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 39c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i32 4) 40c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 7 41c603cefbSNikita Popov store atomic i32 1, ptr %arrayidx1 unordered, align 4 42176bbcaeSNikita Popov ret void 43176bbcaeSNikita Popov} 44176bbcaeSNikita Popov 45176bbcaeSNikita Popov; Atomicity of the store is weaker from the memset 46c603cefbSNikita Popovdefine void @write24to28_atomic_weaker(ptr nocapture %p) nounwind uwtable ssp { 47176bbcaeSNikita Popov; CHECK-LABEL: @write24to28_atomic_weaker( 48176bbcaeSNikita Popov; CHECK-NEXT: entry: 49c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 1 50c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[ARRAYIDX0]], i8 0, i64 24, i32 4) 51c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 7 52c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX1]], align 4 53176bbcaeSNikita Popov; CHECK-NEXT: ret void 54176bbcaeSNikita Popov; 55176bbcaeSNikita Popoventry: 56c603cefbSNikita Popov %arrayidx0 = getelementptr inbounds i32, ptr %p, i64 1 57c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %arrayidx0, i8 0, i64 28, i32 4) 58c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 7 59c603cefbSNikita Popov store i32 1, ptr %arrayidx1, align 4 60176bbcaeSNikita Popov ret void 61176bbcaeSNikita Popov} 62176bbcaeSNikita Popov 63c603cefbSNikita Popovdefine void @write28to32(ptr nocapture %p) nounwind uwtable ssp { 64176bbcaeSNikita Popov; CHECK-LABEL: @write28to32( 65176bbcaeSNikita Popov; CHECK-NEXT: entry: 66c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[P:%.*]], i8 0, i64 28, i1 false) 67c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 7 68c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX1]], align 4 69176bbcaeSNikita Popov; CHECK-NEXT: ret void 70176bbcaeSNikita Popov; 71176bbcaeSNikita Popoventry: 72c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %p, i8 0, i64 32, i1 false) 73c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 7 74c603cefbSNikita Popov store i32 1, ptr %arrayidx1, align 4 75176bbcaeSNikita Popov ret void 76176bbcaeSNikita Popov} 77176bbcaeSNikita Popov 78c603cefbSNikita Popovdefine void @write28to32_atomic(ptr nocapture %p) nounwind uwtable ssp { 79176bbcaeSNikita Popov; CHECK-LABEL: @write28to32_atomic( 80176bbcaeSNikita Popov; CHECK-NEXT: entry: 81c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 [[P:%.*]], i8 0, i64 28, i32 4) 82c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 7 83c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[ARRAYIDX1]] unordered, align 4 84176bbcaeSNikita Popov; CHECK-NEXT: ret void 85176bbcaeSNikita Popov; 86176bbcaeSNikita Popoventry: 87c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 4 %p, i8 0, i64 32, i32 4) 88c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 7 89c603cefbSNikita Popov store atomic i32 1, ptr %arrayidx1 unordered, align 4 90176bbcaeSNikita Popov ret void 91176bbcaeSNikita Popov} 92176bbcaeSNikita Popov 93c603cefbSNikita Popovdefine void @dontwrite28to32memset(ptr nocapture %p) nounwind uwtable ssp { 94176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite28to32memset( 95176bbcaeSNikita Popov; CHECK-NEXT: entry: 96c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[P:%.*]], i8 0, i64 32, i1 false) 97c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 7 98c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX1]], align 4 99176bbcaeSNikita Popov; CHECK-NEXT: ret void 100176bbcaeSNikita Popov; 101176bbcaeSNikita Popoventry: 102c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 16 %p, i8 0, i64 32, i1 false) 103c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 7 104c603cefbSNikita Popov store i32 1, ptr %arrayidx1, align 4 105176bbcaeSNikita Popov ret void 106176bbcaeSNikita Popov} 107176bbcaeSNikita Popov 108c603cefbSNikita Popovdefine void @dontwrite28to32memset_atomic(ptr nocapture %p) nounwind uwtable ssp { 109176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite28to32memset_atomic( 110176bbcaeSNikita Popov; CHECK-NEXT: entry: 111c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 16 [[P:%.*]], i8 0, i64 32, i32 4) 112c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 7 113c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[ARRAYIDX1]] unordered, align 4 114176bbcaeSNikita Popov; CHECK-NEXT: ret void 115176bbcaeSNikita Popov; 116176bbcaeSNikita Popoventry: 117c603cefbSNikita Popov call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 16 %p, i8 0, i64 32, i32 4) 118c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 7 119c603cefbSNikita Popov store atomic i32 1, ptr %arrayidx1 unordered, align 4 120176bbcaeSNikita Popov ret void 121176bbcaeSNikita Popov} 122176bbcaeSNikita Popov 123c603cefbSNikita Popovdefine void @write32to36(ptr nocapture %p) nounwind uwtable ssp { 124176bbcaeSNikita Popov; CHECK-LABEL: @write32to36( 125176bbcaeSNikita Popov; CHECK-NEXT: entry: 126c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[P:%.*]], ptr align 16 @glob2, i64 32, i1 false) 127c603cefbSNikita Popov; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2PLUSI:%.*]], ptr [[P]], i64 0, i32 2 128c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[C]], align 4 129176bbcaeSNikita Popov; CHECK-NEXT: ret void 130176bbcaeSNikita Popov; 131176bbcaeSNikita Popoventry: 132c603cefbSNikita Popov tail call void @llvm.memcpy.p0.p0.i64(ptr align 16 %p, ptr align 16 @glob2, i64 36, i1 false) 133c603cefbSNikita Popov %c = getelementptr inbounds %struct.vec2plusi, ptr %p, i64 0, i32 2 134c603cefbSNikita Popov store i32 1, ptr %c, align 4 135176bbcaeSNikita Popov ret void 136176bbcaeSNikita Popov} 137176bbcaeSNikita Popov 138c603cefbSNikita Popovdefine void @write32to36_atomic(ptr nocapture %p) nounwind uwtable ssp { 139176bbcaeSNikita Popov; CHECK-LABEL: @write32to36_atomic( 140176bbcaeSNikita Popov; CHECK-NEXT: entry: 141c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 [[P:%.*]], ptr align 16 @glob2, i64 32, i32 4) 142c603cefbSNikita Popov; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2PLUSI:%.*]], ptr [[P]], i64 0, i32 2 143c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[C]] unordered, align 4 144176bbcaeSNikita Popov; CHECK-NEXT: ret void 145176bbcaeSNikita Popov; 146176bbcaeSNikita Popoventry: 147c603cefbSNikita Popov tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 %p, ptr align 16 @glob2, i64 36, i32 4) 148c603cefbSNikita Popov %c = getelementptr inbounds %struct.vec2plusi, ptr %p, i64 0, i32 2 149c603cefbSNikita Popov store atomic i32 1, ptr %c unordered, align 4 150176bbcaeSNikita Popov ret void 151176bbcaeSNikita Popov} 152176bbcaeSNikita Popov 153176bbcaeSNikita Popov; Atomicity of the store is weaker than the memcpy 154c603cefbSNikita Popovdefine void @write32to36_atomic_weaker(ptr nocapture %p) nounwind uwtable ssp { 155176bbcaeSNikita Popov; CHECK-LABEL: @write32to36_atomic_weaker( 156176bbcaeSNikita Popov; CHECK-NEXT: entry: 157c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 [[P:%.*]], ptr align 16 @glob2, i64 32, i32 4) 158c603cefbSNikita Popov; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2PLUSI:%.*]], ptr [[P]], i64 0, i32 2 159c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[C]], align 4 160176bbcaeSNikita Popov; CHECK-NEXT: ret void 161176bbcaeSNikita Popov; 162176bbcaeSNikita Popoventry: 163c603cefbSNikita Popov tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 %p, ptr align 16 @glob2, i64 36, i32 4) 164c603cefbSNikita Popov %c = getelementptr inbounds %struct.vec2plusi, ptr %p, i64 0, i32 2 165c603cefbSNikita Popov store i32 1, ptr %c, align 4 166176bbcaeSNikita Popov ret void 167176bbcaeSNikita Popov} 168176bbcaeSNikita Popov 169c603cefbSNikita Popovdefine void @write16to32(ptr nocapture %p) nounwind uwtable ssp { 170176bbcaeSNikita Popov; CHECK-LABEL: @write16to32( 171176bbcaeSNikita Popov; CHECK-NEXT: entry: 172c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[P:%.*]], ptr align 16 @glob1, i64 16, i1 false) 173c603cefbSNikita Popov; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], ptr [[P]], i64 0, i32 1 174c603cefbSNikita Popov; CHECK-NEXT: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr [[C]], align 4 175176bbcaeSNikita Popov; CHECK-NEXT: ret void 176176bbcaeSNikita Popov; 177176bbcaeSNikita Popoventry: 178c603cefbSNikita Popov tail call void @llvm.memcpy.p0.p0.i64(ptr align 16 %p, ptr align 16 @glob1, i64 32, i1 false) 179c603cefbSNikita Popov %c = getelementptr inbounds %struct.vec2, ptr %p, i64 0, i32 1 180c603cefbSNikita Popov store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %c, align 4 181176bbcaeSNikita Popov ret void 182176bbcaeSNikita Popov} 183176bbcaeSNikita Popov 184c603cefbSNikita Popovdefine void @write16to32_atomic(ptr nocapture %p) nounwind uwtable ssp { 185176bbcaeSNikita Popov; CHECK-LABEL: @write16to32_atomic( 186176bbcaeSNikita Popov; CHECK-NEXT: entry: 187c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 [[P:%.*]], ptr align 16 @glob1, i64 16, i32 4) 188c603cefbSNikita Popov; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], ptr [[P]], i64 0, i32 1 189c603cefbSNikita Popov; CHECK-NEXT: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr [[C]], align 4 190176bbcaeSNikita Popov; CHECK-NEXT: ret void 191176bbcaeSNikita Popov; 192176bbcaeSNikita Popoventry: 193c603cefbSNikita Popov tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 %p, ptr align 16 @glob1, i64 32, i32 4) 194c603cefbSNikita Popov %c = getelementptr inbounds %struct.vec2, ptr %p, i64 0, i32 1 195c603cefbSNikita Popov store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %c, align 4 196176bbcaeSNikita Popov ret void 197176bbcaeSNikita Popov} 198176bbcaeSNikita Popov 199c603cefbSNikita Popovdefine void @dontwrite28to32memcpy(ptr nocapture %p) nounwind uwtable ssp { 200176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite28to32memcpy( 201176bbcaeSNikita Popov; CHECK-NEXT: entry: 202c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[P:%.*]], ptr align 16 @glob1, i64 32, i1 false) 203c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], ptr [[P]], i64 0, i32 0, i64 7 204c603cefbSNikita Popov; CHECK-NEXT: store i32 1, ptr [[ARRAYIDX1]], align 4 205176bbcaeSNikita Popov; CHECK-NEXT: ret void 206176bbcaeSNikita Popov; 207176bbcaeSNikita Popoventry: 208c603cefbSNikita Popov tail call void @llvm.memcpy.p0.p0.i64(ptr align 16 %p, ptr align 16 @glob1, i64 32, i1 false) 209c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds %struct.vec2, ptr %p, i64 0, i32 0, i64 7 210c603cefbSNikita Popov store i32 1, ptr %arrayidx1, align 4 211176bbcaeSNikita Popov ret void 212176bbcaeSNikita Popov} 213176bbcaeSNikita Popov 214c603cefbSNikita Popovdefine void @dontwrite28to32memcpy_atomic(ptr nocapture %p) nounwind uwtable ssp { 215176bbcaeSNikita Popov; CHECK-LABEL: @dontwrite28to32memcpy_atomic( 216176bbcaeSNikita Popov; CHECK-NEXT: entry: 217c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 [[P:%.*]], ptr align 16 @glob1, i64 32, i32 4) 218c603cefbSNikita Popov; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], ptr [[P]], i64 0, i32 0, i64 7 219c603cefbSNikita Popov; CHECK-NEXT: store atomic i32 1, ptr [[ARRAYIDX1]] unordered, align 4 220176bbcaeSNikita Popov; CHECK-NEXT: ret void 221176bbcaeSNikita Popov; 222176bbcaeSNikita Popoventry: 223c603cefbSNikita Popov tail call void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr align 16 %p, ptr align 16 @glob1, i64 32, i32 4) 224c603cefbSNikita Popov %arrayidx1 = getelementptr inbounds %struct.vec2, ptr %p, i64 0, i32 0, i64 7 225c603cefbSNikita Popov store atomic i32 1, ptr %arrayidx1 unordered, align 4 226176bbcaeSNikita Popov ret void 227176bbcaeSNikita Popov} 228176bbcaeSNikita Popov 229c603cefbSNikita Popovdeclare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind 230c603cefbSNikita Popovdeclare void @llvm.memcpy.element.unordered.atomic.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i32) nounwind 231c603cefbSNikita Popovdeclare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind 232c603cefbSNikita Popovdeclare void @llvm.memset.element.unordered.atomic.p0.i64(ptr nocapture, i8, i64, i32) nounwind 233176bbcaeSNikita Popov 234176bbcaeSNikita Popov%struct.trapframe = type { i64, i64, i64 } 235176bbcaeSNikita Popov 236176bbcaeSNikita Popov; bugzilla 11455 - make sure negative GEP's don't break this optimisation 237c603cefbSNikita Popovdefine void @cpu_lwp_fork(ptr %md_regs, i64 %pcb_rsp0) nounwind uwtable noinline ssp { 238176bbcaeSNikita Popov; CHECK-LABEL: @cpu_lwp_fork( 239176bbcaeSNikita Popov; CHECK-NEXT: entry: 240c603cefbSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = inttoptr i64 [[PCB_RSP0:%.*]] to ptr 241c603cefbSNikita Popov; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_TRAPFRAME:%.*]], ptr [[TMP0]], i64 -1 242c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[ADD_PTR]], ptr [[MD_REGS:%.*]], i64 24, i1 false) 243c603cefbSNikita Popov; CHECK-NEXT: [[TF_TRAPNO:%.*]] = getelementptr inbounds [[STRUCT_TRAPFRAME]], ptr [[TMP0]], i64 -1, i32 1 244c603cefbSNikita Popov; CHECK-NEXT: store i64 3, ptr [[TF_TRAPNO]], align 8 245176bbcaeSNikita Popov; CHECK-NEXT: ret void 246176bbcaeSNikita Popov; 247176bbcaeSNikita Popoventry: 248c603cefbSNikita Popov %0 = inttoptr i64 %pcb_rsp0 to ptr 249c603cefbSNikita Popov %add.ptr = getelementptr inbounds %struct.trapframe, ptr %0, i64 -1 250c603cefbSNikita Popov call void @llvm.memcpy.p0.p0.i64(ptr %add.ptr, ptr %md_regs, i64 24, i1 false) 251c603cefbSNikita Popov %tf_trapno = getelementptr inbounds %struct.trapframe, ptr %0, i64 -1, i32 1 252c603cefbSNikita Popov store i64 3, ptr %tf_trapno, align 8 253176bbcaeSNikita Popov ret void 254176bbcaeSNikita Popov} 255176bbcaeSNikita Popov 256c603cefbSNikita Popovdefine void @write16To23AndThen24To31(ptr nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) { 257176bbcaeSNikita Popov; CHECK-LABEL: @write16To23AndThen24To31( 258176bbcaeSNikita Popov; CHECK-NEXT: entry: 259c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 16, i1 false) 260c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 2 261c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 3 262c603cefbSNikita Popov; CHECK-NEXT: store i64 3, ptr [[BASE64_2]] 263c603cefbSNikita Popov; CHECK-NEXT: store i64 3, ptr [[BASE64_3]] 264176bbcaeSNikita Popov; CHECK-NEXT: ret void 265176bbcaeSNikita Popov; 266176bbcaeSNikita Popoventry: 267176bbcaeSNikita Popov 268c603cefbSNikita Popov tail call void @llvm.memset.p0.i64(ptr align 8 %P, i8 0, i64 32, i1 false) 269176bbcaeSNikita Popov 270c603cefbSNikita Popov %base64_2 = getelementptr inbounds i64, ptr %P, i64 2 271c603cefbSNikita Popov %base64_3 = getelementptr inbounds i64, ptr %P, i64 3 272176bbcaeSNikita Popov 273c603cefbSNikita Popov store i64 3, ptr %base64_2 274c603cefbSNikita Popov store i64 3, ptr %base64_3 275176bbcaeSNikita Popov ret void 276176bbcaeSNikita Popov} 277176bbcaeSNikita Popov 278c603cefbSNikita Popovdefine void @write16To23AndThen24To31_atomic(ptr nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) { 279176bbcaeSNikita Popov; CHECK-LABEL: @write16To23AndThen24To31_atomic( 280176bbcaeSNikita Popov; CHECK-NEXT: entry: 281c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 16, i32 8) 282c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 2 283c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 3 284c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 3, ptr [[BASE64_2]] unordered, align 8 285c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 3, ptr [[BASE64_3]] unordered, align 8 286176bbcaeSNikita Popov; CHECK-NEXT: ret void 287176bbcaeSNikita Popov; 288176bbcaeSNikita Popoventry: 289176bbcaeSNikita Popov 290c603cefbSNikita Popov tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8) 291176bbcaeSNikita Popov 292c603cefbSNikita Popov %base64_2 = getelementptr inbounds i64, ptr %P, i64 2 293c603cefbSNikita Popov %base64_3 = getelementptr inbounds i64, ptr %P, i64 3 294176bbcaeSNikita Popov 295c603cefbSNikita Popov store atomic i64 3, ptr %base64_2 unordered, align 8 296c603cefbSNikita Popov store atomic i64 3, ptr %base64_3 unordered, align 8 297176bbcaeSNikita Popov ret void 298176bbcaeSNikita Popov} 299176bbcaeSNikita Popov 300c603cefbSNikita Popovdefine void @write16To23AndThen24To31_atomic_weaker1(ptr nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) { 301176bbcaeSNikita Popov; CHECK-LABEL: @write16To23AndThen24To31_atomic_weaker1( 302176bbcaeSNikita Popov; CHECK-NEXT: entry: 303c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 16, i32 8) 304c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 2 305c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 3 306c603cefbSNikita Popov; CHECK-NEXT: store i64 3, ptr [[BASE64_2]], align 8 307c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 3, ptr [[BASE64_3]] unordered, align 8 308176bbcaeSNikita Popov; CHECK-NEXT: ret void 309176bbcaeSNikita Popov; 310176bbcaeSNikita Popoventry: 311176bbcaeSNikita Popov 312c603cefbSNikita Popov tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8) 313176bbcaeSNikita Popov 314c603cefbSNikita Popov %base64_2 = getelementptr inbounds i64, ptr %P, i64 2 315c603cefbSNikita Popov %base64_3 = getelementptr inbounds i64, ptr %P, i64 3 316176bbcaeSNikita Popov 317c603cefbSNikita Popov store i64 3, ptr %base64_2, align 8 318c603cefbSNikita Popov store atomic i64 3, ptr %base64_3 unordered, align 8 319176bbcaeSNikita Popov ret void 320176bbcaeSNikita Popov} 321176bbcaeSNikita Popov 322c603cefbSNikita Popovdefine void @write16To23AndThen24To31_atomic_weaker2(ptr nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) { 323176bbcaeSNikita Popov; CHECK-LABEL: @write16To23AndThen24To31_atomic_weaker2( 324176bbcaeSNikita Popov; CHECK-NEXT: entry: 325c603cefbSNikita Popov; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 [[P:%.*]], i8 0, i64 16, i32 8) 326c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 2 327c603cefbSNikita Popov; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, ptr [[P]], i64 3 328c603cefbSNikita Popov; CHECK-NEXT: store atomic i64 3, ptr [[BASE64_2]] unordered, align 8 329c603cefbSNikita Popov; CHECK-NEXT: store i64 3, ptr [[BASE64_3]], align 8 330176bbcaeSNikita Popov; CHECK-NEXT: ret void 331176bbcaeSNikita Popov; 332176bbcaeSNikita Popoventry: 333176bbcaeSNikita Popov 334c603cefbSNikita Popov tail call void @llvm.memset.element.unordered.atomic.p0.i64(ptr align 8 %P, i8 0, i64 32, i32 8) 335176bbcaeSNikita Popov 336c603cefbSNikita Popov %base64_2 = getelementptr inbounds i64, ptr %P, i64 2 337c603cefbSNikita Popov %base64_3 = getelementptr inbounds i64, ptr %P, i64 3 338176bbcaeSNikita Popov 339c603cefbSNikita Popov store atomic i64 3, ptr %base64_2 unordered, align 8 340c603cefbSNikita Popov store i64 3, ptr %base64_3, align 8 341176bbcaeSNikita Popov ret void 342176bbcaeSNikita Popov} 343176bbcaeSNikita Popov 344c603cefbSNikita Popovdefine void @ow_end_align1(ptr nocapture %p) { 345176bbcaeSNikita Popov; CHECK-LABEL: @ow_end_align1( 346176bbcaeSNikita Popov; CHECK-NEXT: entry: 347c603cefbSNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1 348c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[P1]], i8 0, i64 27, i1 false) 349c603cefbSNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 27 350c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P2]], align 1 351176bbcaeSNikita Popov; CHECK-NEXT: ret void 352176bbcaeSNikita Popov; 353176bbcaeSNikita Popoventry: 354c603cefbSNikita Popov %p1 = getelementptr inbounds i8, ptr %p, i64 1 355c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 1 %p1, i8 0, i64 32, i1 false) 356c603cefbSNikita Popov %p2 = getelementptr inbounds i8, ptr %p1, i64 27 357c603cefbSNikita Popov store i64 1, ptr %p2, align 1 358176bbcaeSNikita Popov ret void 359176bbcaeSNikita Popov} 360176bbcaeSNikita Popov 361c603cefbSNikita Popovdefine void @ow_end_align4(ptr nocapture %p) { 362176bbcaeSNikita Popov; CHECK-LABEL: @ow_end_align4( 363176bbcaeSNikita Popov; CHECK-NEXT: entry: 364c603cefbSNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1 365c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[P1]], i8 0, i64 28, i1 false) 366c603cefbSNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 27 367c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P2]], align 1 368176bbcaeSNikita Popov; CHECK-NEXT: ret void 369176bbcaeSNikita Popov; 370176bbcaeSNikita Popoventry: 371c603cefbSNikita Popov %p1 = getelementptr inbounds i8, ptr %p, i64 1 372c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 4 %p1, i8 0, i64 32, i1 false) 373c603cefbSNikita Popov %p2 = getelementptr inbounds i8, ptr %p1, i64 27 374c603cefbSNikita Popov store i64 1, ptr %p2, align 1 375176bbcaeSNikita Popov ret void 376176bbcaeSNikita Popov} 377176bbcaeSNikita Popov 378c603cefbSNikita Popovdefine void @ow_end_align8(ptr nocapture %p) { 379176bbcaeSNikita Popov; CHECK-LABEL: @ow_end_align8( 380176bbcaeSNikita Popov; CHECK-NEXT: entry: 381c603cefbSNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 1 382c603cefbSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[P1]], i8 0, i64 32, i1 false) 383c603cefbSNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 27 384c603cefbSNikita Popov; CHECK-NEXT: store i64 1, ptr [[P2]], align 1 385176bbcaeSNikita Popov; CHECK-NEXT: ret void 386176bbcaeSNikita Popov; 387176bbcaeSNikita Popoventry: 388c603cefbSNikita Popov %p1 = getelementptr inbounds i8, ptr %p, i64 1 389c603cefbSNikita Popov call void @llvm.memset.p0.i64(ptr align 8 %p1, i8 0, i64 32, i1 false) 390c603cefbSNikita Popov %p2 = getelementptr inbounds i8, ptr %p1, i64 27 391c603cefbSNikita Popov store i64 1, ptr %p2, align 1 392176bbcaeSNikita Popov ret void 393176bbcaeSNikita Popov} 394176bbcaeSNikita Popov 395