blob: 34a55aa718a3c72d4b7d3963f30327294725fff6 [file] [log] [blame]
Davide Italiano141b28912015-05-20 21:40:38 +00001; RUN: llc -O1 < %s -mtriple=armv7 -mattr=+db | FileCheck %s
Renato Golind93295e2014-04-02 09:03:43 +00002
3@x1 = global i32 0, align 4
4@x2 = global i32 0, align 4
5
6define void @test() {
7entry:
8 br label %for.body
9
10for.body: ; preds = %for.body, %entry
11 %i.013 = phi i32 [ 1, %entry ], [ %inc6, %for.body ]
12 store atomic i32 %i.013, i32* @x1 seq_cst, align 4
13 store atomic i32 %i.013, i32* @x1 seq_cst, align 4
14 store atomic i32 %i.013, i32* @x2 seq_cst, align 4
15 %inc6 = add nsw i32 %i.013, 1
16 %exitcond = icmp eq i32 %inc6, 2
17 br i1 %exitcond, label %for.end, label %for.body
18
19for.end: ; preds = %for.body
20 ret void
21
22; The for.body contains 3 seq_cst stores.
23; Hence it should have 3 dmb;str;dmb sequences with the middle dmbs collapsed
24; CHECK: %for.body
25; CHECK-NOT: str
26; CHECK: dmb
27; CHECK-NOT: dmb
28; CHECK: str
29
30; CHECK-NOT: str
31; CHECK: dmb
32; CHECK-NOT: dmb
33; CHECK: str
34
35; CHECK-NOT: str
36; CHECK: dmb
37; CHECK-NOT: dmb
38; CHECK: str
39
40; CHECK-NOT: str
41; CHECK: dmb
42; CHECK-NOT: dmb
43; CHECK-NOT: str
44; CHECK: %for.end
45}
46
47define void @test2() {
48 call void @llvm.arm.dmb(i32 11)
49 tail call void @test()
50 call void @llvm.arm.dmb(i32 11)
51 ret void
52; the call should prevent the two dmbs from collapsing
53; CHECK: test2:
54; CHECK: dmb
55; CHECK-NEXT: bl
56; CHECK-NEXT: dmb
57}
58
59define void @test3() {
60 call void @llvm.arm.dmb(i32 11)
61 call void @llvm.arm.dsb(i32 9)
62 call void @llvm.arm.dmb(i32 11)
63 ret void
64; the call should prevent the two dmbs from collapsing
65; CHECK: test3:
66; CHECK: dmb
67; CHECK-NEXT: dsb
68; CHECK-NEXT: dmb
69
70}
71
72
73declare void @llvm.arm.dmb(i32)
74declare void @llvm.arm.dsb(i32)