Skip to content

Commit 77b9f32

Browse files
committed
[flang][cuda] Fix type mismatch in atomiccas
1 parent 5f8da7e commit 77b9f32

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2728,15 +2728,22 @@ mlir::Value IntrinsicLibrary::genAtomicOr(mlir::Type resultType,
27282728
mlir::Value IntrinsicLibrary::genAtomicCas(mlir::Type resultType,
27292729
llvm::ArrayRef<mlir::Value> args) {
27302730
assert(args.size() == 3);
2731-
assert(args[1].getType() == args[2].getType());
27322731
auto successOrdering = mlir::LLVM::AtomicOrdering::acq_rel;
27332732
auto failureOrdering = mlir::LLVM::AtomicOrdering::monotonic;
27342733
auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get(resultType.getContext());
2734+
2735+
mlir::Value arg1 = args[1];
2736+
mlir::Value arg2 = args[2];
2737+
if (arg1.getType() != arg2.getType()) {
2738+
// arg1 and arg2 need to have the same type in AtomicCmpXchgOp.
2739+
arg2 = builder.createConvert(loc, arg1.getType(), arg2);
2740+
}
2741+
27352742
auto address =
27362743
builder.create<mlir::UnrealizedConversionCastOp>(loc, llvmPtrTy, args[0])
27372744
.getResult(0);
27382745
auto cmpxchg = builder.create<mlir::LLVM::AtomicCmpXchgOp>(
2739-
loc, address, args[1], args[2], successOrdering, failureOrdering);
2746+
loc, address, arg1, arg2, successOrdering, failureOrdering);
27402747
return builder.create<mlir::LLVM::ExtractValueOp>(loc, cmpxchg, 1);
27412748
}
27422749

flang/test/Lower/CUDA/cuda-device-proc.cuf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,13 @@ end subroutine
162162
! CHECK: llvm.atomicrmw _xor %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i32
163163
! CHECK: %[[ADDR:.*]] = builtin.unrealized_conversion_cast %{{.*}}#1 : !fir.ref<i32> to !llvm.ptr
164164
! CHECK: llvm.cmpxchg %[[ADDR]], %{{.*}}, %c14{{.*}} acq_rel monotonic : !llvm.ptr, i32
165+
166+
attributes(device) subroutine testAtomic2()
167+
integer(8) :: a, i, istat
168+
istat = atomiccas(a, i, 14)
169+
end subroutine
170+
171+
! CHECK-LABEL: func.func @_QPtestatomic2()
172+
! CHECK: %[[VAL:.*]] = fir.convert %c14{{.*}} : (i32) -> i64
173+
! CHECK: %[[ADDR:.*]] = builtin.unrealized_conversion_cast %{{.*}}#1 : !fir.ref<i64> to !llvm.ptr
174+
! CHECK: llvm.cmpxchg %{{.*}}, %{{.*}}, %[[VAL]] acq_rel monotonic : !llvm.ptr, i64

0 commit comments

Comments
 (0)