xref: /llvm-project/llvm/test/Transforms/InstCombine/consecutive-fences.ll (revision 094572701dce4aaf36f4521d6cf750420d39f206)
1; RUN: opt -passes=instcombine -S %s | FileCheck %s
2; RUN: opt -passes=instcombine -S %s --try-experimental-debuginfo-iterators | FileCheck %s
3
4; Make sure we collapse the fences in this case
5
6; CHECK-LABEL: define void @tinkywinky
7; CHECK-NEXT:   fence seq_cst
8; CHECK-NEXT:   fence syncscope("singlethread") acquire
9; CHECK-NEXT:   ret void
10; CHECK-NEXT: }
11
12define void @tinkywinky() {
13  fence seq_cst
14  fence seq_cst
15  fence seq_cst
16  fence syncscope("singlethread") acquire
17  fence syncscope("singlethread") acquire
18  fence syncscope("singlethread") acquire
19  ret void
20}
21
22; Arbitrary target dependent scope
23; Is this transform really needed?
24; CHECK-LABEL: test_target_dependent_scope
25; CHECK-NEXT: fence syncscope("MSP430") acquire
26; CHECK-NEXT: ret void
27define void @test_target_dependent_scope() {
28  fence syncscope("MSP430") acquire
29  fence syncscope("MSP430") acquire
30  ret void
31}
32
33; CHECK-LABEL: define void @dipsy
34; CHECK-NEXT:   fence seq_cst
35; CHECK-NEXT:   fence syncscope("singlethread") seq_cst
36; CHECK-NEXT:   ret void
37; CHECK-NEXT: }
38
39define void @dipsy() {
40  fence seq_cst
41  fence syncscope("singlethread") seq_cst
42  ret void
43}
44
45; CHECK-LABEL: define void @patatino
46; CHECK-NEXT:   fence seq_cst
47; CHECK-NEXT:   ret void
48; CHECK-NEXT: }
49
50define void @patatino() {
51  fence acquire
52  fence seq_cst
53  fence acquire
54  fence seq_cst
55  ret void
56}
57
58; CHECK-LABEL: define void @weaker_fence_1
59; CHECK-NEXT: fence seq_cst
60; CHECK-NEXT: ret void
61define void @weaker_fence_1() {
62  fence seq_cst
63  fence release
64  fence seq_cst
65  ret void
66}
67
68; CHECK-LABEL: define void @weaker_fence_2
69; CHECK-NEXT: fence seq_cst
70; CHECK-NEXT: ret void
71define void @weaker_fence_2() {
72  fence seq_cst
73  fence release
74  fence seq_cst
75  fence acquire
76  ret void
77}
78
79; Although acquire is a weaker ordering than seq_cst, it has a system scope,
80; compare to singlethread scope in seq_cst.
81; CHECK-LABEL: acquire_global_neg_test
82; CHECK-NEXT: fence acquire
83; CHECK-NEXT: fence syncscope("singlethread") seq_cst
84define void @acquire_global_neg_test() {
85  fence acquire
86  fence acquire
87  fence syncscope("singlethread") seq_cst
88  ret void
89}
90
91; CHECK-LABEL: acquire_single_thread_scope
92; CHECK-NEXT: fence syncscope("singlethread") seq_cst
93define void @acquire_single_thread_scope() {
94  fence syncscope("singlethread") acquire
95  fence syncscope("singlethread") seq_cst
96  ret void
97}
98
99; CHECK-LABEL: define void @debug
100; CHECK-NOT: fence
101; CHECK: #dbg_value
102; CHECK: fence seq_cst
103define void @debug() {
104  fence seq_cst
105  tail call void @llvm.dbg.value(metadata i32 5, metadata !1, metadata !DIExpression()), !dbg !9
106  fence seq_cst
107  ret void
108}
109
110declare void @llvm.dbg.value(metadata, metadata, metadata)
111
112!llvm.dbg.cu = !{!0}
113!llvm.module.flags = !{!5, !6, !7, !8}
114
115!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "Me", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: null, retainedTypes: null, imports: null)
116!1 = !DILocalVariable(name: "", arg: 1, scope: !2, file: null, line: 1, type: null)
117!2 = distinct !DISubprogram(name: "debug", linkageName: "debug", scope: null, file: null, line: 0, type: null, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0)
118!3 = !DIFile(filename: "consecutive-fences.ll", directory: "")
119!5 = !{i32 2, !"Dwarf Version", i32 4}
120!6 = !{i32 2, !"Debug Info Version", i32 3}
121!7 = !{i32 1, !"wchar_size", i32 4}
122!8 = !{i32 7, !"PIC Level", i32 2}
123!9 = !DILocation(line: 0, column: 0, scope: !2)
124