blob: fc201479d8ce85bd3d7cb98c32776b9631952989 [file] [log] [blame]
Sanjoy Das98a341b2015-10-22 03:12:22 +00001; RUN: opt -S -early-cse < %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
Sanjoy Dasbcd15032015-11-26 01:16:05 +00005; they're carrying unknown operand bundles since the presence of
6; unknown operand bundles implies arbitrary memory effects.
Sanjoy Das98a341b2015-10-22 03:12:22 +00007
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}
Sanjoy Dasbcd15032015-11-26 01:16:05 +000072
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}