[WebAssembly] Don't perform the returned-argument optimization on constants.
[oota-llvm.git] / test / CodeGen / ARM / intrinsics-memory-barrier.ll
1 ; RUN: llc < %s -mtriple=armv7 -mattr=+db | FileCheck %s
2 ; RUN: llc < %s -mtriple=thumbv7 -mattr=+db | FileCheck %s
3
4 ; CHECK-LABEL: test
5 define void @test() {
6   call void @llvm.arm.dmb(i32 3)     ; CHECK: dmb osh
7   call void @llvm.arm.dsb(i32 7)     ; CHECK: dsb nsh
8   call void @llvm.arm.isb(i32 15)    ; CHECK: isb sy
9   ret void
10 }
11
12 ; Important point is that the compiler should not reorder memory access
13 ; instructions around DMB.
14 ; Failure to do so, two STRs will collapse into one STRD.
15 ; CHECK-LABEL: test_dmb_reordering
16 define void @test_dmb_reordering(i32 %a, i32 %b, i32* %d) {
17   store i32 %a, i32* %d              ; CHECK: str {{r[0-9]+}}, [{{r[0-9]+}}]
18
19   call void @llvm.arm.dmb(i32 15)    ; CHECK: dmb sy
20
21   %d1 = getelementptr i32, i32* %d, i32 1
22   store i32 %b, i32* %d1             ; CHECK: str {{r[0-9]+}}, [{{r[0-9]+}}, #4]
23
24   ret void
25 }
26
27 ; Similarly for DSB.
28 ; CHECK-LABEL: test_dsb_reordering
29 define void @test_dsb_reordering(i32 %a, i32 %b, i32* %d) {
30   store i32 %a, i32* %d              ; CHECK: str {{r[0-9]+}}, [{{r[0-9]+}}]
31
32   call void @llvm.arm.dsb(i32 15)    ; CHECK: dsb sy
33
34   %d1 = getelementptr i32, i32* %d, i32 1
35   store i32 %b, i32* %d1             ; CHECK: str {{r[0-9]+}}, [{{r[0-9]+}}, #4]
36
37   ret void
38 }
39
40 ; And ISB.
41 ; CHECK-LABEL: test_isb_reordering
42 define void @test_isb_reordering(i32 %a, i32 %b, i32* %d) {
43   store i32 %a, i32* %d              ; CHECK: str {{r[0-9]+}}, [{{r[0-9]+}}]
44
45   call void @llvm.arm.isb(i32 15)    ; CHECK: isb sy
46
47   %d1 = getelementptr i32, i32* %d, i32 1
48   store i32 %b, i32* %d1             ; CHECK: str {{r[0-9]+}}, [{{r[0-9]+}}, #4]
49
50   ret void
51 }
52
53 declare void @llvm.arm.dmb(i32)
54 declare void @llvm.arm.dsb(i32)
55 declare void @llvm.arm.isb(i32)