blob: 67b26268a3a39a71f4ae425bf79882c5f34782d0 [file] [log] [blame]
Hal Finkel52f7c012015-01-16 04:40:58 +00001; RUN: llc < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE
Mehdi Amini945a6602015-02-27 18:32:11 +00002; RUN: llc -fast-isel -fast-isel-abort=1 < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE
Hal Finkel52f7c012015-01-16 04:40:58 +00003; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE
Mehdi Amini945a6602015-02-27 18:32:11 +00004; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -fast-isel -fast-isel-abort=1 < %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE
Hal Finkel52f7c012015-01-16 04:40:58 +00005
Hal Finkel934361a2015-01-14 01:07:51 +00006target triple = "powerpc64-unknown-linux-gnu"
7
8; Trivial patchpoint codegen
9;
10define i64 @trivial_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
11entry:
12; CHECK-LABEL: trivial_patchpoint_codegen:
13
Hal Finkel52f7c012015-01-16 04:40:58 +000014; CHECK: li 12, -8531
15; CHECK-NEXT: rldic 12, 12, 32, 16
16; CHECK-NEXT: oris 12, 12, 48879
17; CHECK-NEXT: ori 12, 12, 51966
18; CHECK-NEXT: mtctr 12
Hal Finkel934361a2015-01-14 01:07:51 +000019; CHECK-NEXT: bctrl
20
Hal Finkel52f7c012015-01-16 04:40:58 +000021; CHECK: li 12, -8531
22; CHECK-NEXT: rldic 12, 12, 32, 16
23; CHECK-NEXT: oris 12, 12, 48879
24; CHECK-NEXT: ori 12, 12, 51967
25; CHECK-NEXT: mtctr 12
Hal Finkel934361a2015-01-14 01:07:51 +000026; CHECK-NEXT: bctrl
27
28; CHECK: blr
29
30 %resolveCall2 = inttoptr i64 244837814094590 to i8*
David Blaikie23af6482015-04-16 23:24:18 +000031 %result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 2, i32 24, i8* %resolveCall2, i32 4, i64 %p1, i64 %p2, i64 %p3, i64 %p4)
Hal Finkel934361a2015-01-14 01:07:51 +000032 %resolveCall3 = inttoptr i64 244837814094591 to i8*
David Blaikie23af6482015-04-16 23:24:18 +000033 tail call void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 3, i32 24, i8* %resolveCall3, i32 2, i64 %p1, i64 %result)
Hal Finkel934361a2015-01-14 01:07:51 +000034 ret i64 %result
35}
36
37; Caller frame metadata with stackmaps. This should not be optimized
38; as a leaf function.
39;
40; CHECK-LABEL: caller_meta_leaf
Hal Finkel52f7c012015-01-16 04:40:58 +000041; CHECK-BE: stdu 1, -80(1)
42; CHECK-LE: stdu 1, -64(1)
Hal Finkel934361a2015-01-14 01:07:51 +000043; CHECK: Ltmp
Hal Finkel52f7c012015-01-16 04:40:58 +000044; CHECK-BE: addi 1, 1, 80
45; CHECK-LE: addi 1, 1, 64
Hal Finkel934361a2015-01-14 01:07:51 +000046; CHECK: blr
47
48define void @caller_meta_leaf() {
49entry:
50 %metadata = alloca i64, i32 3, align 8
51 store i64 11, i64* %metadata
52 store i64 12, i64* %metadata
53 store i64 13, i64* %metadata
David Blaikie23af6482015-04-16 23:24:18 +000054 call void (i64, i32, ...) @llvm.experimental.stackmap(i64 4, i32 0, i64* %metadata)
Hal Finkel934361a2015-01-14 01:07:51 +000055 ret void
56}
57
58; Test patchpoints reusing the same TargetConstant.
59; <rdar:15390785> Assertion failed: (CI.getNumArgOperands() >= NumArgs + 4)
60; There is no way to verify this, since it depends on memory allocation.
61; But I think it's useful to include as a working example.
62define i64 @testLowerConstant(i64 %arg, i64 %tmp2, i64 %tmp10, i64* %tmp33, i64 %tmp79) {
63entry:
64 %tmp80 = add i64 %tmp79, -16
65 %tmp81 = inttoptr i64 %tmp80 to i64*
David Blaikiea79ac142015-02-27 21:17:42 +000066 %tmp82 = load i64, i64* %tmp81, align 8
David Blaikie23af6482015-04-16 23:24:18 +000067 tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 14, i32 8, i64 %arg, i64 %tmp2, i64 %tmp10, i64 %tmp82)
68 tail call void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 15, i32 32, i8* null, i32 3, i64 %arg, i64 %tmp10, i64 %tmp82)
David Blaikiea79ac142015-02-27 21:17:42 +000069 %tmp83 = load i64, i64* %tmp33, align 8
Hal Finkel934361a2015-01-14 01:07:51 +000070 %tmp84 = add i64 %tmp83, -24
71 %tmp85 = inttoptr i64 %tmp84 to i64*
David Blaikiea79ac142015-02-27 21:17:42 +000072 %tmp86 = load i64, i64* %tmp85, align 8
David Blaikie23af6482015-04-16 23:24:18 +000073 tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 17, i32 8, i64 %arg, i64 %tmp10, i64 %tmp86)
74 tail call void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 18, i32 32, i8* null, i32 3, i64 %arg, i64 %tmp10, i64 %tmp86)
Hal Finkel934361a2015-01-14 01:07:51 +000075 ret i64 10
76}
77
78; Test small patchpoints that don't emit calls.
79define void @small_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
80entry:
81; CHECK-LABEL: small_patchpoint_codegen:
82; CHECK: Ltmp
83; CHECK: nop
84; CHECK-NEXT: nop
85; CHECK-NEXT: nop
86; CHECK-NEXT: nop
87; CHECK-NEXT: nop
88; CHECK-NOT: nop
89; CHECK: blr
David Blaikie23af6482015-04-16 23:24:18 +000090 %result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 5, i32 20, i8* null, i32 2, i64 %p1, i64 %p2)
Hal Finkel934361a2015-01-14 01:07:51 +000091 ret void
92}
93
94declare void @llvm.experimental.stackmap(i64, i32, ...)
95declare void @llvm.experimental.patchpoint.void(i64, i32, i8*, i32, ...)
96declare i64 @llvm.experimental.patchpoint.i64(i64, i32, i8*, i32, ...)
97