1; RUN: opt < %s -basic-aa -dse -S | FileCheck %s
2
3; CHECK-LABEL: void @skipBarrier(i8* %ptr)
4define void @skipBarrier(i8* %ptr) {
5; CHECK-NOT: store i8 42
6  store i8 42, i8* %ptr
7; CHECK: %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
8  %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
9; CHECK: store i8 43
10  store i8 43, i8* %ptr2
11  ret void
12}
13
14; CHECK-LABEL: void @skip2Barriers(i8* %ptr)
15define void @skip2Barriers(i8* %ptr) {
16; CHECK-NOT: store i8 42
17  store i8 42, i8* %ptr
18; CHECK: %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
19  %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
20; CHECK-NOT: store i8 43
21  store i8 43, i8* %ptr2
22  %ptr3 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr2)
23  %ptr4 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr3)
24
25; CHECK: store i8 44
26  store i8 44, i8* %ptr4
27  ret void
28}
29
30; CHECK-LABEL: void @skip3Barriers(i8* %ptr)
31define void @skip3Barriers(i8* %ptr) {
32; CHECK-NOT: store i8 42
33  store i8 42, i8* %ptr
34; CHECK: %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
35  %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
36; CHECK-NOT: store i8 43
37  store i8 43, i8* %ptr2
38  %ptr3 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr2)
39  %ptr4 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr3)
40
41; CHECK: store i8 44
42  store i8 44, i8* %ptr4
43  ret void
44}
45
46; CHECK-LABEL: void @skip4Barriers(i8* %ptr)
47define void @skip4Barriers(i8* %ptr) {
48; CHECK-NOT: store i8 42
49  store i8 42, i8* %ptr
50; CHECK: %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
51  %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
52; CHECK-NOT: store i8 43
53  store i8 43, i8* %ptr2
54  %ptr3 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr2)
55  %ptr4 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr3)
56  %ptr5 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr3)
57
58; CHECK: store i8 44
59  store i8 44, i8* %ptr5
60  ret void
61}
62
63
64declare i8* @llvm.launder.invariant.group.p0i8(i8*)
65declare i8* @llvm.strip.invariant.group.p0i8(i8*)
66