OLD | NEW |
---|---|
(Empty) | |
1 ; RUN: opt -nacl-rewrite-atomics -S < %s | FileCheck %s | |
2 | |
3 ; Check rewriting nand, max, min, umax, umin atomicrmw operations. | |
4 | |
5 target datalayout = "p:32:32:32" | |
6 | |
7 ; We test nand with all types, but for brevity's sake we don't do so for the | |
8 ; other operations. | |
9 define i8 @test_nand_i8(i8* %ptr, i8 %value) { | |
10 %res = atomicrmw nand i8* %ptr, i8 %value seq_cst | |
11 ret i8 %res | |
12 } | |
13 ; CHECK-LABEL: @test_nand_i8 | |
14 ; CHECK-NEXT: %1 = load i8, i8* %ptr, align 8 | |
JF
2015/08/05 16:25:21
This load needs to be atomic, or we need a fence b
Richard Diamond
2015/08/05 16:35:44
Hm, indeed this is wrong. This patch isn't the cul
| |
15 ; CHECK-NEXT: br label %atomicrmw.start | |
16 | |
17 ; CHECK: atomicrmw.start: | |
18 ; CHECK-NEXT: %loaded = phi i8 [ %1, %0 ], [ %3, %atomicrmw.start ] | |
19 ; CHECK-NEXT: %2 = and i8 %loaded, %value | |
20 ; CHECK-NEXT: %new = xor i8 %2, -1 | |
21 ; CHECK-NEXT: %3 = call i8 @llvm.nacl.atomic.cmpxchg.i8(i8* %ptr, i8 %loaded, i8 %new, i32 6, i32 6) | |
22 ; CHECK-NEXT: %success = icmp eq i8 %3, %loaded | |
23 ; CHECK-NEXT: br i1 %success, label %atomicrmw.end, label %atomicrmw.start | |
24 | |
25 ; CHECK: atomicrmw.end: | |
26 ; CHECK-NEXT: ret i8 %3 | |
27 | |
28 | |
29 | |
30 define i16 @test_nand_i16(i16* %ptr, i16 %value) { | |
31 %res = atomicrmw nand i16* %ptr, i16 %value seq_cst | |
32 ret i16 %res | |
33 } | |
34 ; CHECK-LABEL: @test_nand_i16 | |
35 ; CHECK: @llvm.nacl.atomic.cmpxchg | |
36 | |
37 define i32 @test_nand_i32(i32* %ptr, i32 %value) { | |
38 %res = atomicrmw nand i32* %ptr, i32 %value seq_cst | |
39 ret i32 %res | |
40 } | |
41 ; CHECK-LABEL: @test_nand_i32 | |
42 ; CHECK: @llvm.nacl.atomic.cmpxchg | |
43 | |
44 define i64 @test_nand_i64(i64* %ptr, i64 %value) { | |
45 %res = atomicrmw nand i64* %ptr, i64 %value seq_cst | |
46 ret i64 %res | |
47 } | |
48 ; CHECK-LABEL: @test_nand_i64 | |
49 ; CHECK: @llvm.nacl.atomic.cmpxchg | |
50 | |
51 | |
52 define i32 @test_max(i32* %ptr, i32 %value) { | |
53 %res = atomicrmw max i32* %ptr, i32 %value seq_cst | |
54 ret i32 %res | |
55 } | |
56 ; CHECK-LABEL: @test_max | |
57 ; CHECK: @llvm.nacl.atomic.cmpxchg | |
58 | |
59 define i32 @test_min(i32* %ptr, i32 %value) { | |
60 %res = atomicrmw min i32* %ptr, i32 %value seq_cst | |
61 ret i32 %res | |
62 } | |
63 ; CHECK-LABEL: @test_min | |
64 ; CHECK: @llvm.nacl.atomic.cmpxchg | |
65 | |
66 define i32 @test_umax(i32* %ptr, i32 %value) { | |
67 %res = atomicrmw umax i32* %ptr, i32 %value seq_cst | |
68 ret i32 %res | |
69 } | |
70 ; CHECK-LABEL: @test_umax | |
71 ; CHECK: @llvm.nacl.atomic.cmpxchg | |
72 | |
73 define i32 @test_umin(i32* %ptr, i32 %value) { | |
74 %res = atomicrmw umin i32* %ptr, i32 %value seq_cst | |
75 ret i32 %res | |
76 } | |
77 ; CHECK-LABEL: @test_umin | |
78 ; CHECK: @llvm.nacl.atomic.cmpxchg | |
OLD | NEW |