1bf8d0392SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes 2bf8d0392SNoah Goldstein; RUN: opt -S -passes=inline %s | FileCheck %s 3bf8d0392SNoah Goldstein; RUN: opt -S -passes='cgscc(inline)' %s | FileCheck %s 4bf8d0392SNoah Goldstein; RUN: opt -S -passes='module-inline' %s | FileCheck %s 5bf8d0392SNoah Goldstein 6bf8d0392SNoah Goldsteindeclare void @bar1(ptr %p) 7bf8d0392SNoah Goldsteindeclare void @bar2(ptr %p, ptr %p2) 8f8ff51e1SNoah Goldsteindeclare void @bar3(ptr writable %p) 9db03d9d3SNoah Goldsteindeclare void @bar4(ptr byval([4 x i32]) %p) 10bf8d0392SNoah Goldsteindefine dso_local void @foo1_rdonly(ptr readonly %p) { 11bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_rdonly 12bf8d0392SNoah Goldstein; CHECK-SAME: (ptr readonly [[P:%.*]]) { 13bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 14bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 15bf8d0392SNoah Goldstein; 16bf8d0392SNoah Goldstein call void @bar1(ptr %p) 17bf8d0392SNoah Goldstein ret void 18bf8d0392SNoah Goldstein} 19bf8d0392SNoah Goldstein 20bf8d0392SNoah Goldsteindefine dso_local void @foo1(ptr %p) { 21bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1 22bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 23bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 24bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 25bf8d0392SNoah Goldstein; 26bf8d0392SNoah Goldstein call void @bar1(ptr %p) 27bf8d0392SNoah Goldstein ret void 28bf8d0392SNoah Goldstein} 29bf8d0392SNoah Goldstein 30f8ff51e1SNoah Goldsteindefine dso_local void @foo1_writable(ptr %p) { 31f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_writable 32f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 33f8ff51e1SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr writable [[P]]) 34f8ff51e1SNoah Goldstein; CHECK-NEXT: ret void 35f8ff51e1SNoah Goldstein; 36f8ff51e1SNoah Goldstein call void @bar1(ptr writable %p) 37f8ff51e1SNoah Goldstein ret void 38f8ff51e1SNoah Goldstein} 39f8ff51e1SNoah Goldstein 40f8ff51e1SNoah Goldsteindefine dso_local void @foo3_writable(ptr %p) { 41f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo3_writable 42f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 43f8ff51e1SNoah Goldstein; CHECK-NEXT: call void @bar3(ptr [[P]]) 44f8ff51e1SNoah Goldstein; CHECK-NEXT: ret void 45f8ff51e1SNoah Goldstein; 46f8ff51e1SNoah Goldstein call void @bar3(ptr %p) 47f8ff51e1SNoah Goldstein ret void 48f8ff51e1SNoah Goldstein} 49f8ff51e1SNoah Goldstein 50bf8d0392SNoah Goldsteindefine dso_local void @foo1_bar_aligned64_deref512(ptr %p) { 51bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned64_deref512 52bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 53bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr align 64 dereferenceable(512) [[P]]) 54bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 55bf8d0392SNoah Goldstein; 56bf8d0392SNoah Goldstein call void @bar1(ptr align 64 dereferenceable(512) %p) 57bf8d0392SNoah Goldstein ret void 58bf8d0392SNoah Goldstein} 59bf8d0392SNoah Goldstein 60bf8d0392SNoah Goldsteindefine dso_local void @foo1_bar_aligned512_deref_or_null512(ptr %p) { 61bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned512_deref_or_null512 62bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 63bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr align 512 dereferenceable_or_null(512) [[P]]) 64bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 65bf8d0392SNoah Goldstein; 66bf8d0392SNoah Goldstein call void @bar1(ptr align 512 dereferenceable_or_null(512) %p) 67bf8d0392SNoah Goldstein ret void 68bf8d0392SNoah Goldstein} 69bf8d0392SNoah Goldstein 70bf8d0392SNoah Goldsteindefine dso_local void @foo2(ptr %p, ptr %p2) { 71bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2 72bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 73bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[P]]) 74bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 75bf8d0392SNoah Goldstein; 76bf8d0392SNoah Goldstein call void @bar2(ptr %p, ptr %p) 77bf8d0392SNoah Goldstein ret void 78bf8d0392SNoah Goldstein} 79bf8d0392SNoah Goldstein 80bf8d0392SNoah Goldsteindefine dso_local void @foo2_2(ptr %p, ptr %p2) { 81bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2_2 82bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 83bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P2]], ptr [[P2]]) 84bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 85bf8d0392SNoah Goldstein; 86bf8d0392SNoah Goldstein call void @bar2(ptr %p2, ptr %p2) 87bf8d0392SNoah Goldstein ret void 88bf8d0392SNoah Goldstein} 89bf8d0392SNoah Goldstein 90bf8d0392SNoah Goldsteindefine dso_local void @foo2_3(ptr %p, ptr readnone %p2) { 91bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2_3 92bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr readnone [[P2:%.*]]) { 93bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[P2]]) 94bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 95bf8d0392SNoah Goldstein; 96bf8d0392SNoah Goldstein call void @bar2(ptr %p, ptr %p2) 97bf8d0392SNoah Goldstein ret void 98bf8d0392SNoah Goldstein} 99bf8d0392SNoah Goldstein 100bf8d0392SNoah Goldsteindefine dso_local void @buz1_wronly(ptr %p) writeonly { 101bf8d0392SNoah Goldstein; CHECK: Function Attrs: memory(write) 102bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_wronly 103bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] { 104bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 105bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 106bf8d0392SNoah Goldstein; 107bf8d0392SNoah Goldstein call void @bar1(ptr %p) 108bf8d0392SNoah Goldstein ret void 109bf8d0392SNoah Goldstein} 110bf8d0392SNoah Goldstein 111bf8d0392SNoah Goldsteindefine dso_local void @buz1(ptr %p) { 112bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1 113bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 114bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 115bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 116bf8d0392SNoah Goldstein; 117bf8d0392SNoah Goldstein call void @bar1(ptr %p) 118bf8d0392SNoah Goldstein ret void 119bf8d0392SNoah Goldstein} 120bf8d0392SNoah Goldstein 121bf8d0392SNoah Goldsteindefine dso_local void @buz1_wronly_fail_alloca(ptr %p) writeonly { 122bf8d0392SNoah Goldstein; CHECK: Function Attrs: memory(write) 123bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_wronly_fail_alloca 124bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] { 125bf8d0392SNoah Goldstein; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 126bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]]) 127bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 128bf8d0392SNoah Goldstein; 129bf8d0392SNoah Goldstein %a = alloca i32, align 4 130bf8d0392SNoah Goldstein call void @bar2(ptr %p, ptr %a) 131bf8d0392SNoah Goldstein ret void 132bf8d0392SNoah Goldstein} 133bf8d0392SNoah Goldstein 134bf8d0392SNoah Goldsteindefine dso_local void @buz1_fail_alloca(ptr %p) { 135bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_fail_alloca 136bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 137bf8d0392SNoah Goldstein; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 138bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]]) 139bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 140bf8d0392SNoah Goldstein; 141bf8d0392SNoah Goldstein %a = alloca i32, align 4 142bf8d0392SNoah Goldstein call void @bar2(ptr %p, ptr %a) 143bf8d0392SNoah Goldstein ret void 144bf8d0392SNoah Goldstein} 145bf8d0392SNoah Goldstein 146bf8d0392SNoah Goldsteindefine dso_local void @buz1_wronly_partially_okay_alloca(ptr %p) writeonly { 147bf8d0392SNoah Goldstein; CHECK: Function Attrs: memory(write) 148bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_wronly_partially_okay_alloca 149bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] { 150bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 151bf8d0392SNoah Goldstein; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 152bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]]) 153bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 154bf8d0392SNoah Goldstein; 155bf8d0392SNoah Goldstein call void @bar1(ptr %p) 156bf8d0392SNoah Goldstein %a = alloca i32, align 4 157bf8d0392SNoah Goldstein call void @bar2(ptr %p, ptr %a) 158bf8d0392SNoah Goldstein ret void 159bf8d0392SNoah Goldstein} 160bf8d0392SNoah Goldstein 161bf8d0392SNoah Goldsteindefine dso_local void @buz1_partially_okay_alloca(ptr %p) { 162bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@buz1_partially_okay_alloca 163bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 164bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 165bf8d0392SNoah Goldstein; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 166bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]]) 167bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 168bf8d0392SNoah Goldstein; 169bf8d0392SNoah Goldstein call void @bar1(ptr %p) 170bf8d0392SNoah Goldstein %a = alloca i32, align 4 171bf8d0392SNoah Goldstein call void @bar2(ptr %p, ptr %a) 172bf8d0392SNoah Goldstein ret void 173bf8d0392SNoah Goldstein} 174bf8d0392SNoah Goldstein 175bf8d0392SNoah Goldsteindefine dso_local void @foo2_through_obj(ptr %p, ptr %p2) { 176bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo2_through_obj 177bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 178bf8d0392SNoah Goldstein; CHECK-NEXT: [[PP:%.*]] = getelementptr i8, ptr [[P]], i64 9 179bf8d0392SNoah Goldstein; CHECK-NEXT: [[P2P:%.*]] = getelementptr i8, ptr [[P2]], i64 123 180bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P2P]], ptr [[PP]]) 181bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 182bf8d0392SNoah Goldstein; 183bf8d0392SNoah Goldstein %pp = getelementptr i8, ptr %p, i64 9 184bf8d0392SNoah Goldstein %p2p = getelementptr i8, ptr %p2, i64 123 185bf8d0392SNoah Goldstein call void @bar2(ptr %p2p, ptr %pp) 186bf8d0392SNoah Goldstein ret void 187bf8d0392SNoah Goldstein} 188bf8d0392SNoah Goldstein 189db03d9d3SNoah Goldsteindefine dso_local void @foo_byval_readonly(ptr readonly %p) { 190db03d9d3SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@foo_byval_readonly 191db03d9d3SNoah Goldstein; CHECK-SAME: (ptr readonly [[P:%.*]]) { 192db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar4(ptr byval([4 x i32]) [[P]]) 193db03d9d3SNoah Goldstein; CHECK-NEXT: ret void 194db03d9d3SNoah Goldstein; 195db03d9d3SNoah Goldstein call void @bar4(ptr byval([4 x i32]) %p) 196db03d9d3SNoah Goldstein ret void 197db03d9d3SNoah Goldstein} 198db03d9d3SNoah Goldstein 199bf8d0392SNoah Goldsteindefine void @prop_param_func_decl(ptr %p) { 200bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_func_decl 201bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 202db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr readonly [[P]]) 203bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 204bf8d0392SNoah Goldstein; 205bf8d0392SNoah Goldstein call void @foo1_rdonly(ptr %p) 206bf8d0392SNoah Goldstein ret void 207bf8d0392SNoah Goldstein} 208bf8d0392SNoah Goldstein 209bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def(ptr %p) { 210bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def 211bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 212db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr readonly [[P]]) 213bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 214bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 215bf8d0392SNoah Goldstein; 216bf8d0392SNoah Goldstein call void @foo1(ptr readonly %p) 217bf8d0392SNoah Goldstein call void @bar1(ptr %p) 218bf8d0392SNoah Goldstein ret void 219bf8d0392SNoah Goldstein} 220bf8d0392SNoah Goldstein 221bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x(ptr %p, ptr %p2) { 222bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x 223bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 224db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readonly [[P]]) 225bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 226bf8d0392SNoah Goldstein; 227bf8d0392SNoah Goldstein call void @foo2(ptr readonly %p, ptr %p) 228bf8d0392SNoah Goldstein ret void 229bf8d0392SNoah Goldstein} 230bf8d0392SNoah Goldstein 231bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_2(ptr %p, ptr %p2) { 232bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_2 233bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 234bf8d0392SNoah Goldstein; CHECK-NEXT: [[PP_I:%.*]] = getelementptr i8, ptr [[P]], i64 9 235bf8d0392SNoah Goldstein; CHECK-NEXT: [[P2P_I:%.*]] = getelementptr i8, ptr [[P2]], i64 123 236db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P2P_I]], ptr readonly [[PP_I]]) 237bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 238bf8d0392SNoah Goldstein; 239bf8d0392SNoah Goldstein call void @foo2_through_obj(ptr readonly %p, ptr writeonly %p2) 240bf8d0392SNoah Goldstein ret void 241bf8d0392SNoah Goldstein} 242bf8d0392SNoah Goldstein 243bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_incompat(ptr %p, ptr %p2) { 244bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat 245bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 246bf8d0392SNoah Goldstein; CHECK-NEXT: [[PP_I:%.*]] = getelementptr i8, ptr [[P]], i64 9 247bf8d0392SNoah Goldstein; CHECK-NEXT: [[P2P_I:%.*]] = getelementptr i8, ptr [[P]], i64 123 248db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr readonly [[P2P_I]], ptr readnone [[PP_I]]) 249bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 250bf8d0392SNoah Goldstein; 251bf8d0392SNoah Goldstein call void @foo2_through_obj(ptr readnone %p, ptr readonly %p) 252bf8d0392SNoah Goldstein ret void 253bf8d0392SNoah Goldstein} 254bf8d0392SNoah Goldstein 255bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_incompat_2(ptr %p, ptr %p2) { 256bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat_2 257bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 258db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readonly [[P]]) 259bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 260bf8d0392SNoah Goldstein; 261bf8d0392SNoah Goldstein call void @foo2(ptr readonly %p, ptr readnone %p) 262bf8d0392SNoah Goldstein ret void 263bf8d0392SNoah Goldstein} 264bf8d0392SNoah Goldstein 265bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_2x_incompat_3(ptr %p, ptr %p2) { 266bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat_3 267bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 268db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr readnone [[P]], ptr readnone [[P]]) 269bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 270bf8d0392SNoah Goldstein; 271bf8d0392SNoah Goldstein call void @foo2_2(ptr readonly %p, ptr readnone %p) 272bf8d0392SNoah Goldstein ret void 273bf8d0392SNoah Goldstein} 274bf8d0392SNoah Goldstein 275bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_1x_partial(ptr %p, ptr %p2) { 276bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial 277bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 278db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readonly [[P]]) 279bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 280bf8d0392SNoah Goldstein; 281bf8d0392SNoah Goldstein call void @foo2(ptr readonly %p, ptr %p) 282bf8d0392SNoah Goldstein ret void 283bf8d0392SNoah Goldstein} 284bf8d0392SNoah Goldstein 285bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_1x_partial_2(ptr %p, ptr %p2) { 286bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial_2 287bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 288bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[P]]) 289bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 290bf8d0392SNoah Goldstein; 291bf8d0392SNoah Goldstein call void @foo2_2(ptr readonly %p, ptr %p) 292bf8d0392SNoah Goldstein ret void 293bf8d0392SNoah Goldstein} 294bf8d0392SNoah Goldstein 295bf8d0392SNoah Goldsteindefine void @prop_param_callbase_def_1x_partial_3(ptr %p, ptr %p2) { 296bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial_3 297bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) { 298db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readnone [[P]]) 299bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 300bf8d0392SNoah Goldstein; 301bf8d0392SNoah Goldstein call void @foo2_3(ptr readonly %p, ptr %p) 302bf8d0392SNoah Goldstein ret void 303bf8d0392SNoah Goldstein} 304bf8d0392SNoah Goldstein 305bf8d0392SNoah Goldsteindefine void @prop_deref(ptr %p) { 306bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_deref 307bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 308*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar1(ptr dereferenceable(16) [[P]]) 309bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 310bf8d0392SNoah Goldstein; 311bf8d0392SNoah Goldstein call void @foo1(ptr dereferenceable(16) %p) 312bf8d0392SNoah Goldstein ret void 313bf8d0392SNoah Goldstein} 314bf8d0392SNoah Goldstein 315bf8d0392SNoah Goldsteindefine void @prop_deref_or_null(ptr %p) { 316bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_deref_or_null 317bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 318*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar1(ptr dereferenceable_or_null(256) [[P]]) 319bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 320bf8d0392SNoah Goldstein; 321bf8d0392SNoah Goldstein call void @foo1(ptr dereferenceable_or_null(256) %p) 322bf8d0392SNoah Goldstein ret void 323bf8d0392SNoah Goldstein} 324bf8d0392SNoah Goldstein 325bf8d0392SNoah Goldsteindefine void @prop_param_nonnull_and_align(ptr %p) { 326bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_nonnull_and_align 327bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 328*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar1(ptr nonnull align 32 [[P]]) 329bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 330bf8d0392SNoah Goldstein; 331bf8d0392SNoah Goldstein call void @foo1(ptr nonnull align 32 %p) 332bf8d0392SNoah Goldstein ret void 333bf8d0392SNoah Goldstein} 334bf8d0392SNoah Goldstein 335*69a798a9Sgoldsteinndefine void @prop_param_nofree_and_align(ptr %p) { 336*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_param_nofree_and_align 337*69a798a9Sgoldsteinn; CHECK-SAME: (ptr [[P:%.*]]) { 338*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar1(ptr align 32 [[P]]) 339*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 340*69a798a9Sgoldsteinn; 341*69a798a9Sgoldsteinn call void @foo1(ptr nofree align 32 %p) 342*69a798a9Sgoldsteinn ret void 343*69a798a9Sgoldsteinn} 344*69a798a9Sgoldsteinn 345bf8d0392SNoah Goldsteindefine void @prop_param_deref_align_no_update(ptr %p) { 346bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_no_update 347bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 348bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr align 64 dereferenceable(512) [[P]]) 349bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 350bf8d0392SNoah Goldstein; 351bf8d0392SNoah Goldstein call void @foo1_bar_aligned64_deref512(ptr align 4 dereferenceable(64) %p) 352bf8d0392SNoah Goldstein ret void 353bf8d0392SNoah Goldstein} 354bf8d0392SNoah Goldstein 355bf8d0392SNoah Goldsteindefine void @prop_param_deref_align_update(ptr %p) { 356bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_update 357bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 358*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar1(ptr align 128 dereferenceable(1024) [[P]]) 359bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 360bf8d0392SNoah Goldstein; 361bf8d0392SNoah Goldstein call void @foo1_bar_aligned64_deref512(ptr align 128 dereferenceable(1024) %p) 362bf8d0392SNoah Goldstein ret void 363bf8d0392SNoah Goldstein} 364bf8d0392SNoah Goldstein 365bf8d0392SNoah Goldsteindefine void @prop_param_deref_or_null_update(ptr %p) { 366bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_or_null_update 367bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 368*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar1(ptr align 512 dereferenceable_or_null(1024) [[P]]) 369bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 370bf8d0392SNoah Goldstein; 371bf8d0392SNoah Goldstein call void @foo1_bar_aligned512_deref_or_null512(ptr dereferenceable_or_null(1024) %p) 372bf8d0392SNoah Goldstein ret void 373bf8d0392SNoah Goldstein} 374bf8d0392SNoah Goldstein 375bf8d0392SNoah Goldsteindefine void @prop_param_deref_or_null_no_update(ptr %p) { 376bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_or_null_no_update 377bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 378bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr align 512 dereferenceable_or_null(512) [[P]]) 379bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 380bf8d0392SNoah Goldstein; 381bf8d0392SNoah Goldstein call void @foo1_bar_aligned512_deref_or_null512(ptr dereferenceable_or_null(32) %p) 382bf8d0392SNoah Goldstein ret void 383bf8d0392SNoah Goldstein} 384bf8d0392SNoah Goldstein 385bf8d0392SNoah Goldsteindefine void @prop_fn_decl(ptr %p) { 386bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl 387bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 388bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 389bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 390bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 391bf8d0392SNoah Goldstein; 392bf8d0392SNoah Goldstein call void @buz1_wronly(ptr %p) 393bf8d0392SNoah Goldstein call void @bar1(ptr %p) 394bf8d0392SNoah Goldstein ret void 395bf8d0392SNoah Goldstein} 396bf8d0392SNoah Goldstein 397bf8d0392SNoah Goldsteindefine void @prop_cb_def_wr(ptr %p) { 398bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr 399bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 400bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 401bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 402bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 403bf8d0392SNoah Goldstein; 404bf8d0392SNoah Goldstein call void @buz1(ptr %p) writeonly 405bf8d0392SNoah Goldstein call void @bar1(ptr %p) 406bf8d0392SNoah Goldstein ret void 407bf8d0392SNoah Goldstein} 408bf8d0392SNoah Goldstein 409bf8d0392SNoah Goldsteindefine void @prop_fn_decl_fail_alloca(ptr %p) { 410bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl_fail_alloca 411bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 412bf8d0392SNoah Goldstein; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4 413bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]]) 414bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]]) 415bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]]) 416bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 417bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 418bf8d0392SNoah Goldstein; 419bf8d0392SNoah Goldstein call void @buz1_wronly_fail_alloca(ptr %p) 420bf8d0392SNoah Goldstein call void @bar1(ptr %p) 421bf8d0392SNoah Goldstein ret void 422bf8d0392SNoah Goldstein} 423bf8d0392SNoah Goldstein 424bf8d0392SNoah Goldsteindefine void @prop_cb_def_wr_fail_alloca(ptr %p) { 425bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr_fail_alloca 426bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 427bf8d0392SNoah Goldstein; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4 428bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]]) 429bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]]) 430bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]]) 431bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 432bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 433bf8d0392SNoah Goldstein; 434bf8d0392SNoah Goldstein call void @buz1_fail_alloca(ptr %p) writeonly 435bf8d0392SNoah Goldstein call void @bar1(ptr %p) 436bf8d0392SNoah Goldstein ret void 437bf8d0392SNoah Goldstein} 438bf8d0392SNoah Goldstein 439bf8d0392SNoah Goldsteindefine void @prop_fn_decl_partially_okay_alloca(ptr %p) { 440bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl_partially_okay_alloca 441bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 442bf8d0392SNoah Goldstein; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4 443bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]]) 444bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 445bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]]) 446bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]]) 447bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 448bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 449bf8d0392SNoah Goldstein; 450bf8d0392SNoah Goldstein call void @buz1_wronly_partially_okay_alloca(ptr %p) 451bf8d0392SNoah Goldstein call void @bar1(ptr %p) 452bf8d0392SNoah Goldstein ret void 453bf8d0392SNoah Goldstein} 454bf8d0392SNoah Goldstein 455bf8d0392SNoah Goldsteindefine void @prop_cb_def_wr_partially_okay_alloca(ptr %p) { 456bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr_partially_okay_alloca 457bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 458bf8d0392SNoah Goldstein; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4 459bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[A_I]]) 460bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 461bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]]) 462bf8d0392SNoah Goldstein; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[A_I]]) 463bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 464bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 465bf8d0392SNoah Goldstein; 466bf8d0392SNoah Goldstein call void @buz1_partially_okay_alloca(ptr %p) writeonly 467bf8d0392SNoah Goldstein call void @bar1(ptr %p) 468bf8d0392SNoah Goldstein ret void 469bf8d0392SNoah Goldstein} 470bf8d0392SNoah Goldstein 471bf8d0392SNoah Goldsteindefine void @prop_cb_def_readonly(ptr %p) { 472bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_readonly 473bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 474bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 475bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 476bf8d0392SNoah Goldstein; 477bf8d0392SNoah Goldstein call void @foo1(ptr %p) readonly 478bf8d0392SNoah Goldstein ret void 479bf8d0392SNoah Goldstein} 480bf8d0392SNoah Goldstein 481bf8d0392SNoah Goldsteindefine void @prop_cb_def_readnone(ptr %p) { 482bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_readnone 483bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 484bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 485bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 486bf8d0392SNoah Goldstein; 487bf8d0392SNoah Goldstein call void @foo1(ptr %p) readnone 488bf8d0392SNoah Goldstein ret void 489bf8d0392SNoah Goldstein} 490bf8d0392SNoah Goldstein 491bf8d0392SNoah Goldsteindefine void @prop_cb_def_argmem_readonly_fail(ptr %p) { 492bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_argmem_readonly_fail 493bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 494bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 495bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 496bf8d0392SNoah Goldstein; 497bf8d0392SNoah Goldstein call void @foo1(ptr %p) memory(argmem:read) 498bf8d0392SNoah Goldstein ret void 499bf8d0392SNoah Goldstein} 500bf8d0392SNoah Goldstein 501bf8d0392SNoah Goldsteindefine void @prop_cb_def_inaccessible_none(ptr %p) { 502bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_inaccessible_none 503bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 504bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 505bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 506bf8d0392SNoah Goldstein; 507bf8d0392SNoah Goldstein call void @foo1(ptr %p) memory(inaccessiblemem:none) 508bf8d0392SNoah Goldstein ret void 509bf8d0392SNoah Goldstein} 510bf8d0392SNoah Goldstein 511bf8d0392SNoah Goldsteindefine void @prop_cb_def_inaccessible_none_argmem_none(ptr %p) { 512bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_inaccessible_none_argmem_none 513bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 514bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 515bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 516bf8d0392SNoah Goldstein; 517bf8d0392SNoah Goldstein call void @foo1(ptr %p) memory(inaccessiblemem:none, argmem:none) 518bf8d0392SNoah Goldstein ret void 519bf8d0392SNoah Goldstein} 520bf8d0392SNoah Goldstein 521bf8d0392SNoah Goldsteindefine void @prop_cb_def_willreturn(ptr %p) { 522bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_willreturn 523bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 524bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 525bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 526bf8d0392SNoah Goldstein; 527bf8d0392SNoah Goldstein call void @foo1(ptr %p) willreturn 528bf8d0392SNoah Goldstein ret void 529bf8d0392SNoah Goldstein} 530bf8d0392SNoah Goldstein 531bf8d0392SNoah Goldsteindefine void @prop_cb_def_mustprogress(ptr %p) { 532bf8d0392SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_mustprogress 533bf8d0392SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 534bf8d0392SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr [[P]]) 535bf8d0392SNoah Goldstein; CHECK-NEXT: ret void 536bf8d0392SNoah Goldstein; 537bf8d0392SNoah Goldstein call void @foo1(ptr %p) mustprogress 538bf8d0392SNoah Goldstein ret void 539bf8d0392SNoah Goldstein} 540f8ff51e1SNoah Goldstein 541f8ff51e1SNoah Goldsteindefine void @prop_no_conflict_writable(ptr %p) { 542f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable 543f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 544db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar1(ptr readonly [[P]]) 545f8ff51e1SNoah Goldstein; CHECK-NEXT: ret void 546f8ff51e1SNoah Goldstein; 547f8ff51e1SNoah Goldstein call void @foo1_writable(ptr readonly %p) 548f8ff51e1SNoah Goldstein ret void 549f8ff51e1SNoah Goldstein} 550f8ff51e1SNoah Goldstein 551f8ff51e1SNoah Goldsteindefine void @prop_no_conflict_writable2(ptr %p) { 552f8ff51e1SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable2 553f8ff51e1SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 554db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar3(ptr readnone [[P]]) 555f8ff51e1SNoah Goldstein; CHECK-NEXT: ret void 556f8ff51e1SNoah Goldstein; 557f8ff51e1SNoah Goldstein call void @foo3_writable(ptr readnone %p) 558f8ff51e1SNoah Goldstein ret void 559f8ff51e1SNoah Goldstein} 560f8ff51e1SNoah Goldstein 561db03d9d3SNoah Goldsteindefine void @prop_byval_readonly(ptr %p) { 562db03d9d3SNoah Goldstein; CHECK-LABEL: define {{[^@]+}}@prop_byval_readonly 563db03d9d3SNoah Goldstein; CHECK-SAME: (ptr [[P:%.*]]) { 564db03d9d3SNoah Goldstein; CHECK-NEXT: call void @bar4(ptr byval([4 x i32]) [[P]]) 565db03d9d3SNoah Goldstein; CHECK-NEXT: ret void 566db03d9d3SNoah Goldstein; 567db03d9d3SNoah Goldstein call void @foo_byval_readonly(ptr %p) 568db03d9d3SNoah Goldstein ret void 569db03d9d3SNoah Goldstein} 570a9352a0dSgoldsteinn 571a9352a0dSgoldsteinndefine ptr @caller_bad_param_prop(ptr %p1, ptr %p2, i64 %x) { 572a9352a0dSgoldsteinn; CHECK-LABEL: define {{[^@]+}}@caller_bad_param_prop 573a9352a0dSgoldsteinn; CHECK-SAME: (ptr [[P1:%.*]], ptr [[P2:%.*]], i64 [[X:%.*]]) { 574a9352a0dSgoldsteinn; CHECK-NEXT: [[TMP1:%.*]] = call ptr [[P1]](i64 [[X]], ptr [[P2]]) 575a9352a0dSgoldsteinn; CHECK-NEXT: ret ptr [[TMP1]] 576a9352a0dSgoldsteinn; 577a9352a0dSgoldsteinn %1 = call ptr %p1(i64 %x, ptr %p2) 578a9352a0dSgoldsteinn %2 = call ptr @callee_bad_param_prop(ptr %1) 579a9352a0dSgoldsteinn ret ptr %2 580a9352a0dSgoldsteinn} 581a9352a0dSgoldsteinn 582a9352a0dSgoldsteinndefine ptr @callee_bad_param_prop(ptr readonly %x) { 583a9352a0dSgoldsteinn; CHECK-LABEL: define {{[^@]+}}@callee_bad_param_prop 584a9352a0dSgoldsteinn; CHECK-SAME: (ptr readonly [[X:%.*]]) { 585a9352a0dSgoldsteinn; CHECK-NEXT: [[R:%.*]] = tail call ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 -1) 586a9352a0dSgoldsteinn; CHECK-NEXT: ret ptr [[R]] 587a9352a0dSgoldsteinn; 588a9352a0dSgoldsteinn %r = tail call ptr @llvm.ptrmask(ptr %x, i64 -1) 589a9352a0dSgoldsteinn ret ptr %r 590a9352a0dSgoldsteinn} 5913c777f04Sgoldsteinn 5923c777f04Sgoldsteinndefine dso_local void @foo_byval_readonly2(ptr readonly %p) { 5933c777f04Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo_byval_readonly2 5943c777f04Sgoldsteinn; CHECK-SAME: (ptr readonly [[P:%.*]]) { 5953c777f04Sgoldsteinn; CHECK-NEXT: call void @bar4(ptr [[P]]) 5963c777f04Sgoldsteinn; CHECK-NEXT: ret void 5973c777f04Sgoldsteinn; 5983c777f04Sgoldsteinn call void @bar4(ptr %p) 5993c777f04Sgoldsteinn ret void 6003c777f04Sgoldsteinn} 6013c777f04Sgoldsteinn 6023c777f04Sgoldsteinndefine void @prop_byval_readonly2(ptr %p) { 6033c777f04Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_byval_readonly2 6043c777f04Sgoldsteinn; CHECK-SAME: (ptr [[P:%.*]]) { 6053c777f04Sgoldsteinn; CHECK-NEXT: call void @bar4(ptr [[P]]) 6063c777f04Sgoldsteinn; CHECK-NEXT: ret void 6073c777f04Sgoldsteinn; 6083c777f04Sgoldsteinn call void @foo_byval_readonly2(ptr %p) 6093c777f04Sgoldsteinn ret void 6103c777f04Sgoldsteinn} 611*69a798a9Sgoldsteinn 612*69a798a9Sgoldsteinndeclare void @bar5(i32) 613*69a798a9Sgoldsteinn 614*69a798a9Sgoldsteinndefine dso_local void @foo4_range_0_10(i32 %v) { 615*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4_range_0_10 616*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 617*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]]) 618*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 619*69a798a9Sgoldsteinn; 620*69a798a9Sgoldsteinn call void @bar5(i32 range(i32 0, 10) %v) 621*69a798a9Sgoldsteinn ret void 622*69a798a9Sgoldsteinn} 623*69a798a9Sgoldsteinn 624*69a798a9Sgoldsteinndefine dso_local void @foo4_range_10_40(i32 %v) { 625*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4_range_10_40 626*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 627*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]]) 628*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 629*69a798a9Sgoldsteinn; 630*69a798a9Sgoldsteinn call void @bar5(i32 range(i32 10, 40) %v) 631*69a798a9Sgoldsteinn ret void 632*69a798a9Sgoldsteinn} 633*69a798a9Sgoldsteinn 634*69a798a9Sgoldsteinndefine dso_local void @foo4_2_range_0_10(i32 range(i32 0, 10) %v) { 635*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4_2_range_0_10 636*69a798a9Sgoldsteinn; CHECK-SAME: (i32 range(i32 0, 10) [[V:%.*]]) { 637*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 [[V]]) 638*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 639*69a798a9Sgoldsteinn; 640*69a798a9Sgoldsteinn call void @bar5(i32 %v) 641*69a798a9Sgoldsteinn ret void 642*69a798a9Sgoldsteinn} 643*69a798a9Sgoldsteinn 644*69a798a9Sgoldsteinndefine dso_local void @foo4(i32 %v) { 645*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@foo4 646*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 647*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 [[V]]) 648*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 649*69a798a9Sgoldsteinn; 650*69a798a9Sgoldsteinn call void @bar5(i32 %v) 651*69a798a9Sgoldsteinn ret void 652*69a798a9Sgoldsteinn} 653*69a798a9Sgoldsteinn 654*69a798a9Sgoldsteinndefine void @prop_range_empty_intersect(i32 %v) { 655*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_intersect 656*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 657*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 0, 0) [[V]]) 658*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 659*69a798a9Sgoldsteinn; 660*69a798a9Sgoldsteinn call void @foo4_range_0_10(i32 range(i32 11, 50) %v) 661*69a798a9Sgoldsteinn ret void 662*69a798a9Sgoldsteinn} 663*69a798a9Sgoldsteinn 664*69a798a9Sgoldsteinndefine void @prop_range_empty(i32 %v) { 665*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_empty 666*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 667*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 1, 0) [[V]]) 668*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 669*69a798a9Sgoldsteinn; 670*69a798a9Sgoldsteinn call void @foo4(i32 range(i32 1, 0) %v) 671*69a798a9Sgoldsteinn ret void 672*69a798a9Sgoldsteinn} 673*69a798a9Sgoldsteinn 674*69a798a9Sgoldsteinndefine void @prop_range_empty_with_intersect(i32 %v) { 675*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_with_intersect 676*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 677*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 1, 10) [[V]]) 678*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 679*69a798a9Sgoldsteinn; 680*69a798a9Sgoldsteinn call void @foo4_range_0_10(i32 range(i32 1, 0) %v) 681*69a798a9Sgoldsteinn ret void 682*69a798a9Sgoldsteinn} 683*69a798a9Sgoldsteinn 684*69a798a9Sgoldsteinndefine void @prop_range_intersect1(i32 %v) { 685*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect1 686*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 687*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 0, 9) [[V]]) 688*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 689*69a798a9Sgoldsteinn; 690*69a798a9Sgoldsteinn call void @foo4_range_0_10(i32 range(i32 0, 9) %v) 691*69a798a9Sgoldsteinn ret void 692*69a798a9Sgoldsteinn} 693*69a798a9Sgoldsteinn 694*69a798a9Sgoldsteinndefine void @prop_range_intersect2(i32 %v) { 695*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect2 696*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 697*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 1, 9) [[V]]) 698*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 699*69a798a9Sgoldsteinn; 700*69a798a9Sgoldsteinn call void @foo4_range_0_10(i32 range(i32 1, 9) %v) 701*69a798a9Sgoldsteinn ret void 702*69a798a9Sgoldsteinn} 703*69a798a9Sgoldsteinn 704*69a798a9Sgoldsteinndefine void @prop_range_intersect3(i32 %v) { 705*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect3 706*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 707*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 0, 11) [[V]]) 708*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 709*69a798a9Sgoldsteinn; 710*69a798a9Sgoldsteinn call void @foo4_2_range_0_10(i32 range(i32 0, 11) %v) 711*69a798a9Sgoldsteinn ret void 712*69a798a9Sgoldsteinn} 713*69a798a9Sgoldsteinn 714*69a798a9Sgoldsteinndefine void @prop_range_intersect4(i32 %v) { 715*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect4 716*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 717*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 0, 5) [[V]]) 718*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 719*69a798a9Sgoldsteinn; 720*69a798a9Sgoldsteinn call void @foo4_range_0_10(i32 range(i32 40, 5) %v) 721*69a798a9Sgoldsteinn ret void 722*69a798a9Sgoldsteinn} 723*69a798a9Sgoldsteinn 724*69a798a9Sgoldsteinndefine void @prop_range_intersect5(i32 %v) { 725*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect5 726*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 727*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]]) 728*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 729*69a798a9Sgoldsteinn; 730*69a798a9Sgoldsteinn call void @foo4_range_10_40(i32 range(i32 30, 20) %v) 731*69a798a9Sgoldsteinn ret void 732*69a798a9Sgoldsteinn} 733*69a798a9Sgoldsteinn 734*69a798a9Sgoldsteinndefine void @prop_range_keep(i32 %v) { 735*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_keep 736*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 737*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]]) 738*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 739*69a798a9Sgoldsteinn; 740*69a798a9Sgoldsteinn call void @foo4_range_10_40(i32 %v) 741*69a798a9Sgoldsteinn ret void 742*69a798a9Sgoldsteinn} 743*69a798a9Sgoldsteinn 744*69a798a9Sgoldsteinndefine void @prop_range_direct(i32 %v) { 745*69a798a9Sgoldsteinn; CHECK-LABEL: define {{[^@]+}}@prop_range_direct 746*69a798a9Sgoldsteinn; CHECK-SAME: (i32 [[V:%.*]]) { 747*69a798a9Sgoldsteinn; CHECK-NEXT: call void @bar5(i32 range(i32 1, 11) [[V]]) 748*69a798a9Sgoldsteinn; CHECK-NEXT: ret void 749*69a798a9Sgoldsteinn; 750*69a798a9Sgoldsteinn call void @foo4(i32 range(i32 1, 11) %v) 751*69a798a9Sgoldsteinn ret void 752*69a798a9Sgoldsteinn} 753