• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt -S -early-cse -earlycse-debug-hash < %s | FileCheck %s
2
3; While it is normally okay to do memory optimizations over calls to
4; @readonly_function and @readnone_function, we cannot do that if
5; they're carrying unknown operand bundles since the presence of
6; unknown operand bundles implies arbitrary memory effects.
7
8declare void @readonly_function() readonly nounwind
9declare void @readnone_function() readnone nounwind
10
11define i32 @test0(i32* %x) {
12; CHECK-LABEL: @test0(
13 entry:
14  store i32 100, i32* %x
15; CHECK: store i32 100, i32* %x
16  call void @readonly_function() [ "tag"() ]
17; CHECK: call void @readonly_function()
18
19  %v = load i32, i32* %x
20; CHECK: %v = load i32, i32* %x
21; CHECK: ret i32 %v
22  ret i32 %v
23}
24
25define i32 @test1(i32* %x) {
26; CHECK: @test1(
27 entry:
28  store i32 100, i32* %x
29; CHECK: store i32 100, i32* %x
30  call void @readonly_function() readonly [ "tag"() ]
31; CHECK-NOT: call void @readonly_function
32  %v = load i32, i32* %x
33  ret i32 %v
34; CHECK: ret i32 100
35}
36
37define i32 @test3(i32* %x) {
38; CHECK-LABEL: @test3(
39 entry:
40  store i32 100, i32* %x
41; CHECK: store i32 100, i32* %x
42  call void @readonly_function()
43; CHECK-NOT: call void @readonly_function
44  %v = load i32, i32* %x
45  ret i32 %v
46; CHECK: ret i32 100
47}
48
49define void @test4(i32* %x) {
50; CHECK-LABEL: @test4(
51 entry:
52  store i32 100, i32* %x
53; CHECK: store i32 100, i32* %x
54  call void @readnone_function() [ "tag"() ]
55; CHECK: call void @readnone_function
56  store i32 200, i32* %x
57; CHECK: store i32 200, i32* %x
58  ret void
59}
60
61define void @test5(i32* %x) {
62; CHECK-LABEL: @test5(
63 entry:
64  store i32 100, i32* %x
65; CHECK-NOT: store i32 100, i32* %x
66; CHECK-NOT: call void @readnone_function
67  call void @readnone_function() readnone [ "tag"() ]
68  store i32 200, i32* %x
69; CHECK: store i32 200, i32* %x
70  ret void
71}
72
73define void @test6(i32* %x) {
74; The "deopt" operand bundle does not make the call to
75; @readonly_function read-write; and so the nounwind readonly call can
76; be deleted.
77
78; CHECK-LABEL: @test6(
79 entry:
80
81; CHECK-NEXT: entry:
82; CHECK-NEXT:  store i32 200, i32* %x
83; CHECK-NEXT:  ret void
84
85  store i32 100, i32* %x
86  call void @readonly_function() [ "deopt"() ]
87  store i32 200, i32* %x
88  ret void
89}
90