75 lines · plain
1; RUN: llc -O1 < %s -mtriple=armv7 -mattr=+db | FileCheck %s2 3@x1 = global i32 0, align 44@x2 = global i32 0, align 45 6define void @test() {7entry:8 br label %for.body9 10for.body: ; preds = %for.body, %entry11 %i.013 = phi i32 [ 1, %entry ], [ %inc6, %for.body ]12 store atomic i32 %i.013, ptr @x1 seq_cst, align 413 store atomic i32 %i.013, ptr @x1 seq_cst, align 414 store atomic i32 %i.013, ptr @x2 seq_cst, align 415 %inc6 = add nsw i32 %i.013, 116 %exitcond = icmp eq i32 %inc6, 217 br i1 %exitcond, label %for.end, label %for.body18 19for.end: ; preds = %for.body20 ret void21 22; The for.body contains 3 seq_cst stores.23; Hence it should have 3 dmb;str;dmb sequences with the middle dmbs collapsed24; CHECK: %for.body25; CHECK-NOT: str26; CHECK: dmb27; CHECK-NOT: dmb28; CHECK: str29 30; CHECK-NOT: str31; CHECK: dmb32; CHECK-NOT: dmb33; CHECK: str34 35; CHECK-NOT: str36; CHECK: dmb37; CHECK-NOT: dmb38; CHECK: str39 40; CHECK-NOT: str41; CHECK: dmb42; CHECK-NOT: dmb43; CHECK-NOT: str44; CHECK: %for.end45}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 void52; the call should prevent the two dmbs from collapsing53; CHECK: test2:54; CHECK: dmb55; CHECK-NEXT: bl56; CHECK-NEXT: dmb57}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 void64; the call should prevent the two dmbs from collapsing65; CHECK: test3:66; CHECK: dmb67; CHECK-NEXT: dsb68; CHECK-NEXT: dmb69 70}71 72 73declare void @llvm.arm.dmb(i32)74declare void @llvm.arm.dsb(i32)75