@@ -1481,6 +1481,49 @@ llvm.func @omp_atomic_update(%x:!llvm.ptr, %expr: i32, %xbool: !llvm.ptr, %exprb
14811481
14821482// -----
14831483
1484+ // CHECK-LABEL: @omp_atomic_write
1485+ llvm.func @omp_atomic_write () {
1486+ // CHECK: %[[ALLOCA0:.*]] = alloca { float, float }, align 8
1487+ // CHECK: %[[ALLOCA1:.*]] = alloca { float, float }, align 8
1488+ // CHECK: %[[X:.*]] = alloca float, i64 1, align 4
1489+ // CHECK: %[[R1:.*]] = alloca float, i64 1, align 4
1490+ // CHECK: %[[ALLOCA:.*]] = alloca { float, float }, i64 1, align 8
1491+ // CHECK: %[[LOAD:.*]] = load float, ptr %[[R1]], align 4
1492+ // CHECK: %[[IDX1:.*]] = insertvalue { float, float } undef, float %[[LOAD]], 0
1493+ // CHECK: %[[IDX2:.*]] = insertvalue { float, float } %[[IDX1]], float 0.000000e+00, 1
1494+ // CHECK: br label %entry
1495+
1496+ // CHECK: entry:
1497+ // CHECK: store { float, float } %[[IDX2]], ptr %[[ALLOCA1]], align 4
1498+ // CHECK: call void @__atomic_store(i64 8, ptr %[[ALLOCA]], ptr %[[ALLOCA1]], i32 0)
1499+ // CHECK: store { float, float } { float 1.000000e+00, float 1.000000e+00 }, ptr %[[ALLOCA0]], align 4
1500+ // CHECK: call void @__atomic_store(i64 8, ptr %[[ALLOCA]], ptr %[[ALLOCA0]], i32 0)
1501+
1502+ %0 = llvm.mlir.constant (1 : i64 ) : i64
1503+ %1 = llvm.alloca %0 x f32 {bindc_name = " x" } : (i64 ) -> !llvm.ptr
1504+ %2 = llvm.mlir.constant (1 : i64 ) : i64
1505+ %3 = llvm.alloca %2 x f32 {bindc_name = " r1" } : (i64 ) -> !llvm.ptr
1506+ %4 = llvm.mlir.constant (1 : i64 ) : i64
1507+ %5 = llvm.alloca %4 x !llvm.struct <(f32 , f32 )> {bindc_name = " c1" } : (i64 ) -> !llvm.ptr
1508+ %6 = llvm.mlir.constant (1.000000e+00 : f32 ) : f32
1509+ %7 = llvm.mlir.constant (0.000000e+00 : f32 ) : f32
1510+ %8 = llvm.mlir.constant (1 : i64 ) : i64
1511+ %9 = llvm.mlir.constant (1 : i64 ) : i64
1512+ %10 = llvm.mlir.constant (1 : i64 ) : i64
1513+ %11 = llvm.load %3 : !llvm.ptr -> f32
1514+ %12 = llvm.mlir.undef : !llvm.struct <(f32 , f32 )>
1515+ %13 = llvm.insertvalue %11 , %12 [0 ] : !llvm.struct <(f32 , f32 )>
1516+ %14 = llvm.insertvalue %7 , %13 [1 ] : !llvm.struct <(f32 , f32 )>
1517+ omp.atomic.write %5 = %14 : !llvm.ptr , !llvm.struct <(f32 , f32 )>
1518+ %15 = llvm.mlir.undef : !llvm.struct <(f32 , f32 )>
1519+ %16 = llvm.insertvalue %6 , %15 [0 ] : !llvm.struct <(f32 , f32 )>
1520+ %17 = llvm.insertvalue %6 , %16 [1 ] : !llvm.struct <(f32 , f32 )>
1521+ omp.atomic.write %5 = %17 : !llvm.ptr , !llvm.struct <(f32 , f32 )>
1522+ llvm.return
1523+ }
1524+
1525+ // -----
1526+
14841527//CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
14851528//CHECK: %[[X_NEW_VAL:.*]] = alloca { float, float }, align 8
14861529//CHECK: {{.*}} = alloca { float, float }, i64 1, align 8
0 commit comments