brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · a11afbb Raw
126 lines · plain
1; RUN: llc -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE2; RUN: llc -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE3; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE4; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE5 6target triple = "powerpc64-unknown-linux-gnu"7 8; Trivial patchpoint codegen9;10define i64 @trivial_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {11entry:12; CHECK-LABEL: trivial_patchpoint_codegen:13 14; CHECK: li 12, -853115; CHECK-NEXT: rldic 12, 12, 32, 1616; CHECK-NEXT: oris 12, 12, 4887917; CHECK-NEXT: ori 12, 12, 5196618; CHECK-LE-NEXT: std 2, 24(1)19; CHECK-BE-NEXT: std 2, 40(1)20; CHECK-BE-NEXT: ld 2, 8(12)21; CHECK-BE-NEXT: ld 12, 0(12)22; CHECK-NEXT: mtctr 1223; CHECK-NEXT: bctrl24; CHECK-LE-NEXT: ld 2, 24(1)25; CHECK-BE-NEXT: ld 2, 40(1)26 27; CHECK: li 12, -853128; CHECK-NEXT: rldic 12, 12, 32, 1629; CHECK-NEXT: oris 12, 12, 4887930; CHECK-NEXT: ori 12, 12, 5196731; CHECK-LE-NEXT: std 2, 24(1)32; CHECK-BE-NEXT: std 2, 40(1)33; CHECK-BE-NEXT: ld 2, 8(12)34; CHECK-BE-NEXT: ld 12, 0(12)35; CHECK-NEXT: mtctr 1236; CHECK-NEXT: bctrl37; CHECK-LE-NEXT: ld 2, 24(1)38; CHECK-BE-NEXT: ld 2, 40(1)39 40; CHECK: blr41 42  %resolveCall2 = inttoptr i64 244837814094590 to ptr43  %result = tail call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 2, i32 40, ptr %resolveCall2, i32 4, i64 %p1, i64 %p2, i64 %p3, i64 %p4)44  %resolveCall3 = inttoptr i64 244837814094591 to ptr45  tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 3, i32 40, ptr %resolveCall3, i32 2, i64 %p1, i64 %result)46  ret i64 %result47}48 49; Caller frame metadata with stackmaps. This should not be optimized50; as a leaf function.51;52; CHECK-LABEL: caller_meta_leaf53; CHECK-BE: stdu 1, -80(1)54; CHECK-LE: stdu 1, -64(1)55; CHECK: Ltmp56; CHECK-BE: addi 1, 1, 8057; CHECK-LE: addi 1, 1, 6458; CHECK: blr59 60define void @caller_meta_leaf() {61entry:62  %metadata = alloca i64, i32 3, align 863  store i64 11, ptr %metadata64  store i64 12, ptr %metadata65  store i64 13, ptr %metadata66  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 4, i32 0, ptr %metadata)67  ret void68}69 70; Test patchpoints reusing the same TargetConstant.71; <rdar:15390785> Assertion failed: (CI.getNumArgOperands() >= NumArgs + 4)72; There is no way to verify this, since it depends on memory allocation.73; But I think it's useful to include as a working example.74define i64 @testLowerConstant(i64 %arg, i64 %tmp2, i64 %tmp10, ptr %tmp33, i64 %tmp79) {75entry:76  %tmp80 = add i64 %tmp79, -1677  %tmp81 = inttoptr i64 %tmp80 to ptr78  %tmp82 = load i64, ptr %tmp81, align 879  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 14, i32 8, i64 %arg, i64 %tmp2, i64 %tmp10, i64 %tmp82)80  tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 15, i32 48, ptr null, i32 3, i64 %arg, i64 %tmp10, i64 %tmp82)81  %tmp83 = load i64, ptr %tmp33, align 882  %tmp84 = add i64 %tmp83, -2483  %tmp85 = inttoptr i64 %tmp84 to ptr84  %tmp86 = load i64, ptr %tmp85, align 885  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 17, i32 8, i64 %arg, i64 %tmp10, i64 %tmp86)86  tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 18, i32 48, ptr null, i32 3, i64 %arg, i64 %tmp10, i64 %tmp86)87  ret i64 1088}89 90; Test small patchpoints that don't emit calls.91define void @small_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {92entry:93; CHECK-LABEL: small_patchpoint_codegen:94; CHECK:      Ltmp95; CHECK:      nop96; CHECK-NEXT: nop97; CHECK-NEXT: nop98; CHECK-NEXT: nop99; CHECK-NEXT: nop100; CHECK-NOT:  nop101; CHECK: blr102  %result = tail call i64 (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.i64(i64 5, i32 20, ptr null, i32 2, i64 %p1, i64 %p2)103  ret void104}105 106; Trivial symbolic patchpoint codegen.107 108declare i64 @foo(i64 %p1, i64 %p2)109define i64 @trivial_symbolic_patchpoint_codegen(i64 %p1, i64 %p2) {110entry:111; CHECK-LABEL: trivial_symbolic_patchpoint_codegen:112; CHECK:       bl foo113; CHECK-NEXT:  nop114; CHECK-NEXT:  nop115; CHECK-NOT:   nop116; CHECK:       blr117  %result = tail call i64 (i64, i32, ptr, i32, ...)118  @llvm.experimental.patchpoint.i64(i64 9, i32 12, ptr @foo, i32 2, i64 %p1, i64 %p2)119  ret i64 %result120}121 122declare void @llvm.experimental.stackmap(i64, i32, ...)123declare void @llvm.experimental.patchpoint.void(i64, i32, ptr, i32, ...)124declare i64 @llvm.experimental.patchpoint.i64(i64, i32, ptr, i32, ...)125 126