236
|
1 // RUN: mlir-translate -mlir-to-llvmir %s -split-input-file -verify-diagnostics
|
|
2
|
|
3 // Checking translation when the update is carried out by using more than one op
|
|
4 // in the region.
|
|
5 llvm.func @omp_atomic_update_multiple_step_update(%x: !llvm.ptr<i32>, %expr: i32) {
|
|
6 omp.atomic.update %x : !llvm.ptr<i32> {
|
|
7 ^bb0(%xval: i32):
|
|
8 %t1 = llvm.mul %xval, %expr : i32
|
|
9 %t2 = llvm.sdiv %t1, %expr : i32
|
|
10 %newval = llvm.add %xval, %t2 : i32
|
|
11 omp.yield(%newval : i32)
|
|
12 }
|
|
13 llvm.return
|
|
14 }
|
|
15
|
|
16 // -----
|
|
17
|
|
18 // Checking translation when the captured variable is not used in the inner
|
|
19 // update operation
|
|
20 llvm.func @omp_atomic_update_multiple_step_update(%x: !llvm.ptr<i32>, %expr: i32) {
|
252
|
21 // expected-error @+2 {{no atomic update operation with region argument as operand found inside atomic.update region}}
|
236
|
22 // expected-error @+1 {{LLVM Translation failed for operation: omp.atomic.update}}
|
|
23 omp.atomic.update %x : !llvm.ptr<i32> {
|
|
24 ^bb0(%xval: i32):
|
|
25 %newval = llvm.mul %expr, %expr : i32
|
|
26 omp.yield(%newval : i32)
|
|
27 }
|
|
28 llvm.return
|
|
29 }
|
|
30
|
|
31 // -----
|
|
32
|
|
33 // Checking translation when the update is carried out by using more than one
|
|
34 // operations in the atomic capture region.
|
|
35 llvm.func @omp_atomic_update_multiple_step_update(%x: !llvm.ptr<i32>, %v: !llvm.ptr<i32>, %expr: i32) {
|
|
36 // expected-error @+1 {{LLVM Translation failed for operation: omp.atomic.capture}}
|
|
37 omp.atomic.capture memory_order(seq_cst) {
|
252
|
38 omp.atomic.read %v = %x : !llvm.ptr<i32>, i32
|
|
39 // expected-error @+1 {{no atomic update operation with region argument as operand found inside atomic.update region}}
|
236
|
40 omp.atomic.update %x : !llvm.ptr<i32> {
|
|
41 ^bb0(%xval: i32):
|
|
42 %newval = llvm.mul %expr, %expr : i32
|
|
43 omp.yield(%newval : i32)
|
|
44 }
|
|
45 }
|
|
46 llvm.return
|
|
47 }
|
|
48
|
|
49 // -----
|
|
50
|
|
51 // Checking translation when the captured variable is not used in the inner
|
|
52 // update operation
|
|
53 llvm.func @omp_atomic_update_multiple_step_update(%x: !llvm.ptr<i32>, %v: !llvm.ptr<i32>, %expr: i32) {
|
|
54 omp.atomic.capture memory_order(seq_cst) {
|
252
|
55 omp.atomic.read %v = %x : !llvm.ptr<i32>, i32
|
236
|
56 omp.atomic.update %x : !llvm.ptr<i32> {
|
|
57 ^bb0(%xval: i32):
|
|
58 %t1 = llvm.mul %xval, %expr : i32
|
|
59 %t2 = llvm.sdiv %t1, %expr : i32
|
|
60 %newval = llvm.add %xval, %t2 : i32
|
|
61 omp.yield(%newval : i32)
|
|
62 }
|
|
63 }
|
|
64 llvm.return
|
|
65 }
|
|
66
|
|
67 // -----
|
|
68
|
|
69 llvm.func @omp_threadprivate() {
|
|
70 %0 = llvm.mlir.constant(1 : i64) : i64
|
|
71 %1 = llvm.mlir.constant(1 : i32) : i32
|
|
72 %2 = llvm.mlir.constant(2 : i32) : i32
|
|
73 %3 = llvm.mlir.constant(3 : i32) : i32
|
|
74
|
|
75 %4 = llvm.alloca %0 x i32 {in_type = i32, name = "a"} : (i64) -> !llvm.ptr<i32>
|
|
76
|
|
77 // expected-error @below {{Addressing symbol not found}}
|
|
78 // expected-error @below {{LLVM Translation failed for operation: omp.threadprivate}}
|
|
79 %5 = omp.threadprivate %4 : !llvm.ptr<i32> -> !llvm.ptr<i32>
|
|
80
|
|
81 llvm.store %1, %5 : !llvm.ptr<i32>
|
|
82
|
|
83 omp.parallel {
|
|
84 %6 = omp.threadprivate %4 : !llvm.ptr<i32> -> !llvm.ptr<i32>
|
|
85 llvm.store %2, %6 : !llvm.ptr<i32>
|
|
86 omp.terminator
|
|
87 }
|
|
88
|
|
89 llvm.store %3, %5 : !llvm.ptr<i32>
|
|
90 llvm.return
|
|
91 }
|