Skip to content

Commit bef4e52

Browse files
authored
[flang][cuda] Fix type mismatch in atomiccas (#128548)
1 parent 9bfe486 commit bef4e52

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2731,11 +2731,19 @@ mlir::Value IntrinsicLibrary::genAtomicCas(mlir::Type resultType,
27312731
auto successOrdering = mlir::LLVM::AtomicOrdering::acq_rel;
27322732
auto failureOrdering = mlir::LLVM::AtomicOrdering::monotonic;
27332733
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+
27342742
auto address =
27352743
builder.create<mlir::UnrealizedConversionCastOp>(loc, llvmPtrTy, args[0])
27362744
.getResult(0);
27372745
auto cmpxchg = builder.create<mlir::LLVM::AtomicCmpXchgOp>(
2738-
loc, address, args[1], args[2], successOrdering, failureOrdering);
2746+
loc, address, arg1, arg2, successOrdering, failureOrdering);
27392747
return builder.create<mlir::LLVM::ExtractValueOp>(loc, cmpxchg, 1);
27402748
}
27412749

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)