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