Mercurial > hg > CbC > CbC_llvm
view test/CodeGen/AArch64/intrinsics-memory-barrier.ll @ 100:7d135dc70f03 LLVM 3.9
LLVM 3.9
author | Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 26 Jan 2016 22:53:40 +0900 |
parents | afa8332a0e37 |
children |
line wrap: on
line source
; RUN: llc < %s -mtriple=aarch64-eabi -O=3 | FileCheck %s define void @test() { ; CHECK: dmb sy call void @llvm.aarch64.dmb(i32 15) ; CHECK: dmb osh call void @llvm.aarch64.dmb(i32 3) ; CHECK: dsb sy call void @llvm.aarch64.dsb(i32 15) ; CHECK: dsb ishld call void @llvm.aarch64.dsb(i32 9) ; CHECK: isb call void @llvm.aarch64.isb(i32 15) ret void } ; Important point is that the compiler should not reorder memory access ; instructions around DMB. ; Failure to do so, two STRs will collapse into one STP. define void @test_dmb_reordering(i32 %a, i32 %b, i32* %d) { store i32 %a, i32* %d ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}] call void @llvm.aarch64.dmb(i32 15); CHECK: dmb sy %d1 = getelementptr i32, i32* %d, i64 1 store i32 %b, i32* %d1 ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #4] ret void } ; Similarly for DSB. define void @test_dsb_reordering(i32 %a, i32 %b, i32* %d) { store i32 %a, i32* %d ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}] call void @llvm.aarch64.dsb(i32 15); CHECK: dsb sy %d1 = getelementptr i32, i32* %d, i64 1 store i32 %b, i32* %d1 ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #4] ret void } ; And ISB. define void @test_isb_reordering(i32 %a, i32 %b, i32* %d) { store i32 %a, i32* %d ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}] call void @llvm.aarch64.isb(i32 15); CHECK: isb %d1 = getelementptr i32, i32* %d, i64 1 store i32 %b, i32* %d1 ; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, #4] ret void } declare void @llvm.aarch64.dmb(i32) declare void @llvm.aarch64.dsb(i32) declare void @llvm.aarch64.isb(i32)