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 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) 75