1; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 2 3; Stackmap Header: no constants - 6 callsites 4; CHECK: .section .llvm_stackmaps 5; CHECK-NEXT: __LLVM_StackMaps: 6; Header 7; CHECK-NEXT: .byte 3 8; CHECK-NEXT: .byte 0 9; CHECK-NEXT: .short 0 10; Num Functions 11; CHECK-NEXT: .long 8 12; Num Constants 13; CHECK-NEXT: .long 0 14; Num Callsites 15; CHECK-NEXT: .long 8 16 17; Functions and stack size 18; CHECK-NEXT: .quad test 19; CHECK-NEXT: .quad 160 20; CHECK-NEXT: .quad 1 21; CHECK-NEXT: .quad property_access1 22; CHECK-NEXT: .quad 160 23; CHECK-NEXT: .quad 1 24; CHECK-NEXT: .quad property_access2 25; CHECK-NEXT: .quad 168 26; CHECK-NEXT: .quad 1 27; CHECK-NEXT: .quad property_access3 28; CHECK-NEXT: .quad 168 29; CHECK-NEXT: .quad 1 30; CHECK-NEXT: .quad anyreg_test1 31; CHECK-NEXT: .quad 160 32; CHECK-NEXT: .quad 1 33; CHECK-NEXT: .quad anyreg_test2 34; CHECK-NEXT: .quad 160 35; CHECK-NEXT: .quad 1 36; CHECK-NEXT: .quad patchpoint_spilldef 37; CHECK-NEXT: .quad 168 38; CHECK-NEXT: .quad 1 39; CHECK-NEXT: .quad patchpoint_spillargs 40; CHECK-NEXT: .quad 192 41; CHECK-NEXT: .quad 1 42 43; No constants 44 45; Callsites 46; test 47; CHECK: .long .L{{.*}}-test 48; CHECK-NEXT: .short 0 49; 3 locations 50; CHECK-NEXT: .short 3 51; Loc 0: Register 52; CHECK-NEXT: .byte 1 53; CHECK-NEXT: .byte 0 54; CHECK-NEXT: .short 4 55; CHECK-NEXT: .short {{[0-9]+}} 56; CHECK-NEXT: .short 0 57; CHECK-NEXT: .long 0 58; Loc 1: Register 59; CHECK-NEXT: .byte 1 60; CHECK-NEXT: .byte 0 61; CHECK-NEXT: .short 4 62; CHECK-NEXT: .short {{[0-9]+}} 63; CHECK-NEXT: .short 0 64; CHECK-NEXT: .long 0 65; Loc 2: Constant 3 66; CHECK-NEXT: .byte 4 67; CHECK-NEXT: .byte 0 68; CHECK-NEXT: .short 8 69; CHECK-NEXT: .short 0 70; CHECK-NEXT: .short 0 71; CHECK-NEXT: .long 3 72define i64 @test() nounwind ssp uwtable { 73entry: 74 call anyregcc void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 0, i32 14, i8* null, i32 2, i32 1, i32 2, i64 3) 75 ret i64 0 76} 77 78; property access 1 - %obj is an anyreg call argument and should therefore be in a register 79; CHECK: .long .L{{.*}}-property_access1 80; CHECK-NEXT: .short 0 81; 2 locations 82; CHECK-NEXT: .short 2 83; Loc 0: Register <-- this is the return register 84; CHECK-NEXT: .byte 1 85; CHECK-NEXT: .byte 0 86; CHECK-NEXT: .short 8 87; CHECK-NEXT: .short {{[0-9]+}} 88; CHECK-NEXT: .short 0 89; CHECK-NEXT: .long 0 90; Loc 1: Register 91; CHECK-NEXT: .byte 1 92; CHECK-NEXT: .byte 0 93; CHECK-NEXT: .short 8 94; CHECK-NEXT: .short {{[0-9]+}} 95; CHECK-NEXT: .short 0 96; CHECK-NEXT: .long 0 97define i64 @property_access1(i8* %obj) nounwind ssp uwtable { 98entry: 99 %f = inttoptr i64 12297829382473034410 to i8* 100 %ret = call anyregcc i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 1, i32 14, i8* %f, i32 1, i8* %obj) 101 ret i64 %ret 102} 103 104; property access 2 - %obj is an anyreg call argument and should therefore be in a register 105; CHECK: .long .L{{.*}}-property_access2 106; CHECK-NEXT: .short 0 107; 2 locations 108; CHECK-NEXT: .short 2 109; Loc 0: Register <-- this is the return register 110; CHECK-NEXT: .byte 1 111; CHECK-NEXT: .byte 0 112; CHECK-NEXT: .short 8 113; CHECK-NEXT: .short {{[0-9]+}} 114; CHECK-NEXT: .short 0 115; CHECK-NEXT: .long 0 116; Loc 1: Register 117; CHECK-NEXT: .byte 1 118; CHECK-NEXT: .byte 0 119; CHECK-NEXT: .short 8 120; CHECK-NEXT: .short {{[0-9]+}} 121; CHECK-NEXT: .short 0 122; CHECK-NEXT: .long 0 123define i64 @property_access2() nounwind ssp uwtable { 124entry: 125 %obj = alloca i64, align 8 126 %f = inttoptr i64 12297829382473034410 to i8* 127 %ret = call anyregcc i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 2, i32 14, i8* %f, i32 1, i64* %obj) 128 ret i64 %ret 129} 130 131; property access 3 - %obj is a frame index 132; CHECK: .long .L{{.*}}-property_access3 133; CHECK-NEXT: .short 0 134; 2 locations 135; CHECK-NEXT: .short 2 136; Loc 0: Register <-- this is the return register 137; CHECK-NEXT: .byte 1 138; CHECK-NEXT: .byte 0 139; CHECK-NEXT: .short 8 140; CHECK-NEXT: .short {{[0-9]+}} 141; CHECK-NEXT: .short 0 142; CHECK-NEXT: .long 0 143; Loc 1: Direct %r15 + 160 144; CHECK-NEXT: .byte 2 145; CHECK-NEXT: .byte 0 146; CHECK-NEXT: .short 8 147; CHECK-NEXT: .short 15 148; CHECK-NEXT: .short 0 149; CHECK-NEXT: .long 160 150define i64 @property_access3() nounwind ssp uwtable { 151entry: 152 %obj = alloca i64, align 8 153 %f = inttoptr i64 12297829382473034410 to i8* 154 %ret = call anyregcc i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 3, i32 14, i8* %f, i32 0, i64* %obj) 155 ret i64 %ret 156} 157 158; anyreg_test1 159; CHECK: .long .L{{.*}}-anyreg_test1 160; CHECK-NEXT: .short 0 161; 13 locations 162; CHECK-NEXT: .short 13 163; Loc 0: Register <-- this is the return register 164; CHECK-NEXT: .byte 1 165; CHECK-NEXT: .byte 0 166; CHECK-NEXT: .short 8 167; CHECK-NEXT: .short {{[0-9]+}} 168; CHECK-NEXT: .short 0 169; CHECK-NEXT: .long 0 170; Loc 1: Register 171; CHECK-NEXT: .byte 1 172; CHECK-NEXT: .byte 0 173; CHECK-NEXT: .short 8 174; CHECK-NEXT: .short {{[0-9]+}} 175; CHECK-NEXT: .short 0 176; CHECK-NEXT: .long 0 177; Loc 2: Register 178; CHECK-NEXT: .byte 1 179; CHECK-NEXT: .byte 0 180; CHECK-NEXT: .short 8 181; CHECK-NEXT: .short {{[0-9]+}} 182; CHECK-NEXT: .short 0 183; CHECK-NEXT: .long 0 184; Loc 3: Register 185; CHECK-NEXT: .byte 1 186; CHECK-NEXT: .byte 0 187; CHECK-NEXT: .short 8 188; CHECK-NEXT: .short {{[0-9]+}} 189; CHECK-NEXT: .short 0 190; CHECK-NEXT: .long 0 191; Loc 4: Register 192; CHECK-NEXT: .byte 1 193; CHECK-NEXT: .byte 0 194; CHECK-NEXT: .short 8 195; CHECK-NEXT: .short {{[0-9]+}} 196; CHECK-NEXT: .short 0 197; CHECK-NEXT: .long 0 198; Loc 5: Register 199; CHECK-NEXT: .byte 1 200; CHECK-NEXT: .byte 0 201; CHECK-NEXT: .short 8 202; CHECK-NEXT: .short {{[0-9]+}} 203; CHECK-NEXT: .short 0 204; CHECK-NEXT: .long 0 205; Loc 6: Register 206; CHECK-NEXT: .byte 1 207; CHECK-NEXT: .byte 0 208; CHECK-NEXT: .short 8 209; CHECK-NEXT: .short {{[0-9]+}} 210; CHECK-NEXT: .short 0 211; CHECK-NEXT: .long 0 212; Loc 7: Register 213; CHECK-NEXT: .byte 1 214; CHECK-NEXT: .byte 0 215; CHECK-NEXT: .short 8 216; CHECK-NEXT: .short {{[0-9]+}} 217; CHECK-NEXT: .short 0 218; CHECK-NEXT: .long 0 219; Loc 8: Register 220; CHECK-NEXT: .byte 1 221; CHECK-NEXT: .byte 0 222; CHECK-NEXT: .short 8 223; CHECK-NEXT: .short {{[0-9]+}} 224; CHECK-NEXT: .short 0 225; CHECK-NEXT: .long 0 226; Loc 9: Register 227; CHECK-NEXT: .byte 1 228; CHECK-NEXT: .byte 0 229; CHECK-NEXT: .short 8 230; CHECK-NEXT: .short {{[0-9]+}} 231; CHECK-NEXT: .short 0 232; CHECK-NEXT: .long 0 233; Loc 10: Register 234; CHECK-NEXT: .byte 1 235; CHECK-NEXT: .byte 0 236; CHECK-NEXT: .short 8 237; CHECK-NEXT: .short {{[0-9]+}} 238; CHECK-NEXT: .short 0 239; CHECK-NEXT: .long 0 240; Loc 11: Register 241; CHECK-NEXT: .byte 1 242; CHECK-NEXT: .byte 0 243; CHECK-NEXT: .short 8 244; CHECK-NEXT: .short {{[0-9]+}} 245; CHECK-NEXT: .short 0 246; CHECK-NEXT: .long 0 247; Loc 12: Register 248; CHECK-NEXT: .byte 1 249; CHECK-NEXT: .byte 0 250; CHECK-NEXT: .short 8 251; CHECK-NEXT: .short {{[0-9]+}} 252; CHECK-NEXT: .short 0 253; CHECK-NEXT: .long 0 254define i64 @anyreg_test1(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12) nounwind ssp uwtable { 255entry: 256 %f = inttoptr i64 12297829382473034410 to i8* 257 %ret = call anyregcc i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 4, i32 14, i8* %f, i32 12, i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12) 258 ret i64 %ret 259} 260 261; anyreg_test2 262; CHECK: .long .L{{.*}}-anyreg_test2 263; CHECK-NEXT: .short 0 264; 13 locations 265; CHECK-NEXT: .short 13 266; Loc 0: Register <-- this is the return register 267; CHECK-NEXT: .byte 1 268; CHECK-NEXT: .byte 0 269; CHECK-NEXT: .short 8 270; CHECK-NEXT: .short {{[0-9]+}} 271; CHECK-NEXT: .short 0 272; CHECK-NEXT: .long 0 273; Loc 1: Register 274; CHECK-NEXT: .byte 1 275; CHECK-NEXT: .byte 0 276; CHECK-NEXT: .short 8 277; CHECK-NEXT: .short {{[0-9]+}} 278; CHECK-NEXT: .short 0 279; CHECK-NEXT: .long 0 280; Loc 2: Register 281; CHECK-NEXT: .byte 1 282; CHECK-NEXT: .byte 0 283; CHECK-NEXT: .short 8 284; CHECK-NEXT: .short {{[0-9]+}} 285; CHECK-NEXT: .short 0 286; CHECK-NEXT: .long 0 287; Loc 3: Register 288; CHECK-NEXT: .byte 1 289; CHECK-NEXT: .byte 0 290; CHECK-NEXT: .short 8 291; CHECK-NEXT: .short {{[0-9]+}} 292; CHECK-NEXT: .short 0 293; CHECK-NEXT: .long 0 294; Loc 4: Register 295; CHECK-NEXT: .byte 1 296; CHECK-NEXT: .byte 0 297; CHECK-NEXT: .short 8 298; CHECK-NEXT: .short {{[0-9]+}} 299; CHECK-NEXT: .short 0 300; CHECK-NEXT: .long 0 301; Loc 5: Register 302; CHECK-NEXT: .byte 1 303; CHECK-NEXT: .byte 0 304; CHECK-NEXT: .short 8 305; CHECK-NEXT: .short {{[0-9]+}} 306; CHECK-NEXT: .short 0 307; CHECK-NEXT: .long 0 308; Loc 6: Register 309; CHECK-NEXT: .byte 1 310; CHECK-NEXT: .byte 0 311; CHECK-NEXT: .short 8 312; CHECK-NEXT: .short {{[0-9]+}} 313; CHECK-NEXT: .short 0 314; CHECK-NEXT: .long 0 315; Loc 7: Register 316; CHECK-NEXT: .byte 1 317; CHECK-NEXT: .byte 0 318; CHECK-NEXT: .short 8 319; CHECK-NEXT: .short {{[0-9]+}} 320; CHECK-NEXT: .short 0 321; CHECK-NEXT: .long 0 322; Loc 8: Register 323; CHECK-NEXT: .byte 1 324; CHECK-NEXT: .byte 0 325; CHECK-NEXT: .short 8 326; CHECK-NEXT: .short {{[0-9]+}} 327; CHECK-NEXT: .short 0 328; CHECK-NEXT: .long 0 329; Loc 9: Register 330; CHECK-NEXT: .byte 1 331; CHECK-NEXT: .byte 0 332; CHECK-NEXT: .short 8 333; CHECK-NEXT: .short {{[0-9]+}} 334; CHECK-NEXT: .short 0 335; CHECK-NEXT: .long 0 336; Loc 10: Register 337; CHECK-NEXT: .byte 1 338; CHECK-NEXT: .byte 0 339; CHECK-NEXT: .short 8 340; CHECK-NEXT: .short {{[0-9]+}} 341; CHECK-NEXT: .short 0 342; CHECK-NEXT: .long 0 343; Loc 11: Register 344; CHECK-NEXT: .byte 1 345; CHECK-NEXT: .byte 0 346; CHECK-NEXT: .short 8 347; CHECK-NEXT: .short {{[0-9]+}} 348; CHECK-NEXT: .short 0 349; CHECK-NEXT: .long 0 350; Loc 12: Register 351; CHECK-NEXT: .byte 1 352; CHECK-NEXT: .byte 0 353; CHECK-NEXT: .short 8 354; CHECK-NEXT: .short {{[0-9]+}} 355; CHECK-NEXT: .short 0 356; CHECK-NEXT: .long 0 357define i64 @anyreg_test2(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12) nounwind ssp uwtable { 358entry: 359 %f = inttoptr i64 12297829382473034410 to i8* 360 %ret = call anyregcc i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 5, i32 14, i8* %f, i32 8, i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12) 361 ret i64 %ret 362} 363 364; Test spilling the return value of an anyregcc call. 365; 366; <rdar://problem/15432754> [JS] Assertion: "Folded a def to a non-store!" 367; 368; CHECK: .long .L{{.*}}-patchpoint_spilldef 369; CHECK-NEXT: .short 0 370; CHECK-NEXT: .short 3 371; Loc 0: Register (some register that will be spilled to the stack) 372; CHECK-NEXT: .byte 1 373; CHECK-NEXT: .byte 0 374; CHECK-NEXT: .short 8 375; CHECK-NEXT: .short {{[0-9]+}} 376; CHECK-NEXT: .short 0 377; CHECK-NEXT: .long 0 378; Loc 1: Register %r2 379; CHECK-NEXT: .byte 1 380; CHECK-NEXT: .byte 0 381; CHECK-NEXT: .short 8 382; CHECK-NEXT: .short 2 383; CHECK-NEXT: .short 0 384; CHECK-NEXT: .long 0 385; Loc 1: Register %r3 386; CHECK-NEXT: .byte 1 387; CHECK-NEXT: .byte 0 388; CHECK-NEXT: .short 8 389; CHECK-NEXT: .short 3 390; CHECK-NEXT: .short 0 391; CHECK-NEXT: .long 0 392define i64 @patchpoint_spilldef(i64 %p1, i64 %p2, i64 %p3, i64 %p4) { 393entry: 394 %result = tail call anyregcc i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 12, i32 14, i8* inttoptr (i64 0 to i8*), i32 2, i64 %p1, i64 %p2) 395 tail call void asm sideeffect "nopr %r0", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14}"() nounwind 396 ret i64 %result 397} 398 399; Test spilling the arguments of an anyregcc call. 400; 401; <rdar://problem/15487687> [JS] AnyRegCC argument ends up being spilled 402; 403; CHECK: .long .L{{.*}}-patchpoint_spillargs 404; CHECK-NEXT: .short 0 405; CHECK-NEXT: .short 5 406; Loc 0: Return a register 407; CHECK-NEXT: .byte 1 408; CHECK-NEXT: .byte 0 409; CHECK-NEXT: .short 8 410; CHECK-NEXT: .short {{[0-9]+}} 411; CHECK-NEXT: .short 0 412; CHECK-NEXT: .long 0 413; Loc 1: Arg0 in a Register 414; CHECK-NEXT: .byte 1 415; CHECK-NEXT: .byte 0 416; CHECK-NEXT: .short 8 417; CHECK-NEXT: .short {{[0-9]+}} 418; CHECK-NEXT: .short 0 419; CHECK-NEXT: .long 0 420; Loc 2: Arg1 in a Register 421; CHECK-NEXT: .byte 1 422; CHECK-NEXT: .byte 0 423; CHECK-NEXT: .short 8 424; CHECK-NEXT: .short {{[0-9]+}} 425; CHECK-NEXT: .short 0 426; CHECK-NEXT: .long 0 427; Loc 3: Arg2 spilled to %r15 + 428; CHECK-NEXT: .byte 3 429; CHECK-NEXT: .byte 0 430; CHECK-NEXT: .short 8 431; CHECK-NEXT: .short 15 432; CHECK-NEXT: .short 0 433; CHECK-NEXT: .long 434; Loc 4: Arg3 spilled to %r15 + 435; CHECK-NEXT: .byte 3 436; CHECK-NEXT: .byte 0 437; CHECK-NEXT: .short 8 438; CHECK-NEXT: .short 15 439; CHECK-NEXT: .short 0 440; CHECK-NEXT: .long 441define i64 @patchpoint_spillargs(i64 %p1, i64 %p2, i64 %p3, i64 %p4) { 442entry: 443 tail call void asm sideeffect "nopr %r0", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14}"() nounwind 444 %result = tail call anyregcc i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 13, i32 14, i8* inttoptr (i64 0 to i8*), i32 2, i64 %p1, i64 %p2, i64 %p3, i64 %p4) 445 ret i64 %result 446} 447 448declare void @llvm.experimental.patchpoint.void(i64, i32, i8*, i32, ...) 449declare i64 @llvm.experimental.patchpoint.i64(i64, i32, i8*, i32, ...) 450