484 lines · plain
1; RUN: llc -mtriple=riscv64 < %s | FileCheck %s2 3; CHECK-LABEL: .section .llvm_stackmaps4; CHECK-NEXT: __LLVM_StackMaps:5; Header6; CHECK-NEXT: .byte 37; CHECK-NEXT: .byte 08; CHECK-NEXT: .half 09; Num Functions10; CHECK-NEXT: .word 1311; Num LargeConstants12; CHECK-NEXT: .word 313; Num Callsites14; CHECK-NEXT: .word 1715 16; Functions and stack size17; CHECK-NEXT: .quad constantargs18; CHECK-NEXT: .quad 019; CHECK-NEXT: .quad 120; CHECK-NEXT: .quad osrinline21; CHECK-NEXT: .quad 3222; CHECK-NEXT: .quad 123; CHECK-NEXT: .quad osrcold24; CHECK-NEXT: .quad 025; CHECK-NEXT: .quad 126; CHECK-NEXT: .quad propertyRead27; CHECK-NEXT: .quad 1628; CHECK-NEXT: .quad 129; CHECK-NEXT: .quad propertyWrite30; CHECK-NEXT: .quad 031; CHECK-NEXT: .quad 132; CHECK-NEXT: .quad jsVoidCall33; CHECK-NEXT: .quad 034; CHECK-NEXT: .quad 135; CHECK-NEXT: .quad jsIntCall36; CHECK-NEXT: .quad 037; CHECK-NEXT: .quad 138; CHECK-NEXT: .quad liveConstant39; CHECK-NEXT: .quad 040; CHECK-NEXT: .quad 141; CHECK-NEXT: .quad liveArgs42; CHECK-NEXT: .quad 043; CHECK-NEXT: .quad 144; CHECK-NEXT: .quad directFrameIdx45; CHECK-NEXT: .quad 4846; CHECK-NEXT: .quad 247; CHECK-NEXT: .quad longid48; CHECK-NEXT: .quad 049; CHECK-NEXT: .quad 450; CHECK-NEXT: .quad needsStackRealignment51; CHECK-NEXT: .quad -152; CHECK-NEXT: .quad 153; CHECK-NEXT: .quad floats54; CHECK-NEXT: .quad 3255; CHECK-NEXT: .quad 156 57; Num LargeConstants58; CHECK-NEXT: .quad 429496729559; CHECK-NEXT: .quad 429496729660; CHECK-NEXT: .quad 460943421861370265661 62; Constant arguments63;64; CHECK-NEXT: .quad 165; CHECK-NEXT: .word .L{{.*}}-constantargs66; CHECK-NEXT: .half 067; CHECK-NEXT: .half 468; SmallConstant69; CHECK-NEXT: .byte 470; CHECK-NEXT: .byte 071; CHECK-NEXT: .half 872; CHECK-NEXT: .half 073; CHECK-NEXT: .half 074; CHECK-NEXT: .word 6553575; SmallConstant76; CHECK-NEXT: .byte 477; CHECK-NEXT: .byte 078; CHECK-NEXT: .half 879; CHECK-NEXT: .half 080; CHECK-NEXT: .half 081; CHECK-NEXT: .word 6553682; SmallConstant83; CHECK-NEXT: .byte 584; CHECK-NEXT: .byte 085; CHECK-NEXT: .half 886; CHECK-NEXT: .half 087; CHECK-NEXT: .half 088; CHECK-NEXT: .word 089; LargeConstant at index 090; CHECK-NEXT: .byte 591; CHECK-NEXT: .byte 092; CHECK-NEXT: .half 893; CHECK-NEXT: .half 094; CHECK-NEXT: .half 095; CHECK-NEXT: .word 196 97define void @constantargs() {98entry:99 %0 = inttoptr i64 244837814094590 to ptr100 tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 1, i32 28, ptr %0, i32 0, i64 65535, i64 65536, i64 4294967295, i64 4294967296)101 ret void102}103 104; Inline OSR Exit105;106; CHECK: .word .L{{.*}}-osrinline107; CHECK-NEXT: .half 0108; CHECK-NEXT: .half 2109; CHECK-NEXT: .byte 1110; CHECK-NEXT: .byte 0111; CHECK-NEXT: .half 8112; CHECK-NEXT: .half {{[0-9]+}}113; CHECK-NEXT: .half 0114; CHECK-NEXT: .word 0115; CHECK-NEXT: .byte 1116; CHECK-NEXT: .byte 0117; CHECK-NEXT: .half 8118; CHECK-NEXT: .half {{[0-9]+}}119; CHECK-NEXT: .half 0120; CHECK-NEXT: .word 0121define void @osrinline(i64 %a, i64 %b) {122entry:123 ; Runtime void->void call.124 call void inttoptr (i64 244837814094590 to ptr)()125 ; Followed by inline OSR patchpoint with 12-byte shadow and 2 live vars.126 call void (i64, i32, ...) @llvm.experimental.stackmap(i64 3, i32 12, i64 %a, i64 %b)127 ret void128}129 130; Cold OSR Exit131;132; 2 live variables in register.133;134; CHECK: .word .L{{.*}}-osrcold135; CHECK-NEXT: .half 0136; CHECK-NEXT: .half 2137; CHECK-NEXT: .byte 1138; CHECK-NEXT: .byte 0139; CHECK-NEXT: .half 8140; CHECK-NEXT: .half {{[0-9]+}}141; CHECK-NEXT: .half 0142; CHECK-NEXT: .word 0143; CHECK-NEXT: .byte 1144; CHECK-NEXT: .byte 0145; CHECK-NEXT: .half 8146; CHECK-NEXT: .half {{[0-9]+}}147; CHECK-NEXT: .half 0148; CHECK-NEXT: .word 0149define void @osrcold(i64 %a, i64 %b) {150entry:151 %test = icmp slt i64 %a, %b152 br i1 %test, label %ret, label %cold153cold:154 ; OSR patchpoint with 28-byte nop-slide and 2 live vars.155 %thunk = inttoptr i64 244837814094590 to ptr156 call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 4, i32 28, ptr %thunk, i32 0, i64 %a, i64 %b)157 unreachable158ret:159 ret void160}161 162; Property Read163; CHECK-LABEL: .word .L{{.*}}-propertyRead164; CHECK-NEXT: .half 0165; CHECK-NEXT: .half 2166; CHECK-NEXT: .byte 1167; CHECK-NEXT: .byte 0168; CHECK-NEXT: .half 8169; CHECK-NEXT: .half {{[0-9]+}}170; CHECK-NEXT: .half 0171; CHECK-NEXT: .word 0172; CHECK-NEXT: .byte 1173; CHECK-NEXT: .byte 0174; CHECK-NEXT: .half 8175; CHECK-NEXT: .half {{[0-9]+}}176; CHECK-NEXT: .half 0177; CHECK-NEXT: .word 0178define i64 @propertyRead(ptr %obj) {179entry:180 %resolveRead = inttoptr i64 244837814094590 to ptr181 %result = call anyregcc i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 5, i32 28, ptr %resolveRead, i32 1, ptr %obj)182 %add = add i64 %result, 3183 ret i64 %add184}185 186; Property Write187; CHECK: .word .L{{.*}}-propertyWrite188; CHECK-NEXT: .half 0189; CHECK-NEXT: .half 2190; CHECK-NEXT: .byte 1191; CHECK-NEXT: .byte 0192; CHECK-NEXT: .half 8193; CHECK-NEXT: .half {{[0-9]+}}194; CHECK-NEXT: .half 0195; CHECK-NEXT: .word 0196; CHECK-NEXT: .byte 1197; CHECK-NEXT: .byte 0198; CHECK-NEXT: .half 8199; CHECK-NEXT: .half {{[0-9]+}}200; CHECK-NEXT: .half 0201; CHECK-NEXT: .word 0202define void @propertyWrite(i64 %dummy1, ptr %obj, i64 %dummy2, i64 %a) {203entry:204 %resolveWrite = inttoptr i64 244837814094590 to ptr205 call anyregcc void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 6, i32 28, ptr %resolveWrite, i32 2, ptr %obj, i64 %a)206 ret void207}208 209; Void JS Call210;211; 2 live variables in registers.212;213; CHECK: .word .L{{.*}}-jsVoidCall214; CHECK-NEXT: .half 0215; CHECK-NEXT: .half 2216; CHECK-NEXT: .byte 1217; CHECK-NEXT: .byte 0218; CHECK-NEXT: .half 8219; CHECK-NEXT: .half {{[0-9]+}}220; CHECK-NEXT: .half 0221; CHECK-NEXT: .word 0222; CHECK-NEXT: .byte 1223; CHECK-NEXT: .byte 0224; CHECK-NEXT: .half 8225; CHECK-NEXT: .half {{[0-9]+}}226; CHECK-NEXT: .half 0227; CHECK-NEXT: .word 0228define void @jsVoidCall(i64 %dummy1, ptr %obj, i64 %arg, i64 %l1, i64 %l2) {229entry:230 %resolveCall = inttoptr i64 244837814094590 to ptr231 call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 7, i32 28, ptr %resolveCall, i32 2, ptr %obj, i64 %arg, i64 %l1, i64 %l2)232 ret void233}234 235; i64 JS Call236;237; 2 live variables in registers.238;239; CHECK: .word .L{{.*}}-jsIntCall240; CHECK-NEXT: .half 0241; CHECK-NEXT: .half 2242; CHECK-NEXT: .byte 1243; CHECK-NEXT: .byte 0244; CHECK-NEXT: .half 8245; CHECK-NEXT: .half {{[0-9]+}}246; CHECK-NEXT: .half 0247; CHECK-NEXT: .word 0248; CHECK-NEXT: .byte 1249; CHECK-NEXT: .byte 0250; CHECK-NEXT: .half 8251; CHECK-NEXT: .half {{[0-9]+}}252; CHECK-NEXT: .half 0253; CHECK-NEXT: .word 0254define i64 @jsIntCall(i64 %dummy1, ptr %obj, i64 %arg, i64 %l1, i64 %l2) {255entry:256 %resolveCall = inttoptr i64 244837814094590 to ptr257 %result = call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 8, i32 28, ptr %resolveCall, i32 2, ptr %obj, i64 %arg, i64 %l1, i64 %l2)258 %add = add i64 %result, 3259 ret i64 %add260}261 262; Map a constant value.263;264; CHECK: .word .L{{.*}}-liveConstant265; CHECK-NEXT: .half 0266; 1 location267; CHECK-NEXT: .half 1268; Loc 0: SmallConstant269; CHECK-NEXT: .byte 4270; CHECK-NEXT: .byte 0271; CHECK-NEXT: .half 8272; CHECK-NEXT: .half 0273; CHECK-NEXT: .half 0274; CHECK-NEXT: .word 33275 276define void @liveConstant() {277 tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 15, i32 8, i32 33)278 ret void279}280 281; Spilled stack map values.282;283; Verify 28 stack map entries.284;285; CHECK-LABEL: .word .L{{.*}}-liveArgs286; CHECK-NEXT: .half 0287; CHECK-NEXT: .half 28288;289; Check that at least one is a spilled entry from SP.290; Location: Indirect SP + ...291; CHECK: .byte 3292; CHECK-NEXT: .byte 0293; CHECK-NEXT: .half 8294; CHECK-NEXT: .half 2295; CHECK-NEXT: .half 0296; CHECK-NEXT: .word297define void @liveArgs(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i8 %l25, i16 zeroext %l26, i32 signext %l27) {298entry:299 call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 11, i32 28, ptr null, i32 5, i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i8 %l25, i16 %l26, i32 %l27)300 ret void301}302 303; Directly map an alloca's address.304;305; Callsite 16306; CHECK-LABEL: .word .L{{.*}}-directFrameIdx307; CHECK-NEXT: .half 0308; 1 location309; CHECK-NEXT: .half 1310; Loc 0: Direct SP + ofs311; CHECK-NEXT: .byte 2312; CHECK-NEXT: .byte 0313; CHECK-NEXT: .half 8314; CHECK-NEXT: .half 2315; CHECK-NEXT: .half 0316; CHECK-NEXT: .word317 318; Callsite 17319; CHECK-LABEL: .word .L{{.*}}-directFrameIdx320; CHECK-NEXT: .half 0321; 2 locations322; CHECK-NEXT: .half 2323; Loc 0: Direct SP + ofs324; CHECK-NEXT: .byte 2325; CHECK-NEXT: .byte 0326; CHECK-NEXT: .half 8327; CHECK-NEXT: .half 2328; CHECK-NEXT: .half 0329; CHECK-NEXT: .word330; Loc 1: Direct SP + ofs331; CHECK-NEXT: .byte 2332; CHECK-NEXT: .byte 0333; CHECK-NEXT: .half 8334; CHECK-NEXT: .half 2335; CHECK-NEXT: .half 0336; CHECK-NEXT: .word337define void @directFrameIdx() {338entry:339 %metadata1 = alloca i64, i32 3, align 8340 store i64 11, ptr %metadata1341 store i64 12, ptr %metadata1342 store i64 13, ptr %metadata1343 call void (i64, i32, ...) @llvm.experimental.stackmap(i64 16, i32 0, ptr %metadata1)344 %metadata2 = alloca i8, i32 4, align 8345 %metadata3 = alloca i16, i32 4, align 8346 call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 17, i32 4, ptr null, i32 0, ptr %metadata2, ptr %metadata3)347 ret void348}349 350; Test a 64-bit ID.351;352; CHECK: .quad 4294967295353; CHECK-LABEL: .word .L{{.*}}-longid354; CHECK: .quad 4294967296355; CHECK-LABEL: .word .L{{.*}}-longid356; CHECK: .quad 9223372036854775807357; CHECK-LABEL: .word .L{{.*}}-longid358; CHECK: .quad -1359; CHECK-LABEL: .word .L{{.*}}-longid360define void @longid() {361entry:362 tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 4294967295, i32 0, ptr null, i32 0)363 tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 4294967296, i32 0, ptr null, i32 0)364 tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 9223372036854775807, i32 0, ptr null, i32 0)365 tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 -1, i32 0, ptr null, i32 0)366 ret void367}368 369; A stack frame which needs to be realigned at runtime (to meet alignment370; criteria for values on the stack) does not have a fixed frame size.371; CHECK-LABEL: .word .L{{.*}}-needsStackRealignment372; CHECK-NEXT: .half 0373; 0 locations374; CHECK-NEXT: .half 0375define void @needsStackRealignment() {376 %val = alloca i64, i32 3, align 128377 tail call void (...) @escape_values(ptr %val)378; Note: Adding any non-constant to the stackmap would fail because we379; expected to be able to address off the frame pointer. In a realigned380; frame, we must use the stack pointer instead. This is a separate bug.381 tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 0)382 ret void383}384declare void @escape_values(...)385 386; CHECK-LABEL: .word .L{{.*}}-floats387; CHECK-NEXT: .half 0388; Num Locations389; CHECK-NEXT: .half 12390; Loc 0: constant float as constant integer391; CHECK-NEXT: .byte 4392; CHECK-NEXT: .byte 0393; CHECK-NEXT: .half 8394; CHECK-NEXT: .half 0395; CHECK-NEXT: .half 0396; CHECK-NEXT: .word397; Loc 1: constant double as large constant integer398; CHECK-NEXT: .byte 5399; CHECK-NEXT: .byte 0400; CHECK-NEXT: .half 8401; CHECK-NEXT: .half 0402; CHECK-NEXT: .half 0403; CHECK-NEXT: .word404; Loc 2: constant half as constant integer405; CHECK-NEXT: .byte 4406; CHECK-NEXT: .byte 0407; CHECK-NEXT: .half 8408; CHECK-NEXT: .half 0409; CHECK-NEXT: .half 0410; CHECK-NEXT: .word411; Loc 3: constant bfloat as constant integer412; CHECK-NEXT: .byte 4413; CHECK-NEXT: .byte 0414; CHECK-NEXT: .half 8415; CHECK-NEXT: .half 0416; CHECK-NEXT: .half 0417; CHECK-NEXT: .word418; Loc 4: float value in X register419; CHECK-NEXT: .byte 1420; CHECK-NEXT: .byte 0421; CHECK-NEXT: .half 8422; CHECK-NEXT: .half 10423; CHECK-NEXT: .half 0424; CHECK-NEXT: .word425; Loc 5: double value in X register426; CHECK-NEXT: .byte 1427; CHECK-NEXT: .byte 0428; CHECK-NEXT: .half 8429; CHECK-NEXT: .half 11430; CHECK-NEXT: .half 0431; CHECK-NEXT: .word432; Loc 6: half value in X register433; CHECK-NEXT: .byte 1434; CHECK-NEXT: .byte 0435; CHECK-NEXT: .half 8436; CHECK-NEXT: .half 12437; CHECK-NEXT: .half 0438; CHECK-NEXT: .word439; Loc 7: bfloat value in X register440; CHECK-NEXT: .byte 1441; CHECK-NEXT: .byte 0442; CHECK-NEXT: .half 8443; CHECK-NEXT: .half 13444; CHECK-NEXT: .half 0445; CHECK-NEXT: .word446; Loc 8: float on stack447; CHECK-NEXT: .byte 2448; CHECK-NEXT: .byte 0449; CHECK-NEXT: .half 8450; CHECK-NEXT: .half 2451; CHECK-NEXT: .half 0452; CHECK-NEXT: .word453; Loc 9: double on stack454; CHECK-NEXT: .byte 2455; CHECK-NEXT: .byte 0456; CHECK-NEXT: .half 8457; CHECK-NEXT: .half 2458; CHECK-NEXT: .half 0459; CHECK-NEXT: .word460; Loc 10: half on stack461; CHECK-NEXT: .byte 2462; CHECK-NEXT: .byte 0463; CHECK-NEXT: .half 8464; CHECK-NEXT: .half 2465; CHECK-NEXT: .half 0466; CHECK-NEXT: .word467; Loc 11: bfloat on stack468; CHECK-NEXT: .byte 2469; CHECK-NEXT: .byte 0470; CHECK-NEXT: .half 8471; CHECK-NEXT: .half 2472; CHECK-NEXT: .half 0473; CHECK-NEXT: .word474define void @floats(float %f, double %g, half %h, bfloat %i) {475 %ff = alloca float476 %gg = alloca double477 %hh = alloca half478 %ii = alloca bfloat479 call void (i64, i32, ...) @llvm.experimental.stackmap(i64 888, i32 0, float 1.25,480 double 1.5, half 1.5, bfloat 1.5, float %f, double %g, half %h, bfloat %i, ptr %ff, ptr %gg, ptr %hh, ptr %ii)481 ret void482}483 484