xref: /llvm-project/llvm/test/Transforms/GVN/opt-remarks-multiple-users.ll (revision 23abf931386002fb9d2c11d026846475c224c641)
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