mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-30 15:32:52 +01:00
93b4cf4daf
These extra flags are not required to properly order the atomic load/store instructions. SelectionDAGBuilder chains atomics as if they were volatile, and SelectionDAG::getAtomic() sets the isVolatile bit on the memory operands of all atomic operations. The volatile bit is enough to order atomic loads and stores during and after SelectionDAG. This means we set mayLoad on atomic_load, mayStore on atomic_store, and mayLoad+mayStore on the remaining atomic read-modify-write operations. llvm-svn: 162733
34 lines
750 B
LLVM
34 lines
750 B
LLVM
; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
|
|
; Check that we generate new value jump.
|
|
|
|
@i = global i32 0, align 4
|
|
@j = global i32 10, align 4
|
|
|
|
define i32 @foo(i32 %a) nounwind {
|
|
entry:
|
|
; CHECK: if (cmp.eq(r{{[0-9]+}}.new, #0)) jump{{.}}
|
|
%addr1 = alloca i32, align 4
|
|
%addr2 = alloca i32, align 4
|
|
%0 = load i32* @i, align 4
|
|
store i32 %0, i32* %addr1, align 4
|
|
call void @bar(i32 1, i32 2)
|
|
%1 = load i32* @j, align 4
|
|
%tobool = icmp ne i32 %1, 0
|
|
br i1 %tobool, label %if.then, label %if.else
|
|
|
|
if.then:
|
|
call void @baz(i32 1, i32 2)
|
|
br label %if.end
|
|
|
|
if.else:
|
|
call void @guy(i32 10, i32 20)
|
|
br label %if.end
|
|
|
|
if.end:
|
|
ret i32 0
|
|
}
|
|
|
|
declare void @guy(i32, i32)
|
|
declare void @bar(i32, i32)
|
|
declare void @baz(i32, i32)
|