[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / AArch64 / intrinsics-memory-barrier.ll
blob2a73fee7718ad20d1bc31cb1952ba2249f2810e5
1 ; RUN: llc < %s -mtriple=aarch64-eabi -O=3 | FileCheck %s
3 define void @test() {
4   ; CHECK: dmb sy
5   call void @llvm.aarch64.dmb(i32 15)
6   ; CHECK: dmb osh
7   call void @llvm.aarch64.dmb(i32 3)
8   ; CHECK: dsb sy
9   call void @llvm.aarch64.dsb(i32 15)
10   ; CHECK: dsb ishld
11   call void @llvm.aarch64.dsb(i32 9)
12   ; CHECK: isb
13   call void @llvm.aarch64.isb(i32 15)
14   ret void
17 ; Important point is that the compiler should not reorder memory access
18 ; instructions around DMB.
19 ; Failure to do so, two STRs will collapse into one STP.
20 define void @test_dmb_reordering(i32 %a, i32 %b, i32* %d) {
21   store i32 %a, i32* %d              ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}]
23   call void @llvm.aarch64.dmb(i32 15); CHECK: dmb sy
25   %d1 = getelementptr i32, i32* %d, i64 1
26   store i32 %b, i32* %d1             ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #4]
28   ret void
31 ; Similarly for DSB.
32 define void @test_dsb_reordering(i32 %a, i32 %b, i32* %d) {
33   store i32 %a, i32* %d              ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}]
35   call void @llvm.aarch64.dsb(i32 15); CHECK: dsb sy
37   %d1 = getelementptr i32, i32* %d, i64 1
38   store i32 %b, i32* %d1             ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #4]
40   ret void
43 ; And ISB.
44 define void @test_isb_reordering(i32 %a, i32 %b, i32* %d) {
45   store i32 %a, i32* %d              ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}]
47   call void @llvm.aarch64.isb(i32 15); CHECK: isb
49   %d1 = getelementptr i32, i32* %d, i64 1
50   store i32 %b, i32* %d1             ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #4]
52   ret void
55 declare void @llvm.aarch64.dmb(i32)
56 declare void @llvm.aarch64.dsb(i32)
57 declare void @llvm.aarch64.isb(i32)