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: %2 = and i8 %loaded, %value | |
15 ; CHECK: %new = xor i8 %2, -1 | |
16 ; CHECK: %3 = call i8 @llvm.nacl.atomic.cmpxchg.i8(i8* %ptr, i8 %loaded, i8 %ne w, i32 6, i32 6) | |
JF
2015/02/16 21:09:01
Could you check that there's a loop at least for o
Richard Diamond
2015/02/16 23:36:31
Done.
| |
17 | |
18 define i16 @test_nand_i16(i16* %ptr, i16 %value) { | |
19 %res = atomicrmw nand i16* %ptr, i16 %value seq_cst | |
20 ret i16 %res | |
21 } | |
22 ; CHECK-LABEL: @test_nand_i16 | |
23 ; CHECK: %2 = and i16 %loaded, %value | |
24 ; CHECK: %new = xor i16 %2, -1 | |
25 ; CHECK: %3 = call i16 @llvm.nacl.atomic.cmpxchg.i16(i16* %ptr, i16 %loaded, i1 6 %new, i32 6, i32 6) | |
26 | |
27 define i32 @test_nand_i32(i32* %ptr, i32 %value) { | |
28 %res = atomicrmw nand i32* %ptr, i32 %value seq_cst | |
29 ret i32 %res | |
30 } | |
31 ; CHECK-LABEL: @test_nand_i32 | |
32 ; CHECK: %2 = and i32 %loaded, %value | |
33 ; CHECK: %new = xor i32 %2, -1 | |
34 ; CHECK: %3 = call i32 @llvm.nacl.atomic.cmpxchg.i32(i32* %ptr, i32 %loaded, i3 2 %new, i32 6, i32 6) | |
35 | |
36 define i64 @test_nand_i64(i64* %ptr, i64 %value) { | |
37 %res = atomicrmw nand i64* %ptr, i64 %value seq_cst | |
38 ret i64 %res | |
39 } | |
40 ; CHECK-LABEL: @test_nand_i64 | |
41 ; CHECK: %2 = and i64 %loaded, %value | |
42 ; CHECK: %new = xor i64 %2, -1 | |
43 ; CHECK: %3 = call i64 @llvm.nacl.atomic.cmpxchg.i64(i64* %ptr, i64 %loaded, i6 4 %new, i32 6, i32 6) | |
44 | |
45 | |
46 define i32 @test_max(i32* %ptr, i32 %value) { | |
47 %res = atomicrmw max i32* %ptr, i32 %value seq_cst | |
48 ret i32 %res | |
49 } | |
50 ; CHECK-LABEL: @test_max | |
51 ; CHECK: %2 = icmp sgt i32 %loaded, %value | |
52 ; CHECK: %new = select i1 %2, i32 %loaded, i32 %value | |
53 ; CHECK: %3 = call i32 @llvm.nacl.atomic.cmpxchg.i32(i32* %ptr, i32 %loaded, i3 2 %new, i32 6, i32 6) | |
54 | |
55 define i32 @test_min(i32* %ptr, i32 %value) { | |
56 %res = atomicrmw min i32* %ptr, i32 %value seq_cst | |
57 ret i32 %res | |
58 } | |
59 ; CHECK-LABEL: @test_min | |
60 ; CHECK: %1 = load i32* %ptr, align 32 | |
61 ; CHECK: br label %atomicrmw.start | |
62 | |
63 ; CHECK: %2 = icmp sle i32 %loaded, %value | |
64 ; CHECK: %new = select i1 %2, i32 %loaded, i32 %value | |
65 ; CHECK: %3 = call i32 @llvm.nacl.atomic.cmpxchg.i32(i32* %ptr, i32 %loaded, i3 2 %new, i32 6, i32 6) | |
66 | |
67 define i32 @test_umax(i32* %ptr, i32 %value) { | |
68 %res = atomicrmw umax i32* %ptr, i32 %value seq_cst | |
69 ret i32 %res | |
70 } | |
71 ; CHECK-LABEL: @test_umax | |
72 ; CHECK: %2 = icmp ugt i32 %loaded, %value | |
73 ; CHECK: %new = select i1 %2, i32 %loaded, i32 %value | |
74 ; CHECK: %3 = call i32 @llvm.nacl.atomic.cmpxchg.i32(i32* %ptr, i32 %loaded, i3 2 %new, i32 6, i32 6) | |
75 | |
76 define i32 @test_umin(i32* %ptr, i32 %value) { | |
77 %res = atomicrmw umin i32* %ptr, i32 %value seq_cst | |
78 ret i32 %res | |
79 } | |
80 ; CHECK-LABEL: @test_umin | |
81 ; CHECK: %2 = icmp ule i32 %loaded, %value | |
82 ; CHECK: %new = select i1 %2, i32 %loaded, i32 %value | |
83 ; CHECK: %3 = call i32 @llvm.nacl.atomic.cmpxchg.i32(i32* %ptr, i32 %loaded, i3 2 %new, i32 6, i32 6) | |
OLD | NEW |