@@ -1368,6 +1368,77 @@ llvm.func @omp_atomic_read(%arg0 : !llvm.ptr, %arg1 : !llvm.ptr) -> () {
1368
1368
1369
1369
// -----
1370
1370
1371
+ // CHECK-LABEL: @omp_atomic_read_implicit_cast
1372
+ llvm.func @omp_atomic_read_implicit_cast () {
1373
+ //CHECK: %[[Z:.*]] = alloca float, i64 1, align 4
1374
+ //CHECK: %[[Y:.*]] = alloca double, i64 1, align 8
1375
+ //CHECK: %[[X:.*]] = alloca [2 x { float, float }], i64 1, align 8
1376
+ //CHECK: %[[W:.*]] = alloca i32, i64 1, align 4
1377
+ //CHECK: %[[X_ELEMENT:.*]] = getelementptr { float, float }, ptr %3, i64 0
1378
+ %0 = llvm.mlir.constant (1 : i64 ) : i64
1379
+ %1 = llvm.alloca %0 x f32 {bindc_name = " z" } : (i64 ) -> !llvm.ptr
1380
+ %2 = llvm.mlir.constant (1 : i64 ) : i64
1381
+ %3 = llvm.alloca %2 x f64 {bindc_name = " y" } : (i64 ) -> !llvm.ptr
1382
+ %4 = llvm.mlir.constant (1 : i64 ) : i64
1383
+ %5 = llvm.alloca %4 x !llvm.array <2 x struct <(f32 , f32 )>> {bindc_name = " x" } : (i64 ) -> !llvm.ptr
1384
+ %6 = llvm.mlir.constant (1 : i64 ) : i64
1385
+ %7 = llvm.alloca %6 x i32 {bindc_name = " w" } : (i64 ) -> !llvm.ptr
1386
+ %8 = llvm.mlir.constant (1 : index ) : i64
1387
+ %9 = llvm.mlir.constant (2 : index ) : i64
1388
+ %10 = llvm.mlir.constant (1 : i64 ) : i64
1389
+ %11 = llvm.mlir.constant (0 : i64 ) : i64
1390
+ %12 = llvm.sub %8 , %10 overflow <nsw > : i64
1391
+ %13 = llvm.mul %12 , %10 overflow <nsw > : i64
1392
+ %14 = llvm.mul %13 , %10 overflow <nsw > : i64
1393
+ %15 = llvm.add %14 , %11 overflow <nsw > : i64
1394
+ %16 = llvm.mul %10 , %9 overflow <nsw > : i64
1395
+ %17 = llvm.getelementptr %5 [%15 ] : (!llvm.ptr , i64 ) -> !llvm.ptr , !llvm.struct <(f32 , f32 )>
1396
+
1397
+ //CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = alloca { float, float }, align 8
1398
+ //CHECK: call void @__atomic_load(i64 8, ptr %[[X_ELEMENT]], ptr %[[ATOMIC_LOAD_TEMP]], i32 0)
1399
+ //CHECK: %[[LOAD:.*]] = load { float, float }, ptr %[[ATOMIC_LOAD_TEMP]], align 8
1400
+ //CHECK: %[[EXT:.*]] = extractvalue { float, float } %[[LOAD]], 0
1401
+ //CHECK: store float %[[EXT]], ptr %[[Y]], align 4
1402
+ omp.atomic.read %3 = %17 : !llvm.ptr , !llvm.ptr , !llvm.struct <(f32 , f32 )>
1403
+
1404
+ //CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = load atomic i32, ptr %[[Z]] monotonic, align 4
1405
+ //CHECK: %[[CAST:.*]] = bitcast i32 %[[ATOMIC_LOAD_TEMP]] to float
1406
+ //CHECK: %[[LOAD:.*]] = fpext float %[[CAST]] to double
1407
+ //CHECK: store double %[[LOAD]], ptr %[[Y]], align 8
1408
+ omp.atomic.read %3 = %1 : !llvm.ptr , !llvm.ptr , f32
1409
+
1410
+ //CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = load atomic i32, ptr %[[W]] monotonic, align 4
1411
+ //CHECK: %[[LOAD:.*]] = sitofp i32 %[[ATOMIC_LOAD_TEMP]] to double
1412
+ //CHECK: store double %[[LOAD]], ptr %[[Y]], align 8
1413
+ omp.atomic.read %3 = %7 : !llvm.ptr , !llvm.ptr , i32
1414
+
1415
+ //CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = load atomic i64, ptr %[[Y]] monotonic, align 4
1416
+ //CHECK: %[[CAST:.*]] = bitcast i64 %[[ATOMIC_LOAD_TEMP]] to double
1417
+ //CHECK: %[[LOAD:.*]] = fptrunc double %[[CAST]] to float
1418
+ //CHECK: store float %[[LOAD]], ptr %[[Z]], align 4
1419
+ omp.atomic.read %1 = %3 : !llvm.ptr , !llvm.ptr , f64
1420
+
1421
+ //CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = load atomic i32, ptr %[[W]] monotonic, align 4
1422
+ //CHECK: %[[LOAD:.*]] = sitofp i32 %[[ATOMIC_LOAD_TEMP]] to float
1423
+ //CHECK: store float %[[LOAD]], ptr %[[Z]], align 4
1424
+ omp.atomic.read %1 = %7 : !llvm.ptr , !llvm.ptr , i32
1425
+
1426
+ //CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = load atomic i64, ptr %[[Y]] monotonic, align 4
1427
+ //CHECK: %[[CAST:.*]] = bitcast i64 %[[ATOMIC_LOAD_TEMP]] to double
1428
+ //CHECK: %[[LOAD:.*]] = fptosi double %[[CAST]] to i32
1429
+ //CHECK: store i32 %[[LOAD]], ptr %[[W]], align 4
1430
+ omp.atomic.read %7 = %3 : !llvm.ptr , !llvm.ptr , f64
1431
+
1432
+ //CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = load atomic i32, ptr %[[Z]] monotonic, align 4
1433
+ //CHECK: %[[CAST:.*]] = bitcast i32 %[[ATOMIC_LOAD_TEMP]] to float
1434
+ //CHECK: %[[LOAD:.*]] = fptosi float %[[CAST]] to i32
1435
+ //CHECK: store i32 %[[LOAD]], ptr %[[W]], align 4
1436
+ omp.atomic.read %7 = %1 : !llvm.ptr , !llvm.ptr , f32
1437
+ llvm.return
1438
+ }
1439
+
1440
+ // -----
1441
+
1371
1442
// CHECK-LABEL: @omp_atomic_write
1372
1443
// CHECK-SAME: (ptr %[[x:.*]], i32 %[[expr:.*]])
1373
1444
llvm.func @omp_atomic_write (%x: !llvm.ptr , %expr: i32 ) -> () {
0 commit comments