[ARM] Enable shrink-wrapping by default.
[oota-llvm.git] / test / CodeGen / ARM / optimize-dmbs-v7.ll
1 ; RUN: llc -O1 < %s -mtriple=armv7 -mattr=+db | FileCheck %s
2
3 @x1 = global i32 0, align 4
4 @x2 = global i32 0, align 4
5
6 define void @test() {
7 entry:
8   br label %for.body
9
10 for.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
19 for.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
47 define 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
59 define 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
73 declare void @llvm.arm.dmb(i32)
74 declare void @llvm.arm.dsb(i32)