1; RUN: llvm-as < %s | llvm-dis | FileCheck %s --check-prefixes=CHECK,CHECK-TYPED 2; RUN: llvm-as -opaque-pointers < %s | llvm-dis -opaque-pointers | FileCheck %s --check-prefixes=CHECK,CHECK-OPAQUE 3; RUN: verify-uselistorder < %s 4; PR12696 5 6define void @f1(i8 zeroext %0) 7; CHECK: define void @f1(i8 zeroext %0) 8{ 9 ret void; 10} 11 12define void @f2(i8 signext %0) 13; CHECK: define void @f2(i8 signext %0) 14{ 15 ret void; 16} 17 18define void @f3() noreturn 19; CHECK: define void @f3() #0 20{ 21 ret void; 22} 23 24define void @f4(i8 inreg %0) 25; CHECK: define void @f4(i8 inreg %0) 26{ 27 ret void; 28} 29 30define void @f5(i8* sret(i8) %0) 31; CHECK-TYPED: define void @f5(i8* sret(i8) %0) 32; CHECK-OPAQUE: define void @f5(ptr sret(i8) %0) 33{ 34 ret void; 35} 36 37define void @f6() nounwind 38; CHECK: define void @f6() #1 39{ 40 ret void; 41} 42 43define void @f7(i8* noalias %0) 44; CHECK-TYPED: define void @f7(i8* noalias %0) 45; CHECK-OPAQUE: define void @f7(ptr noalias %0) 46{ 47 ret void; 48} 49 50define void @f8(i8* byval(i8) %0) 51; CHECK-TYPED: define void @f8(i8* byval(i8) %0) 52; CHECK-OPAQUE: define void @f8(ptr byval(i8) %0) 53{ 54 ret void; 55} 56 57define void @f9(i8* nest %0) 58; CHECK-TYPED: define void @f9(i8* nest %0) 59; CHECK-OPAQUE: define void @f9(ptr nest %0) 60{ 61 ret void; 62} 63 64define void @f10() readnone 65; CHECK: define void @f10() #2 66{ 67 ret void; 68} 69 70define void @f11() readonly 71; CHECK: define void @f11() #3 72{ 73 ret void; 74} 75 76define void @f12() noinline 77; CHECK: define void @f12() #4 78{ 79 ret void; 80} 81 82define void @f13() alwaysinline 83; CHECK: define void @f13() #5 84{ 85 ret void; 86} 87 88define void @f14() optsize 89; CHECK: define void @f14() #6 90{ 91 ret void; 92} 93 94define void @f15() ssp 95; CHECK: define void @f15() #7 96{ 97 ret void; 98} 99 100define void @f16() sspreq 101; CHECK: define void @f16() #8 102{ 103 ret void; 104} 105 106define void @f17(i8* align 4 %0) 107; CHECK-TYPED: define void @f17(i8* align 4 %0) 108; CHECK-OPAQUE: define void @f17(ptr align 4 %0) 109{ 110 ret void; 111} 112 113define void @f18(i8* nocapture %0) 114; CHECK-TYPED: define void @f18(i8* nocapture %0) 115; CHECK-OPAQUE: define void @f18(ptr nocapture %0) 116{ 117 ret void; 118} 119 120define void @f19() noredzone 121; CHECK: define void @f19() #9 122{ 123 ret void; 124} 125 126define void @f20() noimplicitfloat 127; CHECK: define void @f20() #10 128{ 129 ret void; 130} 131 132define void @f21() naked 133; CHECK: define void @f21() #11 134{ 135 ret void; 136} 137 138define void @f22() inlinehint 139; CHECK: define void @f22() #12 140{ 141 ret void; 142} 143 144define void @f23() alignstack(4) 145; CHECK: define void @f23() #13 146{ 147 ret void; 148} 149 150define void @f24() returns_twice 151; CHECK: define void @f24() #14 152{ 153 ret void; 154} 155 156define void @f25() uwtable 157; CHECK: define void @f25() #15 158{ 159 ret void; 160} 161 162define void @f26() nonlazybind 163; CHECK: define void @f26() #16 164{ 165 ret void; 166} 167 168define void @f27() sanitize_address 169; CHECK: define void @f27() #17 170{ 171 ret void; 172} 173define void @f28() sanitize_thread 174; CHECK: define void @f28() #18 175{ 176 ret void; 177} 178define void @f29() sanitize_memory 179; CHECK: define void @f29() #19 180{ 181 ret void; 182} 183 184define void @f30() "cpu"="cortex-a8" 185; CHECK: define void @f30() #20 186{ 187 ret void; 188} 189 190define i8 @f31(i8 returned %A) 191; CHECK: define i8 @f31(i8 returned %A) 192{ 193 ret i8 %A; 194} 195 196define void @f32() sspstrong 197; CHECK: define void @f32() #21 198{ 199 ret void; 200} 201 202define void @f33() minsize 203; CHECK: define void @f33() #22 204{ 205 ret void; 206} 207 208declare void @nobuiltin() 209 210define void @f34() 211; CHECK: define void @f34() 212{ 213 call void @nobuiltin() nobuiltin 214; CHECK: call void @nobuiltin() #[[NOBUILTIN:[0-9]+]] 215 ret void; 216} 217 218define void @f35() optnone noinline 219; CHECK: define void @f35() #23 220{ 221 ret void; 222} 223 224define void @f36(i8* inalloca(i8) %0) { 225; CHECK-TYPED: define void @f36(i8* inalloca(i8) %0) { 226; CHECK-OPAQUE: define void @f36(ptr inalloca(i8) %0) { 227 ret void 228} 229 230define nonnull i8* @f37(i8* nonnull %a) { 231; CHECK-TYPED: define nonnull i8* @f37(i8* nonnull %a) { 232; CHECK-OPAQUE: define nonnull ptr @f37(ptr nonnull %a) { 233 ret i8* %a 234} 235 236define void @f38() unnamed_addr jumptable { 237; CHECK: define void @f38() unnamed_addr #24 238 call void bitcast (void (i8*)* @f36 to void ()*)() 239 unreachable 240} 241 242define dereferenceable(2) i8* @f39(i8* dereferenceable(1) %a) { 243; CHECK-TYPED: define dereferenceable(2) i8* @f39(i8* dereferenceable(1) %a) { 244; CHECK-OPAQUE: define dereferenceable(2) ptr @f39(ptr dereferenceable(1) %a) { 245 ret i8* %a 246} 247 248define dereferenceable(18446744073709551606) i8* @f40(i8* dereferenceable(18446744073709551615) %a) { 249; CHECK-TYPED: define dereferenceable(18446744073709551606) i8* @f40(i8* dereferenceable(18446744073709551615) %a) { 250; CHECK-OPAQUE: define dereferenceable(18446744073709551606) ptr @f40(ptr dereferenceable(18446744073709551615) %a) { 251 ret i8* %a 252} 253 254define void @f41(i8* align 32 %0, double* align 64 %1) { 255; CHECK-TYPED: define void @f41(i8* align 32 %0, double* align 64 %1) { 256; CHECK-OPAQUE: define void @f41(ptr align 32 %0, ptr align 64 %1) { 257 ret void 258} 259 260; CHECK-TYPED: define dereferenceable_or_null(8) i8* @f42(i8* dereferenceable_or_null(8) %foo) 261; CHECK-OPAQUE: define dereferenceable_or_null(8) ptr @f42(ptr dereferenceable_or_null(8) %foo) 262define dereferenceable_or_null(8) i8* @f42(i8* dereferenceable_or_null(8) %foo) { 263 entry: 264 ret i8* %foo 265} 266 267; CHECK: define void @f43() #25 268define void @f43() convergent { 269 ret void 270} 271 272define void @f44() argmemonly 273; CHECK: define void @f44() #26 274{ 275 ret void; 276} 277 278; CHECK: define "string_attribute" void @f45(i32 "string_attribute" %0) 279define "string_attribute" void @f45(i32 "string_attribute" %0) { 280 ret void 281} 282 283; CHECK: define "string_attribute_with_value"="value" void @f46(i32 "string_attribute_with_value"="value" %0) 284define "string_attribute_with_value"="value" void @f46(i32 "string_attribute_with_value"="value" %0) { 285 ret void 286} 287 288; CHECK: define void @f47() #27 289define void @f47() norecurse { 290 ret void 291} 292 293; CHECK: define void @f48() #28 294define void @f48() inaccessiblememonly { 295 ret void 296} 297 298; CHECK: define void @f49() #29 299define void @f49() inaccessiblemem_or_argmemonly { 300 ret void 301} 302 303; CHECK-TYPED: define void @f50(i8* swiftself %0) 304; CHECK-OPAQUE: define void @f50(ptr swiftself %0) 305define void @f50(i8* swiftself %0) 306{ 307 ret void; 308} 309 310; CHECK-TYPED: define i32 @f51(i8** swifterror %0) 311; CHECK-OPAQUE: define i32 @f51(ptr swifterror %0) 312define i32 @f51(i8** swifterror %0) 313{ 314 ret i32 0 315} 316 317; CHECK-TYPED: define i32 @f52(i32 %0, i8** swifterror %1) 318; CHECK-OPAQUE: define i32 @f52(i32 %0, ptr swifterror %1) 319define i32 @f52(i32 %0, i8** swifterror %1) 320{ 321 ret i32 0 322} 323 324%swift_error = type {i64, i8} 325declare float @foo(%swift_error** swifterror %error_ptr_ref) 326 327; CHECK: define float @f53 328; CHECK: alloca swifterror 329define float @f53(i8* %error_ref) { 330entry: 331 %error_ptr_ref = alloca swifterror %swift_error* 332 store %swift_error* null, %swift_error** %error_ptr_ref 333 %call = call float @foo(%swift_error** swifterror %error_ptr_ref) 334 ret float 1.0 335} 336 337; CHECK-TYPED: define i8* @f54(i32 %0) #30 338; CHECK-OPAQUE: define ptr @f54(i32 %0) #30 339define i8* @f54(i32 %0) allocsize(0) { 340 ret i8* null 341} 342 343; CHECK-TYPED: define i8* @f55(i32 %0, i32 %1) #31 344; CHECK-OPAQUE: define ptr @f55(i32 %0, i32 %1) #31 345define i8* @f55(i32 %0, i32 %1) allocsize(0, 1) { 346 ret i8* null 347} 348 349; CHECK: define void @f56() #32 350define void @f56() writeonly 351{ 352 ret void 353} 354 355; CHECK: define void @f57() #33 356define void @f57() speculatable { 357 ret void 358} 359 360; CHECK: define void @f58() #34 361define void @f58() sanitize_hwaddress 362{ 363 ret void; 364} 365 366; CHECK: define void @f59() #35 367define void @f59() shadowcallstack 368{ 369 ret void 370} 371 372; CHECK: define void @f60() #36 373define void @f60() willreturn 374{ 375 ret void 376} 377 378; CHECK: define void @f61() #37 379define void @f61() nofree { 380 ret void 381} 382 383; CHECK: define void @f62() #38 384define void @f62() nosync 385{ 386 ret void 387} 388 389; CHECK: define void @f63() #39 390define void @f63() sanitize_memtag 391{ 392 ret void 393} 394 395; CHECK-TYPED: define void @f64(i32* preallocated(i32) %a) 396; CHECK-OPAQUE: define void @f64(ptr preallocated(i32) %a) 397define void @f64(i32* preallocated(i32) %a) 398{ 399 ret void 400} 401 402; CHECK: define void @f65() #40 403define void @f65() null_pointer_is_valid 404{ 405 ret void; 406} 407 408; CHECK: define noundef i32 @f66(i32 noundef %a) 409define noundef i32 @f66(i32 noundef %a) 410{ 411 ret i32 %a 412} 413 414; CHECK-TYPED: define void @f67(i32* byref(i32) %a) 415; CHECK-OPAQUE: define void @f67(ptr byref(i32) %a) 416define void @f67(i32* byref(i32) %a) 417{ 418 ret void 419} 420 421; CHECK: define void @f68() #41 422define void @f68() mustprogress 423{ 424 ret void 425} 426 427; CHECK: define void @f69() #42 428define void @f69() nocallback 429{ 430 ret void 431} 432 433; CHECK: define void @f70() #43 434define void @f70() cold 435{ 436 ret void 437} 438 439; CHECK: define void @f71() #44 440define void @f71() hot 441{ 442 ret void 443} 444 445; CHECK: define void @f72() #45 446define void @f72() vscale_range(8) 447{ 448 ret void 449} 450 451; CHECK: define void @f73() #46 452define void @f73() vscale_range(1,8) 453{ 454 ret void 455} 456 457; CHECK: define void @f74() #47 458define void @f74() vscale_range(1,0) 459{ 460 ret void 461} 462 463; CHECK-TYPED: define void @f76(i8* swiftasync %0) 464; CHECK-OPAQUE: define void @f76(ptr swiftasync %0) 465define void @f76(i8* swiftasync %0) 466{ 467 ret void; 468} 469 470; CHECK: define void @f77() #48 471define void @f77() nosanitize_coverage 472{ 473 ret void; 474} 475 476; CHECK: define void @f78() #49 477define void @f78() noprofile 478{ 479 ret void; 480} 481 482declare void @llvm.some.intrinsic(i32*) 483define void @f79() { 484; CHECK-TYPED: call void @llvm.some.intrinsic(i32* elementtype(i32) null) 485; CHECK-OPAQUE: call void @llvm.some.intrinsic(ptr elementtype(i32) null) 486 call void @llvm.some.intrinsic(i32* elementtype(i32) null) 487 ret void 488} 489 490; CHECK: define void @f80() #50 491define void @f80() disable_sanitizer_instrumentation 492{ 493 ret void; 494} 495 496define void @f81(i8** sret(i8*) %0) 497; CHECK-TYPED: define void @f81(i8** sret(i8*) %0) 498; CHECK-OPAQUE: define void @f81(ptr sret(ptr) %0) 499{ 500 ret void; 501} 502 503define void @f82(i32* %0) 504; CHECK-TYPED: define void @f82(i32* %0) 505; CHECK-OPAQUE: define void @f82(ptr %0) 506{ 507; CHECK-TYPED: call void @llvm.some.intrinsic(i32* sret(i32) %0) 508; CHECK-OPAQUE: call void @llvm.some.intrinsic(ptr sret(i32) %0) 509 call void @llvm.some.intrinsic(i32* sret(i32) %0) 510 ret void; 511} 512 513; CHECK-TYPED: define void @f83(<4 x i8*> align 32 %0, <vscale x 1 x double*> align 64 %1) 514; CHECK-OPQUE: define void @f83(<4 x ptr> align 32 %0, <vscale x 1 x ptr> align 64 %1) 515define void @f83(<4 x i8*> align 32 %0, <vscale x 1 x double*> align 64 %1) { 516 ret void 517} 518 519; CHECK: define void @f84() #51 520define void @f84() uwtable(sync) { 521 ret void; 522} 523 524; CHECK: define void @f85() #15 525define void @f85() uwtable(async) { 526 ret void; 527} 528 529; CHECK: define void @f86() #52 530define void @f86() nosanitize_bounds 531{ 532 ret void; 533} 534 535; CHECK: define void @f87() [[FNRETTHUNKEXTERN:#[0-9]+]] 536define void @f87() fn_ret_thunk_extern { ret void } 537 538; CHECK: attributes #0 = { noreturn } 539; CHECK: attributes #1 = { nounwind } 540; CHECK: attributes #2 = { readnone } 541; CHECK: attributes #3 = { readonly } 542; CHECK: attributes #4 = { noinline } 543; CHECK: attributes #5 = { alwaysinline } 544; CHECK: attributes #6 = { optsize } 545; CHECK: attributes #7 = { ssp } 546; CHECK: attributes #8 = { sspreq } 547; CHECK: attributes #9 = { noredzone } 548; CHECK: attributes #10 = { noimplicitfloat } 549; CHECK: attributes #11 = { naked } 550; CHECK: attributes #12 = { inlinehint } 551; CHECK: attributes #13 = { alignstack=4 } 552; CHECK: attributes #14 = { returns_twice } 553; CHECK: attributes #15 = { uwtable } 554; CHECK: attributes #16 = { nonlazybind } 555; CHECK: attributes #17 = { sanitize_address } 556; CHECK: attributes #18 = { sanitize_thread } 557; CHECK: attributes #19 = { sanitize_memory } 558; CHECK: attributes #20 = { "cpu"="cortex-a8" } 559; CHECK: attributes #21 = { sspstrong } 560; CHECK: attributes #22 = { minsize } 561; CHECK: attributes #23 = { noinline optnone } 562; CHECK: attributes #24 = { jumptable } 563; CHECK: attributes #25 = { convergent } 564; CHECK: attributes #26 = { argmemonly } 565; CHECK: attributes #27 = { norecurse } 566; CHECK: attributes #28 = { inaccessiblememonly } 567; CHECK: attributes #29 = { inaccessiblemem_or_argmemonly } 568; CHECK: attributes #30 = { allocsize(0) } 569; CHECK: attributes #31 = { allocsize(0,1) } 570; CHECK: attributes #32 = { writeonly } 571; CHECK: attributes #33 = { speculatable } 572; CHECK: attributes #34 = { sanitize_hwaddress } 573; CHECK: attributes #35 = { shadowcallstack } 574; CHECK: attributes #36 = { willreturn } 575; CHECK: attributes #37 = { nofree } 576; CHECK: attributes #38 = { nosync } 577; CHECK: attributes #39 = { sanitize_memtag } 578; CHECK: attributes #40 = { null_pointer_is_valid } 579; CHECK: attributes #41 = { mustprogress } 580; CHECK: attributes #42 = { nocallback } 581; CHECK: attributes #43 = { cold } 582; CHECK: attributes #44 = { hot } 583; CHECK: attributes #45 = { vscale_range(8,8) } 584; CHECK: attributes #46 = { vscale_range(1,8) } 585; CHECK: attributes #47 = { vscale_range(1,0) } 586; CHECK: attributes #48 = { nosanitize_coverage } 587; CHECK: attributes #49 = { noprofile } 588; CHECK: attributes #50 = { disable_sanitizer_instrumentation } 589; CHECK: attributes #51 = { uwtable(sync) } 590; CHECK: attributes #52 = { nosanitize_bounds } 591; CHECK: attributes [[FNRETTHUNKEXTERN]] = { fn_ret_thunk_extern } 592; CHECK: attributes #[[NOBUILTIN]] = { nobuiltin } 593