123 lines · plain
1; RUN: opt -passes=instcombine -S %s | FileCheck %s2 3; Make sure we collapse the fences in this case4 5; CHECK-LABEL: define void @tinkywinky6; CHECK-NEXT: fence seq_cst7; CHECK-NEXT: fence syncscope("singlethread") acquire 8; CHECK-NEXT: ret void9; CHECK-NEXT: }10 11define void @tinkywinky() {12 fence seq_cst13 fence seq_cst14 fence seq_cst15 fence syncscope("singlethread") acquire16 fence syncscope("singlethread") acquire17 fence syncscope("singlethread") acquire18 ret void19}20 21; Arbitrary target dependent scope22; Is this transform really needed?23; CHECK-LABEL: test_target_dependent_scope24; CHECK-NEXT: fence syncscope("MSP430") acquire25; CHECK-NEXT: ret void26define void @test_target_dependent_scope() {27 fence syncscope("MSP430") acquire28 fence syncscope("MSP430") acquire29 ret void30}31 32; CHECK-LABEL: define void @dipsy33; CHECK-NEXT: fence seq_cst34; CHECK-NEXT: fence syncscope("singlethread") seq_cst35; CHECK-NEXT: ret void36; CHECK-NEXT: }37 38define void @dipsy() {39 fence seq_cst40 fence syncscope("singlethread") seq_cst41 ret void42}43 44; CHECK-LABEL: define void @patatino45; CHECK-NEXT: fence seq_cst46; CHECK-NEXT: ret void47; CHECK-NEXT: }48 49define void @patatino() {50 fence acquire51 fence seq_cst52 fence acquire53 fence seq_cst54 ret void55}56 57; CHECK-LABEL: define void @weaker_fence_158; CHECK-NEXT: fence seq_cst59; CHECK-NEXT: ret void60define void @weaker_fence_1() {61 fence seq_cst62 fence release63 fence seq_cst64 ret void65}66 67; CHECK-LABEL: define void @weaker_fence_268; CHECK-NEXT: fence seq_cst69; CHECK-NEXT: ret void70define void @weaker_fence_2() {71 fence seq_cst72 fence release73 fence seq_cst74 fence acquire 75 ret void76}77 78; Although acquire is a weaker ordering than seq_cst, it has a system scope,79; compare to singlethread scope in seq_cst.80; CHECK-LABEL: acquire_global_neg_test81; CHECK-NEXT: fence acquire82; CHECK-NEXT: fence syncscope("singlethread") seq_cst83define void @acquire_global_neg_test() {84 fence acquire 85 fence acquire 86 fence syncscope("singlethread") seq_cst 87 ret void88}89 90; CHECK-LABEL: acquire_single_thread_scope91; CHECK-NEXT: fence syncscope("singlethread") seq_cst 92define void @acquire_single_thread_scope() {93 fence syncscope("singlethread") acquire 94 fence syncscope("singlethread") seq_cst 95 ret void96}97 98; CHECK-LABEL: define void @debug99; CHECK-NOT: fence100; CHECK: #dbg_value101; CHECK: fence seq_cst102define void @debug() {103 fence seq_cst104 tail call void @llvm.dbg.value(metadata i32 5, metadata !1, metadata !DIExpression()), !dbg !9105 fence seq_cst106 ret void107}108 109declare void @llvm.dbg.value(metadata, metadata, metadata)110 111!llvm.dbg.cu = !{!0}112!llvm.module.flags = !{!5, !6, !7, !8}113 114!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "Me", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: null, retainedTypes: null, imports: null)115!1 = !DILocalVariable(name: "", arg: 1, scope: !2, file: null, line: 1, type: null)116!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)117!3 = !DIFile(filename: "consecutive-fences.ll", directory: "")118!5 = !{i32 2, !"Dwarf Version", i32 4}119!6 = !{i32 2, !"Debug Info Version", i32 3}120!7 = !{i32 1, !"wchar_size", i32 4}121!8 = !{i32 7, !"PIC Level", i32 2}122!9 = !DILocation(line: 0, column: 0, scope: !2)123