10aeedf58SRoman Lebedev; RUN: opt < %s -passes=gvn -o /dev/null -pass-remarks-output=%t -S 2ab1f6ffaSAdam Nemet; RUN: cat %t | FileCheck %s 3ab1f6ffaSAdam Nemet 4ab1f6ffaSAdam Nemet; CHECK: --- !Missed 5ab1f6ffaSAdam Nemet; CHECK-NEXT: Pass: gvn 6ab1f6ffaSAdam Nemet; CHECK-NEXT: Name: LoadClobbered 7ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 2, Column: 2 } 8ab1f6ffaSAdam Nemet; CHECK-NEXT: Function: multipleUsers 9ab1f6ffaSAdam Nemet; CHECK-NEXT: Args: 10ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: 'load of type ' 11ab1f6ffaSAdam Nemet; CHECK-NEXT: - Type: i32 12ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' not eliminated' 13ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' in favor of ' 14ab1f6ffaSAdam Nemet; CHECK-NEXT: - OtherAccess: store 15ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' because it is clobbered by ' 16ab1f6ffaSAdam Nemet; CHECK-NEXT: - ClobberedBy: call 17ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 1, Column: 1 } 18ab1f6ffaSAdam Nemet; CHECK-NEXT: ... 19ab1f6ffaSAdam Nemet; CHECK: --- !Missed 20ab1f6ffaSAdam Nemet; CHECK-NEXT: Pass: gvn 21ab1f6ffaSAdam Nemet; CHECK-NEXT: Name: LoadClobbered 22ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 4, Column: 4 } 23ab1f6ffaSAdam Nemet; CHECK-NEXT: Function: multipleUsers 24ab1f6ffaSAdam Nemet; CHECK-NEXT: Args: 25ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: 'load of type ' 26ab1f6ffaSAdam Nemet; CHECK-NEXT: - Type: i32 27ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' not eliminated' 28ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' in favor of ' 29ab1f6ffaSAdam Nemet; CHECK-NEXT: - OtherAccess: load 30ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 2, Column: 2 } 31ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' because it is clobbered by ' 32ab1f6ffaSAdam Nemet; CHECK-NEXT: - ClobberedBy: call 33ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 3, Column: 3 } 34ab1f6ffaSAdam Nemet; CHECK-NEXT: ... 35ab1f6ffaSAdam Nemet 36ab1f6ffaSAdam Nemet; ModuleID = 'bugpoint-reduced-simplified.bc' 37ab1f6ffaSAdam Nemetsource_filename = "gvn-test.c" 38ab1f6ffaSAdam Nemettarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 39ab1f6ffaSAdam Nemettarget triple = "x86_64-unknown-linux-gnu" 40ab1f6ffaSAdam Nemet 41ab1f6ffaSAdam Nemet; Tests that a last clobbering use can be determined even in the presence of 42ab1f6ffaSAdam Nemet; multiple users, given that one of them lies on a path between every other 43ab1f6ffaSAdam Nemet; potentially clobbering use and the load. 44ab1f6ffaSAdam Nemet 45*23abf931SNikita Popovdefine dso_local void @multipleUsers(ptr %a, i32 %b) local_unnamed_addr #0 { 46ab1f6ffaSAdam Nemetentry: 47*23abf931SNikita Popov store i32 %b, ptr %a, align 4 48ab1f6ffaSAdam Nemet tail call void @clobberingFunc() #1, !dbg !10 49*23abf931SNikita Popov %0 = load i32, ptr %a, align 4, !dbg !11 50ab1f6ffaSAdam Nemet tail call void @clobberingFunc() #1, !dbg !12 51*23abf931SNikita Popov %1 = load i32, ptr %a, align 4, !dbg !13 52ab1f6ffaSAdam Nemet %add2 = add nsw i32 %1, %0 53ab1f6ffaSAdam Nemet ret void 54ab1f6ffaSAdam Nemet} 55ab1f6ffaSAdam Nemet 56ab1f6ffaSAdam Nemet; CHECK: --- !Missed 57ab1f6ffaSAdam Nemet; CHECK-NEXT: Pass: gvn 58ab1f6ffaSAdam Nemet; CHECK-NEXT: Name: LoadClobbered 59ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 2, Column: 2 } 60ab1f6ffaSAdam Nemet; CHECK-NEXT: Function: multipleUsers2 61ab1f6ffaSAdam Nemet; CHECK-NEXT: Args: 62ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: 'load of type ' 63ab1f6ffaSAdam Nemet; CHECK-NEXT: - Type: i32 64ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' not eliminated' 65ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' in favor of ' 66ab1f6ffaSAdam Nemet; CHECK-NEXT: - OtherAccess: store 67ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' because it is clobbered by ' 68ab1f6ffaSAdam Nemet; CHECK-NEXT: - ClobberedBy: call 69ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 1, Column: 1 } 70ab1f6ffaSAdam Nemet; CHECK-NEXT: ... 71ab1f6ffaSAdam Nemet; CHECK: --- !Missed 72ab1f6ffaSAdam Nemet; CHECK-NEXT: Pass: gvn 73ab1f6ffaSAdam Nemet; CHECK-NEXT: Name: LoadClobbered 74ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 4, Column: 4 } 75ab1f6ffaSAdam Nemet; CHECK-NEXT: Function: multipleUsers2 76ab1f6ffaSAdam Nemet; CHECK-NEXT: Args: 77ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: 'load of type ' 78ab1f6ffaSAdam Nemet; CHECK-NEXT: - Type: i32 79ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' not eliminated' 80ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' in favor of ' 81ab1f6ffaSAdam Nemet; CHECK-NEXT: - OtherAccess: load 82ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 2, Column: 2 } 83ab1f6ffaSAdam Nemet; CHECK-NEXT: - String: ' because it is clobbered by ' 84ab1f6ffaSAdam Nemet; CHECK-NEXT: - ClobberedBy: call 85ab1f6ffaSAdam Nemet; CHECK-NEXT: DebugLoc: { File: '/tmp/s.c', Line: 3, Column: 3 } 86ab1f6ffaSAdam Nemet; CHECK-NEXT: ... 87ab1f6ffaSAdam Nemet 88ab1f6ffaSAdam Nemet; Ignore uses in other functions 89ab1f6ffaSAdam Nemet 90ab1f6ffaSAdam Nemetdefine dso_local void @multipleUsers2(i32 %b) local_unnamed_addr #0 { 91ab1f6ffaSAdam Nemetentry: 92*23abf931SNikita Popov store i32 %b, ptr @g, align 4 93ab1f6ffaSAdam Nemet tail call void @clobberingFunc() #1, !dbg !15 94*23abf931SNikita Popov %0 = load i32, ptr @g, align 4, !dbg !16 95ab1f6ffaSAdam Nemet tail call void @clobberingFunc() #1, !dbg !17 96*23abf931SNikita Popov %1 = load i32, ptr @g, align 4, !dbg !18 97ab1f6ffaSAdam Nemet %add3 = add nsw i32 %1, %0 98ab1f6ffaSAdam Nemet ret void 99ab1f6ffaSAdam Nemet} 100ab1f6ffaSAdam Nemet 101ab1f6ffaSAdam Nemetdeclare dso_local void @clobberingFunc() local_unnamed_addr #0 102ab1f6ffaSAdam Nemet 103ab1f6ffaSAdam Nemet@g = external global i32 104ab1f6ffaSAdam Nemet 105ab1f6ffaSAdam Nemetdefine dso_local void @globalUser(i32 %b) local_unnamed_addr #0 { 106ab1f6ffaSAdam Nemetentry: 107*23abf931SNikita Popov store i32 %b, ptr @g, align 4 108ab1f6ffaSAdam Nemet ret void 109ab1f6ffaSAdam Nemet} 110ab1f6ffaSAdam Nemet 111ab1f6ffaSAdam Nemet 112ab1f6ffaSAdam Nemetattributes #0 = { "use-soft-float"="false" } 113ab1f6ffaSAdam Nemetattributes #1 = { nounwind } 114ab1f6ffaSAdam Nemet 115ab1f6ffaSAdam Nemet!llvm.dbg.cu = !{!1} 116ab1f6ffaSAdam Nemet!llvm.module.flags = !{!4, !5, !6} 117ab1f6ffaSAdam Nemet!llvm.ident = !{!0} 118ab1f6ffaSAdam Nemet 119ab1f6ffaSAdam Nemet!0 = !{!"clang version 10.0.0 (git@github.com:llvm/llvm-project.git a2f6ae9abffcba260c22bb235879f0576bf3b783)"} 120ab1f6ffaSAdam Nemet!1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, producer: "clang version 4.0.0 (trunk 282540) (llvm/trunk 282542)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !3) 121ab1f6ffaSAdam Nemet!2 = !DIFile(filename: "/tmp/s.c", directory: "/tmp") 122ab1f6ffaSAdam Nemet!3 = !{} 123ab1f6ffaSAdam Nemet!4 = !{i32 2, !"Dwarf Version", i32 4} 124ab1f6ffaSAdam Nemet!5 = !{i32 2, !"Debug Info Version", i32 3} 125ab1f6ffaSAdam Nemet!6 = !{i32 1, !"PIC Level", i32 2} 126ab1f6ffaSAdam Nemet!8 = distinct !DISubprogram(name: "multipleUsers", scope: !2, file: !2, line: 1, type: !9, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !1, retainedNodes: !3) 127ab1f6ffaSAdam Nemet!9 = !DISubroutineType(types: !3) 128ab1f6ffaSAdam Nemet!10 = !DILocation(line: 1, column: 1, scope: !8) 129ab1f6ffaSAdam Nemet!11 = !DILocation(line: 2, column: 2, scope: !8) 130ab1f6ffaSAdam Nemet!12 = !DILocation(line: 3, column: 3, scope: !8) 131ab1f6ffaSAdam Nemet!13 = !DILocation(line: 4, column: 4, scope: !8) 132ab1f6ffaSAdam Nemet!14 = distinct !DISubprogram(name: "multipleUsers2", scope: !2, file: !2, line: 2, type: !9, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !1, retainedNodes: !3) 133ab1f6ffaSAdam Nemet!15 = !DILocation(line: 1, column: 1, scope: !14) 134ab1f6ffaSAdam Nemet!16 = !DILocation(line: 2, column: 2, scope: !14) 135ab1f6ffaSAdam Nemet!17 = !DILocation(line: 3, column: 3, scope: !14) 136ab1f6ffaSAdam Nemet!18 = !DILocation(line: 4, column: 4, scope: !14) 137