[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / ARM / optimize-dmbs-v7.ll
blob34a55aa718a3c72d4b7d3963f30327294725fff6
1 ; RUN: llc -O1 < %s -mtriple=armv7 -mattr=+db | FileCheck %s
3 @x1 = global i32 0, align 4
4 @x2 = global i32 0, align 4
6 define void @test() {
7 entry:
8   br label %for.body
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
19 for.end:                                          ; preds = %for.body
20   ret void
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
30 ; CHECK-NOT: str
31 ; CHECK: dmb
32 ; CHECK-NOT: dmb
33 ; CHECK: str
35 ; CHECK-NOT: str
36 ; CHECK: dmb
37 ; CHECK-NOT: dmb
38 ; CHECK: str
40 ; CHECK-NOT: str
41 ; CHECK: dmb
42 ; CHECK-NOT: dmb
43 ; CHECK-NOT: str
44 ; CHECK: %for.end
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
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
73 declare void @llvm.arm.dmb(i32)
74 declare void @llvm.arm.dsb(i32)