Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Feature / OperandBundles / early-cse.ll
blob78715b651ec7c09e1fa5ad2dc61c2728132013ca
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=early-cse -earlycse-debug-hash < %s | FileCheck %s
4 ; While it is normally okay to do memory optimizations over calls to
5 ; @readonly_function and @readnone_function, we cannot do that if
6 ; they're carrying unknown operand bundles since the presence of
7 ; unknown operand bundles implies arbitrary memory effects.
9 declare void @readonly_function() readonly nounwind willreturn
10 declare void @readnone_function() readnone nounwind willreturn
12 define i32 @test0(ptr %x) {
13 ; CHECK-LABEL: @test0(
14 ; CHECK-NEXT:  entry:
15 ; CHECK-NEXT:    store i32 100, ptr [[X:%.*]], align 4
16 ; CHECK-NEXT:    call void @readonly_function() [ "tag"() ]
17 ; CHECK-NEXT:    [[V:%.*]] = load i32, ptr [[X]], align 4
18 ; CHECK-NEXT:    ret i32 [[V]]
20   entry:
21   store i32 100, ptr %x
22   call void @readonly_function() [ "tag"() ]
24   %v = load i32, ptr %x
25   ret i32 %v
28 define i32 @test1(ptr %x) {
29 ; CHECK-LABEL: @test1(
30 ; CHECK-NEXT:  entry:
31 ; CHECK-NEXT:    store i32 100, ptr [[X:%.*]], align 4
32 ; CHECK-NEXT:    ret i32 100
34   entry:
35   store i32 100, ptr %x
36   call void @readonly_function() readonly [ "tag"() ]
37   %v = load i32, ptr %x
38   ret i32 %v
41 define i32 @test3(ptr %x) {
42 ; CHECK-LABEL: @test3(
43 ; CHECK-NEXT:  entry:
44 ; CHECK-NEXT:    store i32 100, ptr [[X:%.*]], align 4
45 ; CHECK-NEXT:    ret i32 100
47   entry:
48   store i32 100, ptr %x
49   call void @readonly_function()
50   %v = load i32, ptr %x
51   ret i32 %v
54 define void @test4(ptr %x) {
55 ; CHECK-LABEL: @test4(
56 ; CHECK-NEXT:  entry:
57 ; CHECK-NEXT:    store i32 100, ptr [[X:%.*]], align 4
58 ; CHECK-NEXT:    call void @readnone_function() [ "tag"() ]
59 ; CHECK-NEXT:    store i32 200, ptr [[X]], align 4
60 ; CHECK-NEXT:    ret void
62   entry:
63   store i32 100, ptr %x
64   call void @readnone_function() [ "tag"() ]
65   store i32 200, ptr %x
66   ret void
69 define void @test5(ptr %x) {
70 ; CHECK-LABEL: @test5(
71 ; CHECK-NEXT:  entry:
72 ; CHECK-NEXT:    store i32 200, ptr [[X:%.*]], align 4
73 ; CHECK-NEXT:    ret void
75   entry:
76   store i32 100, ptr %x
77   call void @readnone_function() readnone [ "tag"() ]
78   store i32 200, ptr %x
79   ret void
82 define void @test6(ptr %x) {
83 ; The "deopt" operand bundle does not make the call to
84 ; @readonly_function read-write; and so the nounwind readonly call can
85 ; be deleted.
86 ; CHECK-LABEL: @test6(
87 ; CHECK-NEXT:  entry:
88 ; CHECK-NEXT:    store i32 200, ptr [[X:%.*]], align 4
89 ; CHECK-NEXT:    ret void
91   entry:
94   store i32 100, ptr %x
95   call void @readonly_function() [ "deopt"() ]
96   store i32 200, ptr %x
97   ret void