blob: 44e777161e8e5b9bc18657174975be14b8143778 [file] [log] [blame]
Tim Northover3b0846e2014-05-24 12:50:23 +00001; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs < %s | FileCheck %s
Tim Northovere0e3aef2013-01-31 12:12:40 +00002
3define i32 @foo(i32* %var, i1 %cond) {
Stephen Lind24ab202013-07-14 06:24:09 +00004; CHECK-LABEL: foo:
Tim Northovere0e3aef2013-01-31 12:12:40 +00005 br i1 %cond, label %atomic_ver, label %simple_ver
6simple_ver:
David Blaikiea79ac142015-02-27 21:17:42 +00007 %oldval = load i32, i32* %var
Tim Northovere0e3aef2013-01-31 12:12:40 +00008 %newval = add nsw i32 %oldval, -1
9 store i32 %newval, i32* %var
10 br label %somewhere
11atomic_ver:
Tim Northover15410e92013-04-08 08:40:41 +000012 fence seq_cst
13 %val = atomicrmw add i32* %var, i32 -1 monotonic
14 fence seq_cst
Tim Northovere0e3aef2013-01-31 12:12:40 +000015 br label %somewhere
16; CHECK: dmb
17; CHECK: ldxr
18; CHECK: dmb
19 ; The key point here is that the second dmb isn't immediately followed by the
20 ; simple_ver basic block, which LLVM attempted to do when DMB had been marked
21 ; with isBarrier. For now, look for something that looks like "somewhere".
22; CHECK-NEXT: mov
23somewhere:
24 %combined = phi i32 [ %val, %atomic_ver ], [ %newval, %simple_ver]
25 ret i32 %combined
26}