1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00
llvm-mirror/test/CodeGen/ARM/optimize-dmbs-v7.ll
Davide Italiano 4ae19d2fd4 [Target/ARM] Only enable OptimizeBarrierPass at -O1 and above.
Ideally this is going to be and LLVM IR pass (shared, among others
with AArch64), but for the time being just enable it if consumers
ask us for optimization and not unconditionally.

Discussed with Tim Northover on IRC.

llvm-svn: 237837
2015-05-20 21:40:38 +00:00

75 lines
1.6 KiB
LLVM

; RUN: llc -O1 < %s -mtriple=armv7 -mattr=+db | FileCheck %s
@x1 = global i32 0, align 4
@x2 = global i32 0, align 4
define void @test() {
entry:
br label %for.body
for.body: ; preds = %for.body, %entry
%i.013 = phi i32 [ 1, %entry ], [ %inc6, %for.body ]
store atomic i32 %i.013, i32* @x1 seq_cst, align 4
store atomic i32 %i.013, i32* @x1 seq_cst, align 4
store atomic i32 %i.013, i32* @x2 seq_cst, align 4
%inc6 = add nsw i32 %i.013, 1
%exitcond = icmp eq i32 %inc6, 2
br i1 %exitcond, label %for.end, label %for.body
for.end: ; preds = %for.body
ret void
; The for.body contains 3 seq_cst stores.
; Hence it should have 3 dmb;str;dmb sequences with the middle dmbs collapsed
; CHECK: %for.body
; CHECK-NOT: str
; CHECK: dmb
; CHECK-NOT: dmb
; CHECK: str
; CHECK-NOT: str
; CHECK: dmb
; CHECK-NOT: dmb
; CHECK: str
; CHECK-NOT: str
; CHECK: dmb
; CHECK-NOT: dmb
; CHECK: str
; CHECK-NOT: str
; CHECK: dmb
; CHECK-NOT: dmb
; CHECK-NOT: str
; CHECK: %for.end
}
define void @test2() {
call void @llvm.arm.dmb(i32 11)
tail call void @test()
call void @llvm.arm.dmb(i32 11)
ret void
; the call should prevent the two dmbs from collapsing
; CHECK: test2:
; CHECK: dmb
; CHECK-NEXT: bl
; CHECK-NEXT: dmb
}
define void @test3() {
call void @llvm.arm.dmb(i32 11)
call void @llvm.arm.dsb(i32 9)
call void @llvm.arm.dmb(i32 11)
ret void
; the call should prevent the two dmbs from collapsing
; CHECK: test3:
; CHECK: dmb
; CHECK-NEXT: dsb
; CHECK-NEXT: dmb
}
declare void @llvm.arm.dmb(i32)
declare void @llvm.arm.dsb(i32)