Skip to content

Commit 2f4460b

Browse files
committed
[PowerPC] Allow llvm.ppc.cfence to accept pointer types
Backport https://reviews.llvm.org/D127554
1 parent 5393efb commit 2f4460b

File tree

3 files changed

+142
-1
lines changed

3 files changed

+142
-1
lines changed

llvm/include/llvm/IR/IntrinsicsPowerPC.td

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1427,7 +1427,11 @@ def int_ppc_tsuspend : GCCBuiltin<"__builtin_tsuspend">,
14271427
def int_ppc_ttest : GCCBuiltin<"__builtin_ttest">,
14281428
Intrinsic<[llvm_i64_ty], [], []>;
14291429

1430-
def int_ppc_cfence : Intrinsic<[], [llvm_anyint_ty], []>;
1430+
// We currently use llvm.ppc.cfence in the context of atomic load which
1431+
// in LLVM IR requires its type to be one of integer, pointer and
1432+
// float point type. So llvm_any_ty here refers to type mentioned above.
1433+
// Backend is supposed to lower these types to appropriate MVTs.
1434+
def int_ppc_cfence : Intrinsic<[], [llvm_any_ty], []>;
14311435

14321436
// PowerPC set FPSCR Intrinsic Definitions.
14331437
def int_ppc_setrnd : GCCBuiltin<"__builtin_setrnd">,
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -opaque-pointers -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s
3+
; RUN: llc -opaque-pointers -mtriple=powerpc64-unknown-unknown < %s | FileCheck %s
4+
5+
define void @foo() #0 {
6+
; CHECK-LABEL: foo:
7+
; CHECK: # %bb.0: # %bb0
8+
; CHECK-NEXT: bc 12, 20, .LBB0_2
9+
; CHECK-NEXT: # %bb.1: # %bb1
10+
; CHECK-NEXT: ld 3, 0(3)
11+
; CHECK-NEXT: cmpd 7, 3, 3
12+
; CHECK-NEXT: bne- 7, .+4
13+
; CHECK-NEXT: isync
14+
; CHECK-NEXT: .LBB0_2: # %bb2
15+
bb0:
16+
br i1 undef, label %bb1, label %bb2
17+
18+
bb1:
19+
%0 = load atomic {}*, {}** undef acquire, align 8
20+
unreachable
21+
22+
bb2:
23+
unreachable
24+
}
25+
26+
define void @bar() #0 {
27+
; CHECK-LABEL: bar:
28+
; CHECK: # %bb.0: # %bb0
29+
; CHECK-NEXT: bc 12, 20, .LBB1_2
30+
; CHECK-NEXT: # %bb.1: # %bb1
31+
; CHECK-NEXT: ld 3, 0(3)
32+
; CHECK-NEXT: cmpd 7, 3, 3
33+
; CHECK-NEXT: bne- 7, .+4
34+
; CHECK-NEXT: isync
35+
; CHECK-NEXT: .LBB1_2: # %bb2
36+
bb0:
37+
br i1 undef, label %bb1, label %bb2
38+
39+
bb1:
40+
%0 = load atomic ptr, ptr undef acquire, align 8
41+
unreachable
42+
43+
bb2:
44+
unreachable
45+
}
46+
47+
define void @foobar() {
48+
; CHECK-LABEL: foobar:
49+
; CHECK: # %bb.0: # %top
50+
; CHECK-NEXT: bc 4, 20, .LBB2_2
51+
; CHECK-NEXT: # %bb.1: # %err86
52+
; CHECK-NEXT: .LBB2_2: # %pass9
53+
; CHECK-NEXT: ld 3, 0(3)
54+
; CHECK-NEXT: cmpd 7, 3, 3
55+
; CHECK-NEXT: bne- 7, .+4
56+
; CHECK-NEXT: isync
57+
top:
58+
br i1 undef, label %err86, label %pass9
59+
60+
pass9: ; preds = %top
61+
%0 = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(11)* undef acquire, align 8
62+
unreachable
63+
64+
err86: ; preds = %top
65+
unreachable
66+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -opaque-pointers -atomic-expand -S -mtriple=powerpc64le-unknown-unknown \
3+
; RUN: %s | FileCheck %s
4+
; RUN: opt -opaque-pointers -atomic-expand -S -mtriple=powerpc64-unknown-unknown \
5+
; RUN: %s | FileCheck %s
6+
7+
define void @foo() #0 {
8+
; CHECK-LABEL: @foo(
9+
; CHECK-NEXT: bb0:
10+
; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
11+
; CHECK: bb1:
12+
; CHECK-NEXT: [[TMP0:%.*]] = load atomic ptr, ptr undef monotonic, align 8
13+
; CHECK-NEXT: call void @llvm.ppc.cfence.p0(ptr [[TMP0]])
14+
; CHECK-NEXT: unreachable
15+
; CHECK: bb2:
16+
; CHECK-NEXT: unreachable
17+
;
18+
bb0:
19+
br i1 undef, label %bb1, label %bb2
20+
21+
bb1:
22+
%0 = load atomic {}*, {}** undef acquire, align 8
23+
unreachable
24+
25+
bb2:
26+
unreachable
27+
}
28+
29+
define void @bar() #0 {
30+
; CHECK-LABEL: @bar(
31+
; CHECK-NEXT: bb0:
32+
; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
33+
; CHECK: bb1:
34+
; CHECK-NEXT: [[TMP0:%.*]] = load atomic ptr, ptr undef monotonic, align 8
35+
; CHECK-NEXT: call void @llvm.ppc.cfence.p0(ptr [[TMP0]])
36+
; CHECK-NEXT: unreachable
37+
; CHECK: bb2:
38+
; CHECK-NEXT: unreachable
39+
;
40+
bb0:
41+
br i1 undef, label %bb1, label %bb2
42+
43+
bb1:
44+
%0 = load atomic ptr, ptr undef acquire, align 8
45+
unreachable
46+
47+
bb2:
48+
unreachable
49+
}
50+
51+
define void @foobar() {
52+
; CHECK-LABEL: @foobar(
53+
; CHECK-NEXT: top:
54+
; CHECK-NEXT: br i1 undef, label [[ERR86:%.*]], label [[PASS9:%.*]]
55+
; CHECK: pass9:
56+
; CHECK-NEXT: [[TMP0:%.*]] = load atomic ptr addrspace(10), ptr addrspace(11) undef monotonic, align 8
57+
; CHECK-NEXT: call void @llvm.ppc.cfence.p10(ptr addrspace(10) [[TMP0]])
58+
; CHECK-NEXT: unreachable
59+
; CHECK: err86:
60+
; CHECK-NEXT: unreachable
61+
;
62+
top:
63+
br i1 undef, label %err86, label %pass9
64+
65+
pass9: ; preds = %top
66+
%0 = load atomic {} addrspace(10)*, {} addrspace(10)* addrspace(11)* undef acquire, align 8
67+
unreachable
68+
69+
err86: ; preds = %top
70+
unreachable
71+
}

0 commit comments

Comments
 (0)