1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -verify-machineinstrs | FileCheck %s 3; REQUIRES: webassembly-registered-target 4target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20" 5target triple = "wasm32-unknown-unknown" 6 7; Function Attrs: nounwind 8define void @pass_s0() { 9; CHECK-LABEL: pass_s0: 10; CHECK: .functype pass_s0 () -> () 11; CHECK-NEXT: # %bb.0: # %entry 12; CHECK-NEXT: i32.const 0 13; CHECK-NEXT: call sink 14; CHECK-NEXT: # fallthrough-return 15entry: 16 tail call void (...) @sink() 17 ret void 18} 19 20declare void @sink(...) 21 22; Function Attrs: nounwind 23define void @pass_s1(i8 %x.coerce) { 24; CHECK-LABEL: pass_s1: 25; CHECK: .functype pass_s1 (i32) -> () 26; CHECK-NEXT: .local i32 27; CHECK-NEXT: # %bb.0: # %entry 28; CHECK-NEXT: global.get __stack_pointer 29; CHECK-NEXT: i32.const 16 30; CHECK-NEXT: i32.sub 31; CHECK-NEXT: local.tee 1 32; CHECK-NEXT: global.set __stack_pointer 33; CHECK-NEXT: local.get 1 34; CHECK-NEXT: local.get 0 35; CHECK-NEXT: i32.store 0 36; CHECK-NEXT: local.get 1 37; CHECK-NEXT: call sink 38; CHECK-NEXT: local.get 1 39; CHECK-NEXT: i32.const 16 40; CHECK-NEXT: i32.add 41; CHECK-NEXT: global.set __stack_pointer 42; CHECK-NEXT: # fallthrough-return 43entry: 44 tail call void (...) @sink(i8 %x.coerce) 45 ret void 46} 47 48; Function Attrs: nounwind 49define void @pass_s2(i16 %x.coerce) { 50; CHECK-LABEL: pass_s2: 51; CHECK: .functype pass_s2 (i32) -> () 52; CHECK-NEXT: .local i32 53; CHECK-NEXT: # %bb.0: # %entry 54; CHECK-NEXT: global.get __stack_pointer 55; CHECK-NEXT: i32.const 16 56; CHECK-NEXT: i32.sub 57; CHECK-NEXT: local.tee 1 58; CHECK-NEXT: global.set __stack_pointer 59; CHECK-NEXT: local.get 1 60; CHECK-NEXT: local.get 0 61; CHECK-NEXT: i32.store 0 62; CHECK-NEXT: local.get 1 63; CHECK-NEXT: call sink 64; CHECK-NEXT: local.get 1 65; CHECK-NEXT: i32.const 16 66; CHECK-NEXT: i32.add 67; CHECK-NEXT: global.set __stack_pointer 68; CHECK-NEXT: # fallthrough-return 69entry: 70 tail call void (...) @sink(i16 %x.coerce) 71 ret void 72} 73 74; Function Attrs: nounwind 75define void @pass_s3(i32 %x.coerce) { 76; CHECK-LABEL: pass_s3: 77; CHECK: .functype pass_s3 (i32) -> () 78; CHECK-NEXT: .local i32 79; CHECK-NEXT: # %bb.0: # %entry 80; CHECK-NEXT: global.get __stack_pointer 81; CHECK-NEXT: i32.const 16 82; CHECK-NEXT: i32.sub 83; CHECK-NEXT: local.tee 1 84; CHECK-NEXT: global.set __stack_pointer 85; CHECK-NEXT: local.get 1 86; CHECK-NEXT: local.get 0 87; CHECK-NEXT: i32.store 0 88; CHECK-NEXT: local.get 1 89; CHECK-NEXT: call sink 90; CHECK-NEXT: local.get 1 91; CHECK-NEXT: i32.const 16 92; CHECK-NEXT: i32.add 93; CHECK-NEXT: global.set __stack_pointer 94; CHECK-NEXT: # fallthrough-return 95entry: 96 tail call void (...) @sink(i32 %x.coerce) 97 ret void 98} 99 100; Function Attrs: nounwind 101define void @pass_s4(i64 %x.coerce) { 102; CHECK-LABEL: pass_s4: 103; CHECK: .functype pass_s4 (i64) -> () 104; CHECK-NEXT: .local i32 105; CHECK-NEXT: # %bb.0: # %entry 106; CHECK-NEXT: global.get __stack_pointer 107; CHECK-NEXT: i32.const 16 108; CHECK-NEXT: i32.sub 109; CHECK-NEXT: local.tee 1 110; CHECK-NEXT: global.set __stack_pointer 111; CHECK-NEXT: local.get 1 112; CHECK-NEXT: local.get 0 113; CHECK-NEXT: i64.store 0 114; CHECK-NEXT: local.get 1 115; CHECK-NEXT: call sink 116; CHECK-NEXT: local.get 1 117; CHECK-NEXT: i32.const 16 118; CHECK-NEXT: i32.add 119; CHECK-NEXT: global.set __stack_pointer 120; CHECK-NEXT: # fallthrough-return 121entry: 122 tail call void (...) @sink(i64 %x.coerce) 123 ret void 124} 125 126; Function Attrs: nounwind 127define void @pass_s5(<4 x i32> noundef %x) { 128; CHECK-LABEL: pass_s5: 129; CHECK: .functype pass_s5 (i32, i32, i32, i32) -> () 130; CHECK-NEXT: .local i32 131; CHECK-NEXT: # %bb.0: # %entry 132; CHECK-NEXT: global.get __stack_pointer 133; CHECK-NEXT: i32.const 16 134; CHECK-NEXT: i32.sub 135; CHECK-NEXT: local.tee 4 136; CHECK-NEXT: global.set __stack_pointer 137; CHECK-NEXT: local.get 4 138; CHECK-NEXT: local.get 3 139; CHECK-NEXT: i32.store 12 140; CHECK-NEXT: local.get 4 141; CHECK-NEXT: local.get 2 142; CHECK-NEXT: i32.store 8 143; CHECK-NEXT: local.get 4 144; CHECK-NEXT: local.get 1 145; CHECK-NEXT: i32.store 4 146; CHECK-NEXT: local.get 4 147; CHECK-NEXT: local.get 0 148; CHECK-NEXT: i32.store 0 149; CHECK-NEXT: local.get 4 150; CHECK-NEXT: call sink 151; CHECK-NEXT: local.get 4 152; CHECK-NEXT: i32.const 16 153; CHECK-NEXT: i32.add 154; CHECK-NEXT: global.set __stack_pointer 155; CHECK-NEXT: # fallthrough-return 156entry: 157 tail call void (...) @sink(<4 x i32> noundef %x) 158 ret void 159} 160 161; Function Attrs: nounwind 162define void @pass_int_s0(i32 noundef %i) { 163; CHECK-LABEL: pass_int_s0: 164; CHECK: .functype pass_int_s0 (i32) -> () 165; CHECK-NEXT: .local i32 166; CHECK-NEXT: # %bb.0: # %entry 167; CHECK-NEXT: global.get __stack_pointer 168; CHECK-NEXT: i32.const 16 169; CHECK-NEXT: i32.sub 170; CHECK-NEXT: local.tee 1 171; CHECK-NEXT: global.set __stack_pointer 172; CHECK-NEXT: local.get 1 173; CHECK-NEXT: local.get 0 174; CHECK-NEXT: i32.store 0 175; CHECK-NEXT: local.get 1 176; CHECK-NEXT: call sink 177; CHECK-NEXT: local.get 1 178; CHECK-NEXT: i32.const 16 179; CHECK-NEXT: i32.add 180; CHECK-NEXT: global.set __stack_pointer 181; CHECK-NEXT: # fallthrough-return 182entry: 183 tail call void (...) @sink(i32 noundef %i) 184 ret void 185} 186 187; Function Attrs: nounwind 188define void @pass_int_s1(i32 noundef %i, i8 %x.coerce) { 189; CHECK-LABEL: pass_int_s1: 190; CHECK: .functype pass_int_s1 (i32, i32) -> () 191; CHECK-NEXT: .local i32 192; CHECK-NEXT: # %bb.0: # %entry 193; CHECK-NEXT: global.get __stack_pointer 194; CHECK-NEXT: i32.const 16 195; CHECK-NEXT: i32.sub 196; CHECK-NEXT: local.tee 2 197; CHECK-NEXT: global.set __stack_pointer 198; CHECK-NEXT: local.get 2 199; CHECK-NEXT: local.get 1 200; CHECK-NEXT: i32.store 4 201; CHECK-NEXT: local.get 2 202; CHECK-NEXT: local.get 0 203; CHECK-NEXT: i32.store 0 204; CHECK-NEXT: local.get 2 205; CHECK-NEXT: call sink 206; CHECK-NEXT: local.get 2 207; CHECK-NEXT: i32.const 16 208; CHECK-NEXT: i32.add 209; CHECK-NEXT: global.set __stack_pointer 210; CHECK-NEXT: # fallthrough-return 211entry: 212 tail call void (...) @sink(i32 noundef %i, i8 %x.coerce) 213 ret void 214} 215 216; Function Attrs: nounwind 217define void @pass_int_s2(i32 noundef %i, i16 %x.coerce) { 218; CHECK-LABEL: pass_int_s2: 219; CHECK: .functype pass_int_s2 (i32, i32) -> () 220; CHECK-NEXT: .local i32 221; CHECK-NEXT: # %bb.0: # %entry 222; CHECK-NEXT: global.get __stack_pointer 223; CHECK-NEXT: i32.const 16 224; CHECK-NEXT: i32.sub 225; CHECK-NEXT: local.tee 2 226; CHECK-NEXT: global.set __stack_pointer 227; CHECK-NEXT: local.get 2 228; CHECK-NEXT: local.get 1 229; CHECK-NEXT: i32.store 4 230; CHECK-NEXT: local.get 2 231; CHECK-NEXT: local.get 0 232; CHECK-NEXT: i32.store 0 233; CHECK-NEXT: local.get 2 234; CHECK-NEXT: call sink 235; CHECK-NEXT: local.get 2 236; CHECK-NEXT: i32.const 16 237; CHECK-NEXT: i32.add 238; CHECK-NEXT: global.set __stack_pointer 239; CHECK-NEXT: # fallthrough-return 240entry: 241 tail call void (...) @sink(i32 noundef %i, i16 %x.coerce) 242 ret void 243} 244 245; Function Attrs: nounwind 246define void @pass_int_s3(i32 noundef %i, i32 %x.coerce) { 247; CHECK-LABEL: pass_int_s3: 248; CHECK: .functype pass_int_s3 (i32, i32) -> () 249; CHECK-NEXT: .local i32 250; CHECK-NEXT: # %bb.0: # %entry 251; CHECK-NEXT: global.get __stack_pointer 252; CHECK-NEXT: i32.const 16 253; CHECK-NEXT: i32.sub 254; CHECK-NEXT: local.tee 2 255; CHECK-NEXT: global.set __stack_pointer 256; CHECK-NEXT: local.get 2 257; CHECK-NEXT: local.get 1 258; CHECK-NEXT: i32.store 4 259; CHECK-NEXT: local.get 2 260; CHECK-NEXT: local.get 0 261; CHECK-NEXT: i32.store 0 262; CHECK-NEXT: local.get 2 263; CHECK-NEXT: call sink 264; CHECK-NEXT: local.get 2 265; CHECK-NEXT: i32.const 16 266; CHECK-NEXT: i32.add 267; CHECK-NEXT: global.set __stack_pointer 268; CHECK-NEXT: # fallthrough-return 269entry: 270 tail call void (...) @sink(i32 noundef %i, i32 %x.coerce) 271 ret void 272} 273 274; Function Attrs: nounwind 275define void @pass_int_s4(i32 noundef %i, i64 %x.coerce) { 276; CHECK-LABEL: pass_int_s4: 277; CHECK: .functype pass_int_s4 (i32, i64) -> () 278; CHECK-NEXT: .local i32 279; CHECK-NEXT: # %bb.0: # %entry 280; CHECK-NEXT: global.get __stack_pointer 281; CHECK-NEXT: i32.const 16 282; CHECK-NEXT: i32.sub 283; CHECK-NEXT: local.tee 2 284; CHECK-NEXT: global.set __stack_pointer 285; CHECK-NEXT: local.get 2 286; CHECK-NEXT: local.get 1 287; CHECK-NEXT: i64.store 8 288; CHECK-NEXT: local.get 2 289; CHECK-NEXT: local.get 0 290; CHECK-NEXT: i32.store 0 291; CHECK-NEXT: local.get 2 292; CHECK-NEXT: call sink 293; CHECK-NEXT: local.get 2 294; CHECK-NEXT: i32.const 16 295; CHECK-NEXT: i32.add 296; CHECK-NEXT: global.set __stack_pointer 297; CHECK-NEXT: # fallthrough-return 298entry: 299 tail call void (...) @sink(i32 noundef %i, i64 %x.coerce) 300 ret void 301} 302 303; Function Attrs: nounwind 304define void @pass_int_s5(i32 noundef %i, <4 x i32> noundef %x) { 305; CHECK-LABEL: pass_int_s5: 306; CHECK: .functype pass_int_s5 (i32, i32, i32, i32, i32) -> () 307; CHECK-NEXT: .local i32 308; CHECK-NEXT: # %bb.0: # %entry 309; CHECK-NEXT: global.get __stack_pointer 310; CHECK-NEXT: i32.const 32 311; CHECK-NEXT: i32.sub 312; CHECK-NEXT: local.tee 5 313; CHECK-NEXT: global.set __stack_pointer 314; CHECK-NEXT: local.get 5 315; CHECK-NEXT: i32.const 28 316; CHECK-NEXT: i32.add 317; CHECK-NEXT: local.get 4 318; CHECK-NEXT: i32.store 0 319; CHECK-NEXT: local.get 5 320; CHECK-NEXT: i32.const 24 321; CHECK-NEXT: i32.add 322; CHECK-NEXT: local.get 3 323; CHECK-NEXT: i32.store 0 324; CHECK-NEXT: local.get 5 325; CHECK-NEXT: i32.const 20 326; CHECK-NEXT: i32.add 327; CHECK-NEXT: local.get 2 328; CHECK-NEXT: i32.store 0 329; CHECK-NEXT: local.get 5 330; CHECK-NEXT: i32.const 16 331; CHECK-NEXT: i32.add 332; CHECK-NEXT: local.get 1 333; CHECK-NEXT: i32.store 0 334; CHECK-NEXT: local.get 5 335; CHECK-NEXT: local.get 0 336; CHECK-NEXT: i32.store 0 337; CHECK-NEXT: local.get 5 338; CHECK-NEXT: call sink 339; CHECK-NEXT: local.get 5 340; CHECK-NEXT: i32.const 32 341; CHECK-NEXT: i32.add 342; CHECK-NEXT: global.set __stack_pointer 343; CHECK-NEXT: # fallthrough-return 344entry: 345 tail call void (...) @sink(i32 noundef %i, <4 x i32> noundef %x) 346 ret void 347} 348 349; Function Attrs: nounwind 350define void @pass_asc(i8 %x1.coerce, i16 %x2.coerce, i32 %x3.coerce, i64 %x4.coerce, <4 x i32> noundef %x5) { 351; CHECK-LABEL: pass_asc: 352; CHECK: .functype pass_asc (i32, i32, i32, i64, i32, i32, i32, i32) -> () 353; CHECK-NEXT: .local i32 354; CHECK-NEXT: # %bb.0: # %entry 355; CHECK-NEXT: global.get __stack_pointer 356; CHECK-NEXT: i32.const 48 357; CHECK-NEXT: i32.sub 358; CHECK-NEXT: local.tee 8 359; CHECK-NEXT: global.set __stack_pointer 360; CHECK-NEXT: local.get 8 361; CHECK-NEXT: i32.const 44 362; CHECK-NEXT: i32.add 363; CHECK-NEXT: local.get 7 364; CHECK-NEXT: i32.store 0 365; CHECK-NEXT: local.get 8 366; CHECK-NEXT: i32.const 40 367; CHECK-NEXT: i32.add 368; CHECK-NEXT: local.get 6 369; CHECK-NEXT: i32.store 0 370; CHECK-NEXT: local.get 8 371; CHECK-NEXT: i32.const 36 372; CHECK-NEXT: i32.add 373; CHECK-NEXT: local.get 5 374; CHECK-NEXT: i32.store 0 375; CHECK-NEXT: local.get 8 376; CHECK-NEXT: i32.const 32 377; CHECK-NEXT: i32.add 378; CHECK-NEXT: local.get 4 379; CHECK-NEXT: i32.store 0 380; CHECK-NEXT: local.get 8 381; CHECK-NEXT: i32.const 16 382; CHECK-NEXT: i32.add 383; CHECK-NEXT: local.get 3 384; CHECK-NEXT: i64.store 0 385; CHECK-NEXT: local.get 8 386; CHECK-NEXT: local.get 2 387; CHECK-NEXT: i32.store 8 388; CHECK-NEXT: local.get 8 389; CHECK-NEXT: local.get 1 390; CHECK-NEXT: i32.store 4 391; CHECK-NEXT: local.get 8 392; CHECK-NEXT: local.get 0 393; CHECK-NEXT: i32.store 0 394; CHECK-NEXT: local.get 8 395; CHECK-NEXT: call sink 396; CHECK-NEXT: local.get 8 397; CHECK-NEXT: i32.const 48 398; CHECK-NEXT: i32.add 399; CHECK-NEXT: global.set __stack_pointer 400; CHECK-NEXT: # fallthrough-return 401entry: 402 tail call void (...) @sink(i8 %x1.coerce, i16 %x2.coerce, i32 %x3.coerce, i64 %x4.coerce, <4 x i32> noundef %x5) 403 ret void 404} 405 406; Function Attrs: nounwind 407define void @pass_dsc(<4 x i32> noundef %x0, i64 %x1.coerce, i32 %x2.coerce, i16 %x3.coerce, i8 %x4.coerce) { 408; CHECK-LABEL: pass_dsc: 409; CHECK: .functype pass_dsc (i32, i32, i32, i32, i64, i32, i32, i32) -> () 410; CHECK-NEXT: .local i32 411; CHECK-NEXT: # %bb.0: # %entry 412; CHECK-NEXT: global.get __stack_pointer 413; CHECK-NEXT: i32.const 48 414; CHECK-NEXT: i32.sub 415; CHECK-NEXT: local.tee 8 416; CHECK-NEXT: global.set __stack_pointer 417; CHECK-NEXT: local.get 8 418; CHECK-NEXT: i32.const 32 419; CHECK-NEXT: i32.add 420; CHECK-NEXT: local.get 7 421; CHECK-NEXT: i32.store 0 422; CHECK-NEXT: local.get 8 423; CHECK-NEXT: i32.const 28 424; CHECK-NEXT: i32.add 425; CHECK-NEXT: local.get 6 426; CHECK-NEXT: i32.store 0 427; CHECK-NEXT: local.get 8 428; CHECK-NEXT: i32.const 24 429; CHECK-NEXT: i32.add 430; CHECK-NEXT: local.get 5 431; CHECK-NEXT: i32.store 0 432; CHECK-NEXT: local.get 8 433; CHECK-NEXT: i32.const 16 434; CHECK-NEXT: i32.add 435; CHECK-NEXT: local.get 4 436; CHECK-NEXT: i64.store 0 437; CHECK-NEXT: local.get 8 438; CHECK-NEXT: local.get 3 439; CHECK-NEXT: i32.store 12 440; CHECK-NEXT: local.get 8 441; CHECK-NEXT: local.get 2 442; CHECK-NEXT: i32.store 8 443; CHECK-NEXT: local.get 8 444; CHECK-NEXT: local.get 1 445; CHECK-NEXT: i32.store 4 446; CHECK-NEXT: local.get 8 447; CHECK-NEXT: local.get 0 448; CHECK-NEXT: i32.store 0 449; CHECK-NEXT: local.get 8 450; CHECK-NEXT: call sink 451; CHECK-NEXT: local.get 8 452; CHECK-NEXT: i32.const 48 453; CHECK-NEXT: i32.add 454; CHECK-NEXT: global.set __stack_pointer 455; CHECK-NEXT: # fallthrough-return 456entry: 457 tail call void (...) @sink(<4 x i32> noundef %x0, i64 %x1.coerce, i32 %x2.coerce, i16 %x3.coerce, i8 %x4.coerce) 458 ret void 459} 460 461; Function Attrs: nounwind 462define void @pass_multiple(i32 noundef %i, i8 %x1.coerce, i16 %x2.coerce, i32 %x3.coerce, i64 %x4.coerce, <4 x i32> noundef %x5) { 463; CHECK-LABEL: pass_multiple: 464; CHECK: .functype pass_multiple (i32, i32, i32, i32, i64, i32, i32, i32, i32) -> () 465; CHECK-NEXT: .local i32 466; CHECK-NEXT: # %bb.0: # %entry 467; CHECK-NEXT: global.get __stack_pointer 468; CHECK-NEXT: i32.const 48 469; CHECK-NEXT: i32.sub 470; CHECK-NEXT: local.tee 9 471; CHECK-NEXT: global.set __stack_pointer 472; CHECK-NEXT: local.get 9 473; CHECK-NEXT: local.get 4 474; CHECK-NEXT: i64.store 40 475; CHECK-NEXT: local.get 9 476; CHECK-NEXT: local.get 2 477; CHECK-NEXT: i32.store 36 478; CHECK-NEXT: local.get 9 479; CHECK-NEXT: local.get 0 480; CHECK-NEXT: i32.store 32 481; CHECK-NEXT: local.get 9 482; CHECK-NEXT: i32.const 32 483; CHECK-NEXT: i32.add 484; CHECK-NEXT: call sink 485; CHECK-NEXT: local.get 9 486; CHECK-NEXT: i32.const 28 487; CHECK-NEXT: i32.add 488; CHECK-NEXT: local.get 8 489; CHECK-NEXT: i32.store 0 490; CHECK-NEXT: local.get 9 491; CHECK-NEXT: i32.const 24 492; CHECK-NEXT: i32.add 493; CHECK-NEXT: local.get 7 494; CHECK-NEXT: i32.store 0 495; CHECK-NEXT: local.get 9 496; CHECK-NEXT: i32.const 20 497; CHECK-NEXT: i32.add 498; CHECK-NEXT: local.get 6 499; CHECK-NEXT: i32.store 0 500; CHECK-NEXT: local.get 9 501; CHECK-NEXT: i32.const 16 502; CHECK-NEXT: i32.add 503; CHECK-NEXT: local.get 5 504; CHECK-NEXT: i32.store 0 505; CHECK-NEXT: local.get 9 506; CHECK-NEXT: local.get 3 507; CHECK-NEXT: i32.store 8 508; CHECK-NEXT: local.get 9 509; CHECK-NEXT: local.get 1 510; CHECK-NEXT: i32.store 4 511; CHECK-NEXT: local.get 9 512; CHECK-NEXT: local.get 0 513; CHECK-NEXT: i32.store 0 514; CHECK-NEXT: local.get 9 515; CHECK-NEXT: call sink 516; CHECK-NEXT: local.get 9 517; CHECK-NEXT: i32.const 48 518; CHECK-NEXT: i32.add 519; CHECK-NEXT: global.set __stack_pointer 520; CHECK-NEXT: # fallthrough-return 521entry: 522 tail call void (...) @sink(i32 noundef %i, i16 %x2.coerce, i64 %x4.coerce) 523 tail call void (...) @sink(i32 noundef %i, i8 %x1.coerce, i32 %x3.coerce, <4 x i32> noundef %x5) 524 ret void 525} 526 527